




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
利用遗传算法求解函数最大值题目利用遗传算法求解函数f(x,y)=x*sin(6*y)+y*cos(8*x)在xg[1,2]及ye[1,2]的最大值。解答算法利用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。算法中涉及不同的参数,参数的取值需要依如实际情形进行设定,下面运行时将给出不同参数的结果对照。//遗传■算法关键密constintN="科駢的个怵戳constintlen=30-;//每个亍体的染色tfc的氏度」沛滑占一半constintcrossnum=4-//乍时笺的^^点constintnaxGeneration=//最尢曲七代数constdoubleprobCross=&5;//交叉概率constdoubleprobMutation=®.15j//变异概率概念整体算法的终止条件为,当种群进化次数达到maxGeneration时停止,现在种群中的最优解即作为算法的最终输出。“控制的磁for(intg=&jg<ma)cGeneration;g++)设种群规模为N,第一是随机产生N个个体,实验中概念了类型Chromosome表示一个个体,而且在默许构造函数中即进行了随机的操作。
H初始伽群fcr(Lnti=i<M.;i+f)groupfi]=匚hromso-me;然后程序进行假设干次的迭代,在每次迭代进程中,进行选择、交叉及变异三个操作。选择操作第一计算当前每一个个体的适应度函数值,那个地址的适应度函数即为所要求的优化函数,然后归一化求得每一个个体选中的概率,然后用轮盘赌的方式以许诺重复的方式选择选择N个个体,即为选择以后的群体。//选擇操任□void•亡lect//选擇操任□void•亡lectf匚hromowom亡grcup^msn]){//计亘每个个诡的辭讎d'oublefitn-essVal^mKn]sfor(inti=0;id'oublesum=0;for(inti=0;id'oublepro-b[inKn];for(inti=0ji//intselectld[mxn]jfor(inti=1;i<M;i+4)for(inti=0ji<M;i+4)<MJi+4)fitnessVal[i]=fitness(group[i];sum+=fitnessValfi]jprob[i]=fitneesVal[i]/sum;prob[i]4-=prob[i-l];rsndNum=r3ndom&l();rsndNum=r3ndom&l();刊「(jif(if(randMum<prob[j])selectld[i]=j:breakjif(j==N-1)selectld[l]=jj打把种詳更新为新舞的个濮合f^r(inti=0ji<Nji+十)temGroup[1]=訂oup[i]if^r(inti=0ji<Nii+十)graup[i]=tei»5r0up[^electld[i]];但实验时发觉结果不行,通过认真研究以后发觉,那个地址在x、y取某些值的时候目标函数计算出来的适应值可能会显现负值,这时若是依照把每一个个体的适应值除以适应值的总和的进行归一化的话会显现问题,因为个体可能显现负值,总和也可能显现负值,若是归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成阻碍。对于那个问题,我把适应度函数定为目标函数的函数值加一个正数,保证取得的适应值为正数,然后再进行一样的归一化和选择的操作。实验结果说明,之前的实验结果很不稳固,修正后的结果比较稳固,趋于最大值。H适应度函数,为避免负值,把目标函数加Y正数□doublefitnessfconst匚hro[nciso«ne&c)doubleKjyjdecodeXjy)treturnf(Kjy)十5j交叉操作第一是依照交叉概率probCross选择要交叉的个体进行交叉。H根据交叉醉进行交叉for(int1=0,pre=-1;i<N;i+4-J{if(random01()<probCross)if(pre==-1)pre=i;elsecrossiover(group[pr亡]"呂roup[i]);pre=-1;那个地址依照交叉参数crossnum进行多点交叉,第一随机生成交叉点位置,许诺交叉点重合,两个重合的交叉点成效相互抵消,相当于没有交叉点,然后依照交叉点进行交叉操作,取得新的个体。-Jvoidtr05so¥er(Chromo5OTie&clj匸hromosom亡&c2)£/;生成交艮■点位置,齐排京int匸「O'EspointtniKn];fcr(inti=0;i<croEsnum;i++)trosspoint[i]=rand(")%len;mort(crciTspoirrt』tr□sspoint+crosEnum);//聞蚁boclflag=Q-fcr(inti=j=创iclen^i4-4-)(ifCIflag)swap(d.g[i]Jc2.g[i]j3(i==crasspoint[j])H如果若千。交臭点重合「则效果叠加//催数个交叉点效杲相当于没有交夏点while(j<croEsnumMi==crosspoint[j]j++j-flag=I'flaSi变异操作第一是依照变异概率probMutation选择要变异的个体。JJ根据变异髒进行娈异far(inti=0_;i€井+)if(random01()<probMutati/Mi)mutate(groLip[i])3变异时先随机生成变异的位置,然后把改位的01值翻转。H变异操作-3voidmutate(Chronoso-meAu){//随机选择T锻行翻转inti=randQSlenj(=-g[i]=!c.g[i]3通过必然的进化以后取得最终种群,从中选择最优的个体即可取得最终的结果。//荻取种群最刖休mintgetOptimal(thromsomegroup[mxnjjdoub-1亡呂Kjdoiuble&doublesval)£/;计算适应值.遍历彳导到最优值井进行解码doublefitnessyalfmKnJif^r(inti=0;i<Nji4-4)fitnessVal[i]=fitness(mp[i]);iritid=for(inti=1;i<Nji-l-l-)if(fitnessVal[i]>fItnessVal[id])id=i;decode(group[id]jKj>);val=f(Kjy);returni.d;运行结果借助matlab软件,咱们能够明白该函数在该概念域下的图像为:420211-421.21.81.5借助matlab软件,咱们能够明白该函数在该概念域下的图像为:420211-421.21.81.51.6y)=x*sin(E*y)+fcos(B^)的團像-2<以下设置不同的参数值进行对如实验:表1不同参数的对如实验NlencrossnummaxGenerationprobCrossprobMutate实验一实验二11010410000.850.152.614332042.74697117
25010450000.850.152.871765122.88383150320020450000.850.152.892027452.893073594200304100000.850.152.894406562.888525515200305100000.80.22.888068212.8916507363004041000000.850.152.893637392.89445359以上咱们要紧对种群规模N,个体染色体长度len,迭代次数maxGeneration进行比较。能够看出,随着种群规模的增大,染色体长度的增加,迭代次数的增加,算法取得的结果愈来愈精准。当参数规模达到必然程度时,再增加参数的值会明显地增加程序运行时刻,但却不必然能明显改善解的质量,反而可能因为一些随机因数而产生质量更差的解,如第6组实验一所示。同时也可能比较了一下多点交叉的交叉点个数crossnum,交叉概率probCross,变异概率probMutate等参数,由于参数太多,那个地址没有一一进行操纵变量的比较。大致估算可知,交叉概率及交叉点的个数阻碍交叉操作产生新个体的质量,过量的交叉及转变过大的交叉可能会产生不行的结果,而过量的变异也应该会造成算法的不稳固。下面给出以上几个实验结果的实验截图,其中到此刻为止结果最好的一个为:融C:\Windowsstem32\cmd.e^e-58203125,1.327026=2.89445359Fpessan^keytocontinue...其余假设干个为:算法改良以上实验取得的最好结果仍然是差强人意,那个地址对算法做一个小的优化,即添加避免种群退化的操作。记录当前位置所取得的最优值及对应的个体,每次更新种群以后,计算新种群的最优值,若是最优值变差了,那么把之前较优的个体替换进新种群,避免种群退化;不然更新最优值。//防止^11牝doubl亡teiwal;intbestId=getGptimal(group,k』.±temval);if(t&mval<bestval){//如果新利翳的最优値査差.把较尤的們i直新祸group[beEtld]=beet匚;else{//如果新利辭的最优值M.则更新毘优值记录best<=groLipfbestld]jbestval=temvalj改良以后的成效如下所示,显然比之前更优,且实验结果显示关于前面对如实验中的参数值,那个地址只需要较小的参数(如迭代次数只需2000次)值即可稳固收敛到此最大值,可知改良超级有效。[SIC!\Windows\system32\cmd.exe81数在点"-5眈5195茶1-眈65075R取得最大値2旳44ZL眄Pressanykeytocontinue・・・.增加输出精度以后为,于是取得最优的结果为2.894471354862841SBC:\WindowsXsystem32\匚md.exei■=■ir^[函娄文在点Cl・582519531250000,1,326507568359375>|SIPressanykeytocontinue.・・.^<:2.894471354862841源代码改良后的源代码如下#include<iostream>#include<iomanip>#include〈algorithm>#include<cmath>#include<ctime>usingnamespacestd;//程序欲分派内存的数组大小constintmxn=10000;//最大的种群规模constintmxlen=1000;//最大的染色体长度//遗传算法关键参数constintN=200;//种群的个体数constintlen=30;//每一个个体的染色体的长度,x和y各占一半constintcrossnum=4;//交叉操作时多点交叉的交叉点个数constintmaxGeneration=2000;//最大进化代数constdoubleprobCross=0.85;//交叉概率constdoubleprobMutation=0.15;//变异概率//个体的染色体类classChromosome{public:boolg[mxlen];//二进制编码的编码数组Chromosome。//默许构造函数,构造随机染色体{for(inti=0;i<len;i++)g[i]=rand()%2;}Chromosome(constChromosome&c)//拷贝构造函数,进行深复制{for(inti=0;i<len;i++)g[i]=c.g[i];}voidoperator=(constChromosome&c)//重载=号,进行深复制for(inti=0;i<len;i++)g[i]=c.g[i];}};doublebestval;//记录当前所得的最优值ChromosomebestC;//记录当前最优值对应的个体染色体Chromosomegroup[mxn],temGroup[mxn];//个体的种群,辅助数组//目标函数doublef(doublex,doubley){returnx*sin(6*y)+y*cos(8*x);}//解码函数,从染色体取得x和y的值voiddecode(constChromosome&c,double&x,double&y){doublenum=pow(2.0,len/2.0);inttem=0;for(inti=len-1,q=1;i>=len/2;i一)tem+=c.g[i]*q,q=q*2;y=1+(2-1)/num*tem;tem=0;for(inti=len/2-1,q=1;i>=0;i一)tem+=c.g[i]*q,q=q*2;x=1+(2-1)/num*tem;}//适应度函数,为幸免负值,把目标函数加一个正数{{doublefitness(constChromosome&c){doublex,y;decode(c,x,y);returnf(x,y)+5;}//辅助函数,生成0-1之间的随机小数doubleinlinerandom01(){returnrand()%10000/10000.0;}//选择操作voidselect(Chromosomegroup[mxn]){//计算每一个个体的选择概率doublefitnessVal[mxn];for(inti=0;i<N;i++)doublesum=0;for(inti=0;i<N;i++)doubleprob[mxn];for(inti=0;i<N;i++)//随机选择N个个体组成新种群intselectId[mxn];for(inti=1;i<N;i++)for(inti=0;i<N;i++)fitnessVal[i]=fitness(group[i]);sum+=fitnessVal[i];prob[i]=fitnessVal[i]/sum;prob[i]+=prob[i-1];//利用轮盘赌算法选择个体doublerandNum=random01();intintj;{{for(j=0;j<N-1;j++){if(randNum<prob[j]){selectld[i]=j;break;}if(j==N-1)selectld[i]=j;}//把种群更新为新选择的个体集合for(for(inti=0;i<N;i++)for(inti=0;i<N;i++)}temGroup[i]=group[i];group[i]=temGroup[selectld[i]];//交叉操作,利用多点交叉voidcrossover(Chromosome&c1,Chromosome&c2){//生成交叉点位置,并排序intcrosspoint[mxn];for(inti=0;i<crossnum;i++)crosspoint[i]=rand()%len;sort(crosspoint,crosspoint+crossnum);//进行交叉boolflag=0;for(inti=0,j=0;i<len;i++)if(!flag)swap(c1.g[i],c2.g[i]);ifif(i==crosspoint[j]){//若是假设干个交叉点重合,那么成效叠加//偶数个交叉点成效相当于没有交叉点while(j<crossnum&&i==crosspoint[j]){j++;flag=!flag;}}}}//变异操作voidmutate(Chromosome&c){//随机选择一名进行翻转inti=rand()%len;c.g[i]=!c.g[i];}//获取种群最优个体intgetOptimal(Chromosomegroup[mxn],double&x,double&y,double&val){//计算适应值,遍历取得最优值并进行解码doublefitnessVal[mxn];for(inti=0;i<N;i++)fitnessVal[i]=fitness(group[i]);intid=0;for(inti=1;i<N;i++)if(fitnessVal[i]>fitnessVal[id])id=i;{{decode(group[id],x,y);val=f(x,y);returnid;}//遗传算法总代码voidGA(double&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 巴彦淖尔市中医院消化内科内镜技师晋升高级技师考核试题
- 中国牛冻精项目商业计划书
- 石家庄市人民医院多胎妊娠减胎术技术准入考核
- 北京市人民医院心衰中心规范化管理年度审核
- 2025年中国三氧化铬项目投资计划书
- 巴彦淖尔市中医院肾上腺意外瘤诊疗策略考核
- 牡丹江市中医院血液病相关免疫学检测项目选择考核
- 2025年中国去甲氧基醉椒素项目创业计划书
- 忻州市中医院感染性疾病影像考核
- 长治市人民医院罕见病诊疗体系建设考核
- GB/T 40335-2021无损检测泄漏检测示踪气体方法
- GB/T 16785-2012术语工作概念和术语的协调
- 广州市材料进场检测相关法律法规、检测项目及取样规则
- LENZE-9300EP简明调试汇总课件
- 工伤预防培训-课件
- 公司技术响应表
- 教科版五年级(上)科学2.2地球的结构(课件)
- DBJ∕T13-358-2021 福建省城镇供水基础数据采集与管理技术标准
- 齐鲁医学UCLA肩关节评分系统
- Q∕SY 05064-2018 油气管道动火规范
- 财务收支月报表excel模板
评论
0/150
提交评论