演算法設計與分析心得(2) A 演算法正確性證明

2021-10-07 04:25:35 字數 846 閱讀 7338

分支界限法在找界限減去不可能的情況,最終搜尋完所有可能的情況,在做減法;而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)

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

演算法設計與分析2 遞推演算法

遞推法是一種重要的數學方法。這種演算法特點是 乙個問題的求解需一系列的計算,在已知條件和所求問題之間總存在著某種相互聯絡的關係,在計算時,如果可以找到前後過程之間的數量關係 即遞推式 那麼,從問題出發逐步推到已知條件,此種方法叫逆推。無論順推還是逆推,其關鍵是要找到遞推式。遞推演算法的首要問題是得到...

演算法設計與分析 作業2

1 用floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽 和給出距離矩陣 頂點之間的最短距離矩陣 2 對於下圖使用dijkstra演算法求由頂點a到頂點h的最短路徑 1 floyd演算法 首先從任意一條單邊開始,對於任一對頂點v1和v2,看看是否存在另乙個頂點v3,使得v1到v3再...

演算法設計與分析

輸入輸出 確定性有窮性 np類問題是非確定性計算模型下的易驗證問題類。所有可以在多項式時間內求解的判定問題構成p類問題 1 二分搜尋技術 二分搜尋演算法的基本思路是對給定已排好序的n個元素a 0 n 1 在這n個元素中找出乙個特定元素x。運用分治的思想,將n個元素以n 2為中心對半分。if x a ...