1701066678
1701066679
1701066680
1701066681
动作就是3(往西移动),罗比在这种情形下不会捡罐子。这不太好,不过G总体上还是比M好。
1701066682
1701066683
关键之处不在于单个的基因,而在于各个基因之间的相互作用,就像真正的基因一样。而且同真正的基因一样,很难确定各种相互作用是如何影响整体上的行为或适应度。
1701066684
1701066685
相较于观察一个策略的基因,观察其具体的行为——也就是它们的表型——会更有意义。我编了一个程序来演示罗比在采用某个给定策略时的行动,然后对罗比在采用策略M和策略G时的行为进行观察。我发现这两个策略在许多情形中的行为类似,但策略G有两个小技巧,让它比策略M表现得更好。
1701066686
1701066687
首先来看看当前位置和四周都没有罐子的情形。如果罗比采用策略M,它就会随机选择一个方向移动。但如果它采用的是策略G,它就会往东移动,直到遇到墙为止。然后它会往北移动,就这样逆时针围着格子边缘移动,直到发现罐子。图9.4可以看到罗比的轨迹(虚线)。
1701066688
1701066689
这种围着绕圈的策略不仅让罗比不会撞墙(如果用策略M,随机移动时有可能会撞墙),而且搜索罐子的效率也比随机移动要高。
1701066690
1701066691
1701066692
1701066693
1701066694
▲图9.4 罗比在一个有罐子的场地中。图中虚线是它在仿真时的移动轨迹,上图采用策略M,下图采用策略G
1701066695
1701066696
另外,遗传算法通过策略G还发现了一个巧妙的技巧,它在一些特定的情形中不会去捡当前格子中的罐子。
1701066697
1701066698
例如图9.5(a)给出了一种情形。在这种情形下,如果罗比采用策略M,它会捡起当前格子里的罐子,向西移动,然后捡起新的格子里的罐子[图9.5(b)—图9.5(d)]。由于罗比只能看见相邻格子的情形,因此当前它看不到余下的一堆罐子。它只能随机移动,直到碰巧遇到余下的罐子。
1701066699
1701066700
再看看策略G在同样情形中的表现(图9.6)。罗比没有去捡当前位置上的罐子,而且是直接向西移动[图9.6(b)]。然后它捡起了一堆罐子中最西边的罐子[图9.6(c)]。前面没有捡的罐子现在成了路标,罗比根据这个可以“记住”返回去有罐子。接下来它就会把这一堆罐子都捡起来[图9.6(d)—图9.6(k)]。
1701066701
1701066702
我知道我的策略不完美,但也没想到会有这种办法。进化可能聪明得多,GA经常会让我们感到意外。
1701066703
1701066704
遗传学家经常用“敲除突变(knockout mutations)”的办法来验证关于基因功能的理论,其实就是用遗传工程的方法阻止所研究的基因转录,再看对机体会有何影响。这里我也可以用这种方法。我将策略G中与这个技巧对应的基因敲掉:将所有与“当前格子中有罐子的”情形相对应的基因都换成“清扫罐子”。这会使得策略G的平均分从最初的483降到443,因此证明了我在前面的猜测,策略G之所以成功,部分就是因为这个技巧。
1701066705
1701066706
1701066707
1701066708
1701066709
▲图9.5 罗比在一堆罐子中,使用策略M移动的四步
1701066710
1701066711
1701066712
1701066713
1701066714
1701066715
1701066716
1701066717
▲图9.6 罗比在同样的一堆罐子中,用策略G走的11步
1701066718
1701066720
GA是如何演化出好的技巧的
1701066721
1701066722
下一个问题是,GA是如何从随机的群体演化出像策略G这样好的策略的呢?
1701066723
1701066724
要回答这个问题,我们可以看一看策略是如何一代一代改进的。图9.7中画出了每一代中最佳策略的适应度。你可以看到最好的适应度最开始是小于0的,前300代提高得很快,此后的提高要慢一些。
1701066725
1701066726
第1代有200个随机生成的策略,可以想象它们都很糟糕。最好的策略适应度才-81,最糟糕的到了-825。(可能这么低吗?)
1701066727
[
上一页 ]
[ :1.701066678e+09 ]
[
下一页 ]