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

1. Astart算法路径搜索原理

  Dijkstra算法已经是非常经典的求解最短路径的动态规划算法,其可在解空间的可行域内求解出唯一确定最短路径。但Dijkstra算法需要遍历解空间内所有的点,这在解空间节点数巨大的情况下十分占用计算资源,求解效率低下。而对于在三维构型空间或运动空间内路径规划常见的栅格网络法,则会产生更大的节点数量,导致求解的实时性和效率十分低下。
  针对Dijkstra算法的缺陷,Astart算法在Dijkstra算法的基础上,增加了一个当前探测点到目标点的距离,而综合探测点到出发点的步长探测点到目标点的距离合,f = distStart + distEnd,来选定当前已探测距离点中可以固定的最小距离点,也就是根据合的最小值来确定每一迭代步选入闭集的点。
(由于Astart大部分算法内容近似Dijkstra算法,所以后续的算法步进原理中对部分重复的细节进行了省略,终点介绍改进的部分和整体算法流程。所以在看下文原理前可先看看我的上一篇博客:【路径规划】Dijkstra算法——超详细原理图解

2. 栅格网络的Astart算法

  探测点P到出发点Start的步长和Dijkstra算法的计算原理一致,但探测点P到目标点End的距离可以有多种距离计算方式,其中最常用的就是欧几里得距离和曼哈顿距离,栅格网络由于规则的网格划分,很适合利用计算效率极高的曼哈顿距离进行迭代,所以本文范例采用曼哈顿距离参与计算。(distEnd = |Endx - Px| + |Endy - Py|)
  先让我们看看算例的空间分布:
Astart
  平面空间已经被栅格网络简化为一个个连续分布的网格,从图中可以看出,障碍物为三个网格集合,分别是[8, 17], [28, 29, 37, 38, 46, 47], [44, 53],出发点为22号网格,目标点为9号网格。
  第一步
  我们进行第一步的迭代计算,首先先计算出发点四周邻接点的f值,这个算例及其算法采用的是4向邻接的冯诺依曼邻域,其每一个邻接点到出发点的距离皆为1,在实际路径规划中,也可以采用8向邻接的摩尔领域,则斜向的邻接点到出发点的距离则为根号2,也可以用1.4来近似替代。
Astart1
  第二步
  由于目前求得开集已知f值的点中(4个点),有2个相等的最小值7,则根据算法的循环求解规则,会选中下标小的最小值点,则13号点被选中,13号点进入闭集,在13号点的冯诺依曼邻域内继续计算周围可行域开集的f值
Start2  第三步:以上述方式继续进行迭代。
Start3
  第四步
  此时出现了一个f值更新的情况,这和Dijkstra算法的更新规则相同,只有f值小于点原先已求出的f值时,才能更新该点的f值和父节点信息,14号点由于更新值(4+5)大于原有值(2+5)所以更新失败,14号点保留原有f值和父节点信息。
Astart4
  第五步
Astart5
  第六步
  这一步,开集已求点的最小值点不再从上一探测点的冯诺依曼领域内取得,而是取到了当前开集已求f值点中f值最小且下标最小的14号点,并以该点进行下一步的迭代。
Astart6
  第七步
  这一步的第15号点发生了更新的情况,更新值(3+4)小于原有值(5+4),从而f值发生了更新,父节点也从原先的6变成了上一迭代步的选定点14。
Astart7
  第八步
Astart8
  第九步
Astart9
  第十步
Astart10
  第十一步
Astart11
  第十二步
Astart12
  第十三步
Astart13
  第十四步
Astart14
  第十五步
Astart15
  第十六步
  当f值最小点选中目标点End时,迭代过程结束,通过父节点信息回溯可得从出发点Start到目标点End的最短路径,Astart算法也整体完成。
Astart16

3. Astart算法优缺点

优点
  1. Astart算法的整体搜索规模比Dijkstra算法小不少,其搜索具有一定的指向性,会促使整体搜索方向朝向目标点,使得搜索效率较高,很适合在开放空间中的路径规划。
  2. Astart算法拥有与Dijkstra算法相同的最终确定唯一最优解,具有很好的收敛性,是一个优良的搜索算法。
缺点
  1. 不论选择冯诺依曼邻域还是摩尔邻域,其计算规模仍然较大,对于较复杂路径较大空间的搜索,其路径计算往往不能达到很强的实时性。
  2. Astart算法整体需要求解出确切路径后才能知晓真正最短路径的方向,而任何过程中的计算都存在试错的过程,所以其适用于整体路径规划完毕后的执行,而不适合边执行边规划的任务作业,当然对于实时性要求很强的任务作业,可以采用分段的方式进行Astart算法,不过这样的分段策略和衔接策略就需要更详细的讨论和调优。
(由于Astart算法所常用的栅格网络使用场景多变,其环境构建和代码编写具有很强的特异性,且大部分核心算法代码与Dijkstra算法相似,故本文不做本文范例的代码实现,感兴趣的同学可以根据上述一步步的迭代示意图自行尝试。)

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值