A * 算法(机器人路径避障规划)

1、简介

         A* 算法是一种常见的路径查找、图形遍历算法,是在静态网路中求解最短路径的直接搜索方法。最近在学习机器人路径轨迹规划,所以重新学习一下A*算法。

如下图,图片可以划分为二维数组,每一个方格有唯一状态(可走或者不可走),绿色代表起始点,红色代表目标点,蓝色代表墙壁,计算从绿色到红色走过那些方格,就找到一条路径。

要求:从绿到红,不经过墙体,找一条最短路径。

A * 算法(机器人路径避障规划)_第1张图片

2、算法原理

F(n)=G(n)+H(n)

G(n) 从起始点移动到指定方格的移动代价

H(n) 从指定方格移动到终点的估算成本(试探),并不是实际成本,实际成本只有找出路径之后才能确定。

(对于路径搜索问题,代价就是节点间距离,状态就是其节点)

计算指定方格G(n),就要找出其父亲节点G值,然后加上其父亲节点到指定方格的移动代价。

估计H值,方法有曼哈顿、对角、欧氏距离

      曼哈顿:计算从当前方格横向或纵向移动待目标点做经过的方格,并忽略其中的障碍物。

      对角:再曼哈顿基础上,加上允许节点朝着相邻斜对角节点移动。

      欧氏距离:两点间的直线距离

发现如果H(n)恒为零,A*算法退化为迪杰斯特拉算法

3、搜索路径

  在A*算法中,从起始点开始检查相邻的方格,向四周扩散。

  1. 建立openlist列表,开始时只有起始点A在里面(待检查方格列表)
  2. 查看相邻方格,将可走方格加入openlist,起点A为这些方格的父亲节点,(不可走方格包括,墙体、openlist和closelist元素)
  3. 将A移入closelist中,该列表元素不再使用
  4. 选择openlist中F值最小节点,取出放入closelist中
  5. 检查与它相邻的所有方格,忽略不可达和在close中节点,如果相邻方格并且不在openlist中,那么把他们放入openlist中
  6. 如果某个相邻的方格在openlist中,则检查这条路径是否更优,如果更优,那将这个方格的父亲节点设为当前节点,然后重新计算这个方格的F和G,并更新;否则,无操作。

4 算法时间复杂度

小白认为:影响时间复杂度的因素主要有寻找最小值和查找openlist中的元素,如果使用堆排序对F进行排序,查找openlist元素复杂度会大大增加;反之,亦然,因此可建立结构体保存F与其对应节点,并且建立索引数组保存F和对应节点,对结构体进行排序,排序时间复杂度为O(logn),查找节点近似为常数O(1),复杂度可以优化为为O(nlogn)

参考:A* Pathfinding for Beginners - Artificial Intelligence - Tutorials - GameDev.net

            https://zhuanlan.zhihu.com/p/54510444

你可能感兴趣的:(算法与数据结构,算法,机器人路径)