编程语言
首页 > 编程语言> > 【游戏精粹】模拟群体行为:Flocking算法

【游戏精粹】模拟群体行为:Flocking算法

作者:互联网

目录


一、flocking:模拟群体行为的简单技术


      Flocking(有时也称为是warming或herding),拥有4项简单的规则,把它们组合在一起时,为自治主体群给出一个类似于鸟群、鱼群的群体行为的逼真形式。


 定向行为规则:分离原则、列队原则、聚合原则、躲避原则

        分离原则:定向时要避免与本地flock同伴拥挤。即定时检测邻近同伴,避免拥挤;
        列队原则:驶向本地flock同伴的平均航向。即检测邻近同伴航向、速度,获取平均值并调整自己;
        聚合原则:定向时朝着本地flock同伴的平均位置移动。即检测邻近同伴,平均位置然后调整其匹配航向;
        躲避原则:使避免撞上局部区域内的障碍或敌人。即“向前看一段距离”,遇到障碍物、敌人调整航向、速度进行躲避。


无存储:

       flocking是一个无状态算法,在2次更新之间没有保存任何信息。定向行为与状态信息、保存flock知识的主体、它所前往的环境以及喜好无关。每轮更新中,每个个体会对它的环境进行重新评估。这不仅减少了存储需求,也允许flock对于变化的环境条件进行实时反应。因而,flock显示出了涌现行为要素。    
       :“涌现”指一个系统中个体间预设的简单互动行为所造就的无法预知的复杂样态的现象。    


游戏开发实际应用:

       Flocking为个体运动和构造一个更真实的玩家可探索环境提供了了强有力帮助;它可以用于许多怪兽以及威胁性小的生物,以及控制不对队形与越过3D环境的运动。与简单的脚本结果相比,被创造的动物群体能在地形中更真实地游走。怪兽能以一种更自然的方式在场景中徘徊,躲避玩家可能袭击的位置,当flock(群体)变得足够强大时也许会发动反击。可能性几乎是无穷的。  


拓展:

      为flock添加生命时钟规则,使其拥有时间的概念——偏离同伴的成员联系越来越低,配偶之间能进行“繁衍”产生下一代,年老的成员会逐渐老死。以及捕食者和捕食行为——一种flock被喂养另一种。


二、有齿物群的模拟:捕食者和猎物


      在上文中,介绍了flocking的基础入门,接下来将通过几个方面来介绍flocking的拓展——有齿物群的模拟。


对象个异性:

猫守宫个异体

         根据对象的属性,设计一个异化的方法。该方法针对需要个异化的参数随机生成参数值进行赋予。甚至对其功能进行限制或增强(如一个对象被其他“捕食者”攻击导致腿部受损,则移动受限;一个对象在其群体为优先变异体,则变异部分功能加强如力量、敏捷等)。
        目的:为了使生物行为更加逼真,也为了使不同生物交互式将呈现突发行为,这也使得集体行为的物群更加逼真。
        例如:有些对象比伙伴饥饿,这样会增加其“捕食”的频率,或者说觅食的频率,这能增加物种的交互性;有些对象视野广,当它们在群体里时会增强物群的警戒强度,而当它们休息或者外出觅食时,则物群的警戒强度又会下降。甚至为捕食者增强一定的智能(当捕食者“注意”到这些警戒能力强的被捕食者时,会等待其离开物群时进行捕食或优先捕食其他警戒力较差的猎物),让整个群体行为模拟变得更加真实、有趣。


 物群的喂养:

食物链

      不同类型的物种以其他类型的物种为食,则需要控制物种的饥饿长度。所以,为每个需要的物种设立饥饿值,在游戏的每个更新周期中进行减少。当饥饿达到一定程度,物种开始寻找食物,甚至饥饿值达到一定程度会给物种带来死亡!饥饿值会影响物种的决策,比如物种饱腹后,遇到猎物可能不会去捕食(避免浪费,从而影响后续饥饿时捕食的效率)。每当一个物种被杀死时,则会被删除。


物群的繁衍:

      每个物种都应该能繁衍自己的成员,而作为食物链的底层,其繁衍能力就更强了。注意:为了避免物种过多,应该有所繁衍限制。例如最底层的生物繁衍到一定程度则会停止繁殖(每个地区只能供养一定数量的底层生物),而底层的生物作为被捕者,其数量也会影响到上一层的生物数量,这样层层递进,食物链顶端的生物将会是最少。即使食物链顶端的生物繁衍过多,也会因为大量捕食,使食物大量减少从而使自己饿死。这样循环也符合了自然现象。甚至为其添加进化的原则(同类的不同物群进行繁衍时会进行遗产不同的DNA——记忆,影响下一代的特长,比如长颈鹿和短颈鹿的脖子长度或者速度。长颈鹿和速度快的捕食者能获取的食物机会更大,则成员不断增加,而短颈鹿和速度较慢的捕食者则成员不断减少直至灭绝),进行模拟自然选择!


 物种的趋利避害:

      大部分情况下,捕食者的速度都要比被捕者快,而为了逃脱被捕食的命运,只能依靠捕食者遇到麻烦(体力暂时耗尽或者遇到天敌?)。比较容易的方法就是通过障碍物来进行逃脱,为了避开障碍物,捕食者不得不降低速度,这使猎物有机会逃脱。


有齿物群的模拟:

       1.世界模拟:在布满不同的障碍物世界中,顶级猎手会因饥饿而去捕食中层的物种,被捕食者会四处逃窜以免成为猎手的盘中餐。猎手常常障碍物的妨碍以至于猎物逃脱,而散开的物种会寻找其他同伴组成新的物群,然后整个循环再次重新开始。
       2.世界终结:整个世界会以2种方式之一结束,这取决于配置和运气。
            一种是最底层的生产者灭绝了,造成整个生态链崩溃。或者是顶层猎手将生物链的一环消灭了,造成该环相关的上层食物链崩溃,如果是简单的生物链,则可能导致整个世界只剩下了繁衍到极限的底层生产者。
            另一种是形成静态平衡,顶层猎手运气不好捕食不到猎物而灭绝。而只剩下中层物种与生产者,此时世界继续发展要么进入前一个状态,要么则生产者繁殖够快,提供了中层物种足够食物生存下去(如果除生产者其他物种都不可繁衍)。
            如果所有物种都可以繁衍,则可能出现任何结果,这是最逼真的配置模拟的方式,也是最难以进行正确的平衡。
       3.局限性和可改进的地方:针对物种的参数可更细化的开发,如物种视野,大多数猎手的视觉很敏锐,能看很远;而被捕食者视野较小且看不到后面。为了使视觉属性更逼真,将会带来大量的数学开销(视线检测和视角检测)。


个人想法:

           可以利用flocking算法的思维针对游戏中阵营模块不同阵营的AI进行物群模拟决策,让其更加智能(阵营每一个小势力为一个同伴,当然每个同伴也可以增加彼此的关系属性,从而影响各个原则如因为讨厌增强分离原则并彼此设置一个厌恶权值后将其加入躲避原则的对象)。并在其新增新的原则如攻击(捕食)、防御(躲避或阻碍)、团结(根据彼此的关系,会根据距离、强弱等因素对弱势的同伴进行援助)原则等,让其宏观上的AI更加智能。在微观上可以自定义如同将军一个的更高级的AI,让其进行局部影响,累积成果最终影响甚至改变其阵营宏观的策略(如因为整体的力量比对手强到一定程度,则会攻守转换,并在局部优势地域进行攻击,而在局部弱势地域进行援助——团结原则)。
           整个flocking算法为我们打开了游戏对生物学的生物行为进行模拟的大门,但不应该仅仅局限于已有的基础模块。整个算法仅论基础模块,是一个比较简单的算法,但其可拓展性极强。根据自己游戏需求,对flocking算法进行针对性的开辟原则,可以极大还原真实群体行为,甚至让其拥有更高的智慧(针对首领以及特异性个体进行AI增强,甚至使用机器学习、深度学习等技术进行训练、学习来提高整体群体的基础智慧!)。


学习资源

更详尽的内容和代码实现可在书中阅读。

标签:精粹,捕食者,繁衍,群体行为,物种,Flocking,flock,物群,模拟
来源: https://blog.csdn.net/Evil_Carl/article/details/121236099