美文网首页
交互式选择

交互式选择

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

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

9.12 交互式选择

  • 交互式选择:适应度由用户确定的遗传算法。

1、评分系统

  • 为了展示这种技术,我们打算创建一个由表情构成的种群。每个表情都有一系列属性:头的大小、头的颜色、眼睛的位置、眼睛的大小、嘴的颜色、嘴的位置、嘴的宽度以及嘴的高度。


  • 表情的DNA(基因型)是介于0~1的浮点数组。表情的每个属性都对应着数组的某个元素。

class DNA {
    float[] genes;
    int len = 20; 为了画出这张脸,我们需要20个基因
    DNA() {
        genes = new float[len];
        for (int i = 0; i < genes.length; i++) {
                genes[i] = random(0,1); 每个基因都是介于0~1的随机浮点数
        }
    }
}
  • 表现型是Face类,其中包含一个DNA实例。
class Face {
    DNA dna;
    float fitness;
  • 接下来要在屏幕上绘制表情,我们可以用Processing的map()函数将基因信息转化为合适的像素值或颜色值。(在本例中,我们还会用colorMode()函数将RGB范围设置为0~1。)
void display() {
    float r = map(dna.genes[0],0,1,0,70); 用map()函数将基因转化为绘制参数
    color c = color(dna.genes[1],dna.genes[2],dna.genes[3]);
    float eye_y = map(dna.genes[4],0,1,0,5);
    float eye_x = map(dna.genes[5],0,1,0,10);
    float eye_size = map(dna.genes[5],0,1,0,10);
    color eyecolor = color(dna.genes[4],dna.genes[5],dna.genes[6]);
    color mouthColor = color(dna.genes[7],dna.genes[8],dna.genes[9]);
    float mouth_y = map(dna.genes[5],0,1,0,25);
    float mouth_x = map(dna.genes[5],0,1,-25,25);
    float mouthw = map(dna.genes[5],0,1,0,50);
    float mouthh = map(dna.genes[5],0,1,0,10);
}
  • 到目前为止,我们一直在做前面已经做过的事。
    但这里会有一点不同:我们不打算实现fitness()函数,也不打算用某个数学公式计算表情的适应度;
    相反,我们打算让用户自己确定适应度函数。

  • 如何用最佳方式让用户确定适应度是交互设计方面的问题,这不在本书的讨论范围。
    因此我们不会讨论如何写一个滑动条控件,也不会讨论如何实现一个用于打分的硬件,或创建一个Web应用专门让用户提交在线分数。用什么样的方式获得适应度分值应该由你自己决定,同时也取决于应用的具体类型。

  • 为了实现简单的演示功能,我们打算用以下方式获取适应度分值:当鼠标在某个表情上停留越久,它的适应度就越高。当用户点击“evolve next generation”按钮时,我们就为他创建下一代表情。

  • 让我们来看看遗传算法的各个步骤如何应用在主标签程序中。我们要注意:适应度由鼠标操作决定,下一代的创建由按钮触发。

2、示例代码9-4 交互式选择

Population population;
Button button;
void setup() {
        size(780,200);
        float mutationRate = 0.05;
        population = new Population(mutationRate,10);
        button = new Button(15,150,160,20, "evolve new generation");
}

void draw() {
    population.display();
    population.rollover(mouseX,mouseY); 将鼠标位置传入population对象的rollover()函数,以
    button.display();
}
void mousePressed() {
    if (button.clicked(mouseX,mouseY)) { 一旦按钮被按下,就通过选择和繁殖创建下一代
        population.selection();
        population.reproduction();
  }
}
  • 注意:本例只是交互式选择的演示程序,并不能实现具有实际意义的结果。
  • 首先,我们没有花心思设计表情的外形,这些表情只是由简单图形和颜色构成的。
  • 还有个关键问题,那就是时间。在自然界,进化的过程要花费数百万年。在电脑模拟的世界里,我们用某种特定的算法创建新一代,整个进化过程进行地很快。
    由于适应度值是根据数学公式计算出来的,我们还可以引入更大的样本,加快进化速度。然而,在交互式选择中,我们必须等待用户对种群的每个个体进行评分,评分完成后才能产生下一代。如果种群太大,用户会觉得很无聊,而且用户也没有耐心经历太多子代!
  • 成功构建交互式选择系统的关键在于遗传算法。遗传算法的几个关
    键点:什么是基因型和表现型;如何计算适应度。在交互式选择中,第二个问题应该改为:如何在用户的交互过程中获取适应度?

相关文章

网友评论

      本文标题:交互式选择

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