演算法_第六章 動態規劃.ppt

Download Report

Transcript 演算法_第六章 動態規劃.ppt

動態規劃
6
2016/8/7
演算法 _ 第六章
1
以不含迴圈的有向圖為例
8
A
4
6
4
1
S
D
7
B
T
5
5
2
C
3
1
E
貪婪法不適用!
2016/8/7
演算法 _ 第六章
6-2
以不含迴圈的有向圖為例

dist(S, T) = min{4+dist(A, T), 1+dist(B, T),
2+dist(C, T)}
A
4
1
S
B
d(A,
T
)
d(B, T)
T
T)
,
C
(
d
2
C
2016/8/7
演算法 _ 第六章
6-3
以不含迴圈的有向圖為例

dist(A, T) = 8+dist(D, T) = 8+6 = 14

dist(C, T) = 3+dist(E, T) = 3+1 = 4

dist(B, T) = min{4+dist(A, T), 7+dist(D, T), 5+dist(E, T),
5+dist(C, T)} = min{4+14, 7+6, 5+1,5+4} = min{18, 13, 6,
9} = 6
d
(A, T
A
4
)
D
d(D
,T
)
7
B
T
5
5
C
2016/8/7
d(C,
T)
E
演算法 _ 第六章
,T
E
(
d
)
6-4
以不含迴圈的有向圖為例

有了dist(A, T), dist(B, T), dist(C, T),我們因此
可以算出:
dist(S, T)
= min{4+dist(A, T), 1+dist(B, T), 2+dist(C, T)}
= min{4+14, 1+6, 2+4}
=6
2016/8/7
演算法 _ 第六章
6-5
以不含迴圈的有向圖為例

這種作法實際上解了許多子問題:
{ dist(X, T), X = S, A, B, C, D, E, T}

當我們最後求出 S 到 T 的最短路徑時,
我們實際上也已經求出圖中任一頂點到
T 的最短路徑
2016/8/7
演算法 _ 第六章
6-6
以不含迴圈的有向圖為例

在整個求解的過程中,我們從最小的子
問題開始解決起

利用得到的解再去解決更大的問題

以此類推,直到所有的子問題都解決完
成
2016/8/7
演算法 _ 第六章
6-7
以不含迴圈的有向圖為例

任何有向圖的最短路徑問題都適合用動
態規劃來解?
不是的!
2016/8/7
演算法 _ 第六章
6-8
以不含迴圈的有向圖為例

不含迴圈

線性排列化
5
4
6
1
S
B
4
A
7
8
D
C
3
E
1
T
5
2
2016/8/7
演算法 _ 第六章
6-9
以不含迴圈的有向圖為例

在動態規劃中,我們並不一定真的面對
一個有向圖

大部分的時候是問題本身便隱含著或者
可以表示成一個有向圖

動態規劃一樣可以用來求最長路徑,我
們只需要將 min 函數改成 max 函數即可
2016/8/7
演算法 _ 第六章
6-10
多階圖


Dag 的特例
頂點 V 可以分割成 k  2 個獨立集合 Vi,使得
如果 <u,v>  E 則 u  Vi且 v  Vi+1, 1  i < k

V1=Vk=1

令 S 與 T 分別是 V1 與 Vk 裡的頂點

找出從 S 到 T 的最短(或最長)路徑
2016/8/7
演算法 _ 第六章
6-11
多階圖-四階圖
A
2
9
S
7
3
2
E
4
10
B
F
7
T
C
5
2
D
2016/8/7
9
8
演算法 _ 第六章
G
6-12
多階圖-四階圖—Branch and
Bound
A
A-T: 6 AET
E
2
4
19 AFT
9
B-T: 6 BET
7 BGT
S
7
3
10
B
F
7
9
T
C-T: 16 CFT
2
C
D
2016/8/7
5
2
D-T: 13 DGT
8
演算法 _ 第六章
G
6-13
資源分配的問題


假設我們有 m 個單位的資源要分配到 n
個研究計畫
假設將 j, 0  j  m 個單位的資源分配給
研究計畫 I 將產生 P(i, j) 的產值

這個問題要我們決定分配到各研究計畫
的資源數,以使得整體的產值最大

這個問題可以用一個多階圖來描述
2016/8/7
演算法 _ 第六章
6-14
資源分配的問題
2016/8/7
演算法 _ 第六章
6-15
資源分配的問題

頂點內部的數字對 i,j,
代表已經將總共 j 個
單位的資源分配給前
i 個研究計畫的狀態
1,0
A
1,1
B
1,2
C
1,3
D
0
5
S
10
12
資源分配問題的第一階決定
2016/8/7
演算法 _ 第六章
6-16
資源分配的問題
A
資源分配問題的前兩階決定
0
1,0
3
2,0
E
8
0
1,1
5
S
4
B
C
1,2
D 1,3
2016/8/7
3
2,1 F
4
10
12
0
0
3
0
演算法 _ 第六章
2,2 G
2,3 H
6-17
資源分配的問題
資源分配問題的前三階決定
E
A
0
1,0
3
2,0
8
0
1,1
5
S
12
0
3
4
10
C
1,2
4
I
3,0
8
4
B
0
F
2,1
G
0
3
2,2
J
7
0
4
3,1
7
0
4
K
3,2
H
D 1,3
2016/8/7
0
2,3
演算法 _ 第六章
L
0
3,3
6-18
資源分配的問題
資源分配問題所對應的多階圖
A
E
0
1,0
2,0
3
8
0
1,1
5
S
12
0
3
4
10
C
1,2
4
I
3,0
8
4
B
0
F
2,1
G
0
3
2,2
0
4
3,1
2016/8/7
0
2,3
8
7
0
4
6
3,2
L
0
演算法 _ 第六章
T
K
H
D 1,3
9
J
7
0
3,3
6-19
資源分配的問題

分配給第一個研究計畫 2 個單位的資源

給第二個與三個研究計畫 0 個單位的資
源

以及給第四個研究計畫 1 個單位的資源

總產值是10+0+0+6 = 16
2016/8/7
演算法 _ 第六章
6-20
最長遞增子數列
數列 6, 1, 7, 5, 3, 6, 8, 4 的最長遞增子數列
6
2016/8/7
1
7
5
3
演算法 _ 第六章
6
8
4
6-21
最長遞增子數列

對於任意兩個數字 a[i] 與 a[j], i < j,如果
a[i] < a[j]的話,我們就畫一個從 a[i] 到
a[j] 的有向邊

在這個有向圖裡的最長路徑便是我們要
的最長遞增子數列
2016/8/7
演算法 _ 第六章
6-22
最長遞增子數列
6
2016/8/7
1
7
5
3
演算法 _ 第六章
6
8
4
6-23
最長遞增子數列

起點不一定是第一個頂點、終點也不一定是最
後一個頂點

為了讓這兩個圖更一致,我們令所有在上圖裡
的邊都有一個加權值 1,最後並且再加上一個
起點 S 與一個終點 T

其中起點 S 有 n 個邊,分別射向 a[1], a[2], …, a[n]

而所有 a[1], a[2], …, a[n] 也都各增加一個邊射向 T
2016/8/7
演算法 _ 第六章
6-24
最長遞增子數列
這些邊的加權值都是1
所有頂點有一
個邊連到此
到所有頂點
S
6
1
7
5
3
6
這些邊的加權值都是0
2016/8/7
8
4
T
這些邊的加權值都是0
演算法 _ 第六章
6-25
最長遞增子數列

求 S 到 T 的最長路徑

一旦求出最長遞增子數列的長度,要求
出擁有這個長度的最長遞增子數列只是
一些附帶的工作而已
2016/8/7
演算法 _ 第六章
6-26
最長共同子序列

將字串視為是一個由字元所組成的序列

給定一個字串 X,刪除 X 裡的某些字元
後所得到的子字串稱為 X 的子序列

例如,字串 “loris” 是 “algorithms” 的
子序列
2016/8/7
演算法 _ 第六章
6-27
最長共同子序列

如果 Z 同時是字串 X 與 Y 的子序列,則
我們稱 Z 是 X 與 Y 的共同子序列

例如,字串 “loris” 是 “algorithms” 與
“glorious” 的共同子序列
2016/8/7
演算法 _ 第六章
6-28
最長共同子序列

兩個字串 X 與 Y 的共同子序列有很多個,這些
共同子序列中長度最長的就稱為最長共同子序
列(LCS)

例如,字串 “ris”、“lois”、“ori”、“lis”、
“ors”、“lori”、“goris”、以及 “loris” 等都
是 “algorithms” 與 “glorious” 的共同子序列

但是只有 “goris” 與 “loris” 是它們的LCS
2016/8/7
演算法 _ 第六章
6-29
最長共同子序列

很顯然地,LCS不一定是唯一的

我們這個例子就有兩個LCS。
2016/8/7
演算法 _ 第六章
6-30
最長共同子序列

給定一個字串 X = x1x2....xm,我們定義 X
的第 i 個字首為 Xi = x1x2....xi

例如,如果 X = abcadae,則 X3 = abc 而
X0是空序列
2016/8/7
演算法 _ 第六章
6-31
最長共同子序列
定理:假設 X = x1x2....xm、Y = y1y2....yn、而 Z = z1z2....zk 是 X 與
Y 的任何一個 LCS,則
1.
如果 xm = yn,則 zk = xm = yn 而且 Zk-1 是 Xm-1 與 Yn-1 的一
個 LCS。
2.
如果 xm  yn 且 zk  xm,則 Z 是 Xm-1 與 Y 的一個 LCS。
3.
如 果 xm  yn 且 zk
 yn, 則 Z 是 X 與 Yn-1 =
y1y2....yn-1 的 一 個 LCS。
2016/8/7
演算法 _ 第六章
6-32
最長共同子序列

令 Li,j表示 Xi = x1x2....xi 與Yj = y1y2....yj 的LCS 長
度,則上面的定理告訴我們 Li,j 可以用下列的
遞迴關係來描述:
Li , j
xi  y j
 Li -1, j -1  1

 max{ Li -1, j , Li , j -1} xi  y j
L0,0 = L0,j = Li,0 = 0, 1  i  m 且1  j  n
2016/8/7
演算法 _ 第六章
6-33
最長共同子序列
2016/8/7
L1,1
L1,2
L1,3
L2,1
L2,2
L2,3
L3,1
L3,2
演算法 _ 第六章
Lm-1,n-1
Lm-1,n
Lm,n-1
Lm,n
6-34
最長共同子序列
0 1 2 3 4 5 6 7 8 9 10
a l g o r i t h m s
0 0 0 0 0 0 0 0 0
0
0
1 g 0 0 0 1 1 1 1 1 1
1
1
l 0 0 1 1 1 1 1 1 1
1
1
3 o 0 0 1 1 2 2 2 2 2
2
2
4 r 0 0 1 1 2 3 3 3 3
3
3
i 0 0 1 1 2 3 4 4 4
4
4
6 o 0 0 1 1 2 3 4 4 4
4
4
7 u 0 0 1 1 2 3 4 4 4
4
4
8 s 0 0 1 1 2 3 4 4 4
4
5
0
2
5
2016/8/7
演算法 _ 第六章
6-35
最長共同子序列
0 1 2 3 4 5 6 7 8
a
l
g o r
i
t
9
h m
10
0 1 2 3 4 5 6 7 8
a
s
l
g o r
i
t
9
h m
10
s
0 0 0 0 0 0 0 0 0
0
0
0
0 0 0 0 0 0 0 0 0
0
0
1 g 0 0 0 1 1 1 1 1 1
1
1
1 g 0 0 0 1 1 1 1 1 1
1
1
2
0 0 1 1 1 1 1 1 1
1
1
2
0 0 1 1 1 1 1 1 1
1
1
3 o 0 0 1 1 2 2 2 2 2
2
2
3 o 0 0 1 1 2 2 2 2 2
2
2
4 r 0 0 1 1 2 3 3 3 3
3
3
4 r 0 0 1 1 2 3 3 3 3
3
3
5
0 0 1 1 2 3 4 4 4
4
4
5
0 0 1 1 2 3 4 4 4
4
4
6 o 0 0 1 1 2 3 4 4 4
4
4
6 o 0 0 1 1 2 3 4 4 4
4
4
7 u 0 0 1 1 2 3 4 4 4
4
4
7 u 0 0 1 1 2 3 4 4 4
4
4
8 s 0 0 1 1 2 3 4 4 4
4
5
8 s 0 0 1 1 2 3 4 4 4
4
5
0
l
i
l
i
LCS =“goris”
2016/8/7
LCS =“loris”
演算法 _ 第六章
6-36
最長共同子序列

利用動態規劃來求出 LCS 的時間複雜度
是 O(mn),因為表格大小就是 O(mn)
2016/8/7
演算法 _ 第六章
6-37
單一起點之最短路徑:一般的
4
加權值
1
3
5
−3

一個含有負長度邊的有向圖

演算法Shortest_Path(演算法3.3)不必然找出
正確的結果

演算法停止時dist[2] = 5而dist[3] = 4

從1到3的最短路徑為1, 2, 3

這條路徑的長度為2,它比所計算得的dist[3] 值
還小
2016/8/7
演算法 _ 第六章
2
6-38
單一起點之最短路徑:一般的
加權值

當圖允許有負數邊時,我們要求這個圖
必須沒有負長度的迴路

從頂點 1 到 3 的最短路徑長度為−,而
它的路徑為1, 2, 1, 2, 1, 2, …, 1, 2, 3
1
1
2016/8/7
3
−2
2
3
演算法 _ 第六章
6-39
單一起點之最短路徑:一般的
加權值


令 distl[u] 表示從起點 v 到 u,而且頂多只走過
l 個邊的最短路徑之長度
因此,dist1[u] = length[v][u],其中 1 ≤ u  n

當沒有負長度的迴路時,我們可以把我們要找
的最短路徑限制在頂多只經過 n – 1 個邊的路
徑範圍內

因此,distn–1[u] 就是一條從 v 到 u(沒加任何
限制)的最短路徑長度
2016/8/7
演算法 _ 第六章
6-40
單一起點之最短路徑:一般的
加權值

如果從 v 到 u 最多含有 k 個邊的最短路
徑實際上的邊數並不超過 k – 1 個,那麼
distk[u] = distk–1[u],其中 k > 1

如果從 v 到 u 最多含有 k 個邊的最短路
徑實際上的邊數剛好為 k 個邊,那麼它
實際上是由從 v 到某個頂點 j 的最短路徑,
再緊接著 <j, u> 這個邊所組成
2016/8/7
演算法 _ 第六章
6-41
單一起點之最短路徑:一般的
加權值



從 v 到 j 的路徑有 k – 1 個邊,而且它的
長度是 distk–1[j]
所有 <i, u>  E 的頂點 I 都是 j 的考慮頂
點
由於我們感興趣的是最短路徑,因此使
得 distk–1[i] + length[i][u] 最小的 I 便是 j
的正確值
2016/8/7
演算法 _ 第六章
6-42
單一起點之最短路徑:一般的
加權值

因此
dist k [u]  min{ dist k 1[u], min {dist k 1[i]  length[i][u]}}
i
2016/8/7
演算法 _ 第六章
6-43
單一起點之最短路徑:一般的
加權值
distk[1..7]
-1
2
4
1
5
6
-3
5
1 2 3 4 5 6 7
-2
3
7
5
-2
6
-1
4
1
6
0
0
0
0
0
0
4
2
2
2
2
2
5
5
5
5
5
5
6
3
3
3
3
3
∞
3
1
1
1
1
∞
5
2
2
2
2
∞
∞
6
3
3
3
(b) distk
(a) 有向圖
2016/8/7
k
1
2
3
4
5
6
演算法 _ 第六章
6-44
單一起點之最短路徑:一般的
加權值

1
2
3
4
5
6
7
這個演算法也稱為 Bellman&Ford 演算法
// 單一起點到所有終點的最短路徑,有負的邊長
for i := 1 to n do dist[i] := length[v][i]; // 初始化 dist
for k := 2 to n−1 do
for 每一個 u  v,u 至少有一個邊射向它 do
for 每一個 <i, u>  E do
if dist[u] > dist[i] + length[i][u] then dist[u] :=
dist[i] + length[i][u];
2016/8/7
演算法 _ 第六章
6-45
單一起點之最短路徑:一般的
加權值

演算法的複雜度為 O(n3)
2016/8/7
演算法 _ 第六章
6-46
所有對之最短路徑

動態規劃

複雜度為 O(n3)

即使圖上有負邊也有效

跟 Bellman&Ford 演算法一樣,這個演算
法要求這個圖沒有負長度的迴路
2016/8/7
演算法 _ 第六章
6-47
所有對之最短路徑

定義 Ak[i][j] 為從 i 到 j,而且經過的中間
頂點之索引值都不大於 k 的最短路徑之
長度

因此,An[i][j] 是圖 G 裡 i 到 j 的最短路
徑長度

A0[i][j] 就是 length[i][j],因為從 i 到 j 的
路徑不能經過任何中間頂點
2016/8/7
演算法 _ 第六章
6-48
所有對之最短路徑

所有對最短路徑演算法上的基本想法是
依序地產生矩陣 A0、A1、A2、…、An

假設我們已經產生了Ak–1,那麼根據以下
的事實,我們可以產生 Ak
2016/8/7
演算法 _ 第六章
6-49
所有對之最短路徑

對於任何一對頂點 i 與 j,以下有一條適用:

i 到 j 所經過的中間頂點之索引值都不大於 k 的
最短路徑,如果它並沒有經過索引值為 k 的頂
點,那麼它的長度還是Ak–1

最短路徑通過頂點 k。在這種情形下,路徑由
一個 i 到 k 的子路徑跟一個從 k 到 j 的子路徑
所組成,因此它們的長度是Ak–1[i][k] 與Ak–1[k][j]
2016/8/7
演算法 _ 第六章
6-50
所有對之最短路徑

前面的規則產生一個Ak[i][j] 的公式如下:
Ak[i][j] = min{Ak–1[i][j], Ak–1[i][k] + Ak–1[k][j]}
2016/8/7
演算法 _ 第六章
6-51
所有對之最短路徑
1
for i := 1 to n do
2
for j := 1 to n do
3
4
a[i][j]= length[i][j];
// 為最高頂點索引值 k 的路徑
for k := 1 to n do
5
6
7
2016/8/7
// 複製 length 到 a
// 為所有可能的頂點對
for i := 1 to n do
for j := 1 to n do
a[i][j] := min{a[i][j], a[i][k] + a[k][j]};
演算法 _ 第六章
6-52
所有對之最短路徑
A0
1
2
3
A1
1
2
3
1
0
2
9
1
0
2
9
2
7
0
3
2
7
0
3
3
3

0
3
3
5
0
7
1
2
2
3
9
(b) A0
3
(c) A1
3
(a) 有 有 有 有 有
2016/8/7
A2
1
2
3
A2
1
2
3
1
0
2
5
1
0
2
5
2
7
0
3
2
6
0
3
3
3
5
0
3
3
5
0
(d) A2
演算法 _ 第六章
(e) A3
6-53