遗传算法,第三部分:繁殖
书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
第9章目录
9.6 遗传算法,第三部分:繁殖
1、繁殖
- 现在我们已经有了选择父代的策略,下面就开始讨论繁殖下一代的方法,这一步的关键在于达尔文的遗传法则——子代能继承父代的特性。
- 繁殖的实现方式也有很多种。
- 无性繁殖就是一种合理(并容易实现)的策略,该策略用单个父本复制出子代个体。
- 但遗传算法的标准方法是用两个父本繁殖后代,具体步骤如下。
1.交叉
2.突变
2、交叉
-
交叉就是根据双亲的遗传密码创建一个子代。
-
拿猴子敲键盘举例,假设我们从交配池中选择了两个句子(如选择部分所述)。
父本A:FORK
父本B:PLAY
下面,我们要根据这两个语句创建子代。最直观的方法(我们称为50/50方法)就是取A的前两个字符,取B的后两个字符,把这两部分拼接在一起:
-
这种交叉方法能进一步改进:我们不一定从每个父本中都各选一半的遗传密码,而应该选择随机的中间分割点。
改进后,我们还可能得到“FLAY”或“FORY”。这种方法比50/50方法更好,因为它能提高子代的多样性。
-
还有一种方式是为子代的每个字符随机选择父代。你可以把它想象成掷4次硬币:正面朝上则选择A,反面朝上则选择B。如此一来,我们就能得到各种结果,如:“PLRY”“FLRK”“FLRY”“FORY”……
-
这种方法产生的结果和选择随机中间点法基本上一样;
但是如果基因的顺序对表现型有一定程度的决定作用,你就应该根据具体需求选择其中的一种方法。
3、突变
-
交叉过程产生子代DNA,但还要经历突变过程才能最终确定。突变是一个可选的过程,某些场景不会涉及突变。根据达尔文的进化学说,突变是普遍存在的。在初始化过程中,我们用随机的方式创建种群,确保种群有一定的多样性。但在孕育第一代时,种群的多样性就已经确定了;而突变的作用就是在进化过程中不断引入多样性。
-
突变可以用突变率描述。一个遗传算法可能有5%、1%或0.1%的突变率。假设交叉完成后,某子代个体是“FORY”,如果突变率为1%,这意味着每个字符有1%的突变概率。而字符怎么发生突变呢?在本例中,我们把突变定义为用一个随机的字符替换原字符。1%是一个很低的突变率,对于由4个字符组成的字符串来说,在大部分时间它都不会发生突变(确切地说,在96%的时间都不会发生突变)。一旦突变发生,当前字符就会被替换成另一个随机字符(如图9-6所示)。
-
在某些场景中,突变率能显著地影响系统行为。高突变率(比如,80%的突变率)会阻碍进化过程。如果大部分子代基因是随机产生的,我们就无法保证“合适”的基因能频繁地出现在后代中。
-
在获得新种群之前,我们会不断地进行选择(选择两个父本)和繁殖(交叉和突变)操作。一旦子代种群代替了当前种群,我们还会回到之前的步骤:再次评估适应度,再次进行选择和繁殖操作。
4、代码实现
-
到目前为止,我们已经详细地描述了遗传算法的所有步骤,接下来,我们需要将这些步骤翻译成Processing代码。由于前面的描述有些冗长,我们先对此作个总结,把遗传算法分成几个步骤。
-
SETUP
第1步:初始化 创建由N个个体组成的种群,随机确定个体的DNA。
LOOP
第2步:选择 评估个体的适应度,创建交配池。
第3步:繁殖 重复N次。
a) 根据相对适应度,概率性地选择两个父本。
b) 杂交——结合父本的DNA,创建出一个“子代个体”。
c) 突变——以一定的概率使子代的DNA发生突变。
d) 将这个子代加入新种群。
第4步:用新种群替换旧种群,再回到第2步。