遗传算法的C语言程序案例_第1页
遗传算法的C语言程序案例_第2页
遗传算法的C语言程序案例_第3页
遗传算法的C语言程序案例_第4页
遗传算法的C语言程序案例_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、共享知识分享快乐卑微如蜷蚁、坚以大象盛年不重来,一日难再晨。及时宜自勉,岁月不待人遗传算法的C语言程序案例一、说明1 本程序演示的是用简单遗传算法随机一个种群,然后根据所给的交叉率,变异率,世代 数计算最大适应度所在的代数2 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后, 由用户在键盘上输入演示程序中规定的命令;相应的输入数据和运算结果显示在其后。3举个例子,输入初始变量后,用 y= (x1*x1)+(x2*x2),其中-2.048=x1,x2=2.048作适应度 函数求最大适应度即为函数的最大值4 程序流程图开始Gen=O5 类型定义int popsize;/

2、种群大小共享知识分享快乐卑微如蜷蚁粵虽似大象int maxgeneration;/ 最大世代数double pc;/ 交叉率double pm;/ 变异率struct in dividualchar chromchromle ngth+1;double value;double fitness;/ 适应度;int gen erati on;/ 世代数int best_ in dex;int worstndex;struct in dividual besti ndividual; / 最佳个体struct in dividual worsti ndividual; / 最差个体struct i

3、n dividual curre ntbest;struct in dividual populatio nPOPSIZE;3 函数声明void gen erate in itialpopulati on();void gen erate nextpopulati on();void evaluatepopulati on();long decodechromosome(char *,i nt,i nt);void calculateobjectvalue();void calculatefit nessvalue();void fin dbesta ndworsti ndividual();

4、void performevoluti on();void selectoperator();void crossoveroperator();void mutati ono perator();void in put();void outputtextreport();6 程序的各函数的简单算法说明如下:(1) void gen eratei ni tialpopulatio n ()和 void in put ()初始化种群和遗传算法参数。input()函数输入种群大小,染色体长度,最大世代数,交叉率,变异率等参数。(2)void calculateobjectvalue();计算适应度函

5、数值。根据给定的变量用适应度函数计算然后返回适度值。(3) 选择函数 selectoperator()在函数selectoperator()中首先用rand ()函数产生01间的选择算子,当适度累计值不为零共享知识分享快乐卑微如蜷蚁、粵雖大象时,比较各个体所占总的适应度百分比的累计和与选择算子,直到达到选择算子的值那个个体就被选出,即适应度为fi的个体以fi/刀的概率继续存在;显然,个体适应度愈高,被选中的概率愈大。但是,适应度小的个体也有可能被选中,以便增加下一代群体的多样性。(4 )染色体交叉函数 crossoveroperator()这是遗传算法中的最重要的函数之一,它是对个体两个变量所

6、合成的染色体进行交叉,而不是变量染色体的交叉,这要搞清楚。首先用rand ()函数产生随机概率,若小于交叉概率,则进行染色体交叉,同时交叉次数加1。这时又要用rand()函数随机产生一位交叉位,把染色体的交叉位的后面部分交叉即可;若大于交叉概率,则进行简单的染色体复制即可。(5 )染色体变异函数mutatio n()变异是针对染色体字符变异的,而不是对个体而言,即个体变异的概率是一样。随机产生比较概率,若小于变异概率,则1变为0, 0变为1,同时变异次数加1。(6) long decodechromosome(char *,int,int)本函数是染色体解码函数,它将以数组形式存储的二进制数转

7、成十进制数,然后才能用适应度函数计算。(7) void findbestandworstindividual()本函数是求最大适应度个体的,每一代的所有个体都 要和初始的最佳比较,如果大于就赋给最佳。(8) void outputtextreport () 输出种群统计结果输出每一代的种群的最大适应度和平均适应度,最后输出全局最大值二、运行环境本程序的开发工具是VC+,在VC+下运行。源代码#i ncludestdafx.h#i nclude |#in clude #in clude /The definiton of user data 定义用户数据 Illi#defi ne Cmax 10

8、0 /certa in maximal value #define Cmin 0 /certain minimum value#defi ne LENGHT1 3#defi ne LENGHT2 3/总染体长度#defi ne CHROMLENGTH LENGHT1+LENGHT2const int MaxGe nerati on = 100;const int PopSize = 10;const double Pc = 0.6;con st double Pm = 0.001;/ 数据结构定义 /struct In dividualchar chromCHROMLENGTH + 1;dou

9、ble value;double fitn ess;共享知识分享快乐皋微如蜷蚁、粵虽似大象; int gen erati on ;int bestI ndex;int worstI ndex;In dividual bestI ndividual ;In dividual worst In dividual ;/ best in dividual by nowIn dividual curre ntBest ;In dividual populati on PopSize;/ void gen erate In itialPopulati on();void gen erateNextPopu

10、lati on();void evalutePopulati on();long decomdeChromosome(char*, in t, i nt);void calculateObjectValue();void calculateFit nessValue();void fin dBestA ndWorstl ndividual();void performEvoluti on();void select ionO perator();void crossoverOperator();void mutati onO perator();void outputTextReport();

11、/以上为函数以及全局变量定义部分 int mai n()gen erati on = 0;gen erate In itialPopulati on(); evalutePopulati on();while (ge nerati on MaxGe nerati on) gen erati on+;gen erateNextPopulati on(); evalutePopulati on(); performEvoluti on(); outputTextReport();system(pause);return 0;共享知识分享快乐皋微如蜷蚁坚以大象/IIIIII产生第一代样本/void

12、gen erate In itialPopulati on() int i, j;sran d( un sig ned)time(NULL);for (i = 0; i PopSize; i+) for (j = 0; j CHROMLENGTH; j+) populatio ni.chromj = (ra nd() % 10) 5) ? O : 1;populatio ni.chromCHROMLENGTH =70:/产生下一代样本/void gen erateNextPopulati on() select ionO perator(); |crossoverOperator();muta

13、ti onO perator();变异算子void mutati onO perator() int i, j;double p;/ bit mutati onfor (i = 0; i PopSize; i+) for (j = 0; j CHROMLENGTH; j+) p = ran d() % 1000 / 1000.0;if (p Pm) populatio ni.chromj = (populatio ni.chromj = 0) ? 1: 0; /交叉算子/void crossoverOperator() int i, j;int in dexPopSize;int point,

14、 temp;double p;共享知识分享快乐皋微如蜷蚁、粵雖大象char ch;for (i = 0; i PopSize; i+) in dexi = i;for (i = 0; i PopSize; i+) point = ran d() %(PopSize - i);temp = in dexi;in dexi = in dexpo int + i;in dexpo int + i = temp;for (i = 0; i PopSize - 1; i+=2) p = ran d() % 1000 / 1000.0;if (p Pc) point = rand()% (CHROMLEN

15、GTH - 1) + 1;for (j = poi nt; j CHROMLENGTH; j+) ch = populati on i ndexi.chromj;populati on i ndexi.chromj = populati on i ndexi + 1.chromj;populati on i ndexi + 1.chromj = ch;/选择算子 /void select ionO perator() in t i, i ndex;double p, sum = 0.0;double cfitn essPopSize;In dividual n ewpopulati on Po

16、pSize;for (i = 0; i PopSize; i+) sum += populatio ni.fit ness;for (i = 0; i PopSize; i+) cfitn essi = populati on i.fit ness / sum; / calculate cumulative fitn ess for (i = 1; i PopSize; i+) cfitn essi = cfitn essi + cfitn essi - 1; for (i = 0; i cfitn essi ndex) in dex+;n ewpopulati on i = populati

17、 on i ndex;for (i = 0; i PopSize; i+) populati on i = n ewpopulati on i; /共享知识分享快乐卑微如罐蛟、竖副欢象/依据某些公式对样本进行评价1111void evalutePopulati on() calculateObjectValue();calculateFit nessValue();fin dBestA ndWorstl ndividual(); / |/找出到目前为止最好的个体/void fin dBestA ndWorstl ndividual() int i;double sum = 0.0;bestI

18、ndividual = populati on 0;worstI ndividual = populati on 0;for (i = 0; i bestIndividual.fitness) bestI ndividual = populati on i;bestI ndex = i; else if (populationi.fitness curre ntBest.fit ness) curre ntBest = bestl ndividual; |计算适应度IIIvoid calculateFit nessValue() int i;long temp1, temp2; |double

19、 x1, x2; |for (i = 0; i PopSize; i+) temp1 = decomdeChromosome(populatio ni.chrom, 0, LENGHT1);temp2 = decomdeChromosome(populatio ni.chrom, LENGHT1, LENGHT2); x1 = temp1 * temp1;x2 = temp2 * temp2;populationi.fitness = x1+x2; x1平方加上 x2 平方共享知识分享快乐皋微如蜷蚁、粵雖大象/计算目标值 / 目标函数为 f(x) = x1* x1 + x2*x2 void calculateObjectValue() int i;long temp1, temp2; double x1, x2;for (i = 0; i PopSize; i+) temp1 = decomdeChromosome(populatio ni.chrom, 0, LENGHT1);temp2 = decomdeChromosome(populatio ni.chrom, LENGHT1, LENGHT2); x1 = temp1 * temp1;x2 = temp2 * temp2;populati

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论