大家好,今天和各位分享一下机器人路径规划中非常经典的 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 是指一个计算公式,如下。

其中,f(n) 是指当前节点 n 的全局代价值,g(n) 是指从起始点到当前节点 n 的实际代价值,h(n) 是指当前节点 n 到终点的预测值。


2.2 案例解析

A* 算法整体搜索过程如下图所示,图中绿色格子为寻径起始点红色格子为寻径终止点蓝色代表障碍物从起始点开始,将其放到 open list 列表中,同时让其作为当前节点。通过当前节点查找与其相邻的 8 个邻域节点,如图中带有绿色线条的方格。8 个邻域节点方格中,箭头指向的方向为当前相邻节点 n 的父节点,用于代价值的计算以及最终路径的回溯。

以起始点作为当前节点,通过 A* 算法代价公式计算相邻节点的 f 值,并将起始节点放入 close list 列表中。起始点周围每个方格节点的三个夹角处由数字标识,其中左下角表示的是从起始点到当前节点 n 的真实代价值 g(n),如果起始点到当前节点 n 是在横向上往前/后移动了一个节点,或者在竖直方向上往上/下移动了一个节点,普遍设定 g(n) 移动一个节点的代价为 10;如果起始点到当前节点 n 是经过对角方向的移动,普遍设定 g(n) 的移动代价值为 14右下角表示的是从当前节点 n 到终点的预估值 h(n),通过启发函数进行计算。左上角表示的是全局代价值 f(n)将以上计算出的 g(n)与 h(n)相加可得到对应的 f(n)

基于以上计算,进一步判断当前节点的 8 个邻域节点是否在 open list 列表中,如果某个邻域节点未在 open list 列表中,则将带有 f  值的邻节点添加到 open list 列表中;如果某个邻域节点已经存放在 open  list 表中,则以当前方格为父节点检查经由当前父节点到达那个方格是否具有更小的 g 值,如果没有不做任何操作,如果存在更小的 g 值把那个方格的父节点设置为当前方格,然后重新计算那个方格的 g 值和 f 值。判断完成之后,获取 open list 列表中最小代价值节点。从上图中可以看出起始点周围相邻节点的全局代价值 f 根据从上到下、从左向右的顺序分别为 124、110、104、110、90、104、90、84,从以上数字中选取 f 值最小的 84 的点作为当前节点

循环上述搜索步骤,直至搜索到右侧的红色目标点,将目标点添加到 close list 列表中。根据close list 列表中的各个节点按照父节点的指向逆序输出,从而得到搜索路径。如下图所示,带有黄色边框的格子节点为最终搜索到的最佳路径。


2.3 启发函数

在路径规划时,通常需要寻找一些与搜索环境相关的特征信息,在计算过程中,将这些特征信息称为启发函数。启发函数被用来估计从当前节点到目标节点生成的代价值。常用的启发函数主要包括曼哈顿距离函数、欧氏距离函数、对角距离函数三种。

假设起点的坐标为 (

【路径规划】(2) A* 算法求解最短路,附python完整代码相关推荐

  1. 【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集

    各位同学好,今天我和大家分享一下python机器学习中线性回归算法的实例应用,并介绍正则化.岭回归方法.在上一篇文章中我介绍了线性回归算法的原理及推导过程:[机器学习](7) 线性回归算法:原理.公式 ...

  2. 【路径规划】(1) Dijkstra 算法求解最短路,附python完整代码

    好久不见,我又回来了,这段时间把路径规划的一系列算法整理一下,感兴趣的点个关注.今天介绍一下机器人路径规划算法中最基础的 Dijkstra 算法,文末有 python 完整代码,那我们开始吧. 1. ...

  3. 【机器学习入门】(3) 朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)附python完整代码及数据集

    各位同学好,今天我和大家分享一下朴素贝叶斯算法中的三大模型.在上一篇文章中,我介绍了朴素贝叶斯算法的原理,并利用多项式模型进行了文本分类预测. 朴素贝叶斯算法 -- 原理,多项式模型文档分类预测,附p ...

  4. 【机器学习入门】(9) 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)附python完整代码和数据集

    各位同学好,今天我和大家分享一下python机器学习中的逻辑回归算法.内容主要有: (1) 算法原理:(2) 精确率和召回率:(3) 实例应用--癌症病例预测. 文末有数据集和python完整代码 1 ...

  5. 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍python机器学习中的朴素贝叶斯算法.内容有:算法的基本原理:案例实战--新闻文档的分类预测. 案例简介:新闻数据有20个主题,有10万多篇文章,每篇文章对应不同的主题, ...

  6. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...

  7. 【路径规划】Astart算法——图文直观解析

    Astart算法详解 1. Astart算法路径搜索原理 2. 栅格网络的Astart算法 3. Astart算法优缺点 1. Astart算法路径搜索原理   Dijkstra算法已经是非常经典的求 ...

  8. 全局路径规划:图搜索算法介绍6(A star)Matlab算法实现

    本文接:全局路径规划:图搜索算法介绍2(A star) https://blog.csdn.net/gophae/article/details/103061702 % This is Yunchen ...

  9. 合肥市出行地铁路径规划——基于Dijkstra算法

    合肥市出行地铁路径规划--基于Dijkstra算法 1. 引言 2. 导入相应的模块 3. 申请高德地图的API 4. 获取合肥地铁数据 5. 计算合肥各地铁站点之间的距离 6.寻找最近的地铁站 7. ...

最新文章

  1. css animation动画完成后隐藏_如何使用CSS实现旋转地球动画效果
  2. Linux2.6内核--内存管理(1)--分页机制
  3. 革命离成功还非常非常远,我还不怎么努力
  4. 栈的基础概念与经典题目(Leetcode题解-Python语言)
  5. Java 8中的策略模式
  6. NET 下数据库图片的存入与读取
  7. 用c++创建xml文件的两种方法
  8. Android 模拟器连接异常:Unable to connect to ADB server
  9. 一文说透WordPress的自定义文章类型
  10. 用python画三角函数
  11. Sql Server 删除所有表
  12. C语言进制转换以及原补反码位运算介绍
  13. 北大中文核心期刊目录2021年 无线电电子学、电信技术
  14. c语言编译器官网,C语言编译器app_c语言编译器app官网下载_c语言编译器手机版app-多特软件站安卓网...
  15. 基于stc89c58的万年历设计
  16. vr电力作业安全培训覆盖三大板块,为学员提供高仿真的技能培训
  17. I - Circles (SDUT 2018 Autumn Individual Contest - I)
  18. 梦想贵在坚持 第一周(1.9-1.15)
  19. Python数据 分析微信朋友圈
  20. 【经典面试题】小程序与H5、APP、公众号的区别到底是什么?

热门文章

  1. 中国一百大姓,您排第几?
  2. 【Linux】Linux关闭防火墙、关机重启和查看系统运行级别
  3. 2021年安全员-C证考试及安全员-C证考试技巧
  4. 前端导出pdf以及导出内容截断的解决办法
  5. 如何优化PNG,JPG图片减小图片文件大小
  6. 如何使用Element-UI?
  7. Hadoop配置lzo压缩
  8. 鉴于B站的代码粘贴没有全选功能,up在这里放上软件小妹的脚本代码
  9. DEJA_VU3D - Cesium功能集 之 070-编辑3Dtiles(平移+旋转)
  10. 计算机组成及linux基础