我的《自然计算》作业,搬上来。
(原来发布到简书了,现在搬过来)
目录
- 概述
- 编码
- 初始群体的产生
- 适应度计算
- 选择运算
- 交叉运算
- 变异运算
- 测试效果
参考资料
一,概述
本文在理解遗传算法的基本原理的基础上,使用Java语言写了一个小程序来简单实现用遗传算法求解二次函数f(x,y)=x*x+y*y (x和y的取值范围为1到127的正整数)的最大值。完整源码见已上传至我的github,详情请点击此链接:查看本项目全部代码
二,编码
重述一下本文求解的问题:
由于遗传算法的运算对象是表示个体的符号串,所以必须把变量x,y编码为一种符号串。在这里采用无符号二进制整数来表示。因x,y的取值范围为1到127,,则可用两个7位二进制数来分别表示它们。而一个基因就是一个14位二进制串。例如,基因型00000001111111所对应的表现型是:x=0,y=127。在代码中的具体体现为:设计类Chromosome,其具有私有整形字段x,y表示x,y的十进制值、String字段gene表示二进制串。并使用常量定义其最大值或最大长度。代码如下:
public static final int GENG_LENGTH = 14;
public static final int MAX_X = 127;
public static final int MAX_Y = 127;
private int x,y;
private String gene;
三,初始群体的产生
遗传算法是对群体进行的进化操作,所以第一步要产生一个初始种群,再进行后续的交叉、变异、选择等操作。在具体实现上,初始种群的产生较为简单。首先对类Chromosome进行构造函数的编写,主要写了以下两种构造函数:
public Chromosome(String gene) //给定基因串构造染色体
public Chromosome(int x,int y) //给定表现型构造染色体
在这里用到了第二个构造函数,首先随机产生两个1到127之间的数作为X,Y,再调用构造函数生成新染色体并添加到初始种群中去。如此重复,直到种群规模达到要求。具体代码如下:
public static ArrayList<Chromosome> initGroup(int size) {
ArrayList<Chromosome> list = new ArrayList<Chromosome>();
Random random = new Random();
for(int i = 0