我自己是通过这篇博文博文去理解A*算法的 所以希望读者先看看这篇博文 https://blog.csdn.net/hitwhylz/article/details/23089415
关于A*的解释在上面链接中的博文已经讲得足够详细 下面的文章中我只写我在编写A*算法时遇到的一些问题和其他的理解
同时我将A*寻路过程可视化 可以通过gif每一帧观察整个过程
先上几张·gif看看整个寻路过程
第一张 只能以上下左右四个方向作为路径
第二张 可以以上下左右·左上·左下·右上·右下八个方向作为路径
我解释一下图片中一些量的意义 也可以在 这篇博文 中理解这些量
红色为起始点
黑色为目标点
浅蓝色方块为close set
黄色方块为open set
灰色方块为障碍物
绿色方块为未搜索区域
深蓝色方块为最终搜索的路径
方块的左上角为F量
方块的左下角为H量
方块的右下角为G量
其中F = H + G
G量为该点和目标点的线段距离长度
H量为起始点到该点的路径长度
如何理解线段距离长度和路径距离长度 [路径总是绕过障碍物]
(如下图 蓝色表示两点间线段距离长度 粉红色表示红点到黑点的路径距离长度)
关于两点间距离可以使用不同的距离计算公式 可以参考 距离计算方法总结 我自己在代码中使用的是曼哈顿距离
此外需要知道比较重要的两个点
1. A*算法不会因为当前路径未死胡同而无法寻找路径 除非起始点无论怎么走都无法到达目标点
2. A*算法为启发式算法 它无法保证找到的最终路径一定是最优路径(这个和选择的距离计算公式有关系)