遗传算法Word文档格式.docx

上传人:b****6 文档编号:15917791 上传时间:2022-11-17 格式:DOCX 页数:11 大小:230.50KB
下载 相关 举报
遗传算法Word文档格式.docx_第1页
第1页 / 共11页
遗传算法Word文档格式.docx_第2页
第2页 / 共11页
遗传算法Word文档格式.docx_第3页
第3页 / 共11页
遗传算法Word文档格式.docx_第4页
第4页 / 共11页
遗传算法Word文档格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

遗传算法Word文档格式.docx

《遗传算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《遗传算法Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。

遗传算法Word文档格式.docx

即每个染色体的适应度值就是它的目标函数值,

三、选择算子

初始种群产生后,要从种群中选出若干个体进行交叉、变异,那么如何选择这些个体呢?

选择方法就叫做选择算子。

一般有轮盘赌选择法、锦标赛选择法、排序法等。

本文采用排序法来选择,即每次选择都选出适应度最高的两个个体。

那么执行一次选择操作后,得到的新种群的一部分为下图所示:

图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.用遗传算法求

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1