君子不器分享 http://blog.sciencenet.cn/u/foreverph

博文

演化计算:工具箱的应用(8)

已有 1882 次阅读 2022-4-28 10:13 |个人分类:算法|系统分类:科研笔记

在(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();

}

}




https://blog.sciencenet.cn/blog-260510-1336005.html

上一篇:演化计算:工具箱的设计(7)
下一篇:演化计算:矩阵结构遗传算法(9)
收藏 IP: 111.121.91.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-22 12:57

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部