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

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

三、Cohesion聚集
3.1 定义
Cohesion定义为,智能体不会倾向于独立行动,类鸟群倾向于维持群体的完整性,每个智能体会尽量与附近智能体靠近,以避免孤立。

具体表现为,每个智能体会自发的搜索邻域(neighborhood)内,出现的其他智能体,并计算出这些智能体的平均中心位置,即重心位置,然后朝该重心运动。
已知领域的定义为,以该智能体的位置为圆心,运动方向为弧,扇形半径为distance的扇形区域。

邻域具有两个特征,一是距离(distance,扇形半径),二是角度(angle,扇形圆心角)。
在这个领域内的群体会影响独立智能体的行为。
3.2 Flock
为了简便,我们每次计算环境内全部智能体与当前智能体的距离,然后筛选出处在当前智能体的邻域内的其他智能体,来计算它们的重心。
为此我们需要新建一个Flock文件,用来存储环境内的全部智能体。

动态数组flock存储环境内的全部智能体,run方法为每个智能体boid传递全部智能体flock,并且不能忘了传递 增量时间。
注意这里需要用auto &将变量定义为引用类型,不然无法执行变量b的函数。

同时,不要忘记修改World文件内的相关代码,我们之前是用一个Boids数组来存储全部智能体,现在我们用flock来做这个事情。
先在World.h文件中新增一个Flock类型的变量:Flock flock;然后在.cpp文件中修改代码:


现在我们已经获取到了环境中的全部智能体信息Flock,并将其传递给每个智能体Boid,接下来我们就需要通过领域和重心,来模拟出Boids的聚集行为。
3.3 重心和运动
在数学模型上,Reynolds将Cohesion行为模式表现为智能体寻找领域内的群体的重心位置。
在平面直角坐标系中,重心的坐标是顶点坐标的算术平均。若有n个点,则其重心坐标为:
x =(x1+x2+……+xn)/ n
y =(y1 + y2 +...+ yn)/ n
当一个智能体计算出邻域内其他群体的重心位置后,会执行seek方法计算出运动到重心位置所需的力。

最后,不要忘了在SteeringBehavior方法中应用这个计算出来的力,该方法不仅用来执行全部的行为模式,还需要计算出这些行为模式改变后的受力,并将这些受力合并成智能体最终的受力,再通过Update方法来更新智能体的位置。

3.4 结果演示


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