1. 程式人生 > >動態規劃(DP)

動態規劃(DP)

一.DP簡介

1.定義:動態規劃演算法是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推(或者說分治)的方式去解決。動態規劃演算法的基本思想與分治法類似,也是將待求解的問題分解為若干個子問題(階段),按順序求解子階段,前一子問題的解,為後一子問題的求解提供了有用的資訊。在求解任一子問題時,列出各種可能的區域性解,通過決策保留那些有可能達到最優的區域性解,丟棄其他區域性解。依次解決各子問題,最後一個子問題就是初始問題的解。

2.求解步驟

(1)劃分階段:按照問題的時間或空間特徵,把問題分為若干個階段。在劃分階段時,注意劃分後的階段一定要是有序的或者是可排序的,否則問題就無法求解。

(2)確定狀態和狀態變數:將問題發展到各個階段時所處於的各種客觀情況用不同的狀態表示出來。當然,狀態的選擇要滿足無後效性。

(3)確定決策並寫出狀態轉移方程:因為決策和狀態轉移有著天然的聯絡,狀態轉移就是根據上一階段的狀態和決策來匯出本階段的狀態。所以如果確定了決策,狀態轉移方程也就可寫出。但事實上常常是反過來做,根據相鄰兩個階段的狀態之間的關係來確定決策方法和狀態轉移方程。

(4)尋找邊界條件:給出的狀態轉移方程是一個遞推式,需要一個遞推的終止條件或邊界條件。

一般,只要解決問題的階段、狀態和狀態轉移決策確定了,就可以寫出狀態轉移方程(包括邊界條件)。實際應用中可以按以下幾個簡化的步驟進行設計:

(1)分析最優解的性質,並刻畫其結構特徵。

(2)遞迴的定義最優解。

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

(4)根據計算最優值時得到的資訊,構造問題的最優解

3.動態規劃三要素

(1)問題的階段

(2)每個階段的狀態

(3)從前一個階段轉化到後一個階段之間的遞推關係。

二.典型動態規劃問題

1.揹包問題

https://blog.csdn.net/bestrivern/article/details/85232879