基础 | 自治智能体----类鸟群(五)
本系列为笔者初学c/c++和游戏AI开发的学习过程,算法为主,不涉及到具体的游戏开发软件学习(如unity,虚幻4等),若有错误请在评论区留下批评意见。
语言:c/c++ (11及以上)
平台:macOS mojave
编译器:vs Code / g++

四、Separation和Alignment
4.1 Separation
该行为产生一个向外的力,操控智能体离开他的邻域中的其他智能体。也就是不让两个智能体相撞。
我们需要计算出邻域中所有智能体对当前智能体的合力,然后让智能体朝着这个合力运动。该合力的计算方式是该智能体到邻域其他智能体的距离的相反方向。

4.2 Alignment
该方法使智能体与邻域内的群体的速度保持一致,重点是航向一致。
我们通过遍历邻域,计算出他们的平均速度,该速度的方向就是我们需要的航向,因此只要将这个速度减去智能体当前速度,就可以求出智能体往这个方向航行所需的受力。

4.3 存储邻域内的智能体
在这之前,我们修改了之前的Cohesion方法,在里面添加了一个哈希表neighbor,用来记录出现在只能邻域内的其他智能体,并将这个哈希表传递给其他方法,这样就不需要遍历全部的智能体,可以降低计算开销。

当其他智能体出现在邻域内时,将其索引标记为1,否则为0。
4.4 一些有趣的现象
项目到这里,已经可以完整的实现一个简单的Boids类鸟群,自治智能体。它们会四处游荡,当身边有其他群体时,就会靠近那个群体,并与其他个体保持一定距离。
但是其实如果去掉seek方法和cohesion方法,只保留其他两个行为模式,该自治智能体还是能表现出一定的群集行为,只是会更加混乱一些,四处乱飞。
在计算最终运动轨迹的时候,为每个行为模式分配权重是一件非常重要的事情。每个行为模式在整个群集中的占比不同,会影响到最终的运动轨迹。

我们现在只是粗糙的将所有受力合并起来,这会产生非常大的计算开销。如果我们将群体数量扩大到100以上,就会发现群体速度变得十分的缓慢。
笔者暂时不知道这是因为cpu计算开销太大,导致帧率下降,还是因为群体受力发生改变导致速度变小。如果有小伙伴知道的话,欢迎留言答复。
4.5 结果演示


参考:
《游戏人工智能编程案例精粹》
相关代码下载 https://github.com/linpeijie/GameToy

