• 沒有找到結果。

Dynamic Programming I

N/A
N/A
Protected

Academic year: 2022

Share "Dynamic Programming I"

Copied!
42
0
0

加載中.... (立即查看全文)

全文

(1)

Michael Tsai 2011/9/30

(2)

台大資訊鐵條回收公司

長度 1 2 3 4 5 6 7 8 9 10

價錢 1 5 8 9 10 17 17 20 24 30

 回收鐵條, 依長度算錢.

 假設你有一條很長的鐵條, 長度為n (n為正整數)

 可以把長鐵條砍成長度為整數的短鐵條

 請問如何砍才能夠用這條鐵條換到最多錢?

價目表

(3)

長度為4的鐵條

長度 1 2 3 4 5 6 7 8 9 10

價錢 1 5 8 9 10 17 17 20 24 30

價目表

9 1 8

5 5 1 1 1 1

1 1 5 1 5 1 5 1 1

8 1

(4)

長度為n的鐵條

口吐白沫…

(5)

長度為n的鐵條

(6)

定義一些符號

(7)

類divide-and-conquer思維

 “我請我的遞迴朋友們來解大小較小但同樣的問 題”

 “假設我知道比較小的問題答案, 如何得出這個 問題的答案?”

不砍刀 這一刀砍在左邊數過來第i個

最後再看哪個砍法為可得到最大值即為解.

(8)

Optimal Substructure

 Optimal solutions to a problem incorporate

optimal solutions to related subproblems, which we may solve independently.

(9)

稍微調整一下

 把subproblem數目變少一點

這一段砍下來就不再砍

成更小的了(拿去賣) 這一段是subprogram, 找遞迴朋友去解

(10)

Cut-Rod v0.1 alpha

猜猜看, 她會喜歡嗎?

n每增加1, 時間大約x2

(11)

Recursion tree

4

3

2 1 0

1 0 0

0

2 1 0

1 0 0

0

同樣的事情做那麼多遍…浪費時間!

(12)

遞迴式又來拉~

(13)

休息一下-程式設計師常見藉口

 by Santos Liu on Saturday, March 5, 2011 at 1:00am

 第 20 名:這很奇怪喔。

 第 19 名:以前從來不會這樣啊!

 第 18 名:昨天明明會動的啊!

 第 17 名:怎麼可能~

 第 16 名:這一定是機器的問題。

 第 15 名:你到底是打了什麼才讓程式當掉的?

 第 14 名:一定是你的資料有問題。

 第 13 名:我已經好幾個禮拜沒碰那一段程式了。

 第 12 名:你一定是用到舊版了。

 第 11 名:一定是巧合!為什麼這種壞運氣只讓你碰上。

(14)

休息一下-程式設計師常見藉口

 第 10 名:我不可能什麼功能都測試到吧,有 bug 是 正常的!

 第 9 名:這個不可能是那個的原始碼!

 第 8 名:這程式應該是會動的,只是我寫好後還沒 做測試。

 第 7 名:可惡!一定有人改了我的程式。

 第 6 名:你有檢查過你的電腦有沒有病毒嗎?

 第 5 名:儘管這功能還不能動啦,你覺得他如何?

 第 4 名:在你的系統不能用那一個版本的程式啦!

 第 3 名:你幹嘛要那樣操作,都是你的問題。

 第 2 名:程式發生問題時你在哪裡?

 第 1 名:在我的機器明明就可以動啊!

(15)

假如我們有點記性的話…

空間換取時間

做過的事情就不要再做

“記得結果”就好: 填表與查表

Dynamic programming: 這裡的 programming指填表, 不是寫程式

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

解掉subprogram的時間也是 polynomial,

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

(16)

Dynamic programming的做法

 Top-down with memoization

還是用遞迴的方式來做

但是每次做之前就先檢查是不是做過一樣的

如果沒做過就遞迴下去, 但是要記錄結果

如果做過就用查表取得之前的結果

 Bottom-up method

把所有的subprogram從小排到大

然後從小排到大來解

解一個subproblem時候, 所有它所需要的 subsubproblem都已經被解完了

 請問哪一個快?

 課本p.365有答案.

(17)

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

p: 價目表 n: 鐵條長度

p: 價目表 n: 鐵條長度 r: 存最佳解的陣列

(18)

Cut-Rod v0.1 gamma (Bottom-up)

(19)

Subproblem graphs

4

3

2 1 0

1 0 0

0

2 1 0

1 0 0

0

4

3

2 1 0

Bottom-up method: Reverse Topological Sort Subproblem x必須要考慮subproblem之 optimal solution <x,y> directed edge

Top-down method: Depth First Search 看不懂沒關係: Graph在這學

期之後會教! (供之後參考用)

(20)

Subproblem graphs

期之後會教! (供之後參考用)

(21)

最後的小問題

(22)

……

(23)

連串矩陣相乘問題

主要花費時間在這邊!

p q

共花費pqr次乘法的時間

(24)

看一個例子

10

100 100 5

5

50

(25)

連串矩陣相乘問題-正式版

(26)

暴力法有多暴力

(27)

所以不耍暴力了.

 使用dynamic programming

 正規步驟:

1. 找出最佳解的”結構”

2. 使用遞迴來定義最佳解的花費

3. 計算最佳解的花費

4. 使用已經計算的資訊來構築最佳解

(28)

找出最佳解的”結構”

在k切一刀

(29)

使用遞迴來定義最佳解的花費

(30)

使用遞迴來定義最佳解的花費

(31)

計算最佳解的花費

(32)

計算最佳解的花費

 如何決定填表的順序呢? (這次有i,j兩個變數)

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

(33)

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

邊界條件先設好.

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

(34)

計算最佳解的花費

 用一個例子來trace code比較快

Matrix

Dimension 30 x 35 35 x 15 15 x 5 5 x 10 10 x 20 20 x 25

(35)

使用已經計算的資訊來構築最佳 解

 前面只印出了花費, 不是真正的解

 怎麼乘才是最後的解

 使用s陣列的資訊

(36)

使用已經計算的資訊來構築最佳 解

(37)

看了兩個例子以後…

 問: 一個問題要有什麼要件才能使用dynamic programming?

 答:

1. Optimal substructure

2. Overlapping Subproblems

(38)

什麼是Optimal substructure?

 Definition: A problem exhibits

optimal substructure if an

optimal solution to the problem contains within it optimal

solutions to subproblems.

 怎麼尋找optimal substructure呢?

(39)

怎麼尋找optimal substructure呢?

1. 要得到問題的解答有許多選擇(砍在哪邊, 切在哪 邊), 而做這個選擇之後, 我們有一些subproblem要 解決.

2. 我們假設對於一個問題, 我們可以找到那個選擇

3. 知道這個選擇以後, 我們找出哪個subproblem可以 被拿來應用, 及剩下的問題(沒有對應到subproblem 的)怎麼解決

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

(40)

Optimal substructure越簡單越好

這一段砍下來就不再砍

成更小的了(拿去賣) 這一段是subproblem, 找遞迴朋友去解 versus

(41)

Optimal substructure越簡單越好

在k切一刀

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

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

(42)

Optimal substructure的變化

1. 原始問題的最佳解用了多少個子問題

2. 大問題有多少選擇(選擇用不同的子問題們來 獲得最佳解)

大略來說, 以上兩者決定dynamic programming algorithm的執行時間.

(之前說的Subproblem graphs是另外一種算法)

多少個子問題 有多少選擇 執行時間

鐵條資源回收 n

連串矩陣相乘 n-1

參考文獻

相關文件

• 我們通常用 nD/mD 來表示一個狀態 O(N^n) ,轉移 O(N^m) 的 dp 演算法. • 在做每題

• 也就是 ”我的dp是n^3”這句話本身不夠表示你的dp演算法,必須 要說“我的dp是個狀態n^2,轉移n”才夠精確. •

[r]

✓ Express the solution of the original problem in terms of optimal solutions for subproblems. Construct an optimal solution from

[r]

✓ Express the solution of the original problem in terms of optimal solutions for subproblems.. Construct an optimal solution from

• 有一個可以耐重 W 的背包,及 N 種物品,每種物品有各自的重量 w[i] 和價值 v[i] ,且數量為 k[i] 個,求在不超過重量限制的情 況下往背包塞盡量多的東西,總價值最大為多少?.

依賴背包問題 and