092遗传算法.docx

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

092遗传算法.docx

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

092遗传算法.docx

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位小数。

解:

运行结果:

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

当前位置:首页 > 求职职场 > 简历

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

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