算法设计与分析心得(2):A*算法正确性证明

A*算法思想

分支界限法在找界限减去不可能的情况,最终搜索完所有可能的情况,在做减法;而A*意图告诉我们什么时候已经得到了最优解,在我们找的时候肯定我们的解。

当什么时候A*算法正确?

当所有可以拓展的点中,我们下一步要拓展的点就是T点(目标节点)。那么我们就无需拓展了,T点就已经是最优的了。

正确性

为什么A*算法对?以最短路搜索举例

我们先定义一些名词:当我们到达点n时,已经付出的代价为g(n),这是我们已经知道的,然后假设有上帝,告诉我们这条路到最优解还差h*(n),但是没有上帝,我们仅仅用这个节点下一步路径的最短值作为永远的相对小值h(n)估计值h*(n)。我们设从原点到点n的代价为f*(n)=g(n)+h*(n),代表着上帝告诉我们如果选了n,那么最优解是f*(n),那么有f(n)=g(n)+h(n)<=f*(n)(f(n)是我们实际计算得到的,并且加入堆进行best-first比较的)
然后我们来证明正确性
我们首先注意,我们使用best-first策略在寻找最优点,假设说我们现在所有可拓展的点里面,T是当前代价估计值最小的,那么就有
1)f(t)<=f(n),n是任意可拓展的点,t是我们要拓展的最终节点。
2) 进而有f(t)<=f*(n)
3)当前所有路里面一定有一个估计值是可以找出来最终解的,要不然就没有解了。设它为s,那么根据(2)有f(t)<=f*(s)
4)由于t是目标节点,进而h(t)为0,所以有f(t)=g(t)+h(t)=g(t)<=f*(s),回到路径的关注上找到上界
5)路径固有的下界g(t)>=f*(s),进而g(t)=f*(s)=f(t)

简要版本

简单来讲,就是下界不必说,你找到的这个路因为估计值小于其他的,而且到了最后一步了,所以路径也小于其他的估计值,传递一下,进而小于其他的准确值,也就是该路是最短的。进而得证。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章