A*其实是一种思想,采用启发式遍历来得到起始点到目标点的路径。
A*的基本思想:f(n) = g(n) + h(n);
其中,g(n)是从起始点到当前点V的实际代价,h(n)表示当前点V到目标点的代价估计,一般用两点间x,y坐标差的平方和表示。
则f(n)值就表示该点的估价值了,f值越低表示该点越优。
最佳路径就是一系列最优节点的集合。
算法描述:
1.把起始点加入到开启列表,开启列表表示将要搜索的点的集合。
2.重复如下的工作:
a.寻找开启列表中F值最低的点,我们把它称为当前点V。
b.把它添加到关闭列表,并把它从开启列表删除。
c.对它周围相邻的8个点:
*如果它在关闭列表或者不可通过,略过它
*如果它既不在开启列表,也不在关闭列表,则把它添加进开启列表,并把当前点V作为其父节点,记录改点的F,G,H值。
*如果其已经在开启列表,则比较该点新的G值和其旧的G值,如果新的G值要小,则更新该点的父节点为节点V,从新计算F,G,H值。(以上往开启列表添加节点或是更新节点的数据都要从新对开启列表排序)
d.停止
*如果把目标点添加进了关闭列表,这时候路径找到
或者*没有找到目标点,但是开启列表已经空了,这时候表示路径不存在。
3.保存路径。从目标点开始找其父节点,直到移动到起始点。这就是路径。
具体代码: