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

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

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

本系列为笔者初学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文件,用来存储环境内的全部智能体。

图15:Flock.h

  动态数组flock存储环境内的全部智能体,run方法为每个智能体boid传递全部智能体flock,并且不能忘了传递 增量时间。

  注意这里需要用auto &将变量定义为引用类型,不然无法执行变量b的函数。

图16:flocking方法

  同时,不要忘记修改World文件内的相关代码,我们之前是用一个Boids数组来存储全部智能体,现在我们用flock来做这个事情。

  先在World.h文件中新增一个Flock类型的变量:Flock flock;然后在.cpp文件中修改代码:

图17:红色箭头是需要修改的地方
图17:红色箭头是需要修改的地方

  现在我们已经获取到了环境中的全部智能体信息Flock,并将其传递给每个智能体Boid,接下来我们就需要通过领域和重心,来模拟出Boids的聚集行为。

3.3 重心和运动

  在数学模型上,Reynolds将Cohesion行为模式表现为智能体寻找领域内的群体的重心位置

  在平面直角坐标系中,重心的坐标是顶点坐标的算术平均。若有n个点,则其重心坐标为:

x =(x1+x2+……+xn)/ n

y =(y1 + y2 +...+ yn)/ n

  当一个智能体计算出邻域内其他群体的重心位置后,会执行seek方法计算出运动到重心位置所需的力。

图18:Cohesion方法

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

图19:计算行为模式受力情况

3.4 结果演示

 


参考:

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

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

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

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