A* 算法是一种逐步逼近的启发式路径搜索算法。它搜索出来的路径不一定是最优的,但却是最快的搜索方法。
算法原理简介
A*算法很简单,但要真正理解却又似乎很难,究其原因,主要是介绍该算法的人要么只讲一些虚的大的道理,要么直接上伪代码,很少仔细说明。下面本人就根本自己的理解讲一下。
A* 搜索是从起点出发,向一个预估最正确的方向逼近。如果正确就继续向前,不正确则另外寻找路线。
如果预估最正确的方向:为每个节点计算两个值:g和h。g为从起点到此处的cost,h为从此处到终点的预估cost。(因此A*算法需要首先为当前地图设计一个预估算法)
算法实现原理分析
图例说明:S表示起点,E表示终点,0表示未判定过的点,非0表示已判定过的点(其中1表示连通图内部的点,2表示连通图外部的点)。
2、从连通图的外部点中(1),选择一个预估cost最小的点,作为current node,进行启发。
3、遍历current node的所有子节点,
4、如果Kid为连通图的节点:如果Kid.g+h < check.g+h,则update(check.g&parent)。
如果kid不是连通图的节点:将kid增加到连通图中。
5、两次遍历完子节点后,地图分别为下列状态。
6、重复从2-4的过程,直到找到E为止。
从上述过程可以看出,A*搜索其实是一个不断向预想的最优方向尝试的算法。
PS:
1、向外扩张中,只选择“连通图”外部的的原因。因为选择图内部的点没有意义,它所有的children都是已经判定过的,尝试他们无法得到新的信息。