生生不息
- 名 称:生生不息 (AutoLife)
- 作 者:张 江
- 源代码:文件:Autolife.zip
程序说明
该程序由若干生命智能体在他们的环境中不断的适应进化构成,目的是探讨环境的变迁对生命体的影响。其中白色的点是智能生命体,他们会不停的运动并且自我繁殖、进化,蓝色的点是生命体的食物,它可以被人造的产生或者外部加入,也可以通过智能体的自发规律进行演化。如果选择了draw seeds,那么就能看到绿色的点表示生命体进行的播种。用户可以通过环境控制面板(Env Control panel)上的按钮对环境进行操作。也可以通过在仿真界面上进行鼠标拖拉的方式来操纵生命体和他所处的环境。
如何运行
总的运行结果可以分成两种,第一种情况是生命体可以自己进行播种。选择下拉框Have Seeds。也就是按照生命体他自己的规则运行到一定的时刻就产生一个绿色的“种子”,这个种子经过一段时间就可以生长成熟变成新的食物。一般一个单位的“种子”可以生成2个单位的食物,这样生命体会很快找到播种种子是一种收益递增的行动。在这种情况下,我们不用从外部给系统加入食物,生命体和食物构成的系统可以自我构建。
第二种情况是生命体不可以播种(下拉框No seed),这样因为生命体的运行,会消耗大量的食物,因而我们必须从外界加入食物。这个时候可以运用左边的环境控制面板来操作。首先,用户可以选择增加食物的方式(Dynamic Env下拉框),我们会看到生命体在不同的环境下有非常不一样的适应性行为。最简单的一种环境就是每次随机的增加定量的食物(可以通过增加食物滚动条Ran food supply调节),会看到生命体的数量会呈明显的变化趋势。
我们还可以人工的方式对环境和生命智能体操作。运用鼠标绘图的方式(在屏幕上进行拖拉),你可以方便的增加食物,也可以清除掉一些生命体,还可以对生命体进行拷贝、粘贴、剪切等操作,所有这些动作都可以通过环境控制面板(Env Control Panel)上面的控件完成。
Objects选择的是所绘的物体,可以是Food(增加食物),可以是Eraser(橡皮,删除所选中的所有东西)。当选择了Select之后,再选择区域,会弹出一个对话框,显示了所有选中的生命体的情况,包括他们的一些基本参数和规则。另外,还可以在这个对话框中进行一些对选中区域的其他操作,包括对生命体的拷贝、粘贴。 Shapes选择的是描绘物体的形状,可以是Rectangle(矩形),可以是Line(直线) Fill types:填充方式,即实心填充,还是梯度的方式画图(梯度的情况,只有在选择了食物物体的时候可用)。 Gradiant Value是当选择了梯度填充方式的时候,梯度值的大小。 Line Width是当选择了直线绘图方式的时候的直线宽度。
底部面板上的按钮可以对整个仿真世界进行设置、操作,其中Start/Stop/Continue按钮可以自由控制仿真的运行和暂停。当暂停模式的时候,可以通过Config设置一些基本的参数,Restart则是重新运行整个仿真。Step可以单步运行程序。点Curves按钮会弹出一个对话框,用曲线的方式反映生命体的整体运动趋势和变化规律。Have Seeds、No Seeds选择框可以让生命体置于可以播种、不可以播种两种模式。Draw Seeds和Don't Draw Seeds则是命令程序是否会值种子(绿色)。
趣味看点
生命体会自行播种的情况
1、由于生命体会很快找到播种可以让他们收益递增的方式,并且当多个生命体聚集在一起时会使得整个群体达到互惠互利,因而这个时候组织就会突现,一群生命体聚集在一起,它们会不断的生产种子,种子又会给他们带来更多的食物。有些时候,组织会变得很庞大,当一个巨大的组织出现的时候会很容易衰败下去。这时候,组织会演变为很多小型的组织机构。一般情况,组织总是在不停的产生、衰亡,并能够集体随机运动。
2、生命体构成的组织系统是一个自我构建的系统,它具有一种神奇的自我维持的能力,而且具有非常强的鲁棒性。我们可以通过下面的实验方法证明:当一个组织系统出现的时候,如果我们把这个组织的一小部分切割掉(可以用环境控制面板中的Eraser操作)的时候,组织会自发的寻找出一种运动模式尽量弥补这个被切割的部分。这就好像动物的伤口可以闭合一样。当切割的部分稍大一些的时候,组织会改变运动的方式,然而不会消亡,当切割的部分更大的时候,组织才会失去活力而死亡。
3、组织具有自然的生命周期,从它的出生到死亡,以及中间时期的自发分裂。所有这些现象都是涌现出来的,并没有哪个指令告诉它们应该如何运动。尤其是组织的自发死亡现象。当一个组织增长的过快而过大的时候,很多“寄生”的生命体(也就是仅仅吃食物,而不播种)会呈指数增加,这个时候整个组织的食物供给(主要靠那些播种的生命体)会无法支撑如此庞大的系统,因而我们会看到组织的衰亡现象。具体体现在画面上是组织中白色的生命体非常多,然而蓝色的食物在逐渐减少,很快那些“坏死”的白色生命体团块消失了,整个组织很有可能分裂为一些更小的组织,也可能就此消失了。
4、一般情况下,尺寸越大的组织出现的越少,尺寸越小的组织出现越多,二者的关系(尺寸和出现频率)可能呈现幂率分布。但是这个结果我没有精确的验证。
生命体不会播种的情况
1、当选择随机方式对整个世界进行食物补给的时候,通过观察生命体的变化曲线,我们一般会看到这样的情况:生命体群体呈现为三个阶段:过分繁殖、大灭绝、平稳震荡。也就是说生命体群体经历了学习阶段(疯狂繁殖、大灭绝),逐渐学会了某种固定的数量来应付当前的环境。如果不断的变化食物添加量,生命体群体会不断的学习。如果观察生命体的平均染色体长度曲线(该曲线反映了生命体规则的复杂度),我们会发现,变化的环境有利于整体复杂度的增加。
2、当选择其他的食物增加情况会得到完全不一样的结果,特别是选择circle和helix的情况,生命体会逐渐适应环境形成固定的行为模式,这种行为模式会对环境的变化形成记忆。环境中食物的增长是一个运动的带形区域,生命体们会很快的适应这个环境,并且可以有效的“预测”到环境的变化趋势,因而也会形成一个带形的区域形成对环境的记忆。所有这些集体效果都是自发的行为。
仿真的基本原理
每个生命体实际上都是一个小型的“图灵机”,并且这一群图灵机可以通过遗传变异而进化。
内部结构:一群参数包括拥有的能量值、寿命、当前坐标、当前面对方向等等。一个可变化长度的规则表rules,这个规则表既可以当作指导生命体运动的程序规则,又可以当作遗传的数据(染色体)被遗传变异。
如何行动:每个仿真周期,生命体仅仅读入它所面对的前方三个方格情况,如果0是空格,1是有食物的方格,那么,每次生命体读入的就是一个010,001这样的三位长的二进制字符串。生命体还有一些被编码成0,1,2,3,4……的内部状态,这样根据读入的二进制串和内部状态,生命体会查找它的规则表rules,找到匹配的一条规则,得到输出动作(0,1,2,3,4)和下一时刻的状态。其中动作(0,1,2,3,4)都是动作的编码,它们分别表示前行、左转、右转、繁殖、播种,也就是说每个生命体在每个周期所采用的动作完全是由它们的规则决定的。其中繁殖就是在当前位置诞生一个新的生命体,并且父亲的所有状态都会遗传给后代。
环境规则:如果生命体所在的世界位置有食物,那么就会把这个食物吃掉,吃到食物就可以增加生命体的一定量的能量值。另外,生命体的每一种行动都会对应不同的能量消耗值,而新出生的生命体都会从它的父亲那里得到一部分能量值,如果一个生命体的能量消耗殆尽,或者这个生命体的寿命超过了最大寿命就会死亡。为了限制生命体的繁殖,每个生命都有一个最大繁殖数量。
遗传规则:当每次遗传的时候,父亲会把规则表完全遗传给后代,但同时在遗传的过程中会以概率muteP发生变异,并且,规则表的长度也会以lenP的概率发生变化(既可能增长也可能缩短)。因而,生命体可以通过遗传变异来给自己编程,并且由于这个模型是与图灵机等价的,所以原则上讲,任意复杂的程序都能够被编出来。
基本参数
Initial Agent number:初始时刻生命体的个数
Initial foods density:初始时刻食物的分布密度
MaxAgentContaining:环境对生命体个数的最大容量,当生命体超过这个总数就会使得遗传操作实效。这种处理的原因是为了缓解对内存的压力,如果生命体过多,计算机的负载会很快变得很大
Agent's max age:每个生命体的最大寿命,超过这个年龄的生命体将会死亡
delay time seed to grass:一个种子要经历多少时间才能变成食物
Energy to produce a seed:产生一粒种子,生命体所消耗的能量值
Mutation P:变异的概率
LenP:长度变化的概率
开发背景
起初开发这个仿真模型有两个目的,一个是研究个体Agent的决策行为如何适应性的变化。我提出猜想,行为趋向混沌边缘的个体会逐渐在进化中诞生出来,并得到了一些初步结果。对这个决策模型的进一步改进就得到了现在的模型。
另外一个目的是验证早期关于人工生命的一些思考。在我刚刚接触到人工生命中的蚂蚁觅食行为、人工生命Floy的动态行为觉得很迷人,但总觉得它们的行为是程序事先设计好的,而寻找这样的规则本身是一个艰巨的任务(在我开发蚂蚁觅食的仿真模型的时候深有感触)。于是我希望能够找到一种方法让生命的行为自动演化出不同的样子。然而如果用标准的遗传算法会存在很大的困难。我们都知道,标准的遗传算法都需要对问题用染色体进行编码,并且设计每一种染色体的基因组合的适应度函数,而染色体编码和适应度函数的设计本身就是一个很困难的问题。尤其是人工生命的适应性行为没有固定的评价标准。于是我开始思考如何让人工生命的行为不是一下子从染色体直接翻译过来的,而是通过类似L系统的跌代方法组合生成出来。计算机本身就是一个很好的启发,因为计算机无非就是一大堆01代码的组合,然而原则上它能够做“任意的”事情。为了弄明白普通计算机为什么能够做“任意的”事情,我开始探索计算理论和图灵机。后来搞明白了图灵机具有最强的计算能力,只要计算模型能够执行“通用计算”那么原则上它就能组合出来任意的行为。也正是因为这样,我才考虑到用图灵机作为进化Agent的基本模型。这样对图灵机程序的变异进化原则上能够产生任意复杂的程序。
另外一个头痛的问题是解决适应性行为的判定,也就是适应度函数的问题。为了在模型中不显含适应度函数,我采纳了qingtom的意见,也就是让适应度自发涌现,通过设计Agent的能量值可以达到这个目的。原则上Agent能够做什么,怎么做都没有明确的规定,而每种行动都对应一个能量消耗值,当能量用光了Agent就死掉,这样适应性的结果就会自发的演化出来。通过进化,留下来的Agent能够有效的利用能量。
在解决了以上技术难题之后,仿真模型开始投入运行。然而开始我并没有意识到食物添加环境对Agent的行为会有多大影响,而且一开始我把目光集中到了Agent个体行为上,我希望看到Agent的行为能够逐渐复杂起来,然而事实不如我所料。接下来一个偶然的机会,我看到如果仅仅在一条直线上添加食物,而其他地方没有食物,那么Agent就会聪明的学会如何“走钢丝”(在一条直线上生存),我马上意识到了环境的重要性,并开发了不同模式的动态环境。
最后我希望Agent与环境的作用方式能够更自然,于是想到Agent死后也可能会变成新的食物,但是出于解释方便的目的,我让Agent可以播种,并且播出的种子由于某种假想的“光合作用”能够转变出更多的食物,在这种情况下,令我吃惊的是组织自我突现出来了。而且那些日子我刚刚接触到了自创生理论,我发现在本模型中的组织就是一个自创系统,它自己维持着自己的存在,尤其是看到了惊人的自我维护现象。
疑难问题及进一步改进
1、在生命体能播种的情况,如何让组织实现自主运动。也就是它们的运动具有明显的目的性,会观察到周围环境的食物分布,自动朝向食物分布多的地方运动。由于现在的规则,组织是一个自给自足的系统,因而也失去了获取更多食物的兴趣,因而现在尚无法很好的完成自主食物的获取。
2、如何让更高级的组织涌现?组织可能呈现出明显的内部结构,多个组织联合起来可以形成超级组织等。
3、如果把环境的变化比喻成计算机的指令,那么生命体的适应性行为就是对这些指令的执行。如果让指令根据生命体的变化而进化会怎样?也就是说环境的状况如何自发的进化?
4、如何进一步简化生命体的模型,由于每个周期,生命体都要进行查表操作,因而浪费了很多时间,导致程序的效率下降。
5、如果更改Agent的模型会有什么结果?比如如果把Agent改造成一个演化的神经网络。(不知道传统的BP网络模型是不是能带来更好的结果,原则上,只要是支持通用计算的模型就能达到进化的目的,那么BP网络可以么?)
6、如何进一步减少人们对规则的制定,目前设计者还需要设计环境的规则及其参数,如何让这些东西都自发涌现?如果把环境也看做是图灵机会出现什么情况?
潜在的应用
1、通过这个仿真试验研究并开发个体的行为。由于随着程序的运行个体Agent的规则表会变得相当复杂,因此如何在这些庞大的规则表中找出有用的程序规则成为一个难题。然而通过理解人工生命的行为我们有望更好的理解人类决策的行为。《Decision at edge of chaos》这篇文章就探讨了Autolife模型中的Agent从行为上趋向混沌边缘的可能性,以及对我们决策管理的实际意义。
2、将Autolife模型作为隐喻解决计算理论问题。比如我们看到agent构成的组织有一种自发的聚集行为,我们能否用这个现象构造一种聚类算法?我们知道,已经有人研究运用人工生命的方法解决计算机自动聚类问题,那么我认为Autolife这个模型也很有可能完成这个工作。
3、能否用Autolife模型构造出新的通用的进化算法来解决优化问题?我们知道蚂蚁算法的本质就是利用蚂蚁的涌现行为刚好是最短路径来解决优化问题的。而Autolife中的Agent本质上也在经历着寻优的过程,他们不断的适应新的环境就是不断的优化过程,如何把这种优化过程进一步扩展到更广阔的领域呢?
4、是否能够以Autolife模型作为隐喻构造某种突现计算?如果把Autolife中的网格空间抽象成更加一般的空间,把环境添加食物的动态行为理解为一种指令,那么Agent的群体行为就是执行这些指令的表现。这就好像普通的计算机在执行一堆指令代码,然而不同的是,Autolife中的Agent群体具有很强的灵活性、适应性和鲁棒性,那么执行出来的结果应该和我们的数字计算机不一样,因而能够看到某种适应性的、柔性的执行代码的结果产生出来。
5、在艺术领域的潜在应用。因为Autolife是一个可视化的、界面友好的群集行为仿真,能否把这个模型应用于产生各种各样群集艺术作品是一个既有趣又值得探索的问题。