加载中...

全局路径规划 - 04 A*算法

算法简介

  1. A*算法是一种静态路网中求解最短路径最有效的直接搜索方法。广泛应用于室内机器人的路径搜索、游戏动画路径搜索等;

  2. A*算法结合了贪心算法(深度优先)和Dijkstra算法(广度优先),是一种启发式的搜索算法;

  3. 路径优劣评价公式为:\(f\left(n\right)=g\left(n\right)+h\left(n\right)\)\(g\left(n\right)\)是在状态空间中从初始状态到状态\(n\)的实际代价,\(h\left(n\right)\)是从状态\(n\)目标状态的最佳路径的估计代价

  4. A*算法使用了两个状态表,分别称为OpenListCloseListOpenList存储待考察的节点,CloseList存储已考察过的节点。

地图预处理

  1. 将地图栅格化,把每一个正方形格子的中央称为节点;

  2. 确定栅格属性,即每一个格子有两种状态:可走和不可走;

  3. 定义两个列表集合:OpenList和CloseList,OpenList可以存储节点的g值;

  4. 确定起始节点和目标节点。

算法流程

  1. 初始时,定义起始节点为父节点,移入CloseList中;

  2. 逐个检查与父节点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\),若这条路径不是更优,则不进行任何操作;

  3. 计算OpenList中所有节点的\(f\)值:\(f\left(n\right)=g\left(n\right)+h\left(n\right)\),从OpenList中取出\(f\)值最小的节点,放到CloseList中,并把它作为新的父节点\(i\)

    • 这里启发式函数\(h\left(n\right)\)一般用曼哈顿距离或者欧氏距离来替代。
  4. 重复步骤2和步骤3,不断重复,直到搜索到目标节点,完成路径搜索。搜索出路径的结果可以直接遍历父节点得到。

代码实现

待更新,后续会补到GitHub上

posted @ 2022-03-03 19:38  HeyRay_Yang  阅读(633)  评论(0)    收藏  举报