ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:78.46KB ,
资源ID:16332244      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16332244.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(遗传算法求解yx2副本Word格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

遗传算法求解yx2副本Word格式.docx

1、的适应值,显然,适应值最高的个体被随机选定的概率就越大,被选择的次数就越多,从而被繁殖的次数也就越多。(2)单点交叉。单点交叉又称简单交叉,是遗传算法所使用的交叉操作方法。选择一个交叉点,子代在交叉点前面的基因从一个父代基因那里得到,后面的部分从另外一个父代基因那里得到。如:交叉前:100|10101|01交叉后:100|01101|10(3)基本位变异。基本位变异石最简单和最基本的变异操作,也是基本遗传算法中所使用的变异操作方法。对于基本遗传算法中用二进制编码符号串所表示的个体,对需要进行变异操作的某一基因,若原有基因值为0,则变异操作将该基因值变为1;反之,若原有基因值为1,则变异操作将其

2、变为0.基本位变异算子是指对个体编码串随机指定的某一位或某几位基因作变异运算。对于基本遗传算法中用二进制编码符号串所表示的个体,若需要进行变异操作的某一基因座上的原有基因值为0,则变异操作将其变为1;反之,若原有基因值为1,则变异操作将其变为0。变异前:1001|0变异后:1001|1(4)基本遗传算法的运行参数本例中指定四个基本参数种群大小:popsize最大世代数 maxgeneration交叉率pc 变异率pm至于遗传算法的终止条件,还可以利用某种判定准则,当判定出群体已经进化成熟且不再有进化趋势时就可终止算法的运行过程。如连续几代个体平均适应度的差异小于某一个极小的值;或者群体中所有个

3、体适应度的方差小于某一个极小的值。这4个参数对遗传算法的搜索结果及搜索效率都有一定的影响,目前尚无合理选择它们的理论根据在遗传算法的实际应用中,往往需要经过多次的试算后才能确定出这些参数合理的取值范围或取值大小4、遗传算法的应用步骤如下:遗传算法提供了一种求解复杂系统优化问题的通用框架,它不依赖于问题的领域和种类。对一个需要进行优化计算的实际应用问题,一般可按下述步骤来构造求解该问题的遗传算法。第一步:建立优化模型,即确定出目标函数、决策变量及各种约束条件以及数学描述形式或量化方法。第二步:确定表示可行解的染色体编码方法,也即确定出个体的基因型x及遗传算法的搜索空间。第三步:确定解码方法,即确

4、定出个体基因型x到个体表现型x的对应关系或转换方法。第四步:确定个体适应度的量化评价方法,即确定出由目标函数值到个体适应度的转换规则。第五步:设计遗传操作方法,即确定出选择运算、交叉运算、变异运算等具体操作方法。第六步:确定遗传算法的有关运行参数,即确定出遗传算法的种群大小(popsize)、最大世代数 (maxgeneration)、交叉率(pc)、变异率(pm)等参数。由上述构造步骤可以看出,可行解的编码方法、遗传操作的设计是构造遗传算法时需要考虑的两个主要问题,也是设计遗传算法时的两个关键步骤。对不同的优化问题需要使用不同的编码方法和不同的遗传操作,它们与所求解的具体问题密切相关,因而对

5、所求解问题的理解程度是遗传算法应用成功与否的关键。本例c语言代码/遗传算法 解决 y=x2问题/编译环境 vc+6.0/声明:部分代码来自网#include #includetime.hmath.h#define POPSIZE 500 /种群大小#define chromlength 5 /染色体长int popsize ; /种群大小int maxgeneration; /最大世代数double pc = 0.0; /交叉率double pm = 0.0; /变异率struct individual /定义染色体个体结构体 int chromchromlength; /定义染色体二进制表达

6、形式,edit by ppme 将char 转为 int double value; /染色体的值 double fitness; /染色体的适应值;int generation; /当前执行的世代数int best_index; /最好的染色体索引序号int worst_index; /最差的染色体索引序号struct individual bestindividual; /最佳染色体个体struct individual worstindividual; /最差染色体个体struct individual currentbest; /当前最好的染色体个体 currentbeststruct

7、 individual populationPOPSIZE;/种群数组/函数声明 void generateinitialpopulation(); /ok-初始化当代种群 void generatenextpopulation(); /产生下一代种群void evaluatepopulation(); /评价种群void calculateobjectfitness(); /计算种群适应度double decodechromosome(int,int); /染色体解码void findbestandworstindividual(); /寻找最好的和最坏的染色体个体void performe

8、volution(); /进行演变进化void selectoperator(); /选择操作void crossoveroperator(); /交换操作void mutationoperator(); /变异操作void input(); /输入接口void outputtextreport(); /输出文字报告void main() /主函数 int i; srand(unsigned)time(NULL); /强制类型转化,以当前时间戳定义随机数种子 printf(本程序为求函数y=x*x的最大值n); generation=0; /初始化generation当前执行的代 input(

9、); /初始化种群大小、交叉率、变异率 /*edit by ppme*/ /调试用。显示input()结果种群规模(popsize): %d;n最大世代数(maxgeneration) %d;n交叉率(pc) %f;变异率(pm) %fnn,popsize,maxgeneration,pc,pm); generateinitialpopulation(); /产生初始化种群 evaluatepopulation(); /评价当前种群,(A.计算种群/个体的适应度;B.找出最好和最差的个体) while(generationmaxgeneration) /小于最大世代数,执行循环体 genera

10、tion+; generatenextpopulation(); /生成子代种群(A.选择; B.交叉; C.变异) evaluatepopulation(); /评价新生子代种群 performevolution(); /进行子代进化 outputtextreport(); /输入当代最终种群 n 统计结果: 最大函数值等于:%fn,currentbest.fitness);其染色体编码为: /计算currentbest的value for( i = 0 ; i chromlength ; i+ ) printf( %d,currentbest.chromi);void generatein

11、itialpopulation( ) /种群初始化 int i,j; for (i=0;ipopsize; i+) for(j=0;jchromlength;j+) populationi.chromj=(rand()%105)?0:1; /rand()%10随机产生0-9的整数 /,小于5标注0,否则标注1 /调试显示初始化结果显示初始化结果: for(i = 0 ; popsize ; for(j = 0 ; j = 0 ; i- ) decimal += populationpop_index.chromi*pow(2,i); /遍历染色体二进制编码, return (decimal);

12、 /并计算出其10进制的value值void findbestandworstindividual( ) /求最佳个体和最差个体 double sum=0.0; bestindividual=population0; worstindividual=population0; for (i=1; if (populationi.fitnessbestindividual.fitness) /依次比较,找出最佳个体 bestindividual=populationi; best_index=i; else if (populationi.fitness=currentbest.fitness)/

13、第n代最好的,通过比较大于以往最好个体的话, /暂时存放在currentbest currentbest=bestindividual;void performevolution() /演示评价结果 if (bestindividual.fitnesscurrentbest.fitness) currentbest=populationbest_index; populationworst_index=currentbest;void selectoperator() /比例选择算法 int i,index; double p,sum=0.0; /p存放随机概率,sum存放个体适应率和累计适应

14、率 double cfitnessPOPSIZE; /当代种群染色体个体的适应率 struct individual newpopulationPOPSIZE; /新种群 srand(unsigned) time(NULL); /种下随机种子i+) / /sum存放种群适应值总和 i+) cfitnessi=populationi.fitness/sum; / cfitness = fitness/sum得到个体适应率 for(i=1; cfitnessi=cfitnessi-1+cfitnessi; /cfitness= cfitnessi-1+cfitnessi得到种群 /累计适应率i+)

15、 /for循环实现轮盘赌算法 p=rand()%1000/1000.0; /得到千分位小数 index=0; while (pcfitnessindex) index+; newpopulationi=populationindex; /选出的个体组成新的一代,暂时存放于newpopulation中 populationi=newpopulationi; /全局变量populaiton存放新的种群(有重复的值)void crossoveroperator() /交叉算法 int indexPOPSIZE; int point,temp; double p;i+) /初始化index数组 ind

16、exi=i;i+) /for 循环实现种群内随机两两交换 point=rand()%(popsize-i); /打乱种群顺序 temp=indexi; indexi=indexpoint+i; indexpoint+i=temp;popsize-1;i+=2) if (ppc) /单点交叉算法 point=rand()%(chromlength-1)+1; for (j=point; jj+) temp=populationindexi.chromj; populationindexi.chromj=populationindexi+1.chromj; populationindexi+1.c

17、hromj=temp; void mutationoperator() /变异操作i+) p=rand()%1000/1000.0; if (ppm) populationi.chromj=(populationi.chromj=0)?1:0;void input() /数据输入初始化全局变量:种群大小(4-500偶数): scanf(%d, &popsize); /输入种群大小,必须为偶数 if(popsize%2) != 0) 种群大小已设置为偶数n popsize+; ;最大世代数(10-300): /输入最大世代数maxgeneration);交叉率(0.2-1.0): /输入交叉率%

18、lfpc);变异率(0.00): /输入变异率pm);void outputtextreport()/数据输出 double sum; double average; sum=0.0; sum+=populationi.value; average=sum/popsize;当前世代=%dn当前世代染色体平均值=%fn当前世代染色体最高值=%fn,generation,average,populationbest_index.value);运行结果:/*本程序为求函数y=x*x的最大值450.90.01 4;最大世代数(maxgeneration) 5;交叉率(pc) 0.900000;变异率(pm) 0.010000 0 1 0 0 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 1显示当前种群结

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

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