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

動態規劃(Dynamic Programming)

一個問題想要使用動態規劃來解決,就必須滿足以下條件:

優化原則(最優子結構性質):一個最優決策序列的任何子序列本身,一定是相對於子序列的初始和結束狀態的最優決策序列。

在滿足優化原則的情況下,依賴關係 + 約束條件(+初始條件) -> 目標函式的最值

動態規劃設計要素:

1. 問題建模,優化的目標函式是什麼?約束條件是什麼?
2. 如何劃分子問題(邊界)?

3. 問題的優化函式值與子問題的優化函式值存在著什麼依賴關係?(遞推方程)
4. 是否滿足優化原則?
5. 最小子問題怎樣界定?其優化函式值,即初值等於什麼?

 

動態規劃演算法設計要素


• 多階段決策過程,每步處理一個子問題,界定子問題的邊界
• 列出優化函式的遞推方程及初值
• 問題要滿足優化原則或最優子結構性質,即:一個最優決策序列的任何子序列本身一定是相對於子序列的初始和結束狀態的最優決策序列。

 

投資問題

問題:m 元錢,n項投資, fi (x): 將 x 元投入第 i 個專案的效益。求使得總效益最大的投資方案。

建模:問題的解是向量 < x1, x2, ..., xn >,xi 是投給專案i 的錢數,i =1, 2, ... , n。

         目標函式:max{f1(x1)+f2(x2)+…+fn(xn)}
         約束條件:x1+x2+…+xn = m,xi屬於N

子問題界定:由引數 k 和 x 界定
        k:考慮對專案1, 2, ..., k 的投資
       x:投資總錢數不超過 x

 

揹包問題

 

 

最長公共子序列

 

最短路徑問題

輸入:n個起點,m個終點,若干個中間點,若干條邊。

輸出:一條從起點到終點的最短路徑。

 

 

 

矩陣鏈相乘

問題:設 A1, A2 , … , An 為矩陣序列,Ai 為 Pi-1* Pi 階矩陣,i = 1, 2, … , n. 試確定矩陣的乘法順序,使得元素相乘的總次數最少。
輸入:向量P = < P0, P1, … , Pn >,其中 P0, P1, …, Pn為 n 個矩陣的行數與列數。
輸出:矩陣鏈乘法加括號的位置。

 

矩陣A: i 行 j 列,B:j 行 k 列,A*B:i行k列,總計乘法次數為ijk次。

有n個矩陣,需要加(n-1)個括號來確定運算順序,共有1/n*C(2*(n-1),(n-1))種加括號的方法。

 

 

例項: P = <10, 100, 5, 50>, A1: 10*100,  A2: 100*5, A3: 5*50。
1. (A1A2)A3: 10*100*5+10*5*50 = 7500
2. A1(A2A3): 10*100*50+100*5*50 = 75000
第一種次序計算次數最少.