标题:遗传算法的 javascript实现问题,求解
只看楼主
小羊沉默
Rank: 1
来 自:四川农业大学
等 级:新手上路
帖 子:14
专家分:5
注 册:2015-1-12
结帖率:100%
 问题点数:0 回复次数:1 
遗传算法的 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>
搜索更多相关主题的帖子: javascript function 
2016-05-31 20:30
龙神
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:35
专家分:130
注 册:2016-6-16
得分:0 

你数组拷贝怎么能直接等于号赋值呢,这样只是传递了引用而不是新建克隆了一个,你这个算法运行到最后数组里所有人都指向同一个人,当然一个变了就都变了。
2016-06-16 15:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-465448-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.947712 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved