介绍
本类鸟群算法是自发行为一组在一个相对简单的演示。正如其创建者Craig Reynolds所述,它具有三个主要规则:
基本的植绒模型由三个简单的转向行为组成,这些行为描述了单个波德人如何根据其附近的植群的位置和速度进行操纵:
- 分隔:避免拥挤当地羊群。
- 对齐:对当地flockmates的平均航向转向。
- 凝聚力:转向向当地flockmates的平均位置移动。
每个辫子都可以直接访问整个场景的几何描述,但是植绒要求它仅对自身周围某个特定区域内的植绒动物做出反应。邻域的特征是距离(从主体的中心开始测量)和角度(从主体的飞行方向开始测量)。该本地社区之外的队友将被忽略。可以将邻域视为感知受限的模型(例如在浑浊的水中的鱼),但将其视为定义了一群人影响波伊德转向的区域可能更正确。
我在解释事物时并不完美,因此我强烈建议您查看原始资料。他的网站上还有一些超级有用的图片。
挑战
给定主体(模拟实体)的数量和帧的数量,输出模拟的动画。
- Boid应该呈现为红色圆圈,并在圆圈内部显示一条线,指示其标题,这是Boid指向的方向:
- 每个波蒂的角度(如雷诺所描述的)应为整300度。(不是360)
- 每个boid的起始航向和位置以及位置均应是均匀随机的(但要播种,以便仍能确定输出)。
- 如果boid的半径为1,则邻居的半径应为3。
- 伯德的数量从2到20不等。
- 帧数为1-5000
- 动画的播放时间至少应为每帧10毫秒,最长应为boid数量的1秒。(2个波西德=每帧最大2秒,3个波西德=每帧最大3秒,等等)
- 输出动画应至少为5个boid半径乘以5个boid半径,乘以boid数量的一半。因此,两个boid的最小大小将是10 boid半径乘以10 boid半径,三个boid的最小大小将是15 boid半径乘以15 boid半径,等等。
- 每个投标的半径必须至少为5个像素,最大为50个像素。
- 需要限制每个Boid的速度,以使其在一帧中的移动幅度不超过其半径的1/5。
- 需要确定输出,以便如果多次运行相同的输入将产生相同的输出。
- 如果辫子到达边界,则应回绕到另一侧。同样,每个投标附近的区域也应环绕边界。
算法规则
在这种情况下,每个Boid周围都有一个跨度为300度的扇形,以Boid的航向为中心。这个“邻居”中的任何其他小伙子都被认为是“邻居”,或(用雷诺兹的术语称)“队友”。
每个BOID都应调整其航向以避免碰撞,并保持一个BOID半径与其邻居的舒适距离。(这是算法的“分离”方面。一个波德半径可能会被绕过,但应该像橡皮筋一样,重新卡入到位。)
每个boid都应另外调整其航向,使其更接近其附近其他boid的平均航向,只要它不干扰第一条规则即可。(这是算法的“对齐”方面)
只要不引起碰撞或不会显着干扰第二条规则,每个船长都应将自己转向其队友的平均位置。
在有关该主题的论文中,他解释如下:
为了建立模拟群,我们从支持几何飞行的布依德模型开始。我们添加了与避免碰撞的相反力量和加入羊群的冲动相对应的行为。简要地描述为规则,并按优先级从高到低的顺序,导致模拟植绒的行为为:
- 避免碰撞:避免与附近的队友发生碰撞
- 速度匹配:尝试将速度与附近的队友匹配
- 羊群居中:尝试靠近附近的羊群
运动的更详细描述:
- Boids算法的标准实现通常会对每个规则进行计算,然后将其合并在一起。
- 对于第一个规则,Boid会遍历其邻域内的相邻Boid列表,并且如果其自身与邻居之间的距离小于某个值,则将Boid推离其邻居的矢量应用于Boid的航向。
- 对于第二条规则,Boid计算其邻居的平均航向,并将当前航向与平均航向之间的差值的一小部分(在此挑战中,我们将使用1/10)添加到当前航向。
- 对于第三条规则(也是最后一条规则),该boid将其邻居的位置平均,然后计算指向该位置的向量。此向量乘以比规则2所用的数字还要小的数字(对于此挑战,将使用1/50)并将其应用于航向。
- 然后将标本朝其方向移动
这是Boids算法的有用伪代码实现。
输入和输出示例
输入:输出:5、190(5个辫子,190帧)
获奖标准
这是代码高尔夫球,因此以字节为单位的最小解决方案获胜。