证明采用反证法,课上老师讲解不够清晰,课后自己下了点功夫,明白了A * 算法的原理。
前言
A*算法,其核心思想在于f(n)和Best-First.其中 f(n) = g(n) + h(n),h(n)是代价估计函数,
g(n)是出发点到点n的距离。我们假设结点n可以到达m个结点。这m个结点形成一个
集合S。进一步的,h(n) = minDistance {n -> m | m ∈ S}。从而计算出结点n的代价函
数f(n),再利用Best-First思想,选择f(n)最小的结点,然后递归操作。
A* 证明
我们需要证明利用A*算法选出的路径是最小路径。证明采用反证法。
现在,我们假设有:
A*算法选出的路径A = {S, N1, N2 … Ni-1, Nj … N’, T( A )},并说明该路径不是最短路径。
以及,
最短路径P = {S, N1, N2 … Ni-1, Ni,Ni+1 … T( P )},最短路径中必定包含路径A中没有的结点Ni。并说明路径P的Ni之前的所有结点和路径A保持一致。
其中T( A )表示由路径A到达的终点T,T( P )表示最短路径P到达的终点T,N’表示T( A )结点的上一个结点
因为有f(Ni) = g(Ni) + h(Ni) <= g(T(P)) + 0 = f(T(p))
即无论如何,我们的Ni的下一个结点到起始点的路径长度小于等于终止点T§到起始点的路径长度
又有f(T(P)) <= f(T(A))
即T( P )是最短路径
所以有f(Ni) <= f(T( A ))。
同理,有
所以有f(Ni+1) <= f(T( A )),f(Ni+2) <= f(T( A ))……f(T( P )) <= f(T( A ))
这时,我们反过来看A*算法选出的路径,当我们处于N’,要选择下一个结点时,根据Best - First,我们必定会选择Ni结点,而不会选T(A);而当我们处于Ni结点时,我们必定会选择Ni+1,而不会选择T(A),如此一来,路径A不可能达到,故矛盾,所以A*算法正确