全局路径规划 - 04 A*算法
算法简介
-
A*算法是一种静态路网中求解最短路径最有效的直接搜索方法。广泛应用于室内机器人的路径搜索、游戏动画路径搜索等;
-
A*算法结合了贪心算法(深度优先)和Dijkstra算法(广度优先),是一种启发式的搜索算法;
-
路径优劣评价公式为:\(f\left(n\right)=g\left(n\right)+h\left(n\right)\),\(g\left(n\right)\)是在状态空间中从初始状态到状态\(n\)的实际代价,\(h\left(n\right)\)是从状态\(n\)到目标状态的最佳路径的估计代价。
-
A*算法使用了两个状态表,分别称为OpenList和CloseList,OpenList存储待考察的节点,CloseList存储已考察过的节点。
地图预处理
-
将地图栅格化,把每一个正方形格子的中央称为节点;
-
确定栅格属性,即每一个格子有两种状态:可走和不可走;
-
定义两个列表集合:OpenList和CloseList,OpenList可以存储节点的g值;
-
确定起始节点和目标节点。
算法流程
-
初始时,定义起始节点为父节点,移入CloseList中;
-
逐个检查与父节点i相邻的周围的节点\(j\),忽略不可走节点和已经存在于CloseList中的节点:
-
若节点\(j\)不在OpenList中,则将节点\(j\)的父节点记为节点\(i\),计算节点\(i\)到节点\(j\)的距离\(d\),计算\(g\left(j\right)=g\left(i\right)+d\),并把它们加入到OpenList中成为待考察的对象;
-
若节点\(j\)已经在OpenList中,则检查这条路径是否更优,即经由节点\(i\)到达节点\(j\)是否有更小的\(g\)值:计算节点\(i\)到节点\(j\)的距离\(d\),若\(g\left(i\right)+d\)小于OpenList中节点\(j\)存储的\(g\left(j\right)\),则这条路径更优,更新OpenList中节点\(j\)存储的\(g\)值\(g\left(j\right)=g\left(i\right)+d\),并将节点\(j\)的父节点记为节点\(i\),若这条路径不是更优,则不进行任何操作;
-
-
计算OpenList中所有节点的\(f\)值:\(f\left(n\right)=g\left(n\right)+h\left(n\right)\),从OpenList中取出\(f\)值最小的节点,放到CloseList中,并把它作为新的父节点\(i\);
- 这里启发式函数\(h\left(n\right)\)一般用曼哈顿距离或者欧氏距离来替代。
-
重复步骤2和步骤3,不断重复,直到搜索到目标节点,完成路径搜索。搜索出路径的结果可以直接遍历父节点得到。
代码实现
待更新,后续会补到GitHub上

浙公网安备 33010602011771号