遗传算法的浮点数编码JAVA,遗传算法(浮点数编码).doc

遗传算法(浮点数编码).doc

浮点数编码实现遗传算法

遗传算法主要包括三个主要操作,选择、交叉和变异。用浮点数编码进行运算,三种操作方法如下:和

计算

累计概率

产生均匀分布0~1的随机数r

将r与比较,如果,则选择个体i进入到下一代新群体

反复执行4和5,直至新群体的个体数目等于父代群体规模

交叉:

其中,和是交叉之后的个体,和是随机选择的两个个体,是交叉的一个常数, 取值为。

变异:

是变异之后的个体,是变异之前的个体,k是变异的一个常数,取值为,是个体的上限,是个体的下限,r是产生的随机数。

适应度线性变换:

其中F是原适应度,是变换之后的适应度,a,b是变换的系数。适应度线性变换要满足下面两个条件:

条件一:

条件二:C=1.2~2

缩放时参数a,b的计算方法可以用如下方法:

如果满足:

就令:

否则:

实现代码如下:

#include

#include

#include

#include

#define M 80//种群数量

#define XMIN -1//下限

#define XMAX 2//上限

#define PI 3.1415926

#define PC 0.8//交叉概率

#define PM 0.18//变异概率

#define PA 0.01//交叉因子

struct Node

{

double Pmember;

double Myfitness;//Myfitness是适应度

double Myfitsum;//Myfitsum是适应度占总体适应度的百分比,然后从第一个个体往后累加,主要用于选择操作

}Nownode[M],Nextnode[M];//本代群体和下一代群体

int nodeindex[M];//交叉时随机配对,存放配对的群体下标

int T=0;

double fx(double x)//根据x计算fx

{

double y;

y=x*sin(10*PI*x)+2;

//y=100-(x-5)*(x-5);

return y;

}

int calfitness()//计算适应度值

{

int i;

double minfitness,maxfitness,avefitness=0;

double C=1.7,a,b;

double temp;

minfitness=Nownode[0].Myfitness=fx(Nownode[0].Pmember);

maxfitness=minfitness;

avefitness=maxfitness;

for(i=1;i

{

Nownode[i].Myfitness=fx(Nownode[i].Pmember);

avefitness+=Nownode[i].Myfitness;

if(minfitness>Nownode[i].Myfitness)

{

minfitness=Nownode[i].Myfitness;

}

if(maxfitness

{

maxfitness=Nownode[i].Myfitness;

}

}

if(minfitness<0)//如果有负的适应度值,就把所以的适应度都加上一个数,使适应度全都为正数

{

temp=minfitness;

Nownode[0].Myfitness+=-temp;

avefitness=Nownode[0].Myfitness;

maxfitness=Nownode[0].Myfitness;

minfitness=Nownode[0].Myfitness;

for(i=1;i

{

Nownode[i].Myfitness+=-temp;

avefitness+=Nownode[i].Myfitness;

if(minfitness>Nownode[i].Myfitness)

{

minfitness=Nownode[i].Myfitness;

}

if(maxfitness

{

maxfitness=Nownode[i].Myfitness;

}

}

}

//适应度线性变换

avefitness=avefitness/M;//计算平均适应度

if(minfitness>(C*avefitness-maxfitness)/(C-1))

{

a=(

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值