A*
算法
1 | function A*(): |
定义
我们使用如下定义:
一个图
我们有
同时我们需要两个估计函数
我们可以取
同时可以取
这里要求
可容性
A*算法可以找到最优解,则满足可容性/可采纳性 (admissible)
在之前的定义中,
我们接下来要证明,如果
Lemma 1: 对于任意一个未关闭节点
和对应的从 到 的最短路 , 存在一个节点 使得
证明:
如果
如果
由于
选出一个标号最大的点
令
由
同时
所以我们有
而一般地,
所以
Corollary: 假设
, 且 A* 算法未停止。那么在任意一条最短路 上, 存在一个 上未关闭点 满足
证明:由引理1,存在一个
所以
而因为是最短路,所以有
所以存在一个
Theorem 1: 如果
对所有 成立,那么 A* 是 Admissable (可容) 的
证明:反证
假设不成立,有 3 中情况:
- Case 1: 不会停止在目标点集
这与停止条件矛盾
- Case 2: 不会停止
假设每条边最小值是
这是由于引理1的推论,存在点
那么算法不停止只会是因为距离起点
但是经过这些点的路径只有有限条,记为
记
那么经过
- Case 3: 停止时解不是最优解
假设算法停在了 目标点
但是由引理1的推论,在终止前存在一个点
所以算法应该先选择
综上,三种情况都不满足,命题得证
一致性
如果
这里
Lemma 2: 在一致性条件下,如果一个节点
被关闭,那么
先说一下这个引理的重要性
它主要重要在两方面:
首先,它可以用来证明 A* 的最优性
其次,它说明算法不需要重新打开一个已经关闭的节点
即 A* 算法不会重复扩展同一节点
这样,我们就可以把算法第
这一点与 Dijkstra 是一样的
下面是证明
证明:反证
假设关闭
此时存在一个从
因为
根据引理1, 存在一个
如果
否则我们有
所以
两边同加
由于一致性:
所以
即
这与我们选择
故得证
Lemma 3: 令
表示 A* 依次关闭的节点. 那么对于 , 有
这说明了
证明:
假设
如果到
在选择
如果到
由引理2, 我们有
则
故得证
Corollary: 如果
关闭,那么
证明:
由引理3,
最优性
下面的定理和推论我们都不加证明地给出,具体证明参见原论文
首先是没有出现 ties 的情况
这里的 ties 指 A* 同时可以选择两个及以上的节点
具体地,存在
Theorem 2: 令 A 是任意可容的,不比 A* 有更多信息 (informed) 的算法,
为边权最小值为 ,满足 的图, 且满足一致性。则如果 在 A* 中被拓展,则在 A 中也会被拓展
这里的 informed 未定义,可以感性理解一下,就是
比如,
Corollary: 定义
为 A 算法在 图上拓展的节点,那么
这样我们就说 A* 是一个最优的算法, 因为它拓展了最少的节点
然后是有 ties 存在的情况
令 G* 表示所有处理 ties 方式不同的 A* 算法的集合
Theorem 3: 令 A 是任意可容的,不比 G* 有更多信息的算法,
为边权最小值为 ,满足 的图, 且满足一致性。则存在一个 A* G*, 如果 在 A* 中被拓展,则在 A 中也会被拓展
Corollary 1: 存在一个 A*
G* 满足
Corollary 2: 定义
为 A* 应用于 上的总 critical ties 个数, 则对任意一个 A* G*, 我们有
对于 noncritical ties, 满足所有其他可选的节点一定同时被 A 和 A* 拓展
critical ties 即为相反定义
可容性与一致性的关系
Theorem 4: 如果启发函数满足一致性, 一定满足可容性
证明:
对于任意节点
与 的选取
参考文献
更加严谨,具体的证明与分析可以见A*算法的原论文
A Formal Basis for the Heuristic Determination of Minimum Cost Paths