机器进化
进化计算
遗传编程
利用遗传编程来进化一个沿墙运动的机器人。我们进化一个程序,此程序把机器人当前的传感器数据作为输入,并计算出一个动作。我们希望重复运行此程序来控制机器人,先把机器人从任意位置移到与墙毗邻的一个单元中,使其永远沿墙移动。
1. 遗传编程的程序表示
此程序的基本函数包括:四个布尔函数——and、or、not 和 if;四个动作——东南西北。这几个布尔函数的定义如下:
和之前的传感器一样,这里我们将周围的八个位置的用n,ne,e,se,s,sw,w和nw表示。当相应的单元空缺,agent可以采取动作移动到该单元时,输入值为0;否则为1。下图给出了一个沿墙走动的程序,同时也给出了此程序的树状表示。重复运行此程序将使机器人向北走到墙边,然后顺时针沿墙移动。
2. 遗传编程的过程
在遗传编程的过程中,我们从随机程序开始。依然是上面的机器人永远沿墙移动的问题,我们从5000个随机程序开始进化一个沿墙运动的agent。每一代程序都要接受评估,只有当某个程序的表现让人比较满意时才在此基础上产生新一代程序。
-
评估方法
我们可以将一个程序运行60次,并计算在这60次中被访问的与墙毗邻的单元个数(共有32个单元是贴墙的,一次都没有沿墙行走的计数为0,理想状态计数32)。然后,让机器人分别在10个随机选择的不同初始位置开始执行程序。在这10个运行中被访问的与墙批零的单元总数即为该程序的“合理度”。可能的合理度最高值为320。
第i代按照以下方法构造第i+1代
-
把第i代的500个程序(10%)直接复制到第i+1代。用“锦标赛选拔”过程来选择这500个程序:从5000个程序中随机选出7个,在从中选择最适合的一个。
-
把4500个新的“孩子”程序(90%)归入第i+1代。每一个孩子程序通过以下“交叉”操作由母亲程序和父亲程序共同产生出来:这些双亲程序均从第i代的锦标赛选拔中选出,把母亲程序中一个随机选择的子树替换为父亲程序中一个随机选择的子树,便得到孩子程序。如图所示:
这个孩子程序的合适度可能比其双亲高,也可能低。
-
有时,还需要一个“变异算子”来构造下一代个体,但它构造的下一代数目很少。这个变异算子用锦标赛选拔从第i代中选出一个单亲,删除此单亲程序中随机选择的子树并替换一个新成长的随机子树。
在构造下一代的过程中,要设置几个任意参数,包括直接复制的数目,交叉生产数目,参加锦标赛的程序数目以及变异百分比。实例中所用参数均为遗传编程专家推荐的参数。
3. 进化一个沿墙运动的机器人
下图给出了0代最合适的程序(合适度为92)
第二代的最佳程序合适度为117,下图展示了这个程序及其两次典型的合适度运行表现,这个程序比0代最佳程序短,但仍被困于右下角。
到第六代,程序的最高合适度达到163。其中最佳程序可理想的沿边界运动,依然被困在右下角。
最后直到第10代,遗传编程过程已进化出一个能十分完美地沿墙运动的程序。下图展示了此程序以及从不同起点开始的两条路径。此程序顺时针沿墙移动,并且一开始就向南移动直至靠墙。
下图给出每一代程序进化的合适度曲线。