算法設計與分析心得(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)

簡要版本

簡單來講,就是下界不必說,你找到的這個路因爲估計值小於其他的,而且到了最後一步了,所以路徑也小於其他的估計值,傳遞一下,進而小於其他的準確值,也就是該路是最短的。進而得證。

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