動態規划---算法思想介紹


動態規划 --- 算法思想介紹


一.動態規划的基本概念

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

二.動態規划的適用條件

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

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

如圖,若路線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) .選擇動態規划算法是因為動態規划算法在空間上可以承受,而搜索算法在時間上卻無法承受,所以我們舍空間而取時間

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

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

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

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

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

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

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

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

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

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

  • 遞歸地定義最優值.

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

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

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

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

歡迎大家訪問個人博客網站---喬治的編程小屋,和我一起為大廠offer努力!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM