版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
..实验一遗传算法解决函数优化问题一、实验目的1.掌握遗传算法的基本原理和步骤。2.复习VB、VC的基本概念、基本语法和编程方法,并熟练使用VB或VC编写遗传算法程序。二、实验内容1.上机编写程序,解决以下函数优化问题:2.调试程序。3.根据实验结果,撰写实验报告。三、实验原理遗传算法是一类随机优化算法,但它不是简单的随机比较搜索,而是通过对染色体的评价和对染色体中基因的作用,有效地利用已有信息来指导搜索有希望改善优化质量的状态。标准遗传算法流程图如下图所示,主要步骤可描述如下:随机产生一组初始个体构成初始种群。计算每一个体的适配值〔fitnessvalue,也称为适应度。适应度值是对染色体<个体>进行评价的一种指标,是GA进行优化所用的主要信息,它与个体的目标值存在一种对应关系。判断算法收敛准则是否满足,若满足,则输出搜索结果;否则执行以下步骤。根据适应度值大小以一定方式执行复制操作〔也称为选择操作。按交叉概率pc执行交叉操作。按变异概率pm执行变异操作。返回步骤②。NNN计算各个体的适配值〔适应度算法收敛准则满足?Yrandom[0,1]<Pc?复制〔选择输出搜索结果交叉Yrandom[0,1]<Pm?变异N随机产生初始种群Y图1.1标准遗传算法流程图四、程序代码..#include<stdio.h>#include<math.h>#include<stdlib.h>#include<time.h>#definebyteunsignedchar#definestep200//步长#defineMAX50 #defineN10//随机数个数#definePc0.74//被选择到下一代的概率,个数=Pc*N,小于N下一代数=上一代,不用处理#definePt0.25//交叉的概率,个数=Pt*N舍,小于N0~<n2+1>随机数,之后部分开始交叉#definePm0.01//变异的概率,个数=Pm*N*n2入,小于N0~<N*<n2+1>>随机数/<n2+1>=个体,0~<N*<n2+1>>随机数%<n2+1>=该个体基因位置#definen215//2的15次方,共16位#definenext_t<int><Pt*N>//交叉个数#definenext_m<int><Pm*N+1>//变异个数向后约等于#definee0.001//次数限制阈值/*intN=10;//随机数个数floatPc=0.74;//被选择到下一代的概率,个数=Pc*N,小于N下一代数=上一代,不用处理floatPt=0.25;//交叉的概率,个数=Pt*N舍,小于N0~<n2+1>随机数,之后部分开始交叉floatPm=0.01;//变异的概率,个数=Pm*N*n2入,小于N0~<N*<n2+1>>随机数/<n2+1>=个体,0~<N*<n2+1>>随机数%<n2+1>=该个体基因位置*/bytebitary[N][n2+1],bitary0[N][n2+1];//二进制intsrc1[N];floatShowType<inta>;//表现型voidBinNum<inta>;//二进制位数n2floatfit_func<floata>;//适应度voidDecToBin<intsrc,intnum>;//十进制转二进制voidBinToDec<void>;//十进制转二进制intselectT<floata,floatb[10]>;//选择交叉个体intselectM<floata,floatb[10]>;//选择变异个体voidmain<void>{//范围是[-100,100]*************************** intsrc[N],i=0,j=0,k=0,count=0;//十进制 floatshow[N];//表现型 floatfit[N],sumfit=0;//适应度 floatpcopy[N];//优胜劣汰,遗传到下一代的概率fit[i]/总和<fit[i]> floatpacc[N];//pcopy[i]累加概率值 floatprand[N];//随机产生N个0~1的下一代概率 intiselect;//根据概率选择到的个体序号 intnew_select[N];//根据概率选择到的个体 intnew_T[next_t],new_M[next_m]; floatmin,min1; printf<"随机数<原始母体>,表现型,适配值\n">; srand<<unsigned>time<NULL>>; for<i=0;i<N;i++> { src[i]=rand<>%32768;//rand<>%201-100===>-100~100的十进制随机数 随时间递增 show[i]=ShowType<src[i]>;//转化成表现型 fit[i]=fit_func<show[i]>;//计算各个适配值<适应度> sumfit=sumfit+fit[i];//种群的适应度总和 printf<"%5d,%f,%f\n",src[i],show[i],fit[i]>; } printf<"\n第%d代适配总值\n%f\n",count,sumfit>;//第0代 count++; min=sumfit; printf<"\n遗传到下一代的概率\n">; for<i=0;i<N;i++> { pcopy[i]=fit[i]/sumfit; printf<"%f,",pcopy[i]>; }//求选择<被复制>的累加概率,用于轮盘赌产生随机数区域,选择下一代个体 printf<"\n遗传到下一代的累加概率\n">; pacc[0]=pcopy[0]; for<i=1;i<N;i++> { pacc[i]=pacc[i-1]+pcopy[i]; printf<"%f,",pacc[i]>; }//每个src[N]都随机取其中一个pcopy,取得的值pcopy[i]跟pcopy概率大小有关//模拟轮盘赌方式选择新一代 printf<"\n\n新产生的第%d代,表现型,适配值\n",count>; srand<<unsigned>time<NULL>>; for<i=0;i<N;i++> { prand[i]=<float><<rand<>%101>*0.01>;//0~1的十进制小数,精确到0.01 iselect=selectT<prand[i],pacc>; new_select[i]=src[iselect];//产生的新一代,十进制 show[i]=ShowType<new_select[i]>;//转化成表现型 fit[i]=fit_func<show[i]>; DecToBin<new_select[i],i>; sumfit=sumfit+fit[i];//种群的适应度总和 printf<"%d%f%f\n",new_select[i],show[i],fit[i]>; } printf<"\n第%d代适配总值\n%f\n",count,sumfit>;//第1代 min1=sumfit; if<min>sumfit> { min1=min; min=sumfit; } while<fabs<min-min1>>e&&count<MAX> { //从新一代选择个体交叉 printf<"\n随机产生交叉个体号">; srand<<unsigned>time<NULL>>; for<i=0;i<2;i++>//简单起见交叉数设为2 { new_T[i]=rand<>%N;//0~10的十进制数 产生的交叉个体 if<i>0>//两个不同个体交叉 while<new_T[i]==new_T[i-1]> new_T[i]=rand<>%N; printf<"%d,",new_T[i]>; } srand<<unsigned>time<NULL>>;//随机产生交叉位置 k=rand<>%n2;//0~14的十进制数 printf<"\n随机产生交叉位置%d\n",k>; printf<"\n原编码\n">; for<j=n2;j>=0;j--> printf<"%c",bitary[new_T[0]][j]>; printf<"\n">; for<j=n2;j>=0;j--> printf<"%c",bitary[new_T[1]][j]>; printf<"\n位置%d后交叉编码\n",k>; chartemp; for<i=k+1;i<n2+1;i++>//交叉 { temp=bitary[new_T[0]][i]; bitary[new_T[0]][i]=bitary[new_T[1]][i]; bitary[new_T[1]][i]=temp; } for<j=n2;j>=0;j--> printf<"%c",bitary[new_T[0]][j]>; printf<"\n">; for<j=n2;j>=0;j--> printf<"%c",bitary[new_T[1]][j]>; //从新一代选择个体变异 printf<"\n随机产生变异个体号">; srand<<unsigned>time<NULL>>; for<i=0;i<1;i++>//简单起见变异数设为1个 { new_M[i]=rand<>%N;//0~9的十进制数 产生的变异个体 k=rand<>%<n2+1>;//0~15的十进制数 printf<"%d\n编码位置%d\n原编码\n",new_M[i],k>; for<j=n2;j>=0;j--> printf<"%c",bitary[new_M[i]][j]>; if<bitary[new_M[i]][k]=='0'>//变异取反 bitary[new_M[i]][k]='1'; elsebitary[new_M[i]][k]='0'; printf<"\n位置%d变异后编码\n",k>; for<j=n2;j>=0;j--> printf<"%c",bitary[new_M[i]][j]>; } printf<"\n">; count++; //新的bitary即产生第二代 printf<"\n新产生的第%d代\n",count>; for<i=0;i<N;i++> { for<j=n2;j>=0;j--> printf<"%c",bitary[i][j]>; printf<"\n">; } BinToDec<>;//二进制转十进制for<i=0;i<N;i++> { new_select[i]=src1[i]; show[i]=ShowType<src[i]>;//转化成表现型 fit[i]=fit_func<show[i]>;//计算各个适配值<适应度> sumfit=sumfit+fit[i];//种群的适应度总和 printf<"%5d,%f,%f\n",src1[i],show[i],fit[i]>; } printf<"\n第%d代适配总值\n%f\n",count,sumfit>; if<sumfit<min> { min1=min; min=sumfit; } }printf<"\n\n\n*****************\nover\n*****************\n",sumfit>;}//////////////////////////子函数////////////////floatShowType<inta>{ floattemp; temp=<float><a*200.0/32767-100>;//<2的15次方减1>=32767 returntemp;}floatfit_func<floata>{ floattemp; temp=a*a; returntemp;}voidDecToBin<intsrc,intnum>{ inti; //注意负数的补码 if<src<0> { src=<int>pow<2,16>-abs<src>; } for<i=0;i<=n2;i++> { bitary[num][i]='0'; bitary0[num][i]='0'; if<src> { bitary[num][i]=<src%2>+48; bitary0[num][i]=<src%2>+48; src=<int><src/2>; } }}voidBinToDec<void>{ inti,j; for<i=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论