


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、首先申明,这个程序不是我写的,也是我以前在网上找到的(本科的时候看过,没太看懂,但是测试过了,可以运行的)。这是完整的rosenbrock函数的代码,绝对可用:function f, df, ddf = rosenbrock(x); % rosenbrock.m this function returns the function value, partial derivatives % and hessian of the (general dimension) rosenbrock function, given by: % % f(x) = sum_i=1:d-1 100*(x(i+1)
2、 - x(i)2)2 + (1-x(i)2 % % where d is the dimension of x. the true minimum is 0 at x = (1 1 . 1). % % carl edward rasmussen, 2001-07-21. d = length(x); f = sum(100*(x(2:d)-x(1:d-1).2).2 + (1-x(1:d-1).2); if nargout 1 df = zeros(d, 1); df(1:d-1) = - 400*x(1:d-1).*(x(2:d)-x(1:d-1).2) - 2*(1-x(1:d-1); d
3、f(2:d) = df(2:d) + 200*(x(2:d)-x(1:d-1).2); end if nargout 2 ddf = zeros(d,d); ddf(1:d-1,1:d-1) = diag(-400*x(2:d) + 1200*x(1:d-1).2 + 2); ddf(2:d,2:d) = ddf(2:d,2:d) + 200*eye(d-1); ddf = ddf - diag(400*x(1:d-1),1) - diag(400*x(1:d-1),-1); end 比如说,你可以使用常用的多目标函数的优化来调用: x fx c = minimize(0 1, rosenbr
4、ock, 50) linesearch 1; value 9.801010e-001 linesearch 2; value 7.711174e-001 linesearch 3; value 6.087456e-001 linesearch 4; value 4.170023e-001 linesearch 5; value 3.019709e-001 linesearch 6; value 2.622712e-001 linesearch 7; value 5.074002e-002 linesearch 8; value 4.360344e-002 linesearch 9; value
5、 2.569778e-002 linesearch 10; value 9.313900e-003 linesearch 11; value 2.831055e-003 linesearch 12; value 6.570921e-004 linesearch 13; value 7.260670e-005 linesearch 14; value 2.660941e-007 linesearch 15; value 3.306084e-011 linesearch 16; value 1.640334e-012 linesearch 17; value 4.746897e-014 lines
6、earch 18; value 6.733194e-020 linesearch 19; value 2.144528e-025 linesearch 20; value 1.343529e-030 linesearch 21; value 4.930381e-032 x = 1.0000 1.0000 fx = 101.0000 0.9801 0.7711 0.6087 0.4170 0.3020 0.2623 0.0507 0.0436 0.0257 0.0093 0.0028 0.0007 0.0001 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
7、0.0000 0.0000 c = 23 minimize 时多目标优化的函数,你应该不需要的。用遗传算法求解rosenbrock函数源代码2008-05-02 19:49:10| 分类:程序算法|字号大 中小 订阅/* 基本遗传算法实例程序求解 rosenbrock函数version 1.0 programmed by jim zhou,1994.12. */ #include #include #include /* 常量定义*/ #define popsize 500 /群体大小#define maximization 1 /最大标志,寻找最大解#define minimization
8、2 /最小标志,寻找最小解/* 数据定义(对于不同的问题,可能会有少许差别)*/ #define cmax 100 /确定的最大值#define cmin 0 /确定的最小值#define length1 10 /第一个染色体长度#define length2 10 /第二个染色体长度#define chromlength length1+length2 /染色体总长度int functionmode = maximization; /求解最优值类型:最大?最小int popsize = 80; /群体规模m int maxgeneration = 200; /最大代数double pc =
9、0.6; /交叉概率double pm = 0.001; /变异概率/* 数据结构定义*/ struct individual /个体数据结构 char chromchromlength+1; /个体的基因型,用字符串表示double value; /个体的目标值double fitness; /个体的适应度; /* 全局变量定义*/ int generation; /代数int best_index; /最优个体的索引int worst_index; /最坏个体的索引struct individual bestindividual; /当代最优个体struct individual wors
10、tindividual; /当代最坏个体struct individual currentbest; /迄今为止,最好的个体struct individual populationpopsize;/群体/* 函数原型声明*/ void generateinitialpopulation(void); void generatenextpopulation(void); void evaluatepopulation(void); long decodechromosome(char *,int,int); void calculatefitnessvalue(void); void calcu
11、lateobjectvalue(void); void findbestandworstindividual(void); void performevolution(void); void selectionoperator(void); void crossoveroperator(void); void mutationoperator(void); void outputtextreport(void); /* 主程序*/ void main(void) generation =0; generateinitialpopulation(); evaluatepopulation();
12、while(generationmaxgeneration) generation+; generatenextpopulation(); evaluatepopulation(); performevolution(); outputtextreport(); /* 函数:产生第一代个体参数: void */ void generateinitialpopulation(void) int i,j; srand(time(null); for(i=0;ipopsize;i+) for(j=0;jchromlength;j+) populationi.chromj=(rand()%105)?0
13、:1; populationi.chromchromlength=0; /* 函数:初始化第一代个体参数: void */ void generatenextpopulation(void) selectionoperator(); crossoveroperator(); mutationoperator(); /* 函数:通过特定的方程式评估群体参数: void */ void evaluatepopulation(void) calculateobjectvalue(); calculatefitnessvalue(); findbestandworstindividual(); /*
14、函数:将染色体的基因型解码成表现型参数: void 备注:返回值可能是正、或负。对于不同的解码方法,这个值也可能是“ unsigned int ”*/ long decodechromosome(char *string,int point,int length) int i; long decimal=0l; char *pointer; for(i=0,pointer=string+point;ilength;i+,pointer+) decimal+=(*pointer-0)(length-1-i); return decimal; /* 函数:计算目标值参数: void 备注:对于不同
15、的问题,用户需要修改此处代码。该代码实例是求解rosenbrock函数rosenbrock函数定义如下:f(x1,x2)=100*(x1*2-x2)*2+(1-x1)*2 该函数的最大值是:f(-2.048,-2.048)=3905.926227 */ void calculateobjectvalue(void) int i; long temp1,temp2; double x1,x2; for(i=0;ipopsize;i+) temp1=decodechromosome(populationi.chrom,0,length1); temp2=decodechromosome(popul
16、ationi.chrom,length1,length2); x1=4.096*temp1/1023.0-2.048; x2=4.096*temp2/1023.0-2.048; populationi.value=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1); /* 函数:计算适应度参数: void */ void calculatefitnessvalue(void) int i; double temp; for(i=0;i0.0) temp=cmin+populationi.value; else temp=0.0; else if(functionmo
17、de=minimization) if(populationi.valuecmax) temp=cmax-populationi.value; else temp=0.0; populationi.fitness=temp; /* 函数:查找至今的最优个体参数: void */ void findbestandworstindividual(void) int i; double sum=0.0; bestindividual=population0; worstindividual=population0; for(i=1;ibestindividual.fitness) bestindiv
18、idual=populationi; best_index=i; else if(populationi.fitnesscurrentbest.fitness) currentbest=bestindividual; /* 函数:根据 “ 优胜劣汰 ” 模型对群体进行评估。用迄今为止最好的替代最差的个体参数: void */ void performevolution(void) if(bestindividual.fitnesscurrentbest.fitness) currentbest=populationbest_index; else populationworst_index=c
19、urrentbest; /* 函数:用选择操作重新选择一个染色体参数: void */ void selectionoperator(void) int i,index; double p,sum=0.0; double cfitnesspopsize; struct individual newpopulationpopsize; for(i=0;ipopsize;i+) sum+=populationi.fitness; for(i=0;ipopsize;i+) cfitnessi=populationi.fitness/sum; for(i=1;ipopsize;i+) cfitness
20、i=cfitnessi-1+cfitnessi; for(i=0;icfitnessindex) index+; newpopulationi=populationindex; for(i=0;ipopsize;i+) populationi=newpopulationi; /* 函数:采用单点交叉方式对染色体进行交叉操作参数: void */ void crossoveroperator(void) int i,j; int indexpopsize; int point,temp; double p; char ch; for(i=0;ipopsize;i+) indexi=i; srand(time(null); for(i=0;ipopsize;i+) point=rand()%(popsize-i); temp=indexi; indexi=indexpoint+i; indexpoint+i=temp; for(i=0;ipopsize-1;i+=2) p=rand()%1000/1000.0; if(ppc) point=rand()%(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外研版八年级上英语学生评估计划
- 茶艺师线上培训教学大纲与计划
- 工业自动化项目实施的风险分析及对策措施
- 七年级书法教具准备计划
- 2025文化遗产保护资料保密计划
- 湘教版五年级下册音乐教学计划
- 上学期家长学校多元文化教育计划
- 机关作风与效能建设促进基层治理现代化的心得体会
- 以形致知:地貌模型在中学地理教学中的策略与实践
- 以应用案例教学为翼育初中生信息社会责任之魂
- MOOC 细胞生物学-四川大学 中国大学慕课答案
- 科目余额表模板
- 建设项目安全设施“三同时”(直接使用版)课件
- 2019版新人教版高中英语必修+选择性必修共7册词汇表汇总(带音标)
- 《字体设计》课程标准
- 扩心病的健康宣教
- 日常网络安全检查记录表模板
- 2024磷石膏道路基层材料应用技术规范
- 严防网络钓鱼攻击:安全培训指南
- 天津小学生诗词大赛备考试题库500题(五六年级)
- GB/T 15231-2023玻璃纤维增强水泥性能试验方法
评论
0/150
提交评论