遗传算法Word文档格式.docx
《遗传算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《遗传算法Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![遗传算法Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/16/d039967d-23f5-4f0c-a8f1-f68655adc507/d039967d-23f5-4f0c-a8f1-f68655adc5071.gif)
即每个染色体的适应度值就是它的目标函数值,
。
三、选择算子
初始种群产生后,要从种群中选出若干个体进行交叉、变异,那么如何选择这些个体呢?
选择方法就叫做选择算子。
一般有轮盘赌选择法、锦标赛选择法、排序法等。
本文采用排序法来选择,即每次选择都选出适应度最高的两个个体。
那么执行一次选择操作后,得到的新种群的一部分为下图所示:
图2
四、交叉算子
那么接下来就要对新种群中选出的两个个体进行交叉操作,一般的交叉方法有单点交叉、两点交叉、多点交叉、均匀交叉、融合交叉。
方法不同,效果不同。
本文采用最简单的单点交叉。
交叉点随机产生。
但是交叉操作要在一定的概率下进行,这个概率称为交叉率,一般设置为
到
之间。
交叉后产生的新个体组成的新种群如下:
图3
黑体字表示子代染色体继承母代个体的基因情况。
五、变异
变异就是对染色体的结构进行变异,使其改变原来的结构(值也就改变),达到突变进化的目的。
变异操作也要遵从一定的概率来进行,一般设置为0到0.5之间。
本文的变异方法直接采取基因位反转变异法,即0变为1,1变为0。
要进行变异的基因位的选取也是随机的。
六、终止规则
遗传算法是要一代一代更替的,那么什么时候停止迭代呢?
这个规则就叫终止规则。
一般常用的终止规则有:
若干代后终止,得到的解达到一定目标后终止,计算时间达到一定限度后终止等方法。
本文采用迭代数来限制。
二、算法框图
三、算法程序
源程序:
/*
用遗传算法求y=x*sin(10*pi*x)+2的最大值-1=<
x<
=2
精确到6位小数
pow(2,21)<
3*1000000<
pow(2,22)
编码的二进制长度为22
*/
#include<
stdio.h>
string.h>
stdlib.h>
ctime>
math.h>
#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<
SIZE;
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;
tmp=randi(N);
for(intj=0;
j<
LEN;
j++)
cur[i].x[j]=tmp%2;
tmp=tmp>
>
1;
cal_fitness();
intsel()
doublep=randd();
doublesum=cur[SIZE-1].fitsum;
if(cur[i].fitsum/sum>
p)returni;
//换代
voidtran()
inti,j,pos;
//找当前种群最优个体
max=cur[0];
for(i=1;
SIZE-1;
if(cur[i].fitness>
max.fitness)max=cur[i];
for(intk=0;
k<
k+=2)
//选择交叉个体
i=sel();
j=sel();
//选择交叉位置
pos=randi(LEN-1);
//交叉
if(randd()<
P_CORSS)
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);
//变异
P_MUTATION)
next[k].x[pos]^=next[k].x[pos];
next[k+1].x[pos]^=next[k+1].x[pos];
//找下一代的最差个体
min=next[0],j=0;
if(next[i].fitness<
min.fitness)min=next[i],j=i;
//用上一代的最优个体替换下一代的最差个体
next[j]=max;
memcpy(cur,next,sizeof(cur));
//打印个体适应度和二进制编码
voidprint(nodetmp)
printf("
%.6lf"
tmp.fitness);
i++)printf("
%d"
tmp.x[i]);
\n"
);
//打印种群
voidprintcur()
i++)print(cur[i]);
}
voidGA()
{
intcnt=0;
doubleans;
while(cnt++<
MAXGEN)
tran();
//printf("
%.6lf\n"
max.fitness);
//printcur();
ans=cur[0].fitness;
for(inti=1;
i++)ans=MAX(ans,cur[i].fitness);
ans);
}
intmain()
srand((unsigned)time(NULL));
init();
GA();
system("
pause"
return0;
四、算法实现
例1.用遗传算法求
的最大值,
,精确到6位小数。
解:
运行结果:
例2.用遗传算法求
例3.用遗传算法求
例4.用遗传算法求