大家好,今天和各位分享一下机器人路径规划中非常经典的 A* 算法,感兴趣的点个关注,文末有 python 代码,那我么开始吧。
1. 算法介绍
A* 算法是 1968 年 P.E.Hart[1]等人所提出的在全局地图环境中所有已知情形下求解最短路径问题的方法,由于其简洁高效,容易实施等优点而受到人们的广泛关注。但是,A*算法在实际应用过程中也暴露出其严重弊端,例如:在搜索空间较大的环境下,增加了算法的执行时间,从而大大降低了路线规划效果;复杂环境下,由于地图精度不高,从而减小了获取最佳路径的可能性;在搜索过程中存在相同 F 值无法得到最佳路线等问题。
而面对上述问题,不同的研发人员也以不同的方法以对其做出了改善,并获得了不少研究成果。
Korf 等人[2]在 A*算法的基础上构建了迭代改进的 IDA* 算法,在计算过程中根据迭代次数得到最优解,解决了A*算法容易陷入盲目搜索的不足;Tran HAM[3]等人在 A*算法基础上构建了一种基于视觉的路径规划和导航算法,然后对搜索的路径进行优化。Szczerba[4]等人提出了稀疏 A*算法,在传统 A*算法基础上添加相应的约束条件,根据不同的约束条件修改 A*算法的搜索空间,提升了路线规划效果,大大增加了获取最佳路径的可能性。
参考文献:
[1] Hart P E, Nilsson N J, Raphael B. A formal basis for the heuristic determination of minimum cost paths[J]. IEEE transactions on Systems Science and Cybernetics, 1968, 4(2): 100-107.
[2] Korf, Richard E. Depth-first iterative-deepening: an optimal admissible tree search[J]. Artificial Intelligence, 1985, 27(1):97-109.
[3] Tran H A M, Ngo H Q T, Nguyen T P, et al. Implementation of vision-based autonomous mobile platform to control by A* algorithm[C]//2018 2nd International Conference on Recent Advances in Signal Processing, Telecommunications & omputing (SigTelCom). IEEE, 2018: 39-44.
[4] Szczerba R J, Galkowski P, Glicktein I S, et al. Robust algorithm for real-time route planning[J]. IEEE Transactions on Aerospace & Electronic Systems, 2000, 36(3):869-878.
2. 算法原理
经典 A* 算法主要用在静态且周围环境已知的情况下,是建立在 Dijkstra 和BFS 基础上的启发式遍历搜索算法,在路径规划时不仅要考虑自身与最近节点位置的距离(Dijkstra 实现),还需要考虑自身位置与目标点的距离(BFS 实现)。与传统的遍历搜索算法相比,弥补了搜索过程中的贪心机制,从而很好地完成路径规划的任务。
2.1 基本原理
A* 算法以起点为中心开始进行路径规划,并在路径规划过程中扩展周围的邻近节点。通过 A*算法公式对起始点到当前位置和当前位置到目标点的代价值进行计算。在所有的节点中选取代价值最小的节点作为当前最优节点,以当前最优节点继续搜索,直到搜索到目标点,最后生成一条从起始点到目标点的路径。
A* 算法本身遵循 821 定律,同时在搜索过程中将节点的状态定义为未检查、待检查、已检查三种准备状态;8 是指以当前定位点周围的 8 个邻域的代价值作为计算目标,2 是指两个参数列表,一个是 open list 列表,存放待检查的节点;另外一个是 close list 列表,存放已检查完成不再需要关注的节点,1 是指一个计算公式,如下。