遗传算法的 javascript实现问题,求解
function Mutation() //变异算子{
for(var a=0;a<PopSize;a++) //PopSize 是种群数量
{for(var j=0;j<Chr_len;j++) //Chr_len 是个体基因数量
{
var p=Math.random();
if(p<Pm) //Pm 为变异概率
{
document.write('第'+a+'号个体'+'的'+j+'号位发生变异'+'<br>');
Person[a][j]=(Person[a][j]==0)?1:0;
}
}
}
}
这个是我参照别人的实例改编的遗传算法的 变异算子,这个算子,我发现有个问题我解决不了,就是,前几代变异的时候,还是正常的,到了 5代以后,变异就有问题了,就会变成只要某一个位产生变异,后面的所有个体的这个位都会发生变异,我想了几天了,都没什么进展,特来此发帖,希望大神帮忙解决一下。
遗传算法全部代码
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>遗传</title>
<script>
var Chr_len=6;//染色体长度
var PopSize=6;//样本大小
var Gen_num=0;//迭代计数
var s=20;//迭代次数
var Pc=0.7;//交叉概率
var Pm=0.1;//变异概率
var Pfitness=new Array(); //个体被遗传下一代的概率
var Person=new Array(); // 个体
var NewPerson=Person; //
for(var k=0;k<PopSize;k++)//产生初始种群
{
Person[k]=new Array(Chr_len);
for(var j=0;j<Chr_len;j++)
{
Person[k][j]=Math.random()<0.5?0:1;
}
}
Pt('初始化');
for(Gen_num=0;Gen_num<s;Gen_num++)
{
Select();
Pt('选择');
Crossover();
Pt('交叉');
Mutation();
Pt('变异');
//Print();
}
Select();
Pt('选择');
Crossover();
Pt('交叉');
Mutation();
Pt('变异');
function Pt(s)
{
document.write(s+'操作后:'+'<br>');
for(var i=0;i<PopSize;i++)
{
document.write(Person[i]+'<br>');
}
document.write('<br>');
}
function Print()
{
document.write('第'+Gen_num+'代,'+'最优个体是:'+Findbestperson()+'号个体, '+'<br>');
Pt('优差交换');
}
function Select() //选择算子 ,概率选择法
{
var idx,p,sum=0;
for(var i=0;i<PopSize;i++)
{
sum+=Fitness(Person[i]); //计算每个个体的适应度,并得到种群适应度总和
}
for(var i=0;i<PopSize;i++)
{
Pfitness[i]=Fitness(Person[i])/sum; //得到单个个体的基因遗传概率
}
for(var i=1;i<PopSize;i++)
{
Pfitness[i]=Pfitness[i]+Pfitness[i-1]; //计算累加概率
}
for(var i=0;i<PopSize;i++)
{
p=Math.random();
idx=0;
while(p>Pfitness[idx]) //找到随机概率点对应的个体
{
idx++;
}
NewPerson[i]=Person[idx]; //将符合概率的个体遗传给下一代
}
for(var i=0;i<PopSize;i++) //用下一代替换当前代
{
Person[i]=NewPerson[i];
}
}
function Crossover() //交叉算子
{
var point,c;
for(var i=1;i<PopSize;i+=2) //开始交叉
{
c=Math.random();
if(c<Pc) //交叉概率
{
point=Math.floor(Math.random()*Chr_len);
document.write('<br> 第'+i+'和'+(i-1)+'号,'+point+'位');
for(var y=point;y<Chr_len;y++)
{
var temp=Person[i][y];
Person[i][y]=Person[i-1][y];
Person[i-1][y]=temp;
}
}
}
}
function Mutation() //变异算子
{
for(var a=0;a<PopSize;a++)
{for(var j=0;j<Chr_len;j++)
{
var p=Math.random();
if(p<Pm)
{var x=0;
document.write('第'+a+'号个体'+'的'+j+'号位发生变异'+'<br>');
Person[a][j]=(Person[a][j]==0)?1:0;
}
}
}
}
function Fitness(arr) //个体适应度计算函数
{
var x1=arr[0]*4+arr[1]*2+arr[2];
var x2=arr[3]*4+arr[4]*2+arr[5];
var X=x1*x1+x2*x2;
return X;
}
function Findbestperson() //找到最好的和最坏的个体,返回id
{
var bestid;
var badid;
var bad=Person[0];
var best=Person[0];
for(var i=0;i<PopSize;i++)
{
Pfitness[i]=Fitness(Person[i]);
if(Pfitness[i]>=Fitness(best))
{
bestid=i;
}
if(Pfitness[i]<=Fitness(bad))
{
badid=i;
}
}
Person[badid]=Person[bestid];
return bestid;
}
</script>
</head>
<body>
</body>
</html>