下面的博客将主要介绍A*算法在扩展结点(这对于寻路时间很重要)和总代价(这对于保证最后解的最优性很重要)上的最优性,并将淡化对A *完备性的介绍。
A* 算法流程
A*算法的流程如下[1]:
并定义 f ( n ) f(n) f(n)和 g ( n ) g(n) g(n):
open和closed表中的重要结论
下面是给出引理1:
(引理1)对于任意不在closed表中的结点 n n n 以及对于任意从起点 s s s到 n n n的最优路径 P P P,存在一个在open表中的结点 n ′ n^{'} n′,其在 P P P上,即 g ^ ( n ′ ) = g ( n ′ ) \hat{g}(n^{'})=g(n^{'}) g^(n′)=g(n′)。
Proof. 设 P = ( s = n 0 , n 1 , n 2 , . . . n k = n ) P=(s=n_0,n_1,n_2,...n_k=n) P=(s=n0,n1,n2,...nk=n),当 s s s在open表中时,那么 n ′ = s n^{'}=s n′=s必然满足条件,因为 g ^ ( s ′ ) = g ( s ′ ) = 0 \hat{g}(s^{'})=g(s^{'})=0 g^(s′)=g(s′)=0;当 s s s在closed表中时,令 Δ \Delta Δ是 P P P上的,所有在closed表中的结点 n i n_i ni,其满足 g ^ ( n i ) = g ( n i ) \hat{g}(n_i)=g(n_i) g^(ni)=g(ni)的集合:
Δ = { n i ∈ c l o s e d ∣ g ^ ( n i ) = g ( n i ) ( n i ∈ P ) } \Delta=\{n_i\in closed|\hat{g}(n_i)=g(n_i)(n_i\in P)\} Δ={ni∈closed∣g^(ni)=g(ni)(ni∈P)}
很显然 Δ ≠ ϕ \Delta\ne\phi Δ=ϕ,这是因为假设 Δ \Delta Δ至少包含一个 s s s。令 n ∗ n^* n∗为 Δ \Delta Δ中索引最高的元素,那么很明显 n ∗ ≠ n n^*\ne n n∗=n,这是因为 n n n不在closed表中。令 n ′ n^{'} n′为 n ∗ n^* n∗在 P P P上的后继结点(successor), n ′ ∈ o p e n n^{'}\in open n′∈open,这里很有可能 n ′ = n n^{'}=n n′=n,此时情况特殊,算法结束。现在由于算法Step4中 g ^ \hat{g} g^的定义有:
g ^ ( n ′ ) ≤ g ^ ( n ∗ ) + c n ∗ , n ′ \hat{g}(n^{'})\leq\hat{g}(n^*)+c_{n^*,n^{'}} g^(n′)≤g^(n∗)+cn∗,n′
同样由于 n ∗ ∈ Δ n^*\in\Delta n∗∈Δ, g ^ ( n ∗ ) = g ( n ∗ ) \hat{g}(n^*)=g(n^*) g^(n∗)=g(n∗),且由于 n ∗ ∈ P n^*\in P n∗∈P, g ( n ′ ) = g ( n ∗ ) + c n ∗ , n ′ g(n^{'})=g(n^*)+c_{n^*,n^{'}} g(n′)=g(n∗)+cn∗,n′。因此可以得到:
g ^ ( n ′ ) ≤ g ^ ( n ∗ ) + c n ∗ , n ′ ≤ g ( n ∗ ) + c n ∗ , n ′ ≤ g ( n ′ ) \hat{g}(n^{'}) \leq \hat{g}(n^*)+c_{n^*,n^{'}} \\ \leq g(n^*)+c_{n^*,n^{'}} \\ \leq g(n^{'}) g^(n′)≤g^(n∗)+cn∗,n′≤g(n∗)+cn∗,n′≤g(n′)
而实际上,对于任意一个后继结点 n ′ n^{'} n′而言其距离起点 s s s的累计长度肯定大于最优路径,即 g ^ ( n ′ ) ≥ g ( n ′ ) \hat{g}(n^{'})\geq g(n^{'}) g^(n′)≥g(n′)。因此综上有, g ( n ′ ) = g ^ ( n ′ ) g(n^{'})=\hat{g}(n^{'}) g(n′)=g^(n′),说明 n ′ ∈ P n^{'}\in P n′∈P。
(推论)假设对于任意 n n n有 h ^ ( n ) ≤ h ( n ) \hat{h}(n)\leq h(n) h^(n)≤h(n),且 A ∗ A^* A∗没有结束。那么对于任意从 s s s到其目标点的最优路径 P P P,存在open表中的 n ′ ∈ P n^{'} \in P n′∈P,满足 f ^ ( n ′ ) ≤ f ( s ) \hat{f}(n^{'})\leq f(s) f^(n′)≤f(s)。
Proof. 由引理1有,存在open表中的结点 n ′ ∈ P n^{'} \in P n′∈P ,即 g ^ ( n ′ ) = g ( n ′ ) \hat{g}(n^{'})=g(n^{'}) g^(n′)=g(n′)。因此由定义:
f ^ ( n ′ ) = g ^ ( n ′ ) + h ^ ( n ′ ) = g ( n ′ ) + h ^ ( n ′ ) ≤ g ( n ′ ) + h ( n ′ ) = f ( n ′ ) \hat{f}(n^{'})=\hat{g}(n^{'}) + \hat{h}(n^{'})\\ =g(n^{'}) + \hat{h}(n^{'}) \\ \leq g(n^{'}) + h(n^{'}) \\ = f(n^{'}) f^(n′)=g^(n′)+h^(n′)=g(n′)+h^(n′)≤g(n′)+h(n′)=f(n′)
下面先不证明A*算法的完备性,下面先假设在A * 算法完备的情况下,证明其最优性。
在证明最优性之前,这里需要给出一个概念叫一致性假设(Consistency Assumption)。假设如下:
h ( m , n ) + h ^ ( n ) ≥ h ^ ( m ) h(m,n)+\hat{h}(n)\geq \hat{h}(m) h(m,n)+h^(n)≥h^(m)
这里的 h ( m , n ) h(m,n) h(m,n)表示从 m m m到 n n n所需要的最优代价。在有了上面的一致性假设的前提下,下面的引理可以证明A * 算法的最优性。
(引理2)在 h ^ \hat{h} h^满足一致性假设的前提下,在A*算法所得到的 c l o s e d closed closed中的结点 n n n必定满足 g ^ ( n ) = g ( n ) \hat{g}(n)=g(n) g^(n)=g(n)。
Proof. 采用反证法对上面的结果进行证明。假设 g ^ ( n ) > g ( n ) \hat{g}(n) > g(n) g^(n)>g(n),现在存在从 s s s到 n n n的最优路径 P P P。由于 g ^ ( n ) > g ( n ) \hat{g}(n) > g(n) g^(n)>g(n),这说明A算法并没有找到最优路径 P P P。而由引理1,在open表中必然存在 n ′ ∈ P n^{'}\in P n′∈P,满足 g ( n ′ ) = g ^ ( n ′ ) g(n^{'})=\hat{g}(n^{'}) g(n′)=g^(n′)。当 n ′ = n n^{'}= n n′=n 时,结论成立;当 n ′ ≠ n n^{'}\ne n n′=n 时,很明显有:
g ( n ) = g ( n ′ ) + h ( n ′ , n ) = g ^ ( n ′ ) + h ( n ′ , n ) g(n)=g(n^{'})+h(n^{'},n)\\ = \hat{g}(n^{'}) +h(n^{'},n) g(n)=g(n′)+h(n′,n)=g^(n′)+h(n′,n)
综合有: g ^ ( n ) > g ^ ( n ′ ) + h ( n ′ , n ) \hat{g}(n) > \hat{g}(n^{'})+h(n^{'},n) g^(n)>g^(n′)+h(n′,n),两边同时加上 h ^ ( n ) \hat{h}(n) h^(n)有:
h ^ ( n ) + g ^ ( n ) > h ^ ( n ) + h ( n ′ , n ) + g ^ ( n ′ ) ≥ h ^ ( n ′ ) + g ^ ( n ′ ) \hat{h}(n) + \hat{g}(n) > \hat{h}(n) + h(n^{'},n) + \hat{g}(n^{'}) \\ \geq \hat{h}{(n^{'})} + \hat{g}(n^{'}) h^(n)+g^(n)>h^(n)+h(n′,n)+g^(n′)≥h^(n′)+g^(n′)
这说明 f ^ ( n ) > f ^ ( n ′ ) \hat{f}(n)>\hat{f}(n^{'}) f^(n)>f^(n′),那么在算法Step2中,A应该弹出更小的 n ′ n^{'} n′作为扩展结点进入closed表中,这与终止条件,弹出 n n n进入在closed表的结果矛盾。因此可以说明, g ^ ( n ) ≤ g ( n ) \hat{g}(n)\leq g(n) g^(n)≤g(n),又因为 g ^ ( n ) ≥ g ( n ) \hat{g}(n) \geq g(n) g^(n)≥g(n),因此 g ^ ( n ) = g ( n ) \hat{g}(n)=g(n) g^(n)=g(n)。
上面的引理是重要的,这是因为引理2不仅仅为A*算法的最优性证明提供了条件,更说明对于closed表中的结点,其已经在最优路径上了,没必要在其再次被扩展到的时候,继续放到open表里面了。
(引理3)作为A*算法扩展出的closed表中的结点序列 ( n 1 , n 2 , . . . , n t ) (n_1,n_2,...,n_t) (n1,n2,...,nt),当满足一致性假设条件时,若 p ≤ q p\leq q p≤q,则有 f ^ ( n p ) ≤ f ^ ( n q ) \hat{f}(n_p)\leq \hat{f}(n_q) f^(np)≤f^(nq)。
Proof. 假设结点 n n n是A* 算法在将 m m m放入closed表中后的下一个closed结点。首先假设到 n n n的最优路径 P P P并不经过 m m m,哪么 m m m在被放入closed表中后, n n n再被放入时,肯定有 f ^ ( m ) = f ( m ) = f ( n ) ≤ f ^ ( n ) \hat{f}(m)=f(m)= f(n)\leq \hat{f}(n) f^(m)=f(m)=f(n)≤f^(n),因此引理成立。再假设到 n n n的最优路径经过 m m m,由引理2有 g ^ ( n ) = g ( n ) \hat{g}(n)=g(n) g^(n)=g(n), g ^ ( m ) = g ( m ) \hat{g}(m)=g(m) g^(m)=g(m),那么由 g ( n ) = g ( m ) + h ( m , n ) g(n)=g(m)+h(m,n) g(n)=g(m)+h(m,n)就有:
f ^ ( n ) = g ^ ( n ) + h ^ ( n ) = g ( n ) + h ^ ( n ) = g ( m ) + h ( m , n ) + h ^ ( n ) ≥ g ( m ) + h ^ ( m ) = g ^ ( m ) + h ^ ( m ) = f ^ ( m ) \hat{f}(n)=\hat{g}(n) + \hat{h}(n) \\ = g(n) + \hat{h}(n) \\= g(m) + h(m,n) + \hat{h}(n) \\ \geq g(m) + \hat{h}(m) \\ = \hat{g}(m) + \hat{h}(m) \\ = \hat{f}(m) f^(n)=g^(n)+h^(n)=g(n)+h^(n)=g(m)+h(m,n)+h^(n)≥g(m)+h^(m)=g^(m)+h^(m)=f^(m)
上面的引理说明在一致性条件满足的情况下,closed表中的结点随着不断的加入,其估计值 f ^ \hat{f} f^是单调递增的。
(推论)在引理3的条件下, c l o s e d closed closed表中的结点 n n n必然满足 f ^ ( n ) ≤ f ( s ) \hat{f}(n)\leq f(s) f^(n)≤f(s)。
Proof. 证明是简单的,假设在A*算法中起始结点 s s s开始寻找到的最终结点是 t t t,此时由引理3,有 f ^ ( n ) ≤ f ^ ( t ) = f ( t ) = f ( s ) \hat{f}(n) \leq \hat{f}(t)=f(t)=f(s) f^(n)≤f^(t)=f(t)=f(s)。
这个推论说明了一个很特殊的情况,当closed表中的结点足够多时,由单调有界原理,closed表中的 f ^ \hat{f} f^值将收敛,由于 f ( s ) f(s) f(s)是 f ^ \hat{f} f^的上确界,因此 f ^ → f ( s ) \hat{f}\rightarrow f(s) f^→f(s)。 这个证明是简单的,因为假设 f ^ → c \hat{f} \rightarrow c f^→c,由推论, c = sup { f ^ } ≤ f ( s ) c=\sup\{\hat{f}\} \leq f(s) c=sup{f^}≤f(s),另外对于任意的 n n n有 c ≥ f ^ ( n ) ≥ f ( s ) c\geq \hat{f}(n)\geq f(s) c≥f^(n)≥f(s)必然成立,因此说明 c = f ( s ) c=f(s) c=f(s)。
事实上,这里最重要的假设条件是一致性假设条件和启发项 h ^ ≤ h \hat{h} \leq h h^≤h假设,当这两个条件满足时,可以认为在A * 搜索算法的框架下,closed表中结点的 f ^ \hat{f} f^值必然会单调收敛到最优的代价 f f f上。这样,我们就可以通过在终止结点上的回溯找到完整的最优路径的信息。
换一种思路,博客[2]则是采用反证法结合数学归纳法巧妙地证明了A*算法在图节点搜索中必然可以找到一条最优路径。而博客[3]也是直接采用反证法证明了其最优性。
A*算法在扩展结点数目上的优势
在文献[1]中, Hart P E 还证明了A*算法在扩展结点上相比于任何完备算法在某些条件下有更少的结点扩展:
- 对于任意的完备性算法A而言,当满足一致性假设条件以及A算法“no more informed than”A*算法时,若结点被A *算法所扩展,哪么该结点必定同样被A算法所扩展(见 Theorem 2);
- 在满足Theorem 2的条件下,在 δ \delta δ图 G s G_s Gs中,A算法总共扩展的结点数目不大于A算法总共所扩展的结点数目,即 N ( A ∗ , G s ) ≤ N ( A , G s ) N(A^{ *},G_s)\leq N(A,G_s) N(A∗,Gs)≤N(A,Gs)(见Theorem 2* 的Corollary);
- 当open表中出现相同的 f ^ \hat{f} f^值时,上述定理和推论依旧成立(Theorem 3, Corollary 1, Corollary 2)。
文献指出,如果出现A算法比A*算法扩展更少的结点时,哪通常只是因为运气好,且在图上有更多可以利用的一致性信息导致A算法提前结束,事实上A *算法搜索的结点数是要少于A算法的。
参考文献
[1] Hart P E , Nilsson N J , Raphael B .A Formal Basis for the Heuristic Determination of Minimum Cost Paths[J].IEEE Transactions on Systems Science & Cybernetics, 1972, 4(2):28-29.DOI:10.1145/1056777.1056779.
[2] Veritaswhs, A*算法证明与详解-CSDN博客, CSDN, 2020: https://blog.csdn.net/weixin_43398590.
[3] DeadPool loves Star, 算法导论——A*算法易懂的证明, CSDN, 2020.