【全局路径规划】A*算法 A* Search Algorithm


A Formal Basis for the Heuristic Determination of Minimum Cost Paths

PETER E.HART NILS J. NILSSON BERTRAM RAPHAEL


启发式算法的特点:
  • 提高计算效率
  • 不一定能保证得到最优解
Admissible Algorithm 可接受的算法:在足够多的步数内一定能找到最优解
Optimal Way 最佳方式: 既保证能找到最优解,又能保证展开的节点数最少(步数少)
A*算法步骤:
  1. 标记起点s为open,计算起点的估计代价
  2. 选择open点集中估计代价最小的点
  3. 如果选中的点∈目标集合T,即到达目标,标记该点closed,算法结束
  4. 否则,还未到达目标,标记该点closed,对其周围直达的点计算估计代价,如果周围直达的点未标记为closed,将其标记为open;如果已经标记为closed的,如果重新计算出的估计代价比它原来的估计代价小,更新估计代价,并将其重新标记open。返回第2步。

在这里插入图片描述

理解:
  1. A*并不止针对找寻抵达单个目标的最优路径,当多目标组成目标集T时,它能找到一条代价最小的路径,抵达目标集中的其中一个。

  2. 找到一个合适的估计代价计算方式很重要,这里将节点代价设置为从起点经由该节点到达终点所花费的代价,所以最优路径上的点的代价都一样且一定小于其他点的代价(绕路代价一定变大)。

    但真实代价无从得知,只能估计,将真实代价分为两部分f=g+h,g表示从起点到该点的最小代价,h表示从该点到目标点的最小代价。分别对g和h进行估计,再加和,得到估计代价。

    在这里插入图片描述
    估计g为当前从起点到该点走过的距离(可能比真实g要大,因为没走完全图,不确保现在的走法就是最低代价),估计h为从该点到目标点的直线距离。

  3. 在g和h的估计中,h的估计方法是比较宽泛的,可以是直线距离,也可以是其他(如坐标和之类的),但作者提到,估计h必须要小于真实h才能保证算法是可接收到的,即能找到最优解。如果估计h比真实h大,则可能找到的的不是最优解。

    那么设置h为0?可以,但就会变成类似Dijkstra算法,会找到到达地图上各点的最优路线。最终一定也会到达目标集合T中的节点,并标记closed结束算法,但过程中会展开更多无谓的节点,漫无目的地展开。

    h=0是无约束情况,而设计一个合适的n(如城市间直线距离)是需要利用问题域的信息的。

  4. 第四步是允许更新节点代价并重新open它的,但实际上,作者提到,如果估计h设计的满足一致性条件,那么一个节点已经closed,它必定已经达到最小估计代价,所以不会有再找到更小估计代价而reopen它的可能。

    一致性条件指的是估计h能满足 估计h(m)≤h(m,n)+估计h(n),其中h(m,n)指的是m到n间的直线距离。

    作者提到,如果对全部节点都使用直线距离作为估计h,即使用同一个方法,那么可以满足一致性条件;

    当对某些节点使用一种方法估计h,对其他节点使用另外的方法估计h,则可能会造成不满足一致性条件。

  5. 当满足一致性条件,即不存在reopen的情况时:

    对单目标情况来说,一个节点一经closed,表示它被选择为最优路径上的点

    对多目标情况,可以想象,是在同时expand多条路径,到达各目标过程中的点被“轮流”(实际上当然是无序的)open、closed,最后哪条路径先到达目标集中的点,就认为它是我们要找到的最优路径。

    所以closed表示选中,而open表示备选。

作者的一些证明:
  1. 如果选取的估计h<真实h,则算法是可接受的,即必能找到解
  2. 当一致性假设满足,一个节点一经close,则其估计g必等于真实g,即找到了最小的估计g,即不可能找到更小的估计代价,也不会被reopen
  3. 从起点开始,估计得到的最优路径上的节点的估计代价是【不递减的】
  4. 在利用同样信息的情况下,A*展开的节点数是最少的
讨论:
  1. A*是深度优先,有些算法(如Dijkstra)是广度优先,广度优先的算法考虑扩展过程中可能找到某节点更小的估计代价,要更新原代价

  2. A*通常是指一个算法族,各算法的主要区别就是“估计h”的选择不同

    A*算法族内的各算法对计算复杂度/效率有着不同的平衡, 如估计h选得大一点,可能不能保证一定找到最优解,但大多数情况ok,而且容易算;而估计h选得小一点(极端例子:0,完全不利用问题域的信息),可能会扩张更多无谓的节点造成浪费,但可能还是方便计算。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值