A*
- A*的核心在于F=G+H这个公式,他本身是一个距离评判公式,G是从起点到指定点的消耗,H是从指定点到终点的距离,这个距离忽略对角线,也忽略障碍物。
- 我们首先将平面用网格划分,至于用正方形划分还是用正六边形划分,看情况。
- 然后有两个集合OpenList与CloseList
- 每个节点都有自己的GHP三个数据,可以建立一个结构体,
- 这是一个递归的过程,将起点相邻的格子【忽略障碍物】放置到OpenList并设置父节点然后将起点放置到CloseList
- 再依次计算OpenList里面的F,并获得里面F值最小的格子。放置到ClosedList——当前格子
- 【注意,OpenList是需要检查的列表,CloseList是不需要检查的列表】
- 然后将与该格子相邻的节点,忽略障碍物,也忽略已经放置到CloseList里面的物体,放置到OpenList当中并设置父节点,如果该节点已经存在于OpenList当中,那就比较G值,即通过当前格子到达该点的G值和直接到达该点的G值是否更小,如果更小,就改变P值,重新计算F
- 一直计算下去,最终到达终点的时候,然后依次获取上一级的P值,就可以得到一个路径。
关键点
- H本身忽略了障碍物等因素,因此只是一个近似的模糊值。只有G这个值是精确的。
- 我们每次将一个节点四周的节点放置到OpenList中,然后计算这几个点的F,最小值就是大概最短路径上的点
- 而比较G值就是类似于一个矫正的过程,因为F值的计算没有考虑障碍物,但是在第3步加入OpenList的时候忽略了障碍物,因此相当于把该节点四周的可达点放置进来
- 如果该点已经在OpenList当中,就说明从起点到该点也是一个可达路径,这个时候就需要根据G值比较,应该选择哪一个。
- 并更改P值