1. 程式人生 > 其它 >動態規劃---演算法思想介紹

動態規劃---演算法思想介紹

動態規劃 --- 演算法思想介紹


一.動態規劃的基本概念

動態規劃在五種演算法設計方法中難度最大,它建立在最優原則的基礎上.採用動態規劃方法,可以高效地解決許多用貪婪演算法或分治法無法解決的問題.動態規劃(dynamic programming)屬運籌學中的規劃論分支,是求解決策過程最優化的數學方法.20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決策過程的優化問題時,提出了著名的最優化原理(principle of optimality),把多階段過程轉化為一系列單階段問題,逐個求解,創立了解決這類過程優化問題的新方法——動態規劃.

二.動態規劃的適用條件

任何思想方法都有一定的侷限性,超出了特定條件,它就失去了作用.同樣,動態規劃也並不是萬能的.適用動態規劃的問題必須滿足最優化原理和無後效性.

1.最優化原理(最優子結構性質) 一個最優化策略具有這樣的性質,不論過去狀態和決策如何,對前面的決策所形成的狀態而言,餘下的諸決策必須構成最優策略.一個最優化策略的子策略總是最優的.一個問題滿足最優化原理又稱其具有最優子結構性質.

如圖,若路線I和J是A到C的最優路徑,則根據最優化原理,路線J必是從B到C的最優路線. 反證法證明:假設有另一路徑J'是B到C的最優路徑,則A到C的路線取I和J'比I和J更優,矛盾.從而證明J'必是B到C的最優路徑. 最優化原理是動態規劃的基礎,任何問題,如果失去了最優化原理的支援,就不可能用動態規劃方法計算.哪些問題滿足最優化原理? 動態規劃的最優化理在其指標函式的可分離性和單調性中得到體現.根據最優化原理匯出的動態規劃基本方程是解決一切動態規劃問題的基本方法.

2.無後向性 將各階段按照一定的次序排列好之後,對於某個給定的階段狀態,它以前各階段的狀態無法直接影響它未來的決策,而只能通過當前的這個狀態.換句話說,每個狀態都是過去歷史的一個完整總結.這就是無後向性,又稱為無後效性.如果用前面的記號來描述無後向性,就是:對於確定的xk,無論p1,k-1如何,最優子策略pkn*是唯一確定的,這種性質稱為無後向性.

3.子問題的重疊性 動態規劃將一些具有指數級複雜度的搜尋演算法改進成了具有多項式時間的演算法.其中的關鍵在於解決冗餘,這是動態規劃演算法的根本目的.動態規劃實質上是一種以空間換時間的技術,在實現中往往儲存各種狀態,故空間複雜度大於其它的演算法.例如Bitonic旅行路線問題:動態規劃的時間複雜度為O(n2),搜尋演算法的時間複雜度為O(n!) ,但從空間複雜度來看,動態規劃演算法為O(n2),而搜尋演算法為O(n) .選擇動態規劃演算法是因為動態規劃演算法在空間上可以承受,而搜尋演算法在時間上卻無法承受,所以我們舍空間而取時間

動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題.但是經分解得到的子問題往往不是互相獨立的.不同子問題的數目常常只有多項式量級.在用分治法求解時,有些子問題被重複計算了許多次.

如果能夠儲存已解決的子問題的答案,而在需要時再找出已求得的答案,就可以避免大量重複計算,從而得到多項式時間演算法.

設原問題的規模為n,當子問題樹中的子問題總數是n的超多項式函式,而不同的子問題數只是n的多項式函式時,動態規劃法顯得特別有意義,此時動態規劃法具有線性時間複雜性.所以,能夠用動態規劃解決的問題還有一個顯著特徵:子問題的重疊性.這個性質並不是動態規劃適用的必要條件,但是如果該性質無法滿足,動態規劃演算法同其他演算法相比就不具備優勢.

三.動態規劃的基本思想:

前面介紹了動態規劃理論,稱為標準動態規劃,因為它具有明顯的階段劃分和狀態轉移特徵.這是在研究多階段決策問題時推匯出來的,具有嚴格的數學形式,適合用於理論上的分析.在實際應用中,許多問題的階段劃分並不明顯,這時如果刻意地劃分階段法反而麻煩.一般來說,只要該問題可以劃分成規模更小的子問題,並且原問題的最優解中包含了子問題的最優解(即滿足最優子化原理),則可以考慮用動態規劃解決.

動態規劃的實質是分治思想解決冗餘,因此,動態規劃是一種將問題例項分解為更小的、相似的子問題,並存儲子問題的解而避免計算重複的子問題,以解決最優化問題的演算法策略. 動態規劃法與分治法和貪心法類似,它們都是將問題例項歸納為更小的、相似的子問題,並通過求解子問題產生一個全域性最優解.其中貪心法的當前選擇可能要依賴已經作出的所有選擇,但不依賴於有待於做出的選擇和子問題.因此貪心法自頂向下,一步一步地作出貪心選擇;

而分治法中的各個子問題是獨立的 (即不包含公共的子子問題),因此一旦遞迴地求出各子問題的解後,便可自下而上地將子問題的解合併成問題的解.但不足的是,如果當前選擇可能要依賴子問題的解時,則難以通過區域性的貪心策略達到全域性最優解;如果各子問題是不獨立的,則分治法要做許多不必要的工作,重複地解公共的子問題.

動態規劃法用於最優化問題,這類問題會有多種可能的解,而動態規劃找出其中最優值的解.若存在若干個取最優值的解的話,它只取其中的一個.該方法通過求解區域性子問題的解達到全域性最優解.與分治法和貪心法不同的是,動態規劃允許這些子問題不獨立,(各子問題可包含公共的子子問題) ,該方法對每一個子問題只解一次,並儲存結果,避免每次碰到時都要重複計算.

動態規劃法所針對的問題的特徵:對應的子問題樹中的子問題呈現大量的重複.關鍵:對於重複出現的子問題,只在第一次遇到時加以求解,並把答案儲存起來,以後再遇到時不必重新求解. 實際應用當中經常不顯式地按照上面步驟設計動態規劃,而是按以下幾個步驟進行:

  • 分析最優解的性質,並刻劃其結構特徵.

  • 遞迴地定義最優值.

  • 以自底向上的方式或自頂向下的記憶化方法(備忘錄法)計算出最優值.

  • 根據計算最優值時得到的資訊,構造一最優解.

步驟(1)--(3)是基本步驟.在只需要求出最優值的情形,步驟(4)可以省略.若需要求出問題的一個最優解,則必須執行步驟(4).此時,需要利用在步驟(3)中計算最優值時記錄的許多資訊.

參考畢方明老師《演算法設計與分析》課件.

歡迎大家訪問個人部落格網站---喬治的程式設計小屋,和我一起為大廠offer努力!