演算法_第三章 貪婪演算法.ppt

Download Report

Transcript 演算法_第三章 貪婪演算法.ppt

貪婪演算法
3
2016/8/7
演算法 _ 第三章
1
最佳化問題

每一個最佳化問題都包含一組限制條件
以及一個最佳化函數

滿足這些限制條件的解稱為可行解或候
選解

其中使得最佳化函數得到最佳值的可行
解稱為最佳解
2016/8/7
演算法 _ 第三章
3-2
找錢幣問題

假設有一個小女孩要買14塊錢的糖果,
她給了店員一張100塊錢的鈔票

假設收銀機裡提供足夠的50塊、20塊、
10塊、5塊、1塊的硬幣,而且店員想用
最少數量的硬幣來找錢

店員該找給小女孩哪些硬幣各多少個?
2016/8/7
演算法 _ 第三章
3-3
找錢幣問題

限制條件是只能使用50塊、20塊、10塊、5塊、
1塊共五種硬幣

利用這五種硬幣的組合必須產生總共10014 =
86塊

可行解包括:{20, 20, 20, 20, 5, 1}, {50, 10, 10,
10, 1, 1, 1, 1, 1, 1}, {50, 20, 10, 5, 1}, 。

硬幣數目最少的組合,{50,20,10,5,1}
2016/8/7
演算法 _ 第三章
3-4
找錢幣問題

店員必須做出好幾次的決定,每次的決
定都加進一個硬幣

加進一個硬幣的貪婪原則是:每一次所
加進的硬幣金額越大越好,但是不能讓
總金額超過該找錢的金額

如果每一次我們都選擇最佳決定,而這
些決定也將導致最後的最佳解,那麼這
個最佳化問題就可以用貪婪法來解
2016/8/7
演算法 _ 第三章
3-5
最短路徑
166
96
90
高雄左營
台北汐止
208
國道 1 號
2016/8/7
彰
化
系
統
100
新
竹
系
統
89
國道 3 號
演算法 _ 第三章
3-6
最小花費生成樹

給定一個加權的無向圖,我們定義它的
生成樹之花費是在該生成樹上所有邊的
花費(加權值)總和

最小花費生成樹是所有生成樹中花費最
少的一棵。
2016/8/7
演算法 _ 第三章
3-7
Kruskal 演算法

最壞情況複雜度是 O(e log e)
2016/8/7
演算法 _ 第三章
3-8
Kruskal 演算法
1 12
2
35
25
6
18
15
2016/8/7
24
3
7
22 32
5
10 4
演算法 _ 第三章
3-9
Kruskal 演算法
1
2
6
7
3
5
4
2016/8/7
演算法 _ 第三章
3-10
Kruskal 演算法
1
2
6
7
3
5
10 4
2016/8/7
演算法 _ 第三章
3-11
Kruskal 演算法
1 12
2
6
7
3
5
10 4
2016/8/7
演算法 _ 第三章
3-12
Kruskal 演算法
1 12
2
6
15
2016/8/7
7
3
5
10 4
演算法 _ 第三章
3-13
Kruskal 演算法
1 12
2
6
18
15
2016/8/7
7
3
5
10 4
演算法 _ 第三章
3-14
Kruskal 演算法
1 12
2
24
6
18
15
2016/8/7
7
3
5
10 4
演算法 _ 第三章
3-15
Kruskal 演算法
1 12
2
25
6
18
15
2016/8/7
7
24
3
5
10 4
演算法 _ 第三章
3-16
Prim 演算法

最壞情況複雜度是 O(n2)
2016/8/7
演算法 _ 第三章
3-17
Prim 演算法
1
2
6
7
3
5
4
2016/8/7
演算法 _ 第三章
3-18
Prim 演算法
1 12
2
6
7
3
5
4
2016/8/7
演算法 _ 第三章
3-19
Prim 演算法
1 12
2
24
6
7
3
5
4
2016/8/7
演算法 _ 第三章
3-20
Prim 演算法
1 12
2
25
6
7
24
3
5
4
2016/8/7
演算法 _ 第三章
3-21
Prim 演算法
1 12
2
25
6
18
7
24
3
5
4
2016/8/7
演算法 _ 第三章
3-22
Prim 演算法
1 12
2
25
6
18
7
24
3
5
10 4
2016/8/7
演算法 _ 第三章
3-23
Prim 演算法
1 12
2
25
6
18
15
2016/8/7
7
24
3
5
10 4
演算法 _ 第三章
3-24
Sollin 演算法

在每一個階段中,我們替樹林裡的每一
棵樹選出一個邊

這個邊的花費最小,而且恰好有一個頂
點是在該樹中

當圖中有好幾個花費相同的邊時,兩棵
樹可能會選出兩個不同的邊來彼此相連

2016/8/7
這兩個花費相同的邊只有一個需要留下來
演算法 _ 第三章
3-25
Sollin 演算法
1
2
6
7
3
5
4
2016/8/7
演算法 _ 第三章
3-26
Sollin 演算法
1 12
2
25
6
18
15
2016/8/7
7
24
3
5
10 4
演算法 _ 第三章
3-27
Sollin 演算法
1 12
2
25
6
18
15
2016/8/7
7
24
3
5
10 4
演算法 _ 第三章
3-28
單一起點之最短路徑
2
15
路徑
20
4
4
6
40
1
10
2
14
30
3
5
15
10
7
12
(a) 圖
2016/8/7
1)
2)
3)
4)
5)
1, 3
1, 3, 2
1, 3, 5
1, 3, 5, 4
1, 3, 5, 6
長度
2
12
14
28
29
(b) 從 1 出發的最短路徑
演算法 _ 第三章
3-29
單一起點之最短路徑

令 S 表示已經找到最短路徑的頂點所成
的集合

對於一個不在 S 內的頂點 w,令 dist[w]
為一條從 v 開始,只經過在 S 裡的頂點,
再到終點 w 的最短路徑之長度
2016/8/7
演算法 _ 第三章
3-30
單一起點之最短路徑

如果路徑是按照長度的遞增順序來產生,那麼
我們觀察到:



2016/8/7
如果下一條找到的最短路徑是到頂點 u,那麼這條
路徑必然是從 v 開始、以 u 為終點、而且只路過在
S 內的頂點
下一條所產生的路徑之終點 u 必須是所有不在 S 內
的頂點中 dist 最小的一個
如果 dist[w] 變小的話,那麼這個改變是由於 v 到 u
再到 w 的這條路徑的緣故,其中這條路徑的長度是
dist[u] + length(<u, w>)
演算法 _ 第三章
3-31
單一起點之最短路徑
2016/8/7
演算法 _ 第三章
3-32
length[i, j] = the edge cost between node i and j,
dist[i] = the sum of cost between start node v and node i;
i.e. dist[i] = length[v, a1] + … + length[am, i]

1. Using the greedy method, select an
unprocessed node u. Set the node u processed.

2. For each unprocessed node w, test whether
dist[w] > dist[u] + length[u,w].


If true, dist[w] = dist[u] + length[u,w].
3. Goto step 1 if any unprocessed node exists.
2016/8/7
演算法 _ 第三章
3-33
單一起點之最短路徑

時間複雜度是 O(n2)
2016/8/7
演算法 _ 第三章
3-34
單一起點之最短路徑
[3]
距離
[4]
[5]
[6]
[7]
15
2
∞
∞
∞
∞
∞
12
2
42
14
∞
∞
2
∞
12
2
32
14
∞
∞
3
5
∞
12
2
28
14
29
∞
4
4
∞
12
2
28
14
29
∞
5
6
∞
12
2
28
14
29
∞
疊代
次數
選擇的
頂點
[1]
[2]
----
∞
1
3
2
初始
2016/8/7
演算法 _ 第三章
3-35
凸面體
2016/8/7
演算法 _ 第三章
3-36
凸面體

給定平面上的點,我們所將求出凸面體
端點

這些端點依序連起來構成一個把所有的
點都包圍在內的最小凸多邊形-凸面體
2016/8/7
演算法 _ 第三章
3-37
凸面體
:輸入點
(a)
2016/8/7
:端點
(b)
演算法 _ 第三章
3-38
凸面體
決定各點的處理先後順序
2016/8/7
演算法 _ 第三章
3-39
凸面體
4
5
3
6

1
2016/8/7
4
5
3

6
2
2
1
保留
演算法 _ 第三章
去除
3-40
凸面體
P
2016/8/7
演算法 _ 第三章
3-41
凸面體
5
2
8
4
6
3
7
1
9
P
10
2016/8/7
演算法 _ 第三章
3-42
凸面體
5
2
8
6
4
3
7
1
9
10
2016/8/7
演算法 _ 第三章
3-43
凸面體
5
2
8
4
6
3
7
1
9
10
2016/8/7
演算法 _ 第三章
3-44
凸面體
5
2
8
4
6
3
7
9
10
2016/8/7
演算法 _ 第三章
3-45
凸面體
5
2
8
6
4
3
7
1
9
10
2016/8/7
演算法 _ 第三章
3-46
凸面體
5
2
8
4
6
3
7
1
9
10
2016/8/7
演算法 _ 第三章
3-47
凸面體
5
2
8
4
6
3
7
1
9
10
2016/8/7
演算法 _ 第三章
3-48
凸面體
5
2
8
6
4
3
7
1
9
10
2016/8/7
演算法 _ 第三章
3-49
凸面體
5
2
8
4
6
3
7
1
9
10
2016/8/7
演算法 _ 第三章
3-50
凸面體
5
2
8
4
6
3
7
1
9
10
2016/8/7
演算法 _ 第三章
3-51
凸面體
5
2
8
4
6
3
7
1
9
10
2016/8/7
演算法 _ 第三章
3-52
凸面體

複雜度為 O(n log n)
2016/8/7
演算法 _ 第三章
3-53
霍夫曼編碼

多序列的合併問題
2016/8/7
演算法 _ 第三章
3-54
霍夫曼編碼

加權外部路徑長度

對於圖 3.12 中的兩棵樹,它們的加權外
部路徑長度分別是:
73 + 93 + 272 + 351 = 137

以及
72 + 92 + 272 + 352 = 156
2016/8/7
演算法 _ 第三章
3-55
霍夫曼編碼

圖3.12的兩棵合併樹分別需要
(161) + (431) + (781) = 1373 = 134
以及
(161) + (621) + (781) = 1563 = 153
次的比較運算
2016/8/7
演算法 _ 第三章
3-56
霍夫曼編碼
演算法 3.5 Huffman_Coding
輸入:(s1, q1), …, (sn, qn)
輸出:s1, …, sn 的霍夫曼碼
步驟 1:將 (s1,q1), …, (sn,qn) 根據 q1, …, qn 建成一個最小堆積;
步驟 2:從最小堆積裡取出兩個頻率最小的節點;
步驟 3:為這兩個節點做一個父親節點,它的頻率是這兩個兒子節點
的頻率之和;
步驟 4:將父親節點加入最小堆積中;
步驟 5:由父親節點做到達兩個兒子節點的兩個分支,一支給 0 另一
支給 1;
步驟 6:重覆執行第二步到第五步,直到只剩下一個節點,此為樹根。
2016/8/7
演算法 _ 第三章
3-57
霍夫曼編碼
B
0
7
B
100
C
101
D
110
E
111
13
C
1
0
0
13
C 6
0
A 15
A 15
B 7
A
6
0
39
1
24
D 6
0
D
6
0
11
E 5
2016/8/7
1
1
1
11
E
5
1
演算法 _ 第三章
3-58
霍夫曼編碼

演算法的時間複雜度為 O(n) + O(n log n)
= O(n log n)
2016/8/7
演算法 _ 第三章
3-59
打包問題

給定的 n 項物品,每一項物品 I 有其重
量 wi 以及價值 pi。

這個問題要求我們,在總重量小於等於
C 的前提下,選出來要搬走的物品之總
價值要最高
2016/8/7
演算法 _ 第三章
3-60
打包問題

這個問題可以公式化如下:
n
最大化  pi xi
i 1

前提是必須滿足下面的限制條件
n
w x
i 1
i i
C
0  xi  1, 1  i  n
2016/8/7
演算法 _ 第三章
3-61
打包問題

我們必須決定出每一個 xi 的值

xi = 1 代表物品 i 整個要搬

xi = 0 代表物品 i 整個不搬

xi = 1/3 代表物品 i 只搬1/3。
2016/8/7
演算法 _ 第三章
3-62
打包問題
1
for i := 1 to n do d[i] := p[i]/w[i]; //計算價值密度
2
for i := 1 to n do {
// 從價值密度最高的物品拿起
3
找出物品 k 是所有剩下物品中價值密度最高的一個,即 d[k]是最大的;
4
if (Cw[k]  0) then {
5
C := Cw[k]; x[k] := 1;
6
total_profit := total_profit + p[k]; d[k] := 0;
7
}
8
else {
9
x[k] :=C/w[k]; total_profit := total_profit + p[k]x[k];
10
return;
11
12
}
}
2016/8/7
演算法 _ 第三章
3-63
打包問題

假設 w = [18, 15, 10], p = [25, 24, 15], C = 20

價值密度是 d = [1.32, 1.6, 1.5]

價值密度最高的是物品 2,它的重量是w[2] = 15  C。因此,物品
2 整個放入背包

我們剩下能負擔的重量是 Cw[2] = 2015 = 5,打包物品 2 所獲得
的利益是 24

在剩下的物品中價值密度最高的是物品 3,它的重量是10,大於
目前的 C = 5。我們因此只打包物品 3 的 5/10 = 1/2,即 x[3] = ½

打包部分物品 2 所獲得的利益是 151/2 = 7.5

因此,我們最後求出的最佳解是:x[1] = 0、x[2] = 1、x[3] = 1/2,
總獲利為 24+7.5 = 31.5
2016/8/7
演算法 _ 第三章
3-64
打包問題

「1.5將物品根據d[i]的大小由大到小排序
過;」

時間複雜度是 O(n log n)
2016/8/7
演算法 _ 第三章
3-65