Floy

来自集智百科
2018年5月1日 (二) 15:37Jake讨论 | 贡献的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到: 导航搜索

  • 名 称:人工生命
  • 作 者:Ariel Dolan
  • 源代码:File:Floy.zip

程序说明

生命是什么?我们能不能造出生命来?看看上面的程序——

你看到了什么?一群苍蝇在飞舞?这是简简单单的动画么?这些家伙是“活”的么?我可以告诉你,这群飞舞的动物叫Floy,它既不是苍蝇也不是蝌蚪,而是人工生命!这就是一段简简单单的程序,而且代码的长度才有200多行!

单击Properties按钮,你可以改变这群Floy的属性,首先我们为了从简单开始把Floy的个数更改为1个看看,点击OK返回以后再按一下Continue按钮,一只Floy在围绕着中心转,也许你会说,这没什么,不就是一个运动的点么?如果更改Floy的个数为2个,那么这两只Floy就会互相追逐着在屏幕上飞行,注意两只Floy的行为就会产生混沌模式了,也就是它们的运动方式几乎是完全不确定的。逐渐增加到15只以上你就会看到一大群生物在那里乱飞了,这很像我们现实世界中的苍蝇行为。点击Strangers按钮,你会看到一只红色的Floy从屏幕的左上角飞进来,注意,它的到来可不寻常,它是一个外来的入侵者!本来相安无事的绿色Floy因为它的到来而变得行为异常起来,它们会突然转过头来进攻红色的入侵者,而红色的Floy会赶忙逃跑。继续点击Strangers按钮,就会有不断的入侵者加入进来,同时原有的Floy群体在减少。你会看到有两群苍蝇在那里追逐。绿色的Floy是本地居民,它会进攻入侵者最后将它杀死。如果幸运,你甚至会看到绿色的Floy们会使用诡计,它们先若无其事的在一起飞即使身边就有一只红色的入侵者,但是突然之间,它会转过头来进攻红色的,让它来不及逃跑。点击Default按钮可以恢复原状。

为什么这一群小点在这么简单的程序之下会有这样复杂的行为?它们是怎么实现的?注意,虽然这也是编程,但我们并不是按照传统的方法对所有Floy的集体行为在每一种可能的情况都编程,而是给每一个个体Floy制定简单的规则,这样Floy集体的复杂行为就会自然而然的涌现出来了!那么个体Floy的规则是什么呢?它是遵循下面的规律:

  • 首先找到和自己最近的几只(邻居数)的Floy作为自己的邻居;
  • 对于每个邻居如果它是自己的同类那么然后分别计算与这些邻居之间的距离;
    • 如果太近(距离小于碰撞距离)就朝向远离这个邻居的方向加速飞翔;
    • 如果较远(距离大于碰撞距离)就朝向靠近这个邻居的方向加速飞翔;
  • 如果邻居是自己的异类;
    • 如果这只Floy是绿色的则以非常快的加速度向对方进攻;
    • 如果这只Floy是红色的陌生者则当小于碰撞距离的时候以非常快的加速度逃离,并且自己的能量减小;当距离不是很大时,停止加速。

总体来说,Floy的规则就是选择自己的加速度,并且这种选择仅仅跟自己的邻居有关,也就是说规则都是局部的。而这个程序的关键是要体现整体行为的涌现,也就是说虽然微观上每个Floy个体的规则都是简单的局部的,但是在集体涌现出来的现象却是复杂的并且是不可预测的。人工生命的精髓就是:其实生命现象本身不过是由微观的简单相互作用规律涌现出来的集体复杂行为。

进一步,你可以探索更改参数对这群Floy的影响。你可以点击Behavior按钮,Floy的个性会改变,有温顺的也有疯狂的。它们的行为完全是由几个简单参数制约的,再次点击Properties按钮,那里面的参数制约了每个Floy个体的行为自然也就制约了Floy整体的涌现规律。其中各个参数的意义:加速度就是指每只苍蝇进行加速靠近或者远离的最小加速度值;中心吸引度是为了让Floy能够围绕屏幕中心旋转而让它们的加速度都有一个指向中心的分量;碰撞距离定义多少像素距离是叫做碰撞,从而Floy们选择远离还是靠近;最大速度是为了Floy们的行为不至于太疯狂也就是速度固定一个上限;反弹速度是当Floy撞击墙壁的时候反弹回来的速度;间隔时间是控制整个程序快慢的参数;初始速度是每只苍蝇在开始的初速度;自由重组邻居的概率:为了让Floy们的行为中有一定的随机不确定性,它们会以自由重组邻居的概率重新随机的选择自己的邻居(正常情况下是选择距离最小的若干Floy作为自己的邻居),如果这个概率指定为0那么Floy的行为就没那么有趣了;邻居数目定义了每只Floy可以有多少邻居。

接下来我们能干什么?也许你觉得这个简单程序太没趣了,应该把它改为三维的动画。没问题,这个要求还算容易满足。你只要点击这里就能看到三维的Floy。但是因为Java本身的限制,动画不如用Maya之类的三维软件作的好看,但是这个程序却反映了规律的本质,有兴趣的朋友完全可以把这个动画用Maya作一遍,这样你可以给每个Floy赋予贴图裁质,那样也许更有趣。

也许三维的Floy仍然不够有趣,我们能不能在想出点疯狂的?

进化!首先让每只Floy都拥有自己的个性,然后让Floy能够进行有性繁殖,并且后代Floy能够继承父母的特性,没问题,请看能够进化的Floy。

相关wiki

个人工具
名字空间
操作
导航
工具箱