人工智能实验报告_第1页
人工智能实验报告_第2页
人工智能实验报告_第3页
人工智能实验报告_第4页
人工智能实验报告_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

人工智能第二次试验汇报试验题目:遗传算法的设计与实现试验目的:通过人工智能课程的学习,熟悉遗传算法的简朴应用。试验内容用遗传算法求解f(x)=x2的最大值,x∈[0,31],x取整数。可以看出该函数比较简朴,只要是为了体现遗传算法的思想,在问题选择上,选了一种比较轻易实现的,把重要精力放在遗传算法的实现,以及关键思想体会上。试验过程:实现过程(1)编码使用二进制编码,随机产生一种初始种群。L表达编码长度,一般由对问题的求解精度决定,编码长度L越长,可期望的最优解的精度也就越高,过大的L会增大运算量。针对该问题进行了简化,由于题设中x∈[0,31],因此将二进制长度定为5就够用了;(2)生成初始群体种群规模表达每一代种群中所含个体数目。随机产生N个初始串构造数据,每个串构造数据成为一种个体,N个个体构成一种初始群体,N表达种群规模的大小。当N取值较小时,可提高遗传算法的运算速度,但却减少种群的多样性,轻易引起遗传算法早熟,出现假收敛;而N当取值较大时,又会使得遗传算法效率减少。一般提议的取值范围是20—100。(3)适应度检测根据实际原则计算个体的适应度,评判个体的优劣,即该个体所代表的可行解的优劣。本例中适应度即为所求的目的函数;(4)选择从目前群体中选择优良(适应度高的)个体,使它们有机会被选中进入下一次迭代过程,舍弃适应度低的个体。本例中采用轮盘赌的选择措施,即个体被选择的几率与其适应度值大小成正比;(5)交叉遗传操作,根据设置的交叉概率对交配池中个体进行基因交叉操作,形成新一代的种群,新一代中间个体的信息来自父辈个体,体现了信息互换的原则。交叉概率控制着交叉操作的频率,由于交叉操作是遗传算法中产生新个体的重要措施,因此交叉概率一般应取较大值;但若过大的话,又也许破坏群体的优良模式。一般取0.4到0.99。(6)变异随机选择中间群体中的某个个体,以变异概率大小变化个体某位基因的值。变异为产生新个体提供了机会。变异概率也是影响新个体产生的一种原因,变异概率小,产生新个体少;变异概率太大,又会使遗传算法变成随机搜索。一般取变异概率为0.0001—0.1。(7)结束条件当得到的解不小于等于900时,结束。从而观看遗传的效率问题。代码及成果:/*遗传算法设计最大值*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#defineC0//测试#defineCFLAG4//测试标识#defineJIAOCHA_RATE0.5//交叉概率一般取0.4到0.99#defineBIANYI_RATE0.09//变异概率为0.0001-0.1#defineITER_NUM1000//迭代次数#definePOP_NUM20//染色体个数#defineGENE_NUM5//基因位数#defineFEXP(x)((x)*(x))//y=x^2typedefunsignedintUINT;//染色体typedefstruct{chargeneBit[GENE_NUM];//基因位UINTfitValue;//适应值}Chromosome;//将二进制的基因位转化为十进制UINTtoDec(Chromosomepop){UINTi;UINTradix=1;UINTresult=0;for(i=0;i<GENE_NUM;i++){result+=(pop.geneBit[i]-'0')*radix;radix*=2;}returnresult;}UINTcalcFitValue(UINTx){returnFEXP(x);}voidtest(Chromosome*pop){inti;intj;for(i=0;i<POP_NUM;i++){printf("%d:",i+1);for(j=0;j<GENE_NUM;j++)printf("%c",pop[i].geneBit[j]);printf("%4d",toDec(pop[i]));printf("fixValue=%d\n",calcFitValue(toDec(pop[i])));}}//变异得到新个体:随机变化基因voidmutation(Chromosome*pop){UINTrandRow,randCol;UINTrandValue;randValue=rand()%100;if(randValue>=(int)(BIANYI_RATE*100)){ #if(C==1)&&(CFLAG==4) printf("\n种群个体没有基因变异\n"); #endifreturn;}randCol=rand()%GENE_NUM;//随机产生将要变异的基因位randRow=rand()%POP_NUM;//随机产生将要变异的染色体位#if(C==1)&&(CFLAG==4)printf("\n变异前\n");test(pop);printf("\n变异的位置为:染色体号=%d基因位号=%d\n",randRow+1,randCol);#endifpop[randRow].geneBit[randCol]=(pop[randRow].geneBit[randCol]=='0')?'1':'0';//1变为0,0变为1pop[randRow].fitValue=calcFitValue(toDec(pop[randRow]));#if(C==1)&&(CFLAG==4)printf("\n变异后\n");test(pop);#endif}//创立初始群体voidcreatePop(Chromosome*pop){UINTi,j;UINTrandValue;UINTvalue;srand((unsigned)time(NULL));for(i=0;i<POP_NUM;i++){for(j=0;j<GENE_NUM;j++){randValue=rand()%2;pop[i].geneBit[j]=randValue+'0';//将随机数0或1赋给基因}value=toDec(pop[i]);pop[i].fitValue=calcFitValue(value);}#if(C==1)&&(CFLAG==1)printf("\n随机分派的种群如下:\n");test(pop);#endif}//更新种群voidupdatePop(Chromosome*newPop,Chromosome*oldPop){UINTi;for(i=0;i<POP_NUM;i++){oldPop[i]=newPop[i];}}//选择优良个体:根据适应度选择最优解,即最优个体voidselect(Chromosome*pop){UINTi,j;UINTsumFitValue;//总适应值UINTaFitValue;//平均适应值floatchoice[POP_NUM];//选择ChromosometempPop;//互换变量#if(C==1)&&(CFLAG==2)//测试printf("\n没有选择前的种群如下:\n");test(pop);#endif//根据个体适应度冒泡降序排序for(i=POP_NUM;i>0;i--){for(j=0;j<(i-1);j++){if(pop[j+1].fitValue>pop[j].fitValue){tempPop=pop[j+1];pop[j+1]=pop[j];pop[j]=tempPop;}}}//计算总适应值sumFitValue=0;for(i=0;i<POP_NUM;i++){sumFitValue+=pop[i].fitValue;}aFitValue=(UINT)(((float)sumFitValue/POP_NUM)+0.5);//计算平均适应值//计算出每个群体选择机会,群体的概率=群体适应值/总适应值,平均概率=平均适应值/总适应值,群体选择机会=(群体的概率/平均概率)for(i=0;i<POP_NUM;i++){choice[i]=((float)pop[i].fitValue/sumFitValue)/((float)aFitValue/sumFitValue);choice[i]=(float)((int)(choice[i]*100+0.5)/100.0);//保留到小数点后2位} //根据选择概率来繁殖优良个体,并淘汰较差个体for(i=0;i<POP_NUM;i++){if(((int)(choice[i]+0.55))==0)//假如choice[i]==0淘汰繁殖一次最优的群体pop[POP_NUM-1]=pop[0];}#if(C==1)&&(CFLAG==2)printf("\n通过选择后来的种群:\n");test(pop);#endif}//交叉:基因互换voidcross(Chromosome*pop){chartmpStr[GENE_NUM]="";UINTi;UINTrandPos;UINTrandValue;randValue=rand()%100;if(randValue>=(int)(JIAOCHA_RATE*100)){#if(C==1)&&(CFLAG==3)printf("\n种群没有进行交叉.\n");#endifreturn;}#if(C==1)&&(CFLAG==3)printf("\n交叉前,种群如下:\n");test(pop);printf("\n交叉的位置依次为:");#endif//染色体两两交叉for(i=0;i<POP_NUM;i+=2){randPos=(rand()%(GENE_NUM-1)+1);//产生随机交叉点,范围是1到GENE_NUM-1strncpy(tmpStr,pop[i].geneBit+randPos,GENE_NUM-randPos);strncpy(pop[i].geneBit+randPos,pop[i+1].geneBit+randPos,GENE_NUM-randPos);strncpy(pop[i+1].geneBit+randPos,tmpStr,GENE_NUM-randPos);#if(C==1)&&(CFLAG==3)printf("%d",randPos);#endif}//对个体计算适应度for(i=0;i<POP_NUM;i++){pop[i].fitValue=calcFitValue(toDec(pop[i]));}#if(C==1)&&(CFLAG==3)printf("\n交叉后,种群如下:\n");test(pop);#endif}//输出成果voidresult(Chromosome*pop){UINTi;UINTx=0;UINTmaxValue=0;//函数的最大值for(i=0;i<POP_NUM;i++){if(pop[i].fitValue>maxValue){maxValue=pop[i].fitValue;x=toDec(pop[i]);}}printf("\n当x=%d时,函数得到最大值为:%d\n\n",x,maxVa

温馨提示

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

评论

0/150

提交评论