1. 程式人生 > >動態規劃算法

動態規劃算法

分解 net dijkstra 全局最優 子結構 解決問題 最優解 blog 最好的

  R.Bellman等人於1951年在研究多階段決策過程優化問題時所創立的一種用於解決此類過程優化問題的新方法。

逆向遞歸的方法稱為動態規劃法(Dynamic Programming).

多階段決策

  有一類問題可以將其活動過程分解成若幹個相互聯系的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。在每個階段所作出的決策選擇依賴於當前狀態,又影響以後的發展。當各階段決策確定後,就組成一個決策序列,從而就確定了整個過程的一條活動路線。這種將一個問題看作是一個前後相互關聯且具有鏈狀結構的多階段過程稱為多階段決策。

  通常情況下,在多階段決策過程中,某一階段會存在多個決策序列,如果在進行決策時遵循如下原則:求解過程為自底向上(即從終點到起點),每一步的選擇總是依賴於上一步的選擇,且此步僅把不可能的決策序列排除在外。

  動態規劃註意適用於最優化問題的求解。這類問題可能有多個可能的解,每個解都有一個值,而動態規劃就是找出其中最優(最大或最小)值的解。若存在若幹個最優值的解,只取其中的一個。

  

  動態規劃與分治法、貪心法類似,都是將原問題分解為若幹個更小的、相似的子問題,並通過求解子問題產生一個全局最優解。其不同之處如下:

(1)使用貪心法時,當前選擇可能要依賴於已經作出的所有選擇,但不依賴於有待於作出的選擇和子問題。因此貪心法是自頂向下(即從起點到終點),一步一步地作出貪心選擇。當然,如果當前的選擇可能要依賴於子問題的解時,則難以通過局部的貪心策略達到全局最優解。

(2)使用分治法時,由原問題分解出的各個子問題通常是相互獨立的,即不包含公共的子問題,因此一旦遞歸地求出各子問題的解後,便可自下而上地將各子問題的解合並成問題的解。如果各個子問題不是相互獨立的,則分治法要做出許多不必要的工作,重復求解公共的子問題。

(3)動態規劃允許由原問題分解出的子問題之間相互依賴。每個子問題只求解一次,並將結果保存起來,避免每次碰到此問題時都要重復計算。

綜上所述,動態規劃的基本思想是將待求解的問題分解成若幹個相互聯系的子問題,先求解子問題,然後再從這些子問題的解得到原問題的解。對於重復出現的子問題,只在第一次遇到時對它進行求解,並把中間計算結果保存起來,以後再次遇到時直接引用中間計算結果,不必重新求解。

動態規劃適用條件

(1)最優化原理(最優子結構性質)

  如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構性質,即滿足最優化原理。

  所謂最優化原理是指無論前面的策略如何,此後的決策必須是基於當前狀態(由上一次決策產生)的最優決策。由於對於有些問題的某些遞歸式來講並不一定能保證最優原則,因此在求解問題時有必要對它進行驗證。若不能保持最優原則,則不可以應用動態規劃方法求解。在得到最優解的遞歸式後,需要執行回溯以構造最優解。

(2)無後效性

  應用動態規劃的一個重要條件就是將各階段按照一定的次序排列好,階段i的狀態只能由階段i+1的狀態來確定,與其他狀態沒有關系,尤其是與未發生的狀態沒有關系。每個狀態都是“過去歷史的一個完整總結”。

(3)子問題的重疊性

  子問題的重疊性是指利用遞歸算法自頂向下對問題求解時,每次產生的子問題並不總是新問題,有些子問題可能被重復計算多次。動態規劃法正是利用子問題的這種重疊性質,對每一個子問題只計算一次,然後將其計算結果保存起來,當再次需要計算已經計算過的子問題時,只是簡單查看一下以往計算結果,從而獲得高的解題效率。

  子問題的重疊性並不是動態規劃的必要條件,如果不滿足該條件,動態規劃與其他算法相比就無優勢。

動態規劃法解決問題的步驟

(1)分析:對原始問題進行分析,找出問題的最優解的結構特征。

(2)分解:將所給問題按時間或空間特性分解成若幹相互關聯的階段,並確定出計算局部最優解的遞推關系,這是利用動態規劃法解決問題的關鍵和難點所在。需要註意,分解後的各個階段一定是有序的或者是可排序的,即無後向性。否則問題就無法用動態規則求解。

(3)解決:對於每個階段通過自底向上方法求得局部問題的最優解。需要一個遞推的終止條件或邊界條件。

(4)合並:將各個階段求出的解合並為原問題的解,即構造一個最優解。

  整個求解過程可以使用一個最優決策表的二維數組來描述,其中行表示決策的階段,列表示問題狀態,表格需要填寫的數據一般對應此問題在某個階段式某個狀態下的最優值,如最短路徑、最長公共子序列、最大價值等。填表過程就是根據遞推關系從1行1列開始,以行或者列優先的順序,依次填寫表格。最後根據整個表格的數據通過簡單的取舍或者運算求得問題的最優解。

  動態規劃關鍵在於解決冗余,是一個以空間換時間的技術,所以它的空間復雜度要大於其他的算法。

動態規劃法應用舉例:

多源最短路徑

  對於一個給定的非負有向網圖,求出任意兩個節點之間的最短路徑。通常有兩種方法,一個是分別以圖中每個頂點為源點共調用n次Dijkstra算法;其二是采用Floyed算法。兩種方法時間復雜度都是O(n*n*n),後者比較簡單。

http://blog.csdn.net/wangdd_199326/article/details/62235750

動態規劃算法