欢迎光临散文网 会员登陆 & 注册

基础 | 自治智能体----类鸟群(五)

2020-03-24 11:05 作者:有木乘舟  | 我要投稿

本系列为笔者初学c/c++和游戏AI开发的学习过程,算法为主,不涉及到具体的游戏开发软件学习(如unity,虚幻4等),若有错误请在评论区留下批评意见。

  • 语言:c/c++ (11及以上)

  • 平台:macOS mojave

  • 编译器:vs Code / g++

四、Separation和Alignment

4.1 Separation

  该行为产生一个向外的力,操控智能体离开他的邻域中的其他智能体。也就是不让两个智能体相撞。

  我们需要计算出邻域中所有智能体对当前智能体的合力,然后让智能体朝着这个合力运动。该合力的计算方式是该智能体到邻域其他智能体的距离的相反方向

图20:Separation方法

4.2 Alignment

  该方法使智能体与邻域内的群体的速度保持一致,重点是航向一致。

  我们通过遍历邻域,计算出他们的平均速度,该速度的方向就是我们需要的航向,因此只要将这个速度减去智能体当前速度,就可以求出智能体往这个方向航行所需的受力。

图21:Alignment方法

4.3 存储邻域内的智能体

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

图22:neighbor数组

  当其他智能体出现在邻域内时,将其索引标记为1,否则为0。

4.4 一些有趣的现象

  项目到这里,已经可以完整的实现一个简单的Boids类鸟群,自治智能体。它们会四处游荡,当身边有其他群体时,就会靠近那个群体,并与其他个体保持一定距离。

  但是其实如果去掉seek方法和cohesion方法,只保留其他两个行为模式,该自治智能体还是能表现出一定的群集行为,只是会更加混乱一些,四处乱飞。

  在计算最终运动轨迹的时候,为每个行为模式分配权重是一件非常重要的事情。每个行为模式在整个群集中的占比不同,会影响到最终的运动轨迹。

  我们现在只是粗糙的将所有受力合并起来,这会产生非常大的计算开销。如果我们将群体数量扩大到100以上,就会发现群体速度变得十分的缓慢。

  笔者暂时不知道这是因为cpu计算开销太大,导致帧率下降,还是因为群体受力发生改变导致速度变小。如果有小伙伴知道的话,欢迎留言答复。

4.5 结果演示


参考:

  • 《游戏人工智能编程案例精粹》

  • 相关代码下载    https://github.com/linpeijie/GameToy


基础 | 自治智能体----类鸟群(五)的评论 (共 条)

分享到微博请遵守国家法律