书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
第9章目录
9.7 创建种群的代码2
第2步:选择
- 第2步的内容是“评估个体的适应度,创建交配池”。
我们先来评估对象的适应度,前面我们把正确字符的数量作为适应度函数。我想在此进行一些修改,用正确字符数量的百分比表示适应度——适应度函数就是将正确字符数除以总字符数。
适应度 = 正确字符的数量/总字符数 - 应该在什么地方计算适应度呢?
由于DNA类包含了遗传信息(遗传信息就是猴子打出来的语句,我们要拿它和目标语句进行对比),我们可以在DNA类中添加一个适应度评估函数。假设目标语句如下:
String target = "to be or not to be"; - 现在,我们可以根据目标字符串的内容逐个比对当前“基因”的字符,一旦获得正确字符,就增加计数器。
class DNA {
float fitness; 在DNA类中加入一个适应度变量
void fitness () { 该函数的作用是计算适应度
int score = 0;
for (int i = 0; i < genes.length; i++) {
if (genes[i] == target.charAt(i)) { 字符是否正确
score++; 如果正确,增加分值
}
}
fitness = float(score)/target.length(); 适应度就是正确字符的百分比
}
}
- draw()函数的第一步操作就是对每个对象调用fitness()函数。
void draw() {
for (int i = 0; i < population.length; i++) {
population[i].fitness();
}
}
-
获得所有个体的适应度分值后,我们就要为繁殖过程创建“交配池”。
交配池是一个数据结构,我们可以从中取出繁殖所需的双亲对象。
回顾前面的描述,繁殖过程需要根据适应度计算概率值,然后用这个概率挑选双亲。适应度最高的个体被选中的概率最大;适应度较低的个体被选中的概率也较低。 -
在“引言”部分,我们学习了概率基础和自定义分布随机数的生成方法。下面我们将用这些技术为个体分配概率值,然后用“命运之轮”的方法选择父本。
我们只需要根据这5个选项(ABCDE)的出现概率,在ArrayList中填充不
同数量的实例,然后从中选择父本。也就是说,假设有一堆字母,其中有30个A、40个B、5个C、15个D和10个E。
-
如果你随机地从中选择一个字母,得到A的概率是30%,得到C的概率是5%……对本例而言,字母集合就是ArrayList,ArrayList中的每个字母都是潜在的繁殖个体。
因此,我们要先根据个体的概率计算出现次数N,然后在ArrayList中对该个体添加N次。
ArrayList<DNA> matingPool = new 从空的交配池开始
ArrayList<DNA>();
for (int i = 0; i < population.length; i++) {
int n = int(population[i].fitness * 100); n等于适应度乘以100,是一个介于0~100的整数
for (int j = 0; j < n; j++) {
matingPool.add(population[i]); 在交配池中将个体添加N次
}
}
网友评论