版权声明:本文为博主原创文章,未经博主允许不得转载,转载注明来源。
A*简介
A*算法是一种在静态路网中求解最短路径最有效的直接搜索方法,也是解决许多其他搜索问题的有效算法。算法中的距离估算值与实际值越接近,扩展的节点数越少, 搜索速度越快。A*算法的估价函数的一般形式
f(n) = g(n) + h(n)
其中 f(n) 是从初始状态经由状态n到目标状态的代价估计,g(n) 是在状态空间中从初始状态到状态n的实际代价,h(n) 是从状态n到目标状态的最佳路径的估计代价。而传统的A*算法的 h(n) 多数采用Manhattan 距离和Euclidean 距离对目标状态进行估计。因此传统A*所规划出来的路径往往不具有连续的曲率且转折次数过多等不满足车辆运动学模型问题。
因为A*算法是一种启发式搜索算法,而启发函数 h(n)直接影响 A*算法的路径规划性能。假设当前节点到目标节点的实际代价值为H(n) ,当h(n) < H(n) 时,搜索节点多,运算效率低,但可搜索到最优路径;当 h(n) = H(n)时,是理想情况,沿最短路径进行搜索, 且效率最高;当 h(n) > H(n)时, 搜索节点少,运算效率高,但通常难以搜索到最优路径[19]。而传统的A*算法的 h(n)所使用 Manhattan 距离和Euclidean 距离对代价值进行估计。
A*算法执行步骤
创建两个表 OPEN 和 CLOSED,其中 OPEN 表保存所有已经生成而未考察的节点, CLOSED 表保存已访问过的节点。
1.将 S 点放入OPEN表中,并且将CLOSED表置为空。
2.重复执行以下步骤:
(1)遍历 OPEN,查找并将其作为预处理节点。
(2)将步骤(1)得到的节点移入CLOSED表中。
(3)对于当前节点的4个相邻节点的每一个节点作如下处理:
①如果其为障碍物或者已经移入CLOSED表中,则忽略掉此节点。
②如果其不在 OPEN 表中, 则将其移入OPEN 表,并将当前节点设置为其父节点,并记录值。
③如果其已经在 OPEN 表中,通过对 OPEN表中节点再进行判断,如果有更小值,则将其父节点设置为当前节点,并重新计算和。
④将目标节点加入 OPEN 表中, 即表示路径已经找到,否则查找失败,且OPEN为空,即无路径。
(4)保存路径,路径即为从目标节点开始, 沿着父节点移动至起始节点所组成。
A* 算法作为一种典型的启发式搜索算法, 在人工智能寻径问题有着广泛的应用。其不必遍历所有节点,搜寻速度快,但由于评估进行移动开销预测, 所以可能存在找不到最优路径的问题。
A*算流程图