版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
人工智能实验报告学号:姓名:实验名称:遗传算法实验日期:2023.1.5ﻬ【实验名称】遗传算法【实验目的】掌握遗传算法的基本原理,熟悉遗传算法的运营机制,学会用遗传算法来求解问题。【实验原理】遗传算法(GeneticAlgorithm)是模拟HYPERLINK""\t""达尔文HYPERLINK""\t""生物进化论的自然选择和HYPERLINK""\t""遗传学机理的生物进化过程的计算HYPERLINK""\t""模型,是一种通过模拟自然进化过程搜索HYPERLINK""\t""最优解的方法。遗传算法是从代表问题也许潜在的解集的一个HYPERLINK""种群开始的,而一个种群则由通过HYPERLINK""基因编码的一定数目的个体组成。每个个体事实上是HYPERLINK""\t""染色体带有特性的实体。在一开始需要实现从HYPERLINK""\t""表现型到基因型的HYPERLINK""\t""映射即HYPERLINK""\t""编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化,如HYPERLINK""\t""二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的HYPERLINK""\t""适应度大小选择个体,并借助于自然遗传学的遗传HYPERLINK""\t""算子进行组合交叉和变异,产生出代表新的解集的种群。这个过程将导致种群像自然进化同样的后生代种群比前代更加适应于环境,末代种群中的最优个体通过HYPERLINK""\t""解码,可以作为问题近似最优解。遗传算法限度流程图为:【实验内容】题目:已知f(x)=x*sin(x)+1,xÎ[0,2p],求f(x)的最大值和最小值。数据结构:structpoptype{ doublegene[length];//染色体ﻩdoublerealnumber;//相应的实数x doublefitness;//适应度ﻩdoublerfitness;//相对适应度ﻩdoublecfitness;//累计适应度};structpoptypepopulation[popsize+1];//最后一位存放max/minstructpoptypenewpopulation[popsize+1];//染色体编码:,变量长度为2π,取小数点后6位,由于因此,染色体由23位字节的二进制矢量表达,则X与二进制串(<b22b21……b0>)2之间的映射如下:;适应度函数:由于规定f(x)的最值,所以适应度函数即可为f(x)。但为了保证在轮赌法选择过中,每个个体都有被选中的也许性,因此需要将所有适应度调整为大于0的值。因此,设计求最大值的适应度函数如下:将最小问题转化为求-f(x)的最大值,同理,设计最小值的适应度函数如下:种群大小:本实验默认为50,再进行种群初始化。实验参数:重要有迭代数,交叉概率,变异概率这三个参数。一般交叉概率在0.6-0.9范围内,变异概率在0.01-0.1范围内。可以通过手动输入进行调试。重要代码如下:voidinitialize()//种群初始化{ srand(time(NULL)); inti,j; for(i=0;i<popsize;i++)ﻩ for(j=0;j<23;j++)ﻩ population[i].gene[j]=rand()%2;voidtransform()//染色体转化为实数x{ﻩinti,j;ﻩfor(i=0;i<=popsize+1;i++) {ﻩﻩpopulation[i].realnumber=0;ﻩﻩfor(j=0;j<23;j++) ﻩ population[i].realnumber+=population[i].gene[j]*pow(2,j); population[i].realnumber=population[i].realnumber*2*pi/(pow(2,23)-1);}}voidcal_fitness()//计算适应度{ﻩinti;ﻩfor(i=0;i<popsize;i++) population[i].fitness=population[i].realnumber*sin(population[i].realnumber)+6;}voidselect()//选择操作{ﻩintmem,i,j,k; doublesum=0;ﻩdoublep; for(mem=0;mem<popsize;mem++)ﻩﻩsum+=population[mem].fitness;ﻩfor(mem=0;mem<popsize;mem++) ﻩpopulation[mem].rfitness=population[mem].fitness/sum;ﻩpopulation[0].cfitness=population[0].rfitness; for(mem=1;mem<popsize;mem++) population[mem].cfitness=population[mem-1].cfitness+population[mem].rfitness;ﻩfor(i=0;i<popsize;i++) {//轮赌法选择机制 p=rand()%1000/1000.0; if(p<population[0].cfitness)ﻩ newpopulation[i]=population[0];ﻩ else{ﻩﻩ for(j=0;j<popsize;j++) ﻩﻩ if(p>=population[j].cfitness&&p<population[j+1].cfitness)ﻩﻩﻩ newpopulation[i]=population[j+1]; ﻩ}}for(i=0;i<popsize;i++)//复制给下一代population[i]=newpopulation[i];}voidcross()//交叉操作{ inti,mem,one; intfirst=0;ﻩdoublex;ﻩfor(mem=0;mem<popsize;mem++) {ﻩ x=rand()%1000/1000.0; if(x<pcross) {ﻩ ﻩ++first;ﻩﻩ if(first%2==0)Xover(one,mem);//个体间染色体进行交叉函数ﻩ ﻩelseone=mem;}}}voidmutate()//变异操作{ﻩinti,j,t; doublex; for(i=0;i<popsize;i++)ﻩﻩfor(j=0;j<length;j++) {ﻩ ﻩx=rand()%1000/1000.0;ﻩﻩif(x<pvariation)ﻩﻩ{ﻩﻩﻩif(population[i].gene[j])population[i].gene[j]=0; ﻩ elsepopulation[i].gene[j]=1;}}}voidcal_max()//计算最大值{ﻩinti; doublemax,sum=0; intmax_m; max=population[0].fitness; for(i=0;i<popsize-1;i++) {ﻩ if(population[i].fitness>population[i+1].fitness) ﻩ if(population[i].fitness>=max) ﻩﻩ{ ﻩﻩﻩmax=population[i].fitness;ﻩ ﻩ max_m=i; }ﻩﻩelseif(population[i+1].fitness>=max) ﻩﻩ{ﻩ ﻩﻩmax=population[i+1].fitness;ﻩ ﻩﻩmax_m=i+1;ﻩ} }ﻩif(max>population[popsize].fitness)ﻩ{ ﻩiteration=0; for(i=0;i<length;i++) population[popsize].gene[i]=population[max_m].gene[i];ﻩﻩpopulation[popsize].fitness=population[max_m].fitness;} for(i=0;i<length;i++)ﻩﻩ sum=population[popsize].gene[i]-population[max_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论