最近在学习U3D人工智能的A*寻路,相信只要是对游戏开发有所了解或者对算法有一定研究的同学,一定都听说过A*算法。那么A*算法究竟是什么原理能,下面我来进行详细的解答。
在讲解A*之前,我们先来了解一下,A*算法是要建立在一个“地图”上的,这个所谓的“图”主要分为3类:1.基于单元的导航图 2.可视点导航图 3.导航网格
单元的导航图简单的说,就像是纱窗一样,由一些形状一样的规整的图形组成的图,这些图形一般是正方形或者六边形,例如下面的图形:
其他两种图由于和我这篇讲的不相关,我就不展开了,感兴趣的同学可以自己查资料。
我们接下来要讲解的A*算法就是建立在此单元导航图上的。
A*算法是为了寻找从起点到终点的最短路径,并且有障碍物的时候会避开障碍物。为了达到此目的,我们必须要有三个参数:1.记录起点到当前位置的距离 2.当前位置到终点的最小距离 3.从起点开始经过此节点,并且加上从当前节点到达终点的最小距离(听上去有点拗口,不过意思很简单,就是 从起点开始,经过此节点,到达终点)
这里我们分别用:
g表示从起点出发,到达当前位置的距离。
h表示从当前节点出发到达终点的估计最小距离。(注意这里的h一般是通过某种算法得到的估计值,不一定准确,但是可以作为A*算法的参考)
f表示 g+h
当然,我们还需要一个记录当前节点是从何处走来的,即:当前节点的父节点parent。这下,计算A*的数据结构就出来了,每个节点包括以上4个属性,代码表示如下:
struct StartNode
{
float g=0;
float h=估算当前与终点的距离;
float f=g+h;
StartNode parent =null;
}
在上面的单元导航图中,每一个格子周围有8个相邻的格子,每次移动的时候,只能移动到这8个相邻的格子上面。(这里说明一下,格子分的越多,寻找的路径为好(越短),但是寻路的时间也越长)
A*算法还需要用到两张表:1.Open表由待考察的节点组成。 2.Closed表由已经考察过的节点组成。(以考察过&#x