REF · 经典模型

Boids 鸟群模型THE BOIDS MODEL

Craig Reynolds,1986 — 三条只看邻居的规则,长出一整群的运动

被引用于:Topic 13 自组织

01它问的是什么问题(The Question It Poses)

一群椋鸟转弯时整齐得不像话,一群沙丁鱼受惊时像一块布被抖了一下。最省事的两个解释是:有一只领头的;或者它们之间有某种"感应"。前者早被高速摄影否掉了——转向可以从群体的任何一侧发起,而且同一群鸟在同一分钟里发起的位置不固定。

1986 年 Craig Reynolds 要解决的其实是个动画问题:做电影时,怎么才能不逐帧手画一群鸟。他要的不是解释,是一套能跑出这种画面的最小规则。结果这套规则顺带回答了生物学的问题——这种整齐不需要任何全局信息。

02规则本身(The Rules)

  1. 每个个体叫一只 boid,有位置和速度。它只能"看见"自己附近一小片区域里的邻居。
  2. 分离(separation):离邻居太近,就往反方向推一下。
  3. 对齐(alignment):把自己的速度调向邻居速度的平均值。
  4. 凝聚(cohesion):朝邻居位置的平均值(重心)靠一点。
  5. 三条各配一个权重,加起来当作这一帧的加速度;再加上最大速度和最大转向率两个限制。
  6. 就这些。没有全局变量、没有领头、没有任何一只 boid 知道整群长什么样。

第 1 条值得多看一眼:"邻居是谁"本身就是一个建模选择,而不是一个中立的技术细节。Reynolds 用的是"半径 r 以内、且不在身后盲区里",这叫度量式邻域(metric neighbourhood)。第 4 节会看到,真鸟用的可能不是这个。

一只 boid 只知道两件事:谁算它的邻居,以及三条规则各要它往哪儿走r邻域里的算(苔绿)· 邻域外和盲区里的不算(暗)盲区分离对齐凝聚三者的加权和= 这一帧的加速度三条各有权重 — 改权重就改了整群的形态代码里没有「群」这个对象 — 每只 boid 每帧只做上面这一次加法
一只 boid 的全部世界:邻域里的几只鸟,三个方向的诉求,加权求和成这一帧的加速度。

03跑起来会看到什么(What You See When It Runs)

随机撒一把 boid,几秒钟内它们聚成群。碰到障碍物,群分成两股绕过去,过去之后再合上——代码里没有"分开"和"合上"这两个动作,它们是那三条规则的后果。

更值得看的是转向:一只 boid 先动,邻居跟着调,再传给下一圈。转向像波一样扫过整群,而且波速比"每只鸟看见领头再反应"要快得多,因为它是接力,不是广播。

把三个权重当旋钮拧,同一套代码会给出三种完全不同的宏观形态:分离权重大,群松散得像气体;凝聚权重大,团成一个球;对齐权重大,拉成一条整齐的迁徙带。宏观形态是参数的函数,不是被指定的目标。

同一套规则,只改三个权重的比例① 分离权重大松散得像气体② 凝聚权重大团成一个球③ 对齐权重大拉成整齐的迁徙带宏观形态是参数的函数 — 没有一处代码在描述「气体」「球」「带」
同一套规则,只改三个权重的比例。没有一处代码在描述"气体""球""带"这些形状。

04它解释了现实中的什么(What It Explains)

最重要的一条是否定式的:它把"必须有领头、必须有全局感知"从必要条件里划掉了。在这之前,群体的整齐被默认需要某种集中的东西;boids 之后,需要解释的反而是"如果不需要集中,为什么有些群体还是有领头"。

正面用途在工程上很直接:无人机编队、人群疏散仿真、游戏与电影里的群体动画(1992 年《蝙蝠侠归来》的蝙蝠群是最早的大规模应用之一)。

它还给出了一个能测的量。如果个体只看邻居,那么信息在群里的传播就应该是波,而波速可测。Attanasi 等人 2014 年对椋鸟群的实测确实看到了这种转向波,并且发现它衰减得极慢——这正是"只看邻居"该有的样子,而不是"每只各自反应"该有的样子。

它不能解释什么(What It Cannot Explain)

延伸阅读(Further Reading)