《复杂》读书笔记(part7)--遗传算法

学习笔记

学习书目:《复杂》- 梅拉妮·米歇尔




遗传算法


在对“机器能否复制自身”的问题给予肯定回答后,冯·诺依曼很自然地想让计算机(或计算机程序)复制自己和产生变异,并在某种环境中为生存竞争资源。这就会遇到前面提到的**“生存本能"以及"进化和适应”**的问题。

20世纪60年代初,一些研究团体开始在计算机中进行进化实验,这些研究现在统称为进化计算。其中最为著名的是密歇根大学的霍兰德和他的同事、学生进行的遗传算法研究。

霍兰德在读费希尔的名著《自然选择的遗传理论》时被达尔文的进化论深深吸引。他从计算机科学的角度思考:“这就是遗传算法的由来,我想到,是不是可以像繁育良种马和良种玉米那样繁殖程序。”

霍兰德的主要兴趣在于适应现象——生物如何进化以应对其他生物和环境变化,计算机系统是不是也可以用类似的规则产生适应性。他在1975年的著作《自然和人工系统的适应》中列出了一组适应性的普遍原则,并且提出了遗传算法的构想。


遗传算法菜谱


算法其实就是图灵说的明确程序,就好比做菜的菜谱:一步一步将输入变成输出。

对于遗传算法(GA),期望的输出就是特定问题的解。GA的输入包括两部分:候选程序群体适应性函数。适应性函数用来确定候选程序的适应度,度量程序完成指定任务的能力。候选程序可以表示成位、数字或符号组成的字符串。

下面是GA菜谱。我们将下面的步骤重复代数:

  • 第1步:生成候选方案的初始群体。生成初始群体最简单的办法就是随机生成大量“个体”,在这里个体是程序(字符串)。
  • 第2步:计算当前群体中各个个体的适应度。
  • 第3步:选择一定数量适应度最高的个体作为下一代的父母。
  • 第4步:将选出的父母进行配对。用父母进行重组产生出后代,伴有一定的随机突变概率,后代加入形成新一代群体。选出的父母不断产生后代,直到新的群体数量达到上限(即与初始群体数量一样)。新的群体成为当前群体。
  • 第5步:转到第2步。

上面描述GA时似乎很简单,但是遗传算法已被用于解决科学和工程领域的许多难题,甚至应用到艺术、建筑和音乐。


扫易拉罐的机器人小黄


下面我们用一个更详细的例子来进一步阐述GA的主要思想。

我有一个叫小黄的机器人,它的世界是二维的,到处是丢弃的易拉罐。我们将用遗传算法为小黄进化出一个"脑"(即控制策略)。

在这里插入图片描述

小黄的工作是清理它的世界中的空易拉罐。由上图所示,小黄的世界由10x10的100个格子组成。小黄在位置(0, 0)。我们可以假设周围围绕着一堵墙。许多格子中散落着易拉罐(每个格子中的易拉罐不会多于一个)。 小黄貌似不是很聪明的样子,他只能看到东南西北相邻的4个格子以及本身所在格子中的情况。格子可以是空的(没有罐子),或者有一个罐子,或者是墙。

每次清扫工作小黄可以执行200个动作。动作可以是以下7种:

  • 往北移动

  • 往南移动

  • 往东移动

  • 往西移动

  • 随机移动

  • 不动

  • 收集罐子

每个动作都会受到奖赏或惩罚,如果小黄所在的格子中有罐子并且收集起来了,就会得到10分的奖赏。如果进行收集罐子的动作而格子中又没有罐子,就会被罚1分。如果撞到了墙,会被罚5分,并弹回原来的格子。

显然,小黄尽可能地多收集罐子,别撞墙,没罐子的时候别去捡,得到的分数就最高。

这是一个比较简单的问题,人工为小黄设计一个好策略可能也不是很难。不过,有了遗传算法我们就可以什么也不用干,我们只需要等着计算机替我们进化出来。

下面我们用遗传算法来为小黄进化出一个好策略。

要做的第一步,就是搞清楚我们想要进化的到底是啥?也就是说具体策略是啥?

一般来说,策略指的是一组规则,规则给出了在各种情形下你应当采取的行动。那么多少种可能的情形呢?小黄可以看到5个格子(当前格子、东、南、西、北),每个格子可以标为空、罐和墙。这样就有243种可能情形( 3 5 3^5 种可能)

比如说,下面这张策略表显示的就是一个策略:

要知道下一步怎么做,小黄只需要查看策略表。

小黄在(0, 0)位置时,查到对应的行动是往西移动。因此它往西移动一格,结果一头撞到墙上。

我之前并没有说这是个好的策略,寻找好策略不关我的事,这事归遗传算法管。

我们写了一个遗传算法程序来进化小黄的策略。算法中,群体里每一个个体都是一个策略(与各种可能情形相对应的行动列表)。也就是说,对于上面策略表中的策略,GA用来演化的个体就是最右侧243个行动依次列出的列表。

现在,我们再次解释一下GA的工作原理:

  • 第1步:生成初始群体,初始群体有200个随机个体,程序中用一个伪随机数发生器来进行各种随机选择。

从现在开始我们重复1000次步骤2~步骤4

  • 第2步:计算群体中每个个体的适应度。比如说,通过让小黄执行100次不同的清扫任务来确定策略的适应度。每次将小黄置于位置(0, 0),随机撒一些易拉罐(每个格子至多1个易拉罐,格子有易拉罐的概率是50%)。然后让小黄根据策略在每次任务中执行200个动作。罗比的得分就是策略执行各任务的分数。策略的适应度是执行100次任务的平均得分,每次的罐子分布都不一样。
  • 第3步:进化,让当前群体进化,产生出下一代群体,直到新群体有200个个体。进化的步骤如下:(a)根据适应度随机选择出一对个体A和B作为父母。策略的适应度越高,被选中的概率则越大。(b)父母交配产生两个子代个体。随机选择一个位置将两个数字串截断;将A的前段与B的后段合在一起形成一个子代个体,将A的后段与B的前段个体合在一起形成另一个子代个体。©让子代个体以很小的概率产生变异。以小概率选出1个或几个数,用0到6之间的随机数替换。
  • 第3步:新群体产生200个个体后,回到第2步,对新一代群体进行处理。

GA如何演化出好的技巧


要回答这个问题,我们可以看一看策略是如何一代一代改进的。下图绘制出了每一代中最佳策略的适应度:

由上图可以看出,前300代提高得很快,此后的提高要慢一些。

第1代有200个随机生成的策略,可以想象它们都很糟糕。最好的策略适应度才-81,最糟糕的到了-825。在一些环境设定中,小黄移动了几步就卡住了,之后在整个任务过程中都停止不动。在一些情况下,则不停地撞墙,直到任务结束。有时候则一直不断地去捡罐子,虽然当前位置上没有罐子。

到第10代,群体中最佳策略的适应度已经变成正数了。这个策略经常会停滞不动,有时候还会在两个格子之间不停地来回移动。但基本不怎么撞墙。

到200代时,最好的策略已经具有向罐子移动并捡起罐子这个最重要的能力—至少大部分时候是这样。不过,如果周围没有罐子,它也会浪费很多时间用来随机游走。

到了400代,适应度超过了400分。

到800代时,GA发现了将罐子留作相邻罐子的路标的技巧

GA就这样不断改进最佳适应度。


在实际应用中,GA经常能演化出有用的答案,但是很难看出为什么会有用。这是因为GA找到的好答案与人类想出的相当不同。美国国家航空航天局(NASA)的遗传算法专家罗恩曾这样说:“进化算法是探索设计死角的伟大工具。但是,我们经常发现进化出来的设计完全无法理解。”