书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
第9章目录
9.7 创建种群的代码
第1步:初始化种群
- 如果我们要创建一个种群,首先要做的就是用一个数据结构存放种群中的个体元素。
- 在大部分情况下(比如猴子敲键盘的例子),种群的个体数量是固定的,因此可以用数组存放个体(在后面的例子中,种群中的个体数量会发生变化,我们会用ArrayList实现它)。
- 数组中应该存放什么对象?我们还应该用一个存放基因信息的对象表示个体。
它可以称为DNA对象:
class DNA {
}
- 种群就是由DNA对象组成的数组。
DNA[] population = new DNA[100]; 100个DNA对象组成的种群 - DNA类应该包含哪些内容?
对于敲击键盘的猴子,DNA就是它打出来的随机语句,也就是一个字符串。
class DNA {
string phrase;
}
这样的实现是合理的,但我们不想把String对象用做遗传密码。相反,我们想用字符串数组表示遗传密码。
class DNA {
char[] genes = new char[18]; 每个“基因”都是数组中的元素,我们需要18个基因,因为“to be or not to be"
}
-
用数组的好处是:我们可以很方便地把这些代码扩展到其他例子中。
举些例子:在一个物理系统中,生物的DNA可能是由向量组成的数组;对于一个图像对象,个体的DNA就是整型(RGB值)数组。
我们可以用数组描述任意属性的集合。尽管字符串非常适用于本例,但数组可以作为未来扩展的基础。 -
遗传算法要求我们为种群创建N个个体,每个个体的DNA都是随机生成的。因此,在对象的构造函数中,我们用随机方式确定数组中的每个字符。
class DNA {
char[] genes = new char[18];
DNA() {
for (int i = 0; i < genes.lenght; i++) {
genes[i] = (char) random(32,128); 从编号为32~128的ASCII字符中随机选择一系列字}
}
}
- 我们已经有了构造函数,以下代码初始化种群数组中的DNA对象。
DNA[] population = new DNA[100];
void setup() {
for (int i = 0; i < population.length; i++) {
population[i] = new DNA(); 初始化种群中的每个成员
}
}
- DNA类根本没有完成。为了执行遗传算法的其他任务,我们还需要在其中加入更多函数。
下面我们将实现遗传算法的第2步和第3步。
网友评论