前言:
書中列舉四個常見問題,分析如何採用動態規劃方法進行解決。今天把動態規劃演算法總結一下。關於四個問題的動態規範分析過程可以參考前面的幾篇日誌,鏈結如下:
裝配線排程問題:
矩陣鏈乘問題:
最長公共子串行問題:
最優二叉查詢樹問題:
1、基本概念
動態規劃是通過組合子問題的解而解決整個問題的,通過將問題分解為相互不獨立(各個子問題包含有公共的子問題,也叫重疊子問題)的子問題,對每個子問題求解一次,將其結果儲存到一張輔助表中,避免每次遇到各個子問題時重新計算。動態規劃通常用於解決最優化問題,其設計步驟如下:
(1)描述最優解的結構。
(2)遞迴定義最優解的值。
(3)按自底向上的方式計算最優解的值。
(4)由計算出的結果構造出乙個最優解。
第一步是選擇問題的在什麼時候會出現最優解,通過分析子問題的最優解而達到整個問題的最優解。在第二步,根據第一步得到的最優解描述,將整個問題分成小問題,直到問題不可再分為止,層層選擇最優,構成整個問題的最優解,給出最優解的遞迴公式。第三步根據第二步給的遞迴公式,採用自底向上的策略,計算每個問題的最優解,並將結果儲存到輔助表中。第四步驟是根據第三步中的最優解,借助儲存在表中的值,給出最優解的構造過程。
動態規劃與分治法之間的區別:
(1) 分治法是指將問題分成一些獨立的子問題,遞迴的求解各子問題。
(2) 動態規劃適用於這些子問題不是獨立的情況,也就是各子問題包含公共子問題。
2、動態規劃基礎
什麼時候可以使用動態規範方法解決問題呢?這個問題需要討論一下,書中給出了採用動態規範方法的最優化問題中的兩個要素:最優子結構和重疊子結構。
1)最優子結構
最優子結構是指問題的乙個最優解中包含了其子問題的最優解。在動態規劃中,每次採用子問題的最優解來構造問題的乙個最優解。尋找最優子結構,遵循的共同的模式:
(1)問題的乙個解可以是做乙個選擇,得到乙個或者多個有待解決的子問題。
(2)假設對乙個給定的問題,已知的是乙個可以導致最優解的選擇,不必關心如何確定這個選擇。
(3)在已知這個選擇後,要確定哪些子問題會隨之發生,如何最好地描述所得到的子問題空間。
(4)利用「剪貼」技術,來證明問題的乙個最優解中,使用的子問題的解本身也是最優的。
最優子結構在問題域中以兩種方式變化:
(1)有多少個子問題被使用在原問題的乙個最優解中。
(2)在決定乙個最優解中使用哪些子問題時有多少個選擇。
動態規劃按照自底向上的策略利用最優子結構,即:首先找到子問題的最優解,解決子問題,然後逐步向上找到問題的乙個最優解。為了描述子問題空間,可以遵循這樣一條有效的經驗規則,就是盡量保持這個空間簡單,然後在需要時再擴充它。
注意:在不能應用最優子結構的時候,就一定不能假設它能夠應用。 警惕使用動態規劃去解決缺乏最優子結構的問題!
使用動態規劃時,子問題之間必須是相互獨立的!可以這樣理解,n個子問題域互不相干,屬於完全不同的空間。
2)重疊子問題
用來解決原問題的遞迴演算法可以反覆地解同樣的子問題,而不是總是產生新的子問題。重疊子問題是指當乙個遞迴演算法不斷地呼叫同乙個問題。動態規劃演算法總是充分利用重疊子問題,通過每個子問題只解一次,把解儲存在乙個需要時就可以檢視的表中,每次查表的時間為常數。
由計算出的結果反向構造乙個最優解:把動態規劃或者是遞迴過程中作出的每一次選擇(記住:儲存的是每次作出的選擇)都儲存下來,在最後就一定可以通過這些儲存的選擇來反向構造出最優解。
做備忘錄的遞迴方法:這種方法是動態規劃的乙個變形,它本質上與動態規劃是一樣的,但是比動態規劃更好理解!
(1) 使用普通的遞迴結構,自上而下的解決問題。
(2) 當在遞迴演算法的執行中每一次遇到乙個子問題時,就計算它的解並填入乙個表中。以後每次遇到該子問題時,只要檢視並返回表中先前填入的值即可。
3、總結
動態規劃的核心就是找到問題的最優子結構,在找到最優子結構之後的消除重複子問題。最終無論是採用動態規劃的自底向上的遞推,還是備忘錄,或者是備忘錄的變型,都可以輕鬆的找出最優解的構造過程。
演算法導論 第15章 動態規劃之鋼條切割
python coding utf 8import numpy import copyimport timea 0,1,5,8,9,10,17,17,20,24,30 不同長度鋼條的 表,a k 對應於長度為k的剛條的 assert len a 11 cost numpy.zeros shape 1...
演算法導論15章 動態規劃之矩陣鏈乘法問題
陣鏈乘法問題 給定乙個n個矩陣的序列 矩陣鏈 矩陣ai的規模為pi 1 pi,求完全括號話方案,使得計算成績a1 a2 an所需標量乘法次數最少。注意 求解矩陣鏈乘法問題並不是要真正進行矩陣相乘運算,只是確定代價最低的計算順序,確定最優計算書序所花費的時間通常要比隨後真正進行矩陣相乘所節省的時間要少...
演算法導論 讀書筆記 動態規劃
一.動態規劃介紹 動態規劃與分治法整體思路相近 組合子問題的解求解原問題。將問題劃分為互不相交的子問題,遞迴地求解子問題,再將它們的解組合起來,求出原問題的解。動態規劃的應用場景 子問題重疊。子問題的解決需要解決子子問題 遞迴 而不同子問題之間的子子問題是相同的。動態規劃的實現及特點 對於分治演算法...