• 沒有找到結果。

Greedy Algorithms

N/A
N/A
Protected

Academic year: 2022

Share "Greedy Algorithms"

Copied!
32
0
0

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

全文

(1)

Michael Tsai 2012/10/18

(2)

超級電腦排程問題

需要交給超級電腦的工作若干

每樣工作有選定的開始與結束時間

如何選出一組可以執行的工作(執行時 間不重疊), 使這些工作的數量最大?

時間

4

(3)

問題定義

集合𝑆 = {𝑎1, 𝑎2, … , 𝑎𝑛}

每一個工作𝑎𝑖有開始時間𝑠𝑖及結束時間𝑓𝑖

0 ≤ 𝑠𝑖 < 𝑓𝑖 < ∞

每個工作執行時間為[𝑠𝑖, 𝑓𝑖)

可以選兩個工作, 其中一個工作的結束時間和另 外一個工作的開始時間一樣

當si ≥ fj或𝑠𝑗 ≥ 𝑓𝑖時𝑎𝑖和𝑎𝑗可以被同時選入

工作已經照結束時間排好了:

𝑓1 ≤ 𝑓2 ≤ 𝑓3 ≤ ⋯ ≤ 𝑓𝑛−1 ≤ 𝑓𝑛

𝑠𝑖 𝑓𝑖 𝑠𝑗 𝑓𝑗

𝑎𝑖 𝑎𝑗

(4)

先請出神聖的dynamic programming 尚方寶劍

定義子問題:

𝑆𝑖𝑗為𝑎𝑖完成後,𝑎𝑗開始前的所有工作集合

要找出𝑆𝑖𝑗中的最大可執行集合, 假設其中包含𝑎𝑘

所以假設𝐴𝑖𝑗為𝑆𝑖𝑗的最佳解, 則 𝐴𝑖𝑗 = 𝐴𝑖𝑘 + 𝐴𝑘𝑗 + 1

S𝑖𝑗

S𝑖𝑘 𝑎𝑘 S𝑘𝑗

(5)

Dynamic programming 尚方寶劍

Optimal Substructure:

證明𝐴𝑖𝑗中包含S𝑖𝑘與𝑆𝑘𝑗的最佳解(即欲證明𝐴𝑖𝑘為𝑆𝑖𝑘之 最佳解, 或𝐴𝑘𝑗為𝑆𝑘𝑗之最佳解)

S𝑖𝑘 𝑎𝑘 S𝑘𝑗

𝐴𝑖𝑗 𝐴𝑖𝑘

𝑆𝑖𝑗最佳解 𝑆𝑖𝑘最佳解?

(6)

Optimal Substructure

假設𝐴𝑖𝑘不是𝑆𝑖𝑘的最佳解, 則表示有一𝐴𝑖𝑘 使 𝐴𝑖𝑘 > 𝐴𝑖𝑘

但如果這樣

則此解之工作數目為 𝐴𝑖𝑘 + 1 + 𝐴𝑘𝑗 > 𝐴𝑖𝑘 + 1 + 𝐴𝑘𝑗 = 𝐴𝑖𝑗 , 表示𝐴𝑖𝑗不是最佳解 (矛盾)

因此𝐴𝑖𝑘為𝑆𝑖𝑘的最佳解

S𝑖𝑘 𝑎𝑘 S𝑘𝑗

𝐴𝑖𝑗 𝐴𝑖𝑘

𝑆𝑖𝑗最佳解 𝑆𝑖𝑘最佳解?

𝐴𝑖𝑗 𝐴𝑖𝑘

有Optimal substructure, 可以用DP解!

(7)

𝑐[𝑖, 𝑗]代表𝑆𝑖𝑗最佳解的工作數目

則𝑐 𝑖, 𝑗 = 𝑐 𝑖, 𝑘 + 1 + 𝑐[𝑘, 𝑗]

k是我們的選擇 (不知道選哪一個)

𝑐 𝑖, 𝑗 = 0

𝑎max𝑘𝜖𝑆𝑖𝑗 𝑐 𝑖, 𝑘 + 1 + 𝑐 𝑘, 𝑗

接著使用top-down or bottom-up方法填表即可

if 𝑆𝑖𝑗 = ∅ if 𝑆𝑖𝑗 ≠ ∅

等等, 我們需要用到尚方寶劍嗎?

如果我們可以證明我們知道呢?

(8)

Greedy Algorithm

某些問題, 我們可以知道怎麼做選擇!

此稱為greedy choice

如果greedy choice為optimal choice, 再加上

optimal substructure, 我們就可以非常快速的得 到解!

Greedy choice

𝑆𝑖𝑗

S𝑖𝑘 𝑎𝑔 S𝑘𝑗

不需要考慮所有𝑎𝑘的選擇!

只需要直接解選擇𝑎𝑔之後的subproblem!

(9)

怎麼做出選擇? (創造力)

每次都選最早開始的工作

每次都選花最少時間的工作

每次都選跟其他最少衝突的工作

1

2 3

反例

反例

反例

(10)

Greedy choice

正確的greedy choice(之一): 選最早結束的.

原因: 越早結束, 後面就越多時間讓其他工作執行.

因為原本已經照𝑓𝑖排序好了, 每次我們都選𝑎1

接下來只需考慮𝑎1結束以後才開始的所有工作

因為其他𝑎𝑖的結束時間𝑓𝑖 ≥ 𝑓1, 𝑠𝑖要大於𝑓1才不會重疊.

𝑎1 𝑓1 𝑠𝑖

𝑎𝑖

𝑓𝑖

(11)

證明greedy choice是正確的!

定理: 在某subproblem 𝑆𝑘中𝑎𝑚的完成時間最早, 則𝑆𝑘的某些最佳解(如果有很多個)中一定有𝑎𝑚

證明: 假設𝐴𝑘是𝑆𝑘的某個最佳解, A𝑘裡面完成時 間最早的是𝑎𝑗.

1. 如果𝑎𝑗就是𝑎𝑚, 則得證.

2. 如果𝑎𝑗不是𝑎𝑚, 則

所以可以把𝐴𝑘中的𝑎𝑗換成𝑎𝑚.

更換後工作數目不變, 和𝐴𝑘一樣多, 因此為另 外一個最佳解, 得證.

𝑎𝑗

𝑎𝑚 其他的

(12)

結論: 有時候並不需要DP!

DP可以用, 但是慢很多. (殺雞不用尚方寶劍)

Greedy algorithm通常使用top-down 的方法:

1. 根據目前知道的事情選出最好的選擇

2. 繼續解用了這個選擇之後的subproblem

3. 重複以上一直到subproblem可以直接解掉

重點: 請確定(要證明)greedy choice一定會出現 在最佳解裡面!!!

(13)

來個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)

(14)

來個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

Θ(𝑛)

(15)

什麼問題可以使用greedy algorithm來解?

1. 如果做出一個choice之後, 可以找到剩下要解 的單一個subproblem (定義好subproblem)

2. 有greedy property. (必須證明最佳解裡面一定 有greedy choice)

3. 有optimal substructure (必須證明大問題的最 佳解裡面有小問題的最佳解)

1.999. 決定要怎麼做greedy choice.

(16)

0-1背包問題

某店面有n個物品 item1, item2, … , itemn

各價值 𝑣1, 𝑣2, … , 𝑣𝑛 , 各重 𝑤1, 𝑤2, … , 𝑤𝑛

小偷有一個可以裝W這麼重的背包

請問要偷走哪些東西可以使小偷拿走的東西總 價值最高?

(17)

fractional背包問題

某店面有n個物品 item1, item2, … , itemn

各價值 𝑣1, 𝑣2, … , 𝑣𝑛 , 各重 𝑤1, 𝑤2, … , 𝑤𝑛

小偷有一個可以裝W這麼重的背包

可以拿走”部分物品” (切物品的一部分)

請問要偷走哪些東西可以使小偷拿走的東西總 價值最高?

(18)

背包問題的optimal substructure

𝑖𝑡𝑒𝑚𝑗 不比W重的最佳解

拿掉𝑖𝑡𝑒𝑚𝑗

此為不比W-𝑤𝑗重,

使用除了𝑖𝑡𝑒𝑚𝑗外的物品的最佳解 定理:

證明: (適用於0-1 & fractional 背包問題) 1. 假設右邊的不是最佳解的話,

2. 則可以找到一最佳解, 價值更高且不比W-𝑤𝑗重.

3. 此解加上𝑖𝑡𝑒𝑚𝑗以後也還沒有超過W,

4. 而且此解加上𝑣𝑗後總價值比左邊的價值還高 (矛盾)

(19)

choice

把物品按照單位重量的價值來排序 (也就是𝑤𝑣𝑖

𝑖)

1. 選出單位重量價值最高的(greedy choice).

2. 如果可用重量(W)比物品重量𝑤𝑖小, 則把背包填滿, 把 物品多餘的部分捨棄.

3. 如果可用重量比物品重量𝑤𝑖大, 則繼續解子問題: 可用 重量剩下W- 𝑤𝑖, 把已放入的物品從物品集合中去除.

(20)

證明fractional背包問題有 greedy property

其實就是要證明, (某些)最佳解裡面有greedy choice

通常使用的方法:

1. 假設可以拿到最佳解.

2. 最佳解裡面如果已經有greedy choice的話, 則得證.

3. 最佳解裡面如果沒有greedy choice的話, 則想辦法 把最佳解裡面的一些東西和greedy choice互換. 結 果發現這個新解跟greedy choice一樣好 (也是一個 最佳解) 或者發現這個新解更好 (矛盾, 所以最佳解 裡面不可能沒有greedy choice)

(21)

證明fractional背包問題有 greedy property

1. 假設可以拿到可用重量為W最佳解. 假設𝑖𝑡𝑒𝑚𝑗 單位重量價值最高者(或其中之一).

2. 如果𝑊 ≤ 𝑤𝑗, 則將最佳解之所有東西都換成𝑖𝑡𝑒𝑚𝑗.

3. 如果𝑊 > 𝑤𝑗, 則將最佳解中的物品按照單位重量 價值排序,取其中重𝑤𝑗之最高價值物品(可能包含 部分𝑖𝑡𝑒𝑚𝑗)與剩餘之𝑖𝑡𝑒𝑚𝑗交換.

4. 因為𝑖𝑡𝑒𝑚𝑗為單位重量價值最高者, 因此作了以上 交換以後得到之解, 總價值只可能上升或相等. 但 原來已經為最佳解, 因此總價值只可能相等

5. 交換過後的解也是最佳解

因此至少很多種最佳解中其中幾種裡面有 greedy choice.

(22)

此一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不是 正確的!

因為如果有空間沒有用到, 就 會使單位重量的價值下降!!

(23)

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%

(24)

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

(25)

如何產生最佳的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

(26)

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

(27)

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: 𝑂 𝑛

(28)

證明最佳解裡面一定有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中頻率最低的”, 所以𝑥. 𝑓𝑟𝑒𝑞 ≤ 𝑎. 𝑓𝑟𝑒𝑞及𝑦. 𝑓𝑟𝑒𝑞 ≤ 𝑏. 𝑓𝑟𝑒𝑞.

(29)

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’’

(30)

𝐵 𝑇 − 𝐵 𝑇

= 𝑐. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑐 − 𝑐. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇(𝑐)

𝑐∈𝐶

= 𝑥. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑐∈𝐶 𝑇 𝑥 + 𝑎. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑎 −𝑥. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑥 − 𝑎. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑎

= 𝑥. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑥 + 𝑎. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑎 −𝑥. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑎 − 𝑎. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑥

= 𝑎. 𝑓𝑟𝑒𝑞 − 𝑥. 𝑓𝑟𝑒𝑞 𝑑𝑇 𝑎 − 𝑑𝑇 𝑥

≥ 0

類似方法可得到𝐵 𝑇′ − 𝐵 𝑇′′ ≥ 0, 因此𝐵 𝑇 ≥ 𝐵 𝑇′′ . 但因T已為最佳解, 所以只可能𝐵 𝑇 = 𝐵 𝑇′′ , 𝑇′′也是最 佳解 (得證)

y

a b

x y

x b

a

T T’

(31)

substructure

𝐶 𝐶 = 𝐶 − 𝑥, 𝑦 ∪ {𝑧}

z為一新字元, z.freq=x.freq+y.freq

最佳解為T’

z T’

x y

𝐵 𝑇 = 𝐵 𝑇 − 𝑧. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑧 + 𝑥. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑥 + 𝑦. 𝑓𝑟𝑒𝑞 ∙ 𝑑𝑇 𝑦

= 𝐵 𝑇 − (𝑥. 𝑓𝑟𝑒𝑞 + 𝑦. 𝑓𝑟𝑒𝑞) ∙ 𝑑𝑇 𝑧 + 𝑥. 𝑓𝑟𝑒𝑞 ∙ (1 + 𝑑𝑇 𝑧 ) + 𝑦. 𝑓𝑟𝑒𝑞 ∙ 1 + 𝑑𝑇 𝑧

= 𝐵 𝑇 + 𝑥. 𝑓𝑟𝑒𝑞 + 𝑦. 𝑓𝑟𝑒𝑞 T為C之最佳解

(32)

證明題目有optimal substructure

𝐶

𝐶 = 𝐶 − 𝑥, 𝑦 ∪ {𝑧} 最佳解為T’

z T’

T

x y

T為C之最佳解

則有T’’為C 之最佳解 假設不是的話

將x,y替換成z

得到T’’’

B 𝑇′′′ = 𝐵 𝑇′′ − 𝑥. 𝑓𝑟𝑒𝑞 − 𝑦. 𝑓𝑟𝑒𝑞

< 𝐵 𝑇 − 𝑥. 𝑓𝑟𝑒𝑞 − 𝑦. 𝑓𝑟𝑒𝑞

= 𝐵 𝑇 矛盾!

參考文獻

相關文件

Greedy-Choice Property : making locally optimal (greedy) choices leads to a globally optimal

 “Greedy”: always makes the choice that looks best at the moment in the hope that this choice will lead to a globally optimal solution.  When to

★【解析】 這三個圓弧看起來彎 曲度差別很大,但實際它們完全 一樣,只是下面兩個比上面那個

在這一節裡會提到,即使沒辦法解得實際的解函數,我們也 可以利用方程式藉由圖形(方向場)或者數值上的計算(歐拉法) 來得到逼近的解。..

推理論證 批判思辨 探究能力-問題解決 分析與發現 4-3 分析文本、數據等資料以解決問題 探究能力-問題解決 分析與發現 4-4

才有這樣的結果 ( idaṁ hoti ) 。累次有同樣的事實可現觀或驗證,由例 證推理,就可以記說:處於有這一些因緣具足時( imasmiṁ sati ),肯定 有這樣的結果(

最佳解裡面如果沒有greedy choice的話, 則想辦法 把最佳解裡面的一些東西和greedy choice互換. 結 果發現這個新解跟greedy choice一樣好

結 果發現這個新解跟greedy choice一樣好(也是一個 最佳解) 或者發現這個新解更好(矛盾, 所以最佳解