| 上面的程序是在基本的Floy程序的基础上加入了进化机制的版本:首先点击Scramble按钮这样可以使得我们当前的种群多样化,你会看到每只Floy都有了不一样的颜色,并且它们的行为特征都不尽相同。然后点击Start
Evolution按钮进化就开始了。注意,一只入侵者飞了进来,只有当入侵者被击毙的时候才开始下一代,这样一代一代的重复下去。你所要的就是静静的观察与等待,也许一些意想不到的事情就在你眼前发生了。
点击Show Rules和Show Help按钮你会看到这个程序的使用说明。在这里有必要对每只苍蝇的简单规则再次重复一遍。每只苍蝇只有两条规则,它们分别是:
- 与同类交互的规则:
- 找到你周围的同类尽量去靠近它们,但也不能靠的太近;
- 与异类的规则:
- 如果在自己的疆土上则发现了一只入侵者就尾随它并在适当的时机进攻;
- 如果不在自己的疆土上则如果有本地的居民追逐你就赶快逃跑。
每一代中的每只Floy都不太一样,它们都有自己的个性,而这些个性都体现在它们的行为上,也就是它们的最大速度、反弹速度、加速度、中心的吸引力、碰撞距离等等属性的不同,如果我们将这些特性编码就能得到每只Floy的染色体,然后再对整个一代的Floy中进行适应度的排序,挑选出适应度比较高的Floy作为父母进行繁殖也就是让它们的染色体进行交叉来得到下一代,这就完成了一次自然选择,也就是一代的进化。下面我们有必要对适应度进行说明,适应度是能量值和安全度的加权平均值。打击入侵者和增加移动速度会增加能量值;而与自己同类尽量保持靠近会增加安全度。
在这个程序中,进化是在三个不同层次中进行的,最低的一层是在我们称为基因型的层次进行。基因型就是一个字符串的染色体,物种的基因都编码在染色体之中了。并且每一个染色体字符串的位都表示Floy的一个特征。这些编码在我们解码之前没有任何意义。
中间的一层被称为表现型,在这个层次中Floy的染色体被直接解码形成了这个Floy的行为特征。举例来说,在Floy染色体的一个位上定义了它的加速度的值,我们在屏幕上看到的这个Floy移动的快慢就是受这个基因影响的。
第三个层次是个体的适应度。个体的适应度是依赖于它的基因的,但这种依赖关系不是简单直接的,事实上染色体并没有适应度的基因。当个体的能量值和安全度都很大的时候它的适应度才会大,而这导致了一个矛盾。因为如果一个Floy要想获得更大的能量值它就必须在它的兄弟们进攻入侵者之前就先行动进攻,但是这样做它就会远离自己的同类从而降低它的安全度。
因此我们会得到下面的这样一个链条:自然选择是对适应度进行的,而适应度是依赖于表现型的,而表现型则是被基因型决定的,而遗传的操作(变异、交叉)是在基因型上操作的。因此整个进化的过程就是这样一层一层涌现出来的。 |