一、基本思想
態規劃演算法的基本思想與分治法類似,都是將問題大問題拆分為小問題,通過小問題的求解來得到最後的解。
與分治法不同的是,分治法是分而治之,分治法將大問題拆分為相同性質的子問題,最後合併子問題的解來構成最終解。
而動態規劃是,將子問題拆解後,按順序求解子問題,前面階段的求解為後一階段提供有用資訊,通過動態的選擇來到達最終解。
用圖來表示就是如下所示:
二、適用情況
(1)最優化原理:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。
(2)無後效性:即某階段狀態一旦確定,就不受這個狀態以後決策的影響。也就是說,某狀態以後的過程不會影響以前的狀態,只與當前狀態有關。
(3)有重疊子問題:即子問題之間是不獨立的,乙個子問題在下一階段決策中可能被多次使用到。(該性質並不是動態規劃適用的必要條件,但是如果沒有這條性質,動態規劃演算法同其他演算法相比就不具備優勢)
三、求解步驟
動態規劃中有三個非常重要的概念:最優子結構、邊界、狀態轉移公式。
最優子結構:
最優子結構指的是,問題的最優解包含子問題的最優解。反過來說就是,我們可以通過子問題的最優解,推導出問題的最優解。
邊界:就是問題的出口。
狀態轉移公式:動態規劃問題的這一階段的最優解是可以通過前面階段的解和上一階段的決策推導出來的。這個推導過程就是乙個狀態轉移公式
我們通常按照如下4個步驟設計乙個動態規劃演算法:
1.刻畫乙個最優解的結構特徵
2.遞迴地定義最優解的值
3.計算最優解的值,通常採用自底向上的方法(採用一張**記錄之前的狀態)
4.利用計算出的資訊構造乙個最優解
我們之前的硬幣找零問題和揹包問題 也是一樣的求解步驟。以硬幣找零問題為例:
首先,面對一枚新的硬幣,我們有兩個選擇:使用 和 不使用。構成當前階段的最優解 = min ---- (1.刻畫乙個最優解的結構特徵)
然後,我們就得到轉移方程 value(i) = min ---- (2.遞迴地定義最優解的值)
之後我們從找零1角開始算起,一直到達我們想要找零的數目。中間的計算狀態我們都採用一張表進行記錄。 ---- (3.計算最優解的值,通常採用自底向上的方法(採用一張**記錄之前的狀態))
最後,我們通過之前的計算得到找零六角的最優解。(4.利用計算出的資訊構造乙個最優解)
我的經驗是,面對乙個問題,首先判斷它是否是動態規劃問題(1.最優子結構 2.無後效性 3.重疊子問題),
然後分析選擇和不選擇當前元素的狀態,寫出狀態轉移方程,
之後根據條件或者現實狀況找到邊界條件,
最後列出**,一步步計算各個階段的狀態和最優解,根據**就能得到我們需要的最優解。
動態規劃的關鍵在於階段的劃分(子問題的分解)和 找到狀態轉移方程。
四、乙個
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
什麼是動態規劃
動態規劃 dynamic programming 與分治法相似,都是通過組合子問題的解來求解原問題,動態規劃應用於子問題重疊的情況,即不同的子問題具有公共的子子問題。通常按照下面4個步驟來設計乙個動態規劃演算法 1.刻畫乙個最優解的結構特徵。2.遞迴地定義最優解的值 3.計算最優解的值,通常採用自底...
什麼是動態模型
動態模型著重於系統的控制邏輯,考察在任何時候物件及其關係的改變,描述這些涉及時序和改變的狀態。動態模型包括狀態圖和事件跟蹤圖。狀態圖是乙個狀態和事件的網路,側重於描述每一類物件的動態行為。事件跟蹤圖則側重於說明系統執行過程中的乙個特點 場景 也叫做指令碼 scenarios 是完成 系統某個功能的乙...