遗传算法求y等于x平方 5最优解[应用]遗传算法求y等于x平方 5最优解[应用]
遗传算法求y等于X平方+5最优解
一、编码以及初始种群的产生
二、适应度函数
一般情况下,染色体(也叫个体,或一个解)的适应度函数为目标函数的线性组合。本文直接以目标函数作为适应度函数。即每个染色体的适应度值就是它的目标函数值,f(x)=-x2+ 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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。