美文网首页
遗传算法:整合代码

遗传算法:整合代码

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

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
第9章目录

9.8 遗传算法:整合代码

  • 我们已经学习了两次遗传算法的实现步骤:
    第1次用文字形式描述,
    第2次用代码片段实现。
  • 在本节,我们要把前面的内容合并,用代码描述算法的各个步骤。

1、示例

示例代码9-1 遗传算法:进化出莎士比亚名言

  • 主标签页的实现代码反映了遗传算法的各个步骤,它调用的功能函数是在DNA类中实现的。
GA需要的变量
float mutationRate = 0.01;    // 突变率
int totalPopulation = 150;      // 个体总数

DNA[] population;             // 个体数组
ArrayList<DNA> matingPool;    //交配池数组 "mating pool"
String target;                // 目标答案

PFont f;

void setup() {
  size(800, 200);
  target = "to be or not to be";  //初始化目标答案和突变率

  population = new DNA[totalPopulation]; //步骤1:初始化种群

  for (int i = 0; i < population.length; i++) { //步骤2a:计算适应度
    population[i] = new DNA(target.length());
  }
  
  f = createFont("Courier",12,true);
}

void draw() {
  for (int i = 0; i < population.length; i++) { //步骤2:选择
    population[i].calcFitness(target);
  }

  ArrayList<DNA> matingPool = new ArrayList<DNA>();  // 步骤2b:创建交配池 "mating pool"

  for (int i = 0; i < population.length; i++) {
    int nnnn = int(population[i].fitness * 100);  // 根据适应度分值将个体加入交配池
    for (int j = 0; j <nnnn; j++) {              // and pick two random numbers
      matingPool.add(population[i]);
    }
  }

  for (int i = 0; i < population.length; i++) { //步骤3:繁殖
    int a = int(random(matingPool.size()));
    int b = int(random(matingPool.size()));
    DNA partnerA = matingPool.get(a);
    DNA partnerB = matingPool.get(b);
    DNA child = partnerA.crossover(partnerB); //步骤3a:交叉
    child.mutate(mutationRate);   //步骤3b:变异
    population[i] = child;        //用新的子代覆盖种群draw()循环会重复执行这些步骤
  }
  
  background(255);
  fill(0);
  String everything = "";
  for (int i = 0; i < population.length; i++) {
    everything += population[i].getPhrase() + "     ";
  }
  textFont(f,12);
  text(everything,10,10,width,height);
}
  • DNA.pde
class DNA {

  // The genetic sequence
  char[] genes;
  
  float fitness;
  
  // Constructor (随机地创建DNA)
  DNA(int num) {
    genes = new char[num];
    for (int i = 0; i < genes.length; i++) {
      genes[i] = (char) random(32,128);  // Pick from range of chars
    }
  }
  
  // Converts character array to a String
  String getPhrase() {
    return new String(genes);
  }
  
  // 计算适应度(returns floating point % of "correct" characters)
  void calcFitness (String target) { 
     int score = 0;
     for (int i = 0; i < genes.length; i++) {
        if (genes[i] == target.charAt(i)) {
          score++;
        }
     }
     fitness = (float)score / (float)target.length();
  }
  
  // 交叉
  DNA crossover(DNA partner) {
    // A new child
    DNA child = new DNA(genes.length);
    
    int midpoint = int(random(genes.length)); // Pick a midpoint
    
    // Half from one, half from the other
    for (int i = 0; i < genes.length; i++) {
      if (i > midpoint) child.genes[i] = genes[i];
      else              child.genes[i] = partner.genes[i];
    }
    return child;
  }
  
  // 突变, picks a new random character
  void mutate(float mutationRate) {
    for (int i = 0; i < genes.length; i++) {
      if (random(1) < mutationRate) {
        genes[i] = (char) random(32,128);
      }
    }
  }
}

2、改进

  • 在上例中加入一个额外的特性,使其能输出更多遗传算法的工作信息。
  • 一旦得到目标语句,马上停止遗传算法
  • 用一个Population类管理GA(替换draw()函数中的代码)。
    程序(略)

3、运行结果

相关文章

  • 遗传算法:整合代码

    书名:代码本色:用编程模拟自然系统作者:Daniel Shiffman译者:周晗彬ISBN:978-7-115-3...

  • 模拟退火算法(附代码)

    上一篇我们讲了旅行商问题及遗传算法来解决此类问题:遗传算法(附代码)[https://www.jianshu.co...

  • 优化算法实战

    在遗传算法详解中我们介绍了爬山算法,退火算法和遗传算法的原理。在进行代码实战前让我们先复习下这几种算法。 爬山算法...

  • 一个遗传算法的 js 实现

    昨天看了一点遗传算法的相关资料 所以打算利用自己理解的遗传算法写一个 js 版本的 demo P.S. 为了写代码...

  • 遗传算法的神经网络python实现源码

    代码过程中,把代码过程较好的一些代码段记录起来,下边代码是关于遗传算法的神经网络python实现的代码,应该对大伙...

  • 遗传算法(附代码)

    先看个问题:一个旅行商需要去拜访一系列城市,这些城市之间的距离都不相同,怎么才能访问每个城市一次并回到起始城市最短...

  • 遗传算法(Genetic Algorithm ,GA)学习笔记

    1 遗传算法的概念 1.1 遗传算法的科学定义   遗传算法(Genetic Algorithm, GA) 是模拟...

  • [纯代码]搭建UINavigationController与UI

    UINavigationController与UITabBarController整合Demo(纯代码模式) 代码...

  • 【机器学习】遗传算法(Genetic Algorithm)的Py

      本文章用Python实现了基本的优化遗传算法并用类进行了封装 一、遗传算法概述   遗传算法(Genetic ...

  • 遗传算法综述

    作者:刘衍 【嵌牛导读】:遗传算法简介与其应用 【嵌牛鼻子】:遗传算法 优化算法 java 【嵌牛提问】:遗传算法...

网友评论

      本文标题:遗传算法:整合代码

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