美文网首页
创建种群的代码2--选择

创建种群的代码2--选择

作者: 大龙10 | 来源:发表于2022-08-13 06:31 被阅读0次

书名:代码本色:用编程模拟自然系统
作者: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次
    }
  }

相关文章

网友评论

      本文标题:创建种群的代码2--选择

      本文链接:https://www.haomeiwen.com/subject/wcuawrtx.html