A Formal Basis for the Heuristic Determination of Minimum Cost Paths
PETER E.HART NILS J. NILSSON BERTRAM RAPHAEL
启发式算法的特点:
- 提高计算效率
- 不一定能保证得到最优解
Admissible Algorithm 可接受的算法:在足够多的步数内一定能找到最优解
Optimal Way 最佳方式: 既保证能找到最优解,又能保证展开的节点数最少(步数少)
A*算法步骤:
- 标记起点s为open,计算起点的估计代价
- 选择open点集中估计代价最小的点
- 如果选中的点∈目标集合T,即到达目标,标记该点closed,算法结束
- 否则,还未到达目标,标记该点closed,对其周围直达的点计算估计代价,如果周围直达的点未标记为closed,将其标记为open;如果已经标记为closed的,如果重新计算出的估计代价比它原来的估计代价小,更新估计代价,并将其重新标记open。返回第2步。
理解:
-
A*并不止针对找寻抵达单个目标的最优路径,当多目标组成目标集T时,它能找到一条代价最小的路径,抵达目标集中的其中一个。
-
找到一个合适的估计代价计算方式很重要,这里将节点代价设置为从起点经由该节点到达终点所花费的代价,所以最优路径上的点的代价都一样且一定小于其他点的代价(绕路代价一定变大)。
但真实代价无从得知,只能估计,将真实代价分为两部分f=g+h,g表示从起点到该点的最小代价,h表示从该点到目标点的最小代价。分别对g和h进行估计,再加和,得到估计代价。
估计g为当前从起点到该点走过的距离(可能比真实g要大,因为没走完全图,不确保现在的走法就是最低代价),估计h为从该点到目标点的直线距离。 -
在g和h的估计中,h的估计方法是比较宽泛的,可以是直线距离,也可以是其他(如坐标和之类的),但作者提到,估计h必须要小于真实h才能保证算法是可接收到的,即能找到最优解。如果估计h比真实h大,则可能找到的的不是最优解。
那么设置h为0?可以,但就会变成类似Dijkstra算法,会找到到达地图上各点的最优路线。最终一定也会到达目标集合T中的节点,并标记closed结束算法,但过程中会展开更多无谓的节点,漫无目的地展开。
h=0是无约束情况,而设计一个合适的n(如城市间直线距离)是需要利用问题域的信息的。
-
第四步是允许更新节点代价并重新open它的,但实际上,作者提到,如果估计h设计的满足一致性条件,那么一个节点已经closed,它必定已经达到最小估计代价,所以不会有再找到更小估计代价而reopen它的可能。
一致性条件指的是估计h能满足 估计h(m)≤h(m,n)+估计h(n),其中h(m,n)指的是m到n间的直线距离。
作者提到,如果对全部节点都使用直线距离作为估计h,即使用同一个方法,那么可以满足一致性条件;
当对某些节点使用一种方法估计h,对其他节点使用另外的方法估计h,则可能会造成不满足一致性条件。
-
当满足一致性条件,即不存在reopen的情况时:
对单目标情况来说,一个节点一经closed,表示它被选择为最优路径上的点
对多目标情况,可以想象,是在同时expand多条路径,到达各目标过程中的点被“轮流”(实际上当然是无序的)open、closed,最后哪条路径先到达目标集中的点,就认为它是我们要找到的最优路径。
所以closed表示选中,而open表示备选。
作者的一些证明:
- 如果选取的估计h<真实h,则算法是可接受的,即必能找到解
- 当一致性假设满足,一个节点一经close,则其估计g必等于真实g,即找到了最小的估计g,即不可能找到更小的估计代价,也不会被reopen
- 从起点开始,估计得到的最优路径上的节点的估计代价是【不递减的】
- 在利用同样信息的情况下,A*展开的节点数是最少的
讨论:
-
A*是深度优先,有些算法(如Dijkstra)是广度优先,广度优先的算法考虑扩展过程中可能找到某节点更小的估计代价,要更新原代价
-
A*通常是指一个算法族,各算法的主要区别就是“估计h”的选择不同
A*算法族内的各算法对计算复杂度/效率有着不同的平衡, 如估计h选得大一点,可能不能保证一定找到最优解,但大多数情况ok,而且容易算;而估计h选得小一点(极端例子:0,完全不利用问题域的信息),可能会扩张更多无谓的节点造成浪费,但可能还是方便计算。