NCF参数化建筑论坛
标题: 集群与涌现 [打印本页]
作者: njyqqq 时间: 2010-6-19 21:07
标题: 集群与涌现
电脑中的群集行为 “ 从《侏罗纪公园》和《终结者》时代开始,我们已经熟悉了美国大片惯用的计算机三维动画技术。然而上面提到的机器乌贼构成的巨龙和活泼可爱的鱼群又绝不是传统三维动画技术能够完成得了的。假设我们用关键帧方法来制作《海底总动员》中的鱼群,那么就需要为每一条鱼在每一个关键帧中设置游泳的姿态,我们很快会发现,用这种方法仅仅做 1 分钟的动画也几乎是不可能的任务。首先,为每条鱼在每个关键帧设置姿态是一件非常繁琐的事儿,而且设置出来的效果可能导致鱼群的行为动态是僵死的,最可怕的是,当我们需要调整某个关键帧的时候,就必须更改所有其它关键帧才能保证鱼动作的连贯性,这意味着我们几乎要重新完成所有的工作!那么究竟美国人是怎么完成这些不可能的任务的呢?他们如何制作出蜂拥而至的乌贼“巨龙”以及活灵活现的鱼群?答案就在于一种新的计算机动画技术:人工生命的群集行为!”
本章开始探讨计算机中人工生命群体行为,包括模拟飞鸟的Boid、模拟昆虫的Floy。
作者: njyqqq 时间: 2010-6-19 21:07
名 称: 人工生命Floy
源程序下载: 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。
|
作者: njyqqq 时间: 2010-6-19 21:08
与同类交互的规则:
找到你周围的同类尽量去靠近它们,但也不能靠的太近;
与异类的规则:
如果在自己的疆土上则发现了一只入侵者就尾随它并在适当的时机进攻;
如果不在自己的疆土上则如果有本地的居民追逐你就赶快逃跑。
每一代中的每只Floy都不太一样,它们都有自己的个性,而这些个性都体现在它们的行为上,也就是它们的最大速度、反弹速度、加速度、中心的吸引力、碰撞距离等等属性的不同,如果我们将这些特性编码就能得到每只Floy的染色体,然后再对整个一代的Floy中进行适应度的排序,挑选出适应度比较高的Floy作为父母进行繁殖也就是让它们的染色体进行交叉来得到下一代,这就完成了一次自然选择,也就是一代的进化。下面我们有必要对适应度进行说明,适应度是能量值和安全度的加权平均值。打击入侵者和增加移动速度会增加能量值;而与自己同类尽量保持靠近会增加安全度。
在这个程序中,进化是在三个不同层次中进行的,最低的一层是在我们称为基因型的层次进行。基因型就是一个字符串的染色体,物种的基因都编码在染色体之中了。并且每一个染色体字符串的位都表示Floy的一个特征。这些编码在我们解码之前没有任何意义。
中间的一层被称为表现型,在这个层次中Floy的染色体被直接解码形成了这个Floy的行为特征。举例来说,在Floy染色体的一个位上定义了它的加速度的值,我们在屏幕上看到的这个Floy移动的快慢就是受这个基因影响的。
第三个层次是个体的适应度。个体的适应度是依赖于它的基因的,但这种依赖关系不是简单直接的,事实上染色体并没有适应度的基因。当个体的能量值和安全度都很大的时候它的适应度才会大,而这导致了一个矛盾。因为如果一个Floy要想获得更大的能量值它就必须在它的兄弟们进攻入侵者之前就先行动进攻,但是这样做它就会远离自己的同类从而降低它的安全度。
因此我们会得到下面的这样一个链条:自然选择是对适应度进行的,而适应度是依赖于表现型的,而表现型则是被基因型决定的,而遗传的操作(变异、交叉)是在基因型上操作的。因此整个进化的过程就是这样一层一层涌现出来的。
· 一次观察记录:
开始一个新代,每个个体都有自己的个性,它们都有不同的颜色,而且行为也都不太一样,当入侵者飞进来的时候有的主动进攻,有的逃之夭夭。进化开始了,过程还不算慢。等了十几分钟后,一些个体已经逐渐被淘汰了,最后只剩下了灰色和绿色的两种个体。其中灰色个体的特征是主动进攻型,而绿色的个体是喜欢团队合作集体进攻的类型。经过慢慢的进化,绿色的Floy越来越多,灰色的越来越少最后只剩下一只了,但是它会采取主动的有效进攻。突然,绿色的Floy居然会使用诡计了,它们一大堆抱成一团缓慢的移动,但是它们跟随着那只灰色Floy,并且只有当灰色的Floy进攻的时候它们才一起进攻,否则不会单独行动,这样它们可以使自己的安全度和能量值同时提高。最后,灰色的Floy被淘汰掉了,仅仅剩下了那一大群绿色的。
作者: njyqqq 时间: 2010-6-19 21:08
蚂蚁的智慧
“ 单个蚂蚁异常简单,它们具有非常有限的感知能力,并且只会进行简单的推理。然而当多个蚂蚁聚集在一起形成蚂蚁群的时候,一些智慧的行为就能表现出来。整个蚁群不仅能够找到食物,而且它们还能够聪明的找到把食物搬运回家的最短路程,它们还能够形成等级森严的社会体系……。整个蚁群具有异常灵活的适应性,并体现出一定的智能。”
本章开始把目光集中到小小的蚂蚁身上。我们主要探讨了蚂蚁的聚集食物行为和觅食行为。进一步,我们还可以给蚂蚁赋予进化能力,用遗传编程的技术来进化蚂蚁群体使得它们可以更加有效的觅食。
作者: njyqqq 时间: 2010-6-19 21:11
人工社会
我们看到,计算机中的动点Agent可以代表鸟、苍蝇、蚂蚁,同样它也能够代表人。这就是人工社会思想的基本出发点。“人工社会采用的主要思路就是在计算机中模拟人类社会的个体:人——这种计算机中的人的模型被统称为智能 Agent ——然后让这些 Agent 在计算机中按照固定的模拟相互作用,最后研究人员观察 Agent 的总体所体现出来的涌现属性和行为。”
Sugarscape
Sugarscape是由Epstein和Axtell合写的程序,他们二人将Sugarscape中的各种涌现行为写成了一本书《Growing Artficial Societies》。
作者: njyqqq 时间: 2010-6-19 21:12
名 称: 人工模拟股市
开 发:Santa Fe Instutive(Swarm版),jake(java版)
源程序下载: asm_java.zip、asm_swarm.zip
·程序简介:
人工股市(Artificial Stock Market,简称ASM)是模拟股市运作的一个程序。在这个电脑中的虚拟市场中,若干被称为交易者的人工智能程序(Agent)通过观察它们所在的数字世界中股价和股息的不断变换而做出预测,并且根据这些预测做出购买股票与否以及购买股票数量的决策。反过来,所有的交易者的决策又决定了股票的价格,这样,整个的股票交易市场就构成了一个自我封闭的计算系统。同时,这些交易者都具有学习的能力,可以根据以前预测的成功或者失败对自己的决策进行调整,并且通过一种被称为遗传算法的方法产生创新能力。总之,ASM是一个电脑中不断进化的虚拟股票市场!通过研究ASM,我们可以更好的理解现实世界的行为,并且它提供了一个很好的现实股市的隐喻。
·程序运行说明:
点击下排的开始按钮,则股市开始运作。首先,程序需要对每个Agent和整个世界进行初始化,然后才进入ASM的实际运行阶段,这个时候,你可以点击曲线图、柱状图等按钮察看世界运行的情况,得到价格、股息等信息的直观显示。当点击结束的时候,股市停止运行,这个时候你可以设置一些参数,再次点击开始可以在新的参数下运行程序。察看规则部分可以让你看到每个Agent的内部规则,并且可以看到它们与真实世界价格、股息、编码的对比情况。点击暂停按钮后,你还可以单步运行股市。
·详细说明:
1、参数说明:
· 遗传算法概率:每隔多长周期执行一次遗传算法。
· 变异率:执行遗传算法的时候,变异操作的概率。
· 交叉率:执行遗传算法的时候交叉操作的概率。
· Agent的数量:进行股票交易的交易者数量。
· 规则的数量:每个Agent所拥有的预测规则的数量。
2、图形说明:
世界的状态显示的是有关整个股市的状况,包括股价、股息等等,风险中性价格即股息/利息的值。Agent的状况则显示了每个Agent的变量的变化趋势。曲线图画出了单一变量与时间的关系,柱状图主要显示了各个变量的Agent之间的对比情况。
3、关于图形操作:
曲线图,可以在一个坐标系下察看两种变量的情况。蓝色表示一个变量,红色表示另一个,可以从下面的选择框选择不同的变量。关于柱状图,可以变换不同的变量察看情况。
4、关于规则察看的操作:
在上面列表中显示了当前的Agent拥有的所有的规则,选择最下方的Agent编号,可以察看不同的Agent的规则,选择中间的察看方式:全部规则还是激活规则则可以分别察看当前Agent的所有规则和被激活的规则。点击列表框中的一个规则,则在下面的文本框中显示了该规则的具体对应的条件部分的编码,和代表的预测意义。世界状态则表示了当前世界股票价格、股息等变量的二进制编码。下面显示的价格和股息都是当前股市的股价和股息。
·关于本程序:
该程序是作者对SFI的ASM2.2版本运用java进行重写和改造。其中有不少对源程序的改动,可能会造成一些运行结果与源程序的不同,也可能存在着一些bug,所以我们提供了该java版本程序的下载以及Swarm源程序的下载。
作者: 3828669 时间: 2010-6-19 22:03
留名收藏。
作者: 夜神 时间: 2010-6-19 23:13
越智能的算法对数学的应用反而越简单,关键是逻辑规则要找准。
作者: Line 时间: 2010-6-19 23:18
首先向前辈们的研究成果致敬。
我们花在像他们这样研究上的时间和精力都是远远不及的。
其次希望楼主能补充编辑一下文字段落中缺失的图片,完整的资料传递的讯息会更准确。
最后,作为一个对“集群与涌现”的计算机技术了解得不深的人,
也许还没资格说三道四,但我还是希望提出一个问题:
这世界不变的只有变化,我们能够用不断发展的计算机技术完整的描述出这个变化的世界么?
我认为永远是不可能的。
正因为如此,才更要对前面文章中提到的致力于探索和研究的人们致敬!
作者: njyqqq 时间: 2010-6-20 00:21
http://www.swarmagents.com/javaclass/floy.htm
大家自己去看吧,
作者: claudemit 时间: 2010-6-20 15:51
话说上届有个计算机人才误入建筑学的大哥,自己编过一个蚁踪软件
不知道啥语言,哪天厚着脸皮要来看看
作者: Kunka 时间: 2010-6-21 01:01
好深奥 定完之后慢慢啃
作者: scmast 时间: 2010-11-25 17:30
感谢分享 很有用!
作者: sfwwdf 时间: 2010-11-28 09:15
很好的资源,谢谢楼主!
作者: yuhao666 时间: 2011-7-5 18:53
ddddddddddddd
作者: 1236542020 时间: 2011-8-19 09:49
我想说我没看明白……
作者: 暴躁璐 时间: 2012-5-14 21:22
收藏加mark一个~
作者: jianzhumdx 时间: 2012-5-27 09:34
1# njyqqq
下来看看啊
作者: jianzhumdx 时间: 2012-5-27 09:43
有东西吗里面
作者: yinny 时间: 2012-5-28 21:02
留名收藏,,,膜拜。
欢迎光临 NCF参数化建筑论坛 (http://bbs.ncf-china.com/) |
Powered by Discuz! X3.2 |