为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

遗传算法求y等于x平方 5最优解[应用]

2017-11-13 10页 doc 25KB 41阅读

用户头像

is_721103

暂无简介

举报
遗传算法求y等于x平方 5最优解[应用]遗传算法求y等于x平方 5最优解[应用] 遗传算法求y等于X平方+5最优解 一、编码以及初始种群的产生 二、适应度函数 一般情况下,染色体(也叫个体,或一个解)的适应度函数为目标函数的线性组合。本文直接以目标函数作为适应度函数。即每个染色体的适应度值就是它的目标函数值,f(x)=-x2+ 5。 三、选择算子 初始种群产生后,要从种群中选出若干个体进行交叉、变异,那么如何选择这些个体呢,选择方法就叫做选择算子。一般有轮盘赌选择法、锦标赛选择法、排序法等。本文采用排序法来选择,即每次选择都选出适应度最高的两个个体。那么执行...
遗传算法求y等于x平方 5最优解[应用]
遗传算法求y等于x平方 5最优解[应用] 遗传算法求y等于X平方+5最优解 一、编码以及初始种群的产生 二、适应度函数 一般情况下,染色体(也叫个体,或一个解)的适应度函数为目标函数的线性组合。本文直接以目标函数作为适应度函数。即每个染色体的适应度值就是它的目标函数值,f(x)=-x2+ 5。 三、选择算子 初始种群产生后,要从种群中选出若干个体进行交叉、变异,那么如何选择这些个体呢,选择就叫做选择算子。一般有轮盘赌选择法、锦标赛选择法、排序法等。本文采用排序法来选择,即每次选择都选出适应度最高的两个个体。那么执行一次选择操作后,得到的新种群的一部分为下图所示: 五、变异 变异就是对染色体的结构进行变异,使其改变原来的结构(值也就改变),达到突变进化的目的。变异操作也要遵从一定的概率来进行,一般设置为0到0.5之间。本文的变异方法直接采取基因位反转变异法,即0变为1,1变为0。要进行变异的基因位的选取也是随机的。 六、终止规则 遗传算法是要一代一代更替的,那么什么时候停止迭代呢,这个规则就叫终止规则。一般常用的终止规则有:若干代后终止,得到的解达到一定目标后终止,计算时间达到一定限度后终止等方法。本文采用迭代数来限制。 七、代码如下: #include //调用输入输出函数所需要的头文件 #include //调用getche函数所需要的头文件 #include //调用随机函数所需要的头文件 typedef struct Chrom // 结构体类型,为单个染色体的结构; { short int bit[6]; int fit; }chrom; void *evpop(chrom popcurrent[4]); //定义将会用到的几个函数; int x(chrom popcurrent); int y(int x); void *pickchroms(chrom popcurrent[4]); void *crossover(chrom popnext[4]); void *mutation(chrom popnext[4]); void main() // 主函数; { int num; // 迭代次数; int i,j,l,Max,k; Max=0; // 函数最大 值 printf("/nWelcome to the Genetic Algorithm coded by Luay Al-wesi,editd by xujinpeng/n"); // introduction to the program,欢迎词; printf("The Algorithm is based on the function y = -x^2 + 5 to find the maximum value of the function./n"); enter:printf("/nPlease enter the no. of iterations/n 请输 入您要设定的迭代数: "); scanf("%d",&num); // 输入迭代 次数,传送给参数num; chrom popcurrent[4]; // 初始种群 规模为4; chrom popnext[4]; // 更新后种 群规模仍为4; if(num<1) goto enter; // 判断输入 的迭代次数是否为负或零,是的话重新输入; evpop(popcurrent); // 随机产生 初始种群; for(i=0;i Max) { Max=popcurrent[l].fit; k=l; } } printf("/n当x等于%d时,函数得到最大值为:%d ",k,Max); printf("/nPress any key to end ! "); flushall(); // 清除所有缓冲区; getche(); // 从控制台取字符,不以回车为结束; } void *evpop(chrom popcurrent[4]) // 函数:随机生成初始种群; { int i,j,value; int random; for(j=0;j<4;j++) // 从种群中的第1个染色体到第4个染色体 { for(i=0;i<6;i++) // 从染色体的第1个基因位到第6个基因位 { random=rand(); // 产生一个随机值 random=(random%2); // 随机产生0 或者1 popcurrent[j].bit[i]=random; // 随机产生 染色体上每一个基因位的值,0或1; } value=x(popcurrent[j]); // 将二进制 换算为十进制,得到一个整数值; popcurrent[j].fit=y(x(popcurrent[j])); // 计算染色 体的适应度值; printf("/n popcurrent[%d]=%d%d%d%d%d%d value=%d fitness = %d",j,popcurrent[j].bit[5],popcurrent[j].bit[4],popcurrent[j].bit[3],popcurrent[j].bit[2],popcurrent[j].bit[1],popcu rrent[j].bit[0],value,popcurrent[j].fit); // 输出整条染 色体的编码情况, } return(0); } int x(chrom popcurrent) // 函数:将二 进制换算为十进制; { int z; z=(popcurrent.bit[0]*1)+(popcurrent.bit[1]*2)+(popcurrent.bit[2]*4)+(popcurrent.bit[3]*8)+(popcurrent.bit[4]*16); if(popcurrent.bit[5]==1) { z=z*(-1); // 考虑到符号; } return(z); } int y(int x) // 函数:求个体的适应度; { int y; y=-(x*x)+5; // 目标函数: y= - ( x^ 2 ) +5; return(y); } void *pickchroms(chrom popcurrent[4]) // 函数:选择个体; { int i,j; chrom temp; // 中间变量 for(i=0;i<3;i++) // 根据个体适应度来排序;(冒泡法) { for(j=0;j<3;j++) { if(popcurrent[j+1].fit>popcurrent[j].fit) { temp=popcurrent[j+1]; popcurrent[j+1]=popcurrent[j]; popcurrent[j]=temp; } } } for(i=0;i<4;i++) { printf("/nSorting:popnext[%d] fitness=%d",i,popcurrent[i].fit); printf("/n"); } flushall(); return(0); } void *crossover(chrom popnext[4]) // 函数:交叉操作; { int random; int i; random=rand(); // 随机产生交叉点; random=((random%5)+1); // 交叉点控 制在1到5之间; for(i=0;i
/
本文档为【遗传算法求y等于x平方 5最优解[应用]】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索