Michael Tsai 2012/10/18
超級電腦排程問題
需要交給超級電腦的工作若干
每樣工作有選定的開始與結束時間
如何選出一組可以執行的工作(執行時 間不重疊), 使這些工作的數量最大?
時間
4
問題定義
集合𝑆 = {𝑎1, 𝑎2, … , 𝑎𝑛}
每一個工作𝑎𝑖有開始時間𝑠𝑖及結束時間𝑓𝑖
0 ≤ 𝑠𝑖 < 𝑓𝑖 < ∞
每個工作執行時間為[𝑠𝑖, 𝑓𝑖)
可以選兩個工作, 其中一個工作的結束時間和另 外一個工作的開始時間一樣
當si ≥ fj或𝑠𝑗 ≥ 𝑓𝑖時𝑎𝑖和𝑎𝑗可以被同時選入
工作已經照結束時間排好了:
𝑓1 ≤ 𝑓2 ≤ 𝑓3 ≤ ⋯ ≤ 𝑓𝑛−1 ≤ 𝑓𝑛
𝑠𝑖 𝑓𝑖 𝑠𝑗 𝑓𝑗
𝑎𝑖 𝑎𝑗
先請出神聖的dynamic programming 尚方寶劍
定義子問題:
𝑆𝑖𝑗為𝑎𝑖完成後,𝑎𝑗開始前的所有工作集合
要找出𝑆𝑖𝑗中的最大可執行集合, 假設其中包含𝑎𝑘
所以假設𝐴𝑖𝑗為𝑆𝑖𝑗的最佳解, 則 𝐴𝑖𝑗 = 𝐴𝑖𝑘 + 𝐴𝑘𝑗 + 1
S𝑖𝑗
S𝑖𝑘 𝑎𝑘 S𝑘𝑗
Dynamic programming 尚方寶劍
Optimal Substructure:
證明𝐴𝑖𝑗中包含S𝑖𝑘與𝑆𝑘𝑗的最佳解(即欲證明𝐴𝑖𝑘為𝑆𝑖𝑘之 最佳解, 或𝐴𝑘𝑗為𝑆𝑘𝑗之最佳解)
S𝑖𝑘 𝑎𝑘 S𝑘𝑗
𝐴𝑖𝑗 𝐴𝑖𝑘
𝑆𝑖𝑗最佳解 𝑆𝑖𝑘最佳解?
Optimal Substructure
假設𝐴𝑖𝑘不是𝑆𝑖𝑘的最佳解, 則表示有一𝐴𝑖𝑘′ 使 𝐴′𝑖𝑘 > 𝐴𝑖𝑘
但如果這樣
則此解之工作數目為 𝐴′𝑖𝑘 + 1 + 𝐴𝑘𝑗 > 𝐴𝑖𝑘 + 1 + 𝐴𝑘𝑗 = 𝐴𝑖𝑗 , 表示𝐴𝑖𝑗不是最佳解 (矛盾)
因此𝐴𝑖𝑘為𝑆𝑖𝑘的最佳解
S𝑖𝑘 𝑎𝑘 S𝑘𝑗
𝐴𝑖𝑗 𝐴𝑖𝑘
𝑆𝑖𝑗最佳解 𝑆𝑖𝑘最佳解?
𝐴𝑖𝑗 𝐴𝑖𝑘′
有Optimal substructure, 可以用DP解!
𝑐[𝑖, 𝑗]代表𝑆𝑖𝑗最佳解的工作數目
則𝑐 𝑖, 𝑗 = 𝑐 𝑖, 𝑘 + 1 + 𝑐[𝑘, 𝑗]
k是我們的選擇 (不知道選哪一個)
𝑐 𝑖, 𝑗 = 0
𝑎max𝑘𝜖𝑆𝑖𝑗 𝑐 𝑖, 𝑘 + 1 + 𝑐 𝑘, 𝑗
接著使用top-down or bottom-up方法填表即可
if 𝑆𝑖𝑗 = ∅ if 𝑆𝑖𝑗 ≠ ∅
等等, 我們需要用到尚方寶劍嗎?
如果我們可以證明我們知道呢?
Greedy Algorithm
某些問題, 我們可以知道怎麼做選擇!
此稱為greedy choice
如果greedy choice為optimal choice, 再加上
optimal substructure, 我們就可以非常快速的得 到解!
Greedy choice
𝑆𝑖𝑗
S𝑖𝑘 𝑎𝑔 S𝑘𝑗
不需要考慮所有𝑎𝑘的選擇!
只需要直接解選擇𝑎𝑔之後的subproblem!
怎麼做出選擇? (創造力)
每次都選最早開始的工作
每次都選花最少時間的工作
每次都選跟其他最少衝突的工作
1
2 3
反例
反例
反例
Greedy choice
正確的greedy choice(之一): 選最早結束的.
原因: 越早結束, 後面就越多時間讓其他工作執行.
因為原本已經照𝑓𝑖排序好了, 每次我們都選𝑎1
接下來只需考慮𝑎1結束以後才開始的所有工作
因為其他𝑎𝑖的結束時間𝑓𝑖 ≥ 𝑓1, 𝑠𝑖要大於𝑓1才不會重疊.
𝑎1 𝑓1 𝑠𝑖
𝑎𝑖
𝑓𝑖
證明greedy choice是正確的!
定理: 在某subproblem 𝑆𝑘中𝑎𝑚的完成時間最早, 則𝑆𝑘的某些最佳解(如果有很多個)中一定有𝑎𝑚
證明: 假設𝐴𝑘是𝑆𝑘的某個最佳解, A𝑘裡面完成時 間最早的是𝑎𝑗.
1. 如果𝑎𝑗就是𝑎𝑚, 則得證.
2. 如果𝑎𝑗不是𝑎𝑚, 則
所以可以把𝐴𝑘中的𝑎𝑗換成𝑎𝑚.
更換後工作數目不變, 和𝐴𝑘一樣多, 因此為另 外一個最佳解, 得證.
𝑎𝑗
𝑎𝑚 其他的
結論: 有時候並不需要DP!
DP可以用, 但是慢很多. (殺雞不用尚方寶劍)
Greedy algorithm通常使用top-down 的方法:
1. 根據目前知道的事情選出最好的選擇
2. 繼續解用了這個選擇之後的subproblem
3. 重複以上一直到subproblem可以直接解掉
重點: 請確定(要證明)greedy choice一定會出現 在最佳解裡面!!!
來個pseudo-code
Recursive_Activity_Selector(s,f,k,n) m=k+1
while m<=n and s[m]<f[k]
m=m+1 if m<=n
return {𝑎𝑚} ∪
Recursive_Activity_Selector(s,f,m,n) else
return ∅
Θ(𝑛) 選完greedy choice以後只剩下
一個recursive call在最後: tail recursive k: 目前要解的subproblem為𝑆𝑘 n: 總共有幾個task (problem size)
來個pseudo-code
Greedy_Activity_Selector(s,f) n=s.length
A={}
k=1
for m=2 to n
if s[m]>=f[k]
A=𝐴 ∪ 𝑎𝑚 k=m
return A
Θ(𝑛)
什麼問題可以使用greedy algorithm來解?
1. 如果做出一個choice之後, 可以找到剩下要解 的單一個subproblem (定義好subproblem)
2. 有greedy property. (必須證明最佳解裡面一定 有greedy choice)
3. 有optimal substructure (必須證明大問題的最 佳解裡面有小問題的最佳解)
1.999. 決定要怎麼做greedy choice.
0-1背包問題
某店面有n個物品 item1, item2, … , itemn
各價值 𝑣1, 𝑣2, … , 𝑣𝑛 , 各重 𝑤1, 𝑤2, … , 𝑤𝑛
小偷有一個可以裝W這麼重的背包
請問要偷走哪些東西可以使小偷拿走的東西總 價值最高?
fractional背包問題
某店面有n個物品 item1, item2, … , itemn
各價值 𝑣1, 𝑣2, … , 𝑣𝑛 , 各重 𝑤1, 𝑤2, … , 𝑤𝑛
小偷有一個可以裝W這麼重的背包
可以拿走”部分物品” (切物品的一部分)
請問要偷走哪些東西可以使小偷拿走的東西總 價值最高?
背包問題的optimal substructure
𝑖𝑡𝑒𝑚𝑗 不比W重的最佳解
拿掉𝑖𝑡𝑒𝑚𝑗
此為不比W-𝑤𝑗重,
使用除了𝑖𝑡𝑒𝑚𝑗外的物品的最佳解 定理:
證明: (適用於0-1 & fractional 背包問題) 1. 假設右邊的不是最佳解的話,
2. 則可以找到一最佳解, 價值更高且不比W-𝑤𝑗重.
3. 此解加上𝑖𝑡𝑒𝑚𝑗以後也還沒有超過W,
4. 而且此解加上𝑣𝑗後總價值比左邊的價值還高 (矛盾)
choice
把物品按照單位重量的價值來排序 (也就是𝑤𝑣𝑖
𝑖)
1. 選出單位重量價值最高的(greedy choice).
2. 如果可用重量(W)比物品重量𝑤𝑖小, 則把背包填滿, 把 物品多餘的部分捨棄.
3. 如果可用重量比物品重量𝑤𝑖大, 則繼續解子問題: 可用 重量剩下W- 𝑤𝑖, 把已放入的物品從物品集合中去除.
證明fractional背包問題有 greedy property
其實就是要證明, (某些)最佳解裡面有greedy choice
通常使用的方法:
1. 假設可以拿到最佳解.
2. 最佳解裡面如果已經有greedy choice的話, 則得證.
3. 最佳解裡面如果沒有greedy choice的話, 則想辦法 把最佳解裡面的一些東西和greedy choice互換. 結 果發現這個新解跟greedy choice一樣好 (也是一個 最佳解) 或者發現這個新解更好 (矛盾, 所以最佳解 裡面不可能沒有greedy choice)
證明fractional背包問題有 greedy property
1. 假設可以拿到可用重量為W最佳解. 假設𝑖𝑡𝑒𝑚𝑗為 單位重量價值最高者(或其中之一).
2. 如果𝑊 ≤ 𝑤𝑗, 則將最佳解之所有東西都換成𝑖𝑡𝑒𝑚𝑗.
3. 如果𝑊 > 𝑤𝑗, 則將最佳解中的物品按照單位重量 價值排序,取其中重𝑤𝑗之最高價值物品(可能包含 部分𝑖𝑡𝑒𝑚𝑗)與剩餘之𝑖𝑡𝑒𝑚𝑗交換.
4. 因為𝑖𝑡𝑒𝑚𝑗為單位重量價值最高者, 因此作了以上 交換以後得到之解, 總價值只可能上升或相等. 但 原來已經為最佳解, 因此總價值只可能相等
5. 交換過後的解也是最佳解
因此至少很多種最佳解中其中幾種裡面有 greedy choice.
此一greedy choice不適用於0-1背包 問題!
反例:
10 20 30
50
$60 $100 $120
$6 $5 $4 單位重
量價值 總價值
50 30 20
50 10 20
$220 $160
50 10 30
$180
最佳解, 但是沒有greedy choice!
注意: 但是這不代表這個問題 一定沒有greedy property! 只 是表示這個greedy choice不是 正確的!
因為如果有空間沒有用到, 就 會使單位重量的價值下降!!
Huffman codes
a b c d e f
出現次數 45k 13k 12k 16k 9k 5k
Fixed- length codeword
000 001 010 011 100 101
Variable- length codeword
0 101 100 111 1101 1100
總共需要224 Kb 總共需要300 Kb
越不常出現的字, codeword應該越長! 再省25%
Prefix code
定義: 某個code中, 沒有任何一個codeword是另 外一個codeword的prefix, 則稱為prefix code.
Encode: “abc””0 101 100”
Decode: “0 101 100””abc”
使用右邊的decoding tree, 走到leaf就解出一個字母
Prefix code就不會有混淆的狀況 產生.
例: a=001 b=00 c=1
那看到001是 “a” or “bc”?
注意: 此非binary search tree!
a
c b d
f e
0 1
0 1
0 1
0 1
0 1
如何產生最佳的code呢?
想要產生一棵decode tree, 使得檔案大小能最小.
檔案大小(cost):
𝐵 𝑇 = 𝑐. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑐
𝑐∈𝐶
Full binary tree
(跟上學期定義不同!):
每個non-leaf node都有兩個children
一個optimal code畫成的decode tree一定是full binary tree.
a
c b d
f e
0 1
0 1
0 1
0 1
0 1
Huffman code
Huffman發明了一種使用greedy algorithm產生 optimal prefix code的方法, 稱為Huffman Code
f:5 e:9 d:16 c:12 b:13 a:45 14
0 1
25
0 1
30
0 1
0 55
1 0 100
1
Pseudo-code
Huffman(C) n=|C|
Q=C
for i=1 to n-1
allocate a new node z z.left=Extract_Min(Q) z.right=Extract_Min(Q)
z.freq=z.left.freq+z.right.freq Insert(Q,z)
return Extract_Min(Q) 在Priority Queue Q插入z: 𝑂 log 𝑛
在Priority Queue Q拿出item:
𝑂 log 𝑛 起始Priority queue: 𝑂 𝑛
證明最佳解裡面一定有greedy choice
定理: 假設所有的字都在集合C裡面. 每個字𝑐 ∈ 𝐶, 出現 的頻率為c.freq. 假設x和y為C中頻率最低的. 則一定有 一組最佳的code是使得x和y的codeword長度一樣且只 有最後一個bit不同.
證明:
1. 假設有T代表任一的最佳code. 在其中假設a 和 b在T中 為depth最大且為sibling的兩個字元. 我們可以假設 𝑎. 𝑓𝑟𝑒𝑞 ≤ 𝑏. 𝑓𝑟𝑒𝑞及𝑥. 𝑓𝑟𝑒𝑞 ≤ 𝑦. 𝑓𝑟𝑒𝑞.
2. 因為” x和y為C中頻率最低的”, 所以𝑥. 𝑓𝑟𝑒𝑞 ≤ 𝑎. 𝑓𝑟𝑒𝑞及𝑦. 𝑓𝑟𝑒𝑞 ≤ 𝑏. 𝑓𝑟𝑒𝑞.
choice
3. 如果x.freq=b.freq, 則
x.freq=a.freq=y.freq=b.freq. 如此的話可以直接 得證 (可以把x和a交換, y和b交換, 則得到另一 optimal code, x和y的codeword長度一樣且只 有最後一個bit不同)
4. 如果𝑥. 𝑓𝑟𝑒𝑞 ≠ 𝑏. 𝑓𝑟𝑒𝑞, 則先將a, x交換(得到T’), 再將y, b交換(得到T’’)
y
a b
x y
x b
a b
x y
a
T T’ T’’
𝐵 𝑇 − 𝐵 𝑇′
= 𝑐. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑐 − 𝑐. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇′(𝑐)
𝑐∈𝐶
= 𝑥. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑐∈𝐶 𝑇 𝑥 + 𝑎. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑎 −𝑥. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇′ 𝑥 − 𝑎. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇′ 𝑎
= 𝑥. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑥 + 𝑎. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑎 −𝑥. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑎 − 𝑎. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑥
= 𝑎. 𝑓𝑟𝑒𝑞 − 𝑥. 𝑓𝑟𝑒𝑞 𝑑𝑇 𝑎 − 𝑑𝑇 𝑥
≥ 0
類似方法可得到𝐵 𝑇′ − 𝐵 𝑇′′ ≥ 0, 因此𝐵 𝑇 ≥ 𝐵 𝑇′′ . 但因T已為最佳解, 所以只可能𝐵 𝑇 = 𝐵 𝑇′′ , 𝑇′′也是最 佳解 (得證)
y
a b
x y
x b
a
T T’
substructure
𝐶 𝐶′ = 𝐶 − 𝑥, 𝑦 ∪ {𝑧}
z為一新字元, z.freq=x.freq+y.freq
最佳解為T’
z T’
x y
𝐵 𝑇 = 𝐵 𝑇′ − 𝑧. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇′ 𝑧 + 𝑥. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑥 + 𝑦. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑦
= 𝐵 𝑇′ − (𝑥. 𝑓𝑟𝑒𝑞 + 𝑦. 𝑓𝑟𝑒𝑞) ∙ 𝑑𝑇′ 𝑧 + 𝑥. 𝑓𝑟𝑒𝑞 ∙ (1 + 𝑑𝑇′ 𝑧 ) + 𝑦. 𝑓𝑟𝑒𝑞 ∙ 1 + 𝑑𝑇′ 𝑧
= 𝐵 𝑇′ + 𝑥. 𝑓𝑟𝑒𝑞 + 𝑦. 𝑓𝑟𝑒𝑞 T為C之最佳解
證明題目有optimal substructure
𝐶
𝐶′ = 𝐶 − 𝑥, 𝑦 ∪ {𝑧} 最佳解為T’
z T’
T
x y
T為C之最佳解
則有T’’為C 之最佳解 假設不是的話
將x,y替換成z
得到T’’’
B 𝑇′′′ = 𝐵 𝑇′′ − 𝑥. 𝑓𝑟𝑒𝑞 − 𝑦. 𝑓𝑟𝑒𝑞
< 𝐵 𝑇 − 𝑥. 𝑓𝑟𝑒𝑞 − 𝑦. 𝑓𝑟𝑒𝑞
= 𝐵 𝑇′ 矛盾!