||
在(7)中我们给出了对种群操作的一些基本算子,是针对二进制编码的;若是浮点数编码的,也可以类似的设计。
这里再理一理思路:
1)首先,对问题进行建模,即设计一种可能解的类型,本系列文中称为Point类;
2)采用面向对象的组合机制设计新类,即若干Point类的对象作为新类(种群类,不妨为EASet)的数据成员;
3) 种群类的一些操作调用工具箱类(Tools);
在下示例中,有10多次的工具箱基本算子调用,表明了工具箱类设计能够充分简化程序。
class EASet
{
Point[] obj;
Point[] nextobj;
double[] sump; //个体的累积概率
Point gbest;
int size=20;
public EASet(int size)
{
this.size=size;
obj=new Point[size];
nextobj=new Point[size];
gbest=new Point();
sump=new double[size];
init();
}
public void init()
{
for(int i=0;i<size;i++)
{
obj[i]=new Point();
nextobj[i]=new Point();
}
int pos=Tools.getBestPos(obj);
Tools.copy(obj[pos],gbest);
}
//累积概率计算
public void getsump()
{
double sum=0;
for(int i=0;i<size;i++){
sump[i]=obj[i].getFitness();
sum=sum+sump[i];
}
for(int i=0;i<size;i++){
if(i>0)
sump[i]=sump[i]+sump[i-1];
}
for(int i=0;i<size;i++)
sump[i]=sump[i]/sum;
}
//轮盘赌选择算子
public int select()
{
double p=Math.random();
for(int i=0;i<size;i++)
if(p<sump[i])
return i;
return 0;
}
public void update()
{
int m=0,n=0;
int bestpos,badpos;
Point temp=new Point();
bestpos=Tools.getBestPos(obj);
Tools.copy(obj[bestpos],temp);
getsump();
for(int i=0;i<size/2;i++)
{
if(Math.random()<0.85)
Tools.cross(obj[m],obj[n],nextobj[2*i],nextobj[2*i+1]);
else
{
Tools.copy(obj[m],nextobj[2*i]);
Tools.copy(obj[n],nextobj[2*i+1]);
}
}
for(int i=0;i<size;i++)
if(Math.random()<0.05)
Tools.mut(nextobj[i]);
//查找子代最差个体位置
badpos=Tools.getBadPos(nextobj);
//用父代最优替换子代最差
if(temp.getFitness()>nextobj[badpos].getFitness())
Tools.copy(temp,nextobj[badpos]);
//种群更新
for(int i=0;i<size;i++)
{
Tools.copy(nextobj[i],obj[i]);
}
bestpos=Tools.getBestPos(obj);
if(obj[bestpos].getFitness()>gbest.getFitness())
Tools.copy(temp,gbest);
}
}
public class Test
{
public static void main(String[] arg)
{
EASet s=new EASet(40);
int n=0;
while(n<300)
{
s.update();
n++;
}
s.gbest.show();
}
}
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 12:57
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社