Unity GameAI 启发式搜索算法(A *算法底层)

A*算法

虽然在unity给我们的提供了Navigation作为我们寻路的解决方案,但是在实际中我们同样也不得不使用到一套自己的方案来实现,这时A*就是我们最常用的一种方式。

  • A* 搜索算法是一种解决图遍历问题的计算机算法,这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。最主要的应用是寻找地图中两点间的最佳路线。

  • A改变它自己行为的能力是基于启发式代价函数*,启发式代价函数在速度和精确度之间取得折中会让游戏运行得更快。

    • 在介绍启发式搜索算法之前,先介绍状态空间搜索。状态空间搜索就是将一个问题的求解表现为从初始状态到目标状态的过程。 在这个过程中,我们可以使用这种数据结构去表达,由于求解方式有很多(树的分支)我们到达目标状态的方式也就有很多,这个过程就叫做状态空间搜索。

    • 状态空间搜索也分为:深度优先和广度优先。

      • 广度优先是从初始状态一层一层向下找直到找到为止。
      • 深度优先是按照一定的顺序查找完一个分支再去查询另一个分支,直到找到为止。

深度优先和广度优先算法在状态空间不大的时候会很合适的,但是如果状态空间非常大并且不可预测的情况下就不可取了。它的效率会十分的低,甚至无法完成。 这时就需要用到启发式搜索。

启发式搜索算法。

启发式搜索算法:

  • 启发式搜索算法就是在状态空间中对每一条搜索分支进行评估,得到最好的分支,再从这个分支进行搜索从而到达目标。这样可以省略大量无畏的搜索路径,提高效率。

  • 在这其中,对分支的评估是非常重要的,不同的评估就会有不同的效果。以下为部分评估算法:

    • 局部择优搜索: 在搜索过程中,选取在该层分支中的“最佳节点”后舍弃其他兄弟节点,父节点,而一直进行搜索下去。由于舍弃了其他节点,也很可能也把全局的最佳节点也舍去。

    • 最好优先搜索:为局部择优的优化版,在搜索时,找到最佳节点后并不是舍弃其他节点,在每一次评估中都把当前的节点和以前的节点的估价值进行比较得到一个最佳节点。

    • A算法: A ** 算法也属于一种最好优先算法,但是为进行一些条件约束。因为在某些问题的求解时,我们希望求解出状态空间搜索的最短路径,也就是用最快的方案求解问题。 我们先对问题做一个定义,如果一个评估方法可以找出最短路径,我们称之为可采纳性。A 算法是一个可采纳的最好优先算法。

估价函数

启发中的估价是用估价函数表示的:
             f(n)=g(n)+h(n)

其中f(n)是节点n的估价函数,g(n)是在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估价代价。在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。g(n)就代表了搜索的广度优先趋势。但是当h(n)>g(n)时,可以省略g(n),而提高效率

像素化地图。

我们想要进行对AI路径的控制首先我们就需要对地图进行像素化。 何为像素化地图呢? 就如unity的网格一样。将一张地图按照一定的比例尺进行网格化划分就是像素化。其中的每一个网格单元我们称之为节点(不以方格来表示示因为这些网格单元不一样是矩形的也可以是六边形,圆形等等。)。节点就称为是寻路算法的单元。

  • 示例图片:
    • 使用了正方形作为了寻路算法单元
Paste_Image.png

Paste_Image.png
  • 可视化导航点
Paste_Image.png
  • 导航网格,可行走区域划分为凸多边形。
Paste_Image.png
  • 寻路的第一步是简化成易控制的搜索区域。
  • 接着我们就需要模拟计算出寻路的最短路径。
Paste_Image.png
  • 从我们的角度去思考,猫到食物的最短路径有两条。

    • 1-2-3-4-5-6-食物
    • 1-2-3-4-5-7-食物
  • 那计算机是如何处理的呢?

    • 我们在计算最短路径的时候最关键的部分也就是计算出距离!
    • 而这个距离并不是直线距离,是曼哈顿距离

曼哈顿距离

曼哈顿距离是一种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。

曼哈顿距离.jpg
  • 曼哈顿距离:两点在X轴方向上的距离加上两点在Y轴方向上的距离。

例如在平面上,坐标(x1, y1)的i点与坐标(x2, y2)的j点的曼哈顿距离为:

d(i,j)=|X1-X2|+|Y1-Y2|

以上图猫的地图来说:

曼哈顿距离.png
  • 以左下角的方格为(0,0)点,那猫的坐标就为(1,2),食物的坐标为(5,1),那它们的曼哈顿距离就为d(i,j)=|1-5|+|2-1|=5. 图中两条红线就是曼哈顿距离。(没有考虑障碍物的情况)

  • f值, f(n),估价值函数。要想从起点A到B,中间可能经过n个点,假如其中经过点x,则对点x的计算所得的估价值就是f(x),估价值越小越好。

  • g值: 从起点A到达x点实际所花费的价值。以方格为例,g值就表示,从A到x点的格子数。

Paste_Image.png
  • h值,从点X到终点B可能需要花费的值,所谓的估计值。f(x)=g(x)+h(x),g(x)是固定的,要想f(x)越小那h(x)就得越小。

寻路算法。

Paste_Image.png
  • 如图所示,由于猫的下方有障碍物,则猫的移动方向有三个方向。F值分别为5,7,7,那就会选择F值较小也就是5的这条路径进行移动。

  • 移动以后。则有出现了5,7两条路线,继续选择5的路径进行移动

Paste_Image.png
  • 但当我们发现在继续移动时,就会出现以下问题,我们开始选择的最佳路径,到了此时却出现了四条估值都为7的路径。
Paste_Image.png
  • 我们先继续沿着路径行走。
Paste_Image.png
Paste_Image.png
  • 最终我们得到了两条最短路径。(之前我们没有用计算机考虑的路径)
Paste_Image.png
  • 如果没有沿着之前最近的点进行移动。(通过模拟测试其他路线的估值将会更大)
Paste_Image.png

使用算法进行实现。(Open列表和Close列表)

  • 首先我们需要一个列表用于保存检索出所有可行走的路线(Open列表)。当我们通过一个路径时需要知道这条路径是否被检索过。(Close列表)

    • Open列表:记录所有被考虑来寻找最短路径的方块。
    • Close列表:记录下不会再被考虑的方块。
  • 猫寻路的步骤:

    • 将方块添加到open列表,该列表中有最小的F值,将这个方块进行标记为S。
    • 将S从open列表移除,然后添加到closed列表中。
    • 对与S相邻的每一块可通行的方块标记为T。
    • 如果T在closed列表中,则不进行考虑。
    • 如果T不在open列表里,添加它然后计算出F值。
    • 如果T已经在open中,使用当前生成的路径到达那里时,检查F值是否更小。如果是,更新它的F值并前进。
Paste_Image.png
  • 当遇见这种有多个相同F值的分叉路径时,我们需要一个父节点来记录行走过的路,进行路径的回溯。

  • 伪代码:

Paste_Image.png
  • unity中使用了强大的NavMesh来实现寻路时遇见障碍物的动态改变路线,有兴趣可以自行github查找开源的代码。

Paste_Image.png

最后感谢蛮牛的陈亚通老师,图片伪代码出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容