A* 路径规划

目录

一: 实验目标

二: 障碍物生成

三:路径规划


一:实验目标:

     设计不同的障碍物地图,在可以改变障碍物位置、形状和尺寸的情况下,分别进行 A*,
greedy,dijikstra 路径规划算法,在障碍物地图中进行由起始点到目标点的路径规划。

二:障碍物生成

    利用 ubuntu 系统中的 Pinta 软件进行障碍物地图绘制,图片大小设置为 500*500 像素,以
方便生成 10*10 的栅格地图。

        设置网格大小为 10*10,读取图片转换为灰度图数据,并存储到 100*100 的二维矩阵中,通过 floor 函数将灰度值大于 200 的(障碍物黑色区域)赋值 1,表示障碍物所在区域,其余值赋值为 0,表示空白区域。 栅格图是有 100 个栅格,分别从横向和纵向上读取每个栅格中数据,如果在对应方向上的大于 1 的数据超过 5 个(0.1 读取一个数据,一格对应 10 个数据),则视为此栅格被障碍物占据,标记障碍物值。最后对所有障碍物标记的位置画出障碍物图,图中用圆圈表示。

      图中绿色圆圈代表障碍物所在区域,蓝色*代表起点,红色*代表终点。最下边障碍物占据上下两格是由于第二、第三行的横向每个栅格是占据超过一半 1 的数据。也符合实际情况。

三.路径规划

        A*搜索算法是属于全局路径规划,其引进是基于 dijikstra 和 greedy 贪心算法结合而来。
dijikstra 算法是因为在路径搜索过程中,广度优先搜索需要遍历所有节点,消耗的时空代价较大。因此当图形中的节点移动代价不相等时,引入 dijikstra 算法。即需要计算每个节点距离起点的总移动代价,并将遍历过的节点距离起点的代价 g 存入优先级队列中,选取最小代价的节点存储起来后再进行节点扩展,计算子节点的路径代价比干更新队列。不断循环迭代直到找到目标节点。然后将每次存储的最下代价节点生成最优路径。dijikstra 搜索出的路径是完备的且最优的。
     但是由于 dijikstra 算法没有先验知识,搜索过程中还存在一定盲目性,时间空间消耗较大,因此考虑贪心算法。贪心算法中也是将所有遍历过的节点存入优先级队列中,但是选取到达终点距离 h 最小值作为父节点进行扩展,最后画出父节点作为最优路径。贪心算法可以大大加快搜索速度,但是如果起点和终点之间有障碍物时,先验知识则变为先验噪声,影响误导路径规划。
        结合 dijikstra 和 greedy 贪心算法的优缺点,A*算法的代价函数 f(n)=g(n)+h(n),即总代价结
合了 dijikstra 和贪心算法的代价,h(n)也叫做启发函数。A*算法探索过的最优代价节点存入到 closelist 列表中,用于生成最终路径。其余探索过的节点存到 openlist 列比中,用于选取下一个父节点。程序流程:首先预处理,用起始节点初始化 closelist 然后找到所有子节点来初始化 openist。搜索 openlist 中总代价 f(n)最小的节点最为父节点。然后开始循环搜索:找到父节点的子节点(忽略 closelist 的节点),判断子节点是否在 openlist 中,如果在就比较和更新 g(n),f(n),如果不在就直接追加到 openlist 中。从openlist 中代价最小的节点移出到 closelist 中,然后再从 openlist 中搜索代价最小的节点作为父节点进行循环,一直到搜索到目标节点。最后将到目标节点所经过的最优代价节点生成路径。
      A*搜索算法,搜索出来的路径如下图红色轨迹所示,启发函数 h(n)采用的曼哈顿距离,即分别计算 x 和 y 的长度和作为总距离。

       将 A*搜索算法中的 g(n)和 h(n)分别等于 0,即可表示为 dijikstra 和 greedy 贪心算法。搜索结
果如下,黑色的轨迹是 dijikstra 算法生成的,蓝色的轨迹是 greedy 算法生成的。

        将三个算法生成的轨迹画在一个栅格图中进行对比,蓝色为贪心算法生成路径,红色为 A*算法生成路径,黑色为 dijikstra 算法生成路径。父节点的扩展是 8 个方向,即中间栅格对应的周围 8 个栅格。扩展顺序为从第一行开始依次从左到右扩展。贪心算法和 A*算法的启发函数都采用曼哈顿距离。对比左图中贪心算法根据先验知识过分向目标点靠近,导致在中间有障碍物时误导搜索。A*与 dijikstra 相比,由于加入了启发函数值,因此最开始先朝向对角线扩展。

 

      比较时空代价,贪心算法最终路径经过的节点数最多,路径代价最大。dijikstra 算法和A*算法都找到了最优路径,最优路径代价最小。但是 dijikstra 扩展的节点较多,运行时间也比较大,因此时空消耗都比较大。而 A*综合了两者优点,保证路径最优的同时,搜索速度和最优性都较高。当改变地图形状尺寸时,发现会出现 A*搜索出的路径并不是最优路径,如下图所示(A*搜索出的路径与 dijikstra 路径重合):

    原因分析时由于启发函数采用曼哈顿距离时,并不能保证 h(n)<=实际代价,因此不能一定找到最优路径。当启发函数采用欧氏距离时,A*找到的最短路径时最优路径。

代码地址:A_star: A*路径规划

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

刘加油要努力

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值