演算法_第八章 處理NP完備理論.ppt

Download Report

Transcript 演算法_第八章 處理NP完備理論.ppt

處理NP-完備問題
8
2016/8/7
演算法 _ 第八章
1
解NP-完備問題


是否一定要找出正確解(判斷問題)或
最佳解(最佳化問題)

回溯法(判斷問題)

分支設限法(最佳化問題)
或者我們可以接受只找出近似解

2016/8/7
近似演算法
演算法 _ 第八章
8-2
回溯法與分支設限法

回溯法與分支設限法是兩種用來有系統地檢視
候選解的方法

這種有系統地檢視候選解的方法,不管是在最
壞的情況還是在平均的情況下,都能省下大量
的執行時間

這些方法通常使得我們得以排除大量的候選解;
雖然如此,它們卻還是可以保證當演算法執行
結束時,我們能找到所要的正確解或最佳解
2016/8/7
演算法 _ 第八章
8-3
回溯法

回溯法的作法是利用觀察候選解的一小
部分,如果從候選解的這一小部分已經
足以判定它不可能形成我們最後要的解,
就馬上放棄這個候選解

舉個例子,如果 SAT 問題的給定布林公
式中有一個子句是 (x1  x2),則所有可能
的真假值指派中只要是 x1 = x2 = false 的
都可以直接予以淘汰而不至於影響到最
終解的正確性
2016/8/7
演算法 _ 第八章
8-4
回溯法
F ( w, x, y, z )  ( w  x  y  z )  ( w  x )  ( x  y )  ( y  z )  ( w  z )  ( w  z )
F
w=1
w=0
x=0
x=1
與 ( w  x ) 違背!
2016/8/7
演算法 _ 第八章
8-5
回溯法

回溯法通常會選擇深度優先,即 w = 0, x
= 0 的頂點繼續分支


因為它已經指派了兩個變數的真假值,可能
很快就可以找到解
深度優先通常比廣度優先還省記憶體

2016/8/7
過程中產生的可分支頂點數比較少
演算法 _ 第八章
8-6
回溯法

利用這個方式,回溯法檢視真假值指派
的搜尋空間

一旦確定一個頂點所代表的部分真假值
指派已經不可能導致正確解,就不再為
該頂點做後續的再分支運算

會繼續做分支運算的頂點(灰色頂點)
代表還有可能導致正確的真假值指派
2016/8/7
演算法 _ 第八章
8-7
回溯法

如果我們將 w = 0, x = 0 帶入 F,則任何包含字
元或的子句立刻為 1,而字元 w 與 x 則因為是
0,因而可以予以刪除

這麼處理之後,在 w = x = 0 的頂點只剩下
( 0  0  y  z )  (0  0 )  (0  y )  ( y  z )  ( 0  z )  ( 0  z )
 ( y  z )  (1)  ( y )  ( y  z )  (1)  (1)
 ( y  z)  ( y)  ( y  z )
2016/8/7
演算法 _ 第八章
8-8
回溯法

類似地,在 w = 0, x = 1 的頂點將只剩下
(0  1  y  z )  (0  1 )  (1  y )  ( y  z )  ( 0  z )  ( 0  z )
 (1)  (0)  (1)  ( y  z )  (1)  (1)
 (0)  ( y  z )

由於任何子句與空子句 F = (0) =  做 and 的
結果都是 false,因此以 w = 0, x = 1 為樹根的
所有真假值指派至此就已經注定不可能使得整
個布林公式為真,也因此不用再分支下去
2016/8/7
演算法 _ 第八章
8-9
回溯法

回溯法顯示 F 不可能為真
(w  x  y  z)  (w  x )  ( x  y )  ( y  z )  (w  z)  (w  z )
w=1
w=0
( x  y)  ( y  z )  ( z)  ( z )
( x  y  z)  ( x )  ( x  y)  ( y  z )
x=0
( y  z)  ( y)  ( y  z )
( z)  ( z )

2016/8/7
  ( y  z)
( x  y)  
z=1
( x  y )  ( y)  
y=1
y=0
z=0
z=0
x=1

z=1

演算法 _ 第八章
8-10
回溯法

回溯法顯示 xfalse, yfalse, ztrue 會使得 F
為真
( x  y  z)  x  y  ( z  x )  ( x  y)
x=1
x=0
( y  z)  ( y)
y=1
y=0

(z )
z=0

2016/8/7
  ( y)  ( z)  ( y)
z=1
(1)
演算法 _ 第八章
8-11
回溯法

從以上的討論可以知道,回溯法必須有
一個檢視機制,它觀察子問題並且很快
地判斷出這個子問題是以下三種可能的
哪一種:

失敗:這個子問題無解。

成功:找到這個子問題的一個解。

不確定。
2016/8/7
演算法 _ 第八章
8-12
回溯法
令 S = {P0},其中 S 代表活點(active nodes)所成的集合,而
P0 是要解的原問題;
repeat while {S}
從 S 中選出(choose)一個子問題 P,將它從 S 中移除;
將它分支成(expand)較小的子問題 P1, P2, P3, …, Pk;
for i := 1 to k do {
if ( test(Pi) 成功 ) then 演算法輸出解,並且結束;
// 已經找到解
else if ( test(Pi) 失敗 ) then 放棄 Pi;
// 視 Pi 為死點(dead nodes)
else 把 Pi 加入到 S; // Pi 是不確定頂點(活點)
宣布不存在任何解;
2016/8/7
演算法 _ 第八章
8-13
分支設限法

分支設限法多了一個界限函數

利用界限函數,我們可以正確地判斷出一個子
問題如果繼續做下去的話,它所導致的最低花
費(或者最高獲利)會是多少

如果一個子問題(活點)的界限函數指出這個
子問題繼續做下去所導致的最低花費(最高獲
利)將高於(低於)我們目前已經找出的一組
解,那麼這個子問題就不用再考慮下去,可以
直接予以丟棄(列為死點)
2016/8/7
演算法 _ 第八章
8-14
分支設限法
令 S = {P0},其中 S 代表活點所成的集合,而 P0 是要解的原問
題;
best_so_far := ;
repeat while {S}
從 S 中選出(choose)一個子問題 P 並且將它從 S 中移除;
將它分支成(expand)較小的子問題 P1, P2, P3, …, Pk;
for i := 1 to k do {
if ( Pi 是一組解 and 這組解小於 best_so_far )
then 更新 best_so_far;
else if ( lower_bound(Pi) 大於 best_so_far )
then 放棄 Pi; // 視 Pi 為死點
else 把 Pi 加入到 S;
// lower_bound(Pi) < best_so_far 屬於不確定頂點
return best_so_far;
2016/8/7
演算法 _ 第八章
8-15
TSP 問題

S
a 
b

b  a
V S
V-S
b
S
2016/8/7
a
演算法 _ 第八章
8-16
TSP 問題

每一步我們都將部分路徑 [a, S, b] 延伸一個邊
(b, x),其中x  VS

共有VS種可能選擇,每一種選擇將導致形
式為 [a, S  {x}, x] 的子問題
x
V – S – {x}
b
S {x} a
2016/8/7
演算法 _ 第八章
8-17
TSP 問題
lower_bound(Pi)





2016/8/7
lower_bound([a, S, b])?
從 a 連結到 VS 裡某一個頂點的最小邊之
花費,加上
從 b 連結到 VS 裡某一個頂點的最小邊之
花費,加上
VS 的最小花費生成樹的花費。
演算法 _ 第八章
8-18
TSP 問題
x
V- S
b
y
S
2016/8/7
a
演算法 _ 第八章
8-19
TSP 問題
C
C
1
1
B
D
B
D
1
2
1
2
1
1
5
A
E
A
E
1
1
F
H
F
2
1
1
G
2016/8/7
1
H
1
1
1
1
1
G
演算法 _ 第八章
8-20
TSP 問題
A
10
B
F
8
1
2
3
16
10
C
6
E
10
4
8
5
7
14
10
D
14
H
D
F
10
E
B
8
11
9
E
15
F
10
G
19
D
G
G
X
14
20
C
8
21
11
13
12
15
8
8
17
18
13
H
8
D
22
H
X
11
G
11
H 12
總花費:11
11
2016/8/7
8
G
23
H 24
總花費:8
8
演算法 _ 第八章
8-21
TSP 問題
A
10
B
8
1
F
2
3
E
8
5
4
8
H
13
6
G
7
B
D
8
12
8
C
8
9
8
10
D
H
X
8
G
11
H 12
總花費:8
8
2016/8/7
演算法 _ 第八章
8-22
0/1 打包問題

請注意,pi/wi  pi+1/wi+1, i = 1, 2, .., 5
2016/8/7
演算法 _ 第八章
8-23
0/1 打包問題

利用貪婪演算法求得 x1 = x2 = 1, x3 = 5/8,
x4 = x5 = x6 = 0,它的總價值是6 + 10 +
45/8 = 18.5

這樣子所求得的總價值 18.5 會是我們同
一組資料的 0/1 打包問題解之上限

換句話說,我們針對這組資料的 0/1 打包
問題所求出的最佳解 Z 必然小於等於
18.5
2016/8/7
演算法 _ 第八章
8-24
0/1 打包問題

用演算法 Knapsack2 求出 0/1 打包問題的
解之下限

x1 = x2 = 1, x3 = x4 = x5 = x6 = 0,總價值是
6 + 10 = 16

換句話說,我們最後求出的 0/1 打包問題
之最佳解Z必然大於等於16
2016/8/7
演算法 _ 第八章
8-25
0/1 打包問題

綜合上述的結果,16  Z  18.5

由於 0/1 打包問題的xi值只能是 0 或 1,
而且所有 pi 的值都是整數,因此16  Z 
18

實際上,這組資料的最佳解是17
2016/8/7
演算法 _ 第八章
8-26
0/1 打包問題
16~18
0
x1 = 0
x1 = 1
1
16~18
2
x2 = 0
x2 = 1
3
x3 = 1
5
16~18
6
x4 = 1
7
X
8
X
10
x6 = 1
11
2016/8/7
X
16~18
13
x4 = 1
16~18
x6 = 0
12
21
16~18
x5 = 0
16~16
15~18
x3 = 1
x4 = 0
x5 = 1
9
4
x3 = 0
X
14~17
x5 = 1
27
X
x6 = 1
29
X
x3 = 0
15~18
14
x4 = 0
15~18
22
16~18
x5 = 0 x5 = 1
28
15~18
23
15~15
25
15
x5 = 0
24
16~18
x6 = 0 x6 = 1
30
x4 = 1
x6 = 0
X
演算法 _ 第八章
26
x4 = 0
17~18
x5 = 1
14~14
16
16~16
x5 = 0
17
17~18
x6 = 1
16~16
17~18
19
18
15~15
x6 = 0
X
20
17~17
8-27
近似演算法

OPT(I):最佳解的值

似演算法 A,針對輸入 I 所產生的解是A(I)

定義演算法 A 的近似比為
A( I )
 A  max
I
OPT( I )

如果是最大化的問題,只需要將上面的定義倒
數過來即可
2016/8/7
演算法 _ 第八章
8-28
頂點涵蓋

我們要的是 S 最小的頂點涵蓋
1
7
2
6
3
5
2016/8/7
4
演算法 _ 第八章
8-29
頂點涵蓋

匹配指的是沒有共同頂點的邊之子集合 S
( E)
1
7
2
6
3
5
2016/8/7
4
演算法 _ 第八章
8-30
頂點涵蓋

如果一個匹配已經使得不可能再有其他
的邊加入,那麼我們就稱這個匹配為最
大匹配

請注意,最大匹配不是唯一的
2016/8/7
演算法 _ 第八章
8-31
頂點涵蓋-四個最大匹配
1
7
1
7
2
2
6
6
3
5
3
5
4
1
7
4
1
7
2
2
6
6
3
5
2016/8/7
4
3
5
(c)
演算法 _ 第八章
4
8-32
頂點涵蓋

由於產生每一個最大匹配的時間不超過
O(n3)

因此我們實際上可以產生多個(例如,n
個)最大匹配,然後再從中選擇最符合
我們需要的

我們希望最大匹配的邊數越少越好
2016/8/7
演算法 _ 第八章
8-33
頂點涵蓋


一個圖 G 的任何一組頂點涵蓋至少必須
跟 G 裡的任何一組匹配裡的邊數一樣大
換句話說,令最大匹配裡的邊數為 M,
則 OPT  M

頂點涵蓋有 2M 個頂點

前面又證明 OPT  M

因此,A  2
2016/8/7
演算法 _ 第八章
8-34
頂點涵蓋
2016/8/7
演算法 _ 第八章
8-35
頂點涵蓋

(a) 與 (d) 的近似比是 A = 4/3 = 1.33

(b) 與 (c) 的近似比是 A = 6/3 = 2
2016/8/7
演算法 _ 第八章
8-36
頂點涵蓋


步驟 1:找出一個最大匹配 M  E;
步驟 2:return S = {M 裡所有邊的所有
端點};
2016/8/7
演算法 _ 第八章
8-37
TSP 問題

假設點與點之間的距離滿足三角不等式

步驟 1:找出 G 的最小花費生成樹MST;

步驟 2:建立對應於 MST 的往返雙向邊MST’ ;


步驟 3:在往返雙向邊 MST’上建立一個拜訪
所有頂點的迴路;
步驟 4:利用捷徑以產生最後的近似TSP迴路;
2016/8/7
演算法 _ 第八章
8-38
TSP 問題
9
9
10
8
6
8
10
7
6
7
5
5
3
3
4
1
2016/8/7
4
2
2
1
演算法 _ 第八章
8-39
TSP 問題
9
1-3-2-3-7-8-9-8-7-6-10-6-5-4-5-6-7-3-1
10
8
7
6
5
3
4
2
1
2016/8/7
演算法 _ 第八章
8-40
TSP 問題
9
捷徑!
8
10
7
6
5
3
4
2
1
2016/8/7
演算法 _ 第八章
8-41
TSP 問題

沒去掉重複頂點的迴路長度是  2MST

因此,近似TSP迴路之長度  2MST

但是,最佳化的 TSP 迴路之長度 OPT  MST



因為去掉最佳化的 TSP 迴路之任何一邊將形
成一棵生成樹,這棵生成樹的總花費當然大
於等於最小花費生成樹的總花費
綜合以上,近似TSP迴路之長度  2MST 
2OPT
換句話說,A = 2
2016/8/7
演算法 _ 第八章
8-42
TSP 問題

另一個 A = 1.5 的近似演算法

步驟 1:找出 G 的最小花費生成樹 MST;

步驟 2:找出 MST 裡奇數級數頂點的最小加權
匹配 M;

步驟 3:在 MST+M 上找出尤拉迴路;

步驟 4:利用捷徑以產生近似 TSP 迴路;
2016/8/7
演算法 _ 第八章
8-43
TSP 問題
9
9
10
10
8
6
7
6
7
5
3
3
4
2
1
2016/8/7
4
2
1
演算法 _ 第八章
8-44
TSP 問題
9
9
10
10
8
6
7
6
7
5
3
3
4
2
1
2016/8/7
4
2
1
演算法 _ 第八章
8-45
TSP 問題
9
9
10
8
10
8
6
7
6
7
5
5
3
3
4
2
1
1
2016/8/7
4
2
演算法 _ 第八章
8-46