092遗传算法.docx
- 文档编号:3635158
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:11
- 大小:230.36KB
092遗传算法.docx
《092遗传算法.docx》由会员分享,可在线阅读,更多相关《092遗传算法.docx(11页珍藏版)》请在冰豆网上搜索。
092遗传算法
2013-2014
(1)专业课程实践论文
题目:
遗传算法
一、算法理论
一、编码以及初始种群的产生
编码采用二进制编码,初始种群采用矩阵的形式,每一行表示一个染色体,每一个染色体由若干个基因位组成。
关于染色体的长度(即基因位的个数)可根据具体情况而定。
比如说根据要求极值的函数的情况,本文的染色体长度为6,前5个二进制构成该染色体的值(十进制),第6个表示该染色体的适应度值。
长度越长,表示解空间搜索范围越大。
关于如何将二进制转换为十进制,这个应该很简单,文后的C代码中函数
即为转换函数。
初始种群结构如下图所示:
图1
该初始种群共有4个染色体,第一列表示各个染色体的编号,第2列表示该染色体值的正负号,0表示正,1表示负。
第3列到第7列为二进制编码,第8列表示各个染色体的适应度值。
第2列到第7列的0-1值都是随机产生的。
二、适应度函数
一般情况下,染色体(也叫个体,或一个解)的适应度函数为目标函数的线性组合。
本文直接以目标函数作为适应度函数。
即每个染色体的适应度值就是它的目标函数值,
。
三、选择算子
初始种群产生后,要从种群中选出若干个体进行交叉、变异,那么如何选择这些个体呢?
选择方法就叫做选择算子。
一般有轮盘赌选择法、锦标赛选择法、排序法等。
本文采用排序法来选择,即每次选择都选出适应度最高的两个个体。
那么执行一次选择操作后,得到的新种群的一部分为下图所示:
图2
四、交叉算子
那么接下来就要对新种群中选出的两个个体进行交叉操作,一般的交叉方法有单点交叉、两点交叉、多点交叉、均匀交叉、融合交叉。
方法不同,效果不同。
本文采用最简单的单点交叉。
交叉点随机产生。
但是交叉操作要在一定的概率下进行,这个概率称为交叉率,一般设置为
到
之间。
交叉后产生的新个体组成的新种群如下:
图3
黑体字表示子代染色体继承母代个体的基因情况。
五、变异
变异就是对染色体的结构进行变异,使其改变原来的结构(值也就改变),达到突变进化的目的。
变异操作也要遵从一定的概率来进行,一般设置为0到0.5之间。
本文的变异方法直接采取基因位反转变异法,即0变为1,1变为0。
要进行变异的基因位的选取也是随机的。
六、终止规则
遗传算法是要一代一代更替的,那么什么时候停止迭代呢?
这个规则就叫终止规则。
一般常用的终止规则有:
若干代后终止,得到的解达到一定目标后终止,计算时间达到一定限度后终止等方法。
本文采用迭代数来限制。
二、算法框图
三、算法程序
源程序:
/*
用遗传算法求y=x*sin(10*pi*x)+2的最大值-1= 精确到6位小数 pow(2,21)<3*1000000 编码的二进制长度为22 */ #include #include #include #include #include #defineN3000000 #definePI3.14159265 #defineMAX(a,b)((a)>(b)? (a): (b)) #defineSIZE50 #defineMAXGEN50 #defineP_CORSS0.75 #defineP_MUTATION0.05 #defineLEN22 typedefstructnode { charx[LEN]; doublefitness,fitsum; }node; nodecur[SIZE],next[SIZE],max,min; doublerandd() { return(double)rand()/RAND_MAX; } intrandi(intk) { return(int)(randd()*k+0.5); } //计算当前种群中各个个体的适应度 voidcal_fitness() { inti,j,k; doubled; for(i=0;i { k=0; for(j=LEN-1;j>=0;j--)k=(k<<1)+cur[i].x[j]; d=(double)k/N*3-1; cur[i].fitness=d*sin(10*PI*d)+2; cur[i].fitsum=i>0? (cur[i].fitness+cur[i-1].fitsum): (cur[0].fitness); } } voidinit() { inttmp; for(inti=0;i { tmp=randi(N); for(intj=0;j { cur[i].x[j]=tmp%2; tmp=tmp>>1; } } cal_fitness(); } intsel() { doublep=randd(); doublesum=cur[SIZE-1].fitsum; for(inti=0;i { if(cur[i].fitsum/sum>p)returni; } } //换代 voidtran() { inti,j,pos; //找当前种群最优个体 max=cur[0]; for(i=1;i { if(cur[i].fitness>max.fitness)max=cur[i]; } for(intk=0;k { //选择交叉个体 i=sel(); j=sel(); //选择交叉位置 pos=randi(LEN-1); //交叉 if(randd() { memcpy(next[k].x,cur[i].x,pos); memcpy(next[k].x+pos,cur[j].x+pos,LEN-pos); memcpy(next[k+1].x,cur[j].x,pos); memcpy(next[k+1].x+pos,cur[i].x+pos,LEN-pos); } else { memcpy(next[k].x,cur[i].x,LEN); memcpy(next[k+1].x,cur[j].x,LEN);} //变异 if(randd() { pos=randi(LEN-1); next[k].x[pos]^=next[k].x[pos]; pos=randi(LEN-1); next[k+1].x[pos]^=next[k+1].x[pos]; } } //找下一代的最差个体 min=next[0],j=0; for(i=1;i { if(next[i].fitness } //用上一代的最优个体替换下一代的最差个体 next[j]=max; memcpy(cur,next,sizeof(cur)); cal_fitness(); } //打印个体适应度和二进制编码 voidprint(nodetmp) { printf("%.6lf",tmp.fitness); for(inti=0;i printf("\n"); } //打印种群 voidprintcur() { for(inti=0;i } voidGA() { intcnt=0; doubleans; while(cnt++ { tran(); //printf("%.6lf\n",max.fitness); //printcur(); } ans=cur[0].fitness; for(inti=1;i printf("%.6lf\n",ans); } intmain() { srand((unsigned)time(NULL)); init(); GA(); system("pause"); return0; } 四、算法实现 例1.用遗传算法求 的最大值, ,精确到6位小数。 解: 运行结果: 例2.用遗传算法求 的最大值, ,精确到6位小数。 解: 运行结果: 例3.用遗传算法求 的最大值, ,精确到6位小数。 解: 运行结果: 例4.用遗传算法求 的最大值, ,精确到6位小数。 解: 运行结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 092 遗传 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)