dynamic programming ii

30
Dynamic Programming II Michael Tsai 2011/3/25

Upload: aelwen

Post on 23-Feb-2016

37 views

Category:

Documents


0 download

DESCRIPTION

Dynamic Programming II. Michael Tsai 2011/3/25. 上課 !. 假如我們有點記性的話 …. 空間換取時間 做過的事情就不要再 做 “ 記得結果 ” 就好 : 填表與查表 Dynamic programming: 這裡 的 programming 指填表 , 不是寫程式 當 所有不同的 subprogram 數目是 polynomial, 及 解掉 subprogram 的時間也是 polynomial, dynamic programming 方法可以在 polynomial time 內完成. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Dynamic Programming  II

Dynamic Programming IIMichael Tsai2011/3/25

Page 2: Dynamic Programming  II

2

上課 !

Page 3: Dynamic Programming  II

3

假如我們有點記性的話… 空間換取時間 做過的事情就不要再做 “ 記得結果”就好 : 填表與查表 Dynamic programming: 這裡的

programming 指填表 , 不是寫程式 當

所有不同的 subprogram 數目是polynomial, 及

解掉 subprogram 的時間也是polynomial,

dynamic programming 方法可以在polynomial time 內完成

Page 4: Dynamic Programming  II

4

Dynamic programming 的做法 Top-down with memoization

還是用遞迴的方式來做 但是每次做之前就先檢查是不是做過一樣的 如果沒做過就遞迴下去 , 但是要記錄結果 如果做過就用查表取得之前的結果

Bottom-up method 把所有的 subprogram 從小排到大 然後從小排到大來解 解一個 subproblem 時候 , 所有它所需要的

subsubproblem 都已經被解完了 請問哪一個快 ? 課本 p.365 有答案 .

Page 5: Dynamic Programming  II

5

Cut-Rod v0.1 beta (Top-down)

Memoized_Cut_Rod(p,n)let r[0..n] be a new arrayfor i=0 to nr[i]=-return Memoized_Cut_Rod_Aux(p,n,r)

Memoized_Cut_Rod_Aux(p,n,r)if return r[n]if n==0q=0else q=-for i=1 to nq=max(q,p[i]+Memoized_Cut_Rod_Aux(p,n-i,r))r[n]=qreturn q

Page 6: Dynamic Programming  II

6

Cut-Rod v0.1 gamma (Bottom-up)Bottom_Up_Cut_Rod(p,n)let r[0..n] be a new arrayr[0]=0for j=1 to n

q=-for i=1 to j

q=max(q,p[i]+r[j-i])r[j]=q

return r[n]Θ (𝑛2 )

Page 7: Dynamic Programming  II

7

Subproblem graphs

4

3

2 1 001

0

0

2 1 001

0

0

4

3

2

1

0Bottom-up method: Reverse Topological Sort

Subproblem x 必須要考慮subproblem 之 optimal solution <x,y>

Top-down method: Depth First Search

Page 8: Dynamic Programming  II

8

Subproblem graphs Subproblem graph 的大小讓我們可以估計

dynamic programming 演算法的執行時間 大小 ? 我們指和 . = 有幾個要解的 subproblem ( 因為有記結果 ,

所以一個 subproblem 只要做一次 ) = 每個 subproblem 需要幾個比它小的

subproblem 的結果 大致的估計 : 和和成線性

Page 9: Dynamic Programming  II

9

最後的小問題 剛剛的程式只把可以拿多少錢算出來 沒有真的印出要怎麼切 如何解決 ? 用另外一個陣列 ( 大小 ) 紀錄 optimal

solution 應該切的大小 . 最後依序印出結果即可 . 課本 p. 369 有解答 .

Page 10: Dynamic Programming  II

10

連串矩陣相乘問題

Matrix multiplication is associative.

以上算出來答案都一樣

𝐴1 𝐴2 𝐴3 𝐴4𝐴𝑛

……

題目 : 求矩陣相乘之解 .

.cols=.rows

and are compatible.

Page 11: Dynamic Programming  II

11

連串矩陣相乘問題Matrix-Multiply(A,B)if A.columns != B.rowserror “incompatible dimensions”else let C be a new A.rows x B.cols matrixfor i=1 to A.rowsfor j=1 to B.cols=0for k=1 to A.cols

return C 主要花費時間在這邊 !

𝐴 𝐵p

q

q

r

共花費 pqr 次乘法的時間

Page 12: Dynamic Programming  II

12

看一個例子

花費之乘法數目 = 花費之乘法數目 = 差十倍 !!

10100 1005

550

Page 13: Dynamic Programming  II

13

連串矩陣相乘問題 - 正式版 給一連串的矩陣 , 其中矩陣的大小為 (, 找出一種乘法可以使計算時的乘法數目最少 沒有真的要算結果 , 而只是找出能最快算出結果的方法 . 因為算”怎麼算比較快”多花的時間 , 比”用爛方法直接算”多花的時間少很多

Page 14: Dynamic Programming  II

14

暴力法有多暴力 全部到底有幾種算法呢 ? 用遞迴定義 :

上學期有講過喔 ~ P(n) 之解為 Catalan numbers, , or is also

神父 , 我有罪 .

𝑃 (𝑛)={ 1

∑𝑘=1

𝑛− 1

𝑃 (𝑘 ) 𝑃 (𝑛−𝑘)

if

if .

假設先這樣分 :

Page 15: Dynamic Programming  II

15

所以不耍暴力了 . 使用 dynamic programming 正規步驟 :1. 找出最佳解的”結構”2. 使用遞迴來定義最佳解的花費3. 計算最佳解的花費4. 使用已經計算的資訊來構築最佳解

Page 16: Dynamic Programming  II

16

找出最佳解的”結構”

總花費 = 的花費 + 的花費 + 把和乘起來的花費 最佳解的結構 : 假設有的最佳解 , 此一方法為在 k 切一刀 .

則在此最佳解中 , 的相乘方法一定是的最佳相乘方法 假設不是最佳解 , 則我們可以在中把換成更好的方法 , 則可以找到一個更好的的相乘方法矛盾 . 子問題的最佳解可以導出大問題的最佳解 ! 最後結論 : 分成兩個子問題 , 並嘗試所有可以切分的地方

(k 值 )

𝐴𝑖 𝐴𝑖+1… 𝐴𝑘 𝐴𝑘+1 𝐴𝑘+2… 𝐴 𝑗

𝑖≤ 𝑗

𝑖≤𝑘< 𝑗

在 k 切一刀

Page 17: Dynamic Programming  II

17

使用遞迴來定義最佳解的花費 遞迴定義 : 使用子問題最佳解的 cost 來定義大問題最佳解的 cost 定義 : 為所需花的最少乘法數 所花乘法數 =

𝐴𝑖 ..𝑘 𝐴𝑘+1. . 𝑗.rows=.cols=

.rows=

.cols=

Page 18: Dynamic Programming  II

18

使用遞迴來定義最佳解的花費 但是我們不知道最佳解中的 k 的值 因此我們必須找所有 最後版本 :

𝑚 [ 𝑖 , 𝑗 ]={ 0min𝑖 ≤𝑘< 𝑗

{𝑚 [ 𝑖 ,𝑘 ]+𝑚 [𝑘+1, 𝑗 ]+𝑝𝑖−1𝑝𝑘𝑝 𝑗 }if if .

Page 19: Dynamic Programming  II

19

計算最佳解的花費 純 recursive 解法 : exponential time 使用前面教的 Bottom-up 填表方法 : 每個不同的 subprogram 僅需解 1 次 有幾個不同的問題 ? , 幾個 i 和 j 的組合 ? 答案 :

𝑖≠ 𝑗 𝑖= 𝑗

Page 20: Dynamic Programming  II

20

計算最佳解的花費 如何決定填表的順序呢 ? ( 這次有 i,j 兩個變數 )𝑚 [ 𝑖 , 𝑗 ]={ 0

min𝑖 ≤𝑘< 𝑗

{𝑚 [ 𝑖 ,𝑘 ]+𝑚 [𝑘+1, 𝑗 ]+𝑝𝑖−1𝑝𝑘𝑝 𝑗 }if if .

個矩陣相乘 個矩陣相乘都小於個

我們可以把 j-i+1( 也就是要相乘的 matrix 個數 )當作 problem size 的定義

Page 21: Dynamic Programming  II

21計算最佳解的花費n=p.length-1let m[1..n,1..n] and s[1..n-1,2..n] be new tablesfor i=1 to nm[i,i]=0for l=2 to nfor i=1 to n-l+1j=i+l-1m[i,j]=for k=i to j-1q=m[i,k]+m[k+1,j]+if q<m[i,j]m[i,j]=qs[i,j]=kreturn m and s

大 problem 的解只會用到小 problem 的解 . 因此慢慢往上長 .

邊界條件先設好 .

把同樣 problem size 的所有 i,j 組合都依序做過使用遞迴式找出最佳切點 k

Θ(𝑛3)

Page 22: Dynamic Programming  II

22

計算最佳解的花費 用一個例子來 trace code 比較快

MatrixDimension

30 x 35

35 x 15 15 x 5 5 x 10 10 x 20 20 x 25

Page 23: Dynamic Programming  II

23

使用已經計算的資訊來構築最佳解 前面只印出了花費 , 不是真正的解 怎麼乘才是最後的解 使用 s 陣列的資訊

Page 24: Dynamic Programming  II

24

使用已經計算的資訊來構築最佳解Print-Optimal-Parens(s,i,j)if i==jprint elseprint “(“Print-Optimal-Parens(s,i,s[i,j])Print-Optimal-Parens(s,s[i,j]+1,j)print “)”

Page 25: Dynamic Programming  II

25

看了兩個例子以後… 問 : 一個問題要有什麼要件才能使用

dynamic programming? 答 :1. Optimal substructure2. Overlapping Subproblems

Page 26: Dynamic Programming  II

26什麼是 Optimal substructure?

Definition: A problem exhibits optimal substructure if an optimal solution to the problem contains within it optimal solutions to subproblems.

怎麼尋找 optimal substructure 呢 ?

Page 27: Dynamic Programming  II

27

怎麼尋找 optimal substructure 呢 ?1. 要得到問題的解答有許多選擇 ( 砍在哪邊 , 切在哪邊 ), 而做這個選擇之後 , 我們有一些

subproblem 要解決 .2. 我們假設對於一個問題 , 我們可以找到那個選擇3. 知道這個選擇以後 , 我們找出哪個

subproblem 可以被拿來應用 , 及剩下的問題( 沒有對應到 subproblem 的 ) 怎麼解決

4. 證明大問題的最佳解中可以直接應用 ( 剪下貼上 ) 子問題的最佳解 .

Page 28: Dynamic Programming  II

28

Optimal structure越簡單越好=? =?

𝑝𝑖 =?

這一段砍下來就不再砍成更小的了 ( 拿去賣 ) 這一段是 subprogram, 找遞迴朋友去解

versus

Page 29: Dynamic Programming  II

29

Optimal structure越簡單越好

𝐴1𝐴𝑖+1… 𝐴𝑘 𝐴𝑘+1 𝐴𝑘+2… 𝐴 𝑗

1≤ 𝑗

1≤𝑘< 𝑗

在 k 切一刀

假設把問題定義成就好 ( 少一個變數 )

此為一個子問題 此不為一個子問題 !

除非 k 一直都是 j-1, 否則…

Page 30: Dynamic Programming  II

30

Optimal substructure 的變化1. 原始問題的最佳解用了多少個子問題2. 大問題有多少選擇 ( 選擇用不同的子問題們來獲得最佳解 )大略來說 , 以上兩者決定 dynamic programming algorithm 的執行時間 .( 之前說的 Subproblem graphs 是另外一種算法 )

多少個子問題 有多少選擇 執行時間鐵條資源回收 n連串矩陣相乘 n-1