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

Download Report

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

NP-完備理論
7
2016/8/7
演算法 _ 第七章
1
簡單問題與困難問題

在 60 年代末期到 70 年代初期,許多研
究人員成功地找出一些最佳化問題的快
速解

但是,在那同時卻也發現越來越多的問
題似乎無法快速地找到解

解這些問題的演算法在最壞的情況下都
會需要指數時間
2016/8/7
演算法 _ 第七章
7-2
簡單問題與困難問題

於是有人開始懷疑,是不是還有什麼不
知道的演算法設計方法尚待開發

或者是不是應該有一個證明告訴我們這
些問題本質上就很難,低於指數時間的
演算法根本就不存在?
2016/8/7
演算法 _ 第七章
7-3
簡單問題與困難問題

大約就是那個時候,出現了一個重大的
發現

這個發現告訴我們這些所謂的“困難”
問題彼此間是相關的,只要它們其中有
一個問題可以在多項式時間內解掉的話,
那麼所有這些困難問題將都可以在多項
式時間內解掉

這些問題就統稱為NP-完備問題
2016/8/7
演算法 _ 第七章
7-4
多項式時間

以一個問題能不能在多項式時間內解決掉來區
隔“可以有效率地解決的問題”與“無法有效
率地解決的問題”

前者籠統地統稱為“簡單的問題”而後者則籠
統地通成為“困難的問題”

評估一個演算法的執行時間所採用的都是最壞
情況的複雜度

事實上,NP-完備問題所探討的時間複雜度都
是最壞情況的複雜度。
2016/8/7
演算法 _ 第七章
7-5
多項式時間

當我們說一個演算法的複雜度是 O(n)時,
n 指的是輸入資料的“數量”

針對不同問題,我們對於這個“數量”
的定義會有一些不同

但是,真正比較嚴謹的定義應該是「使
用合理、有效率的編碼方式來表示輸入
資料時所需要的位元數」
2016/8/7
演算法 _ 第七章
7-6
多項式時間

前面都假設任何算術運算(例如,兩個數的加、
減、乘、除)都固定需要一個常數時間

但是,現在我們得小心些,實際上它們所需要
的計算時間跟表示一個數字所用的位元數成正
比

例如,把兩個 64 位元整數相加所需要的時間
是把兩個 32 位元整數相加所需要時間的兩倍
2016/8/7
演算法 _ 第七章
7-7
多項式時間

如果一個問題存在一個多項式時間演算
法來解它的話,我們就說這個問題可以
在多項式的時間內解掉
2016/8/7
演算法 _ 第七章
7-8
最佳化問題與判斷問題

每一個最佳化的問題都有一個對應的判
斷問題版本

是不是存在一個打包方法使得它打包所
得的總價值高於等於常數C?

是不是存在一個路徑的長度小於等於常
數C?

輸出只是很單純的“是”或“否”
2016/8/7
演算法 _ 第七章
7-9
最佳化問題與判斷問題

定義 P 為所有可以在多項式時間內解決
掉的判斷問題所成的集合。

P 因此就是我們認為的簡單問題所成的
集合
2016/8/7
演算法 _ 第七章
7-10
一些常見的困難問題

SAT問題

給定一個布林公式(CNF的形式),是不是存
在一種真假值的指派使得整個布林公式為真?

舉一個例子,是不是存在一種真假值的指派使
得
F = ( x  y  z)  x  y  ( z  x )  ( x  y)
為真?
2016/8/7
演算法 _ 第七章
7-11
一些常見的困難問題

這個例子不管我們如何選擇 x, y, z 的真假
值組合,F 總之都是假,因此針對這個
例子我們應該回答“否”

SAT是第一個被證明是NP-完備的問題
2016/8/7
演算法 _ 第七章
7-12
一些常見的困難問題

3-SAT問題

它是SAT問題的一個特例,布林公式裡要
and 起來的每一個子句都恰好含3個字元

例如,
F=
( x  y  z )  ( x  y  z )  ( y  z  w)  ( x  z  w )  ( x  y  z )

這個問題也被證明是一個NP-完備問題
2016/8/7
演算法 _ 第七章
7-13
一些常見的困難問題

如果一個問題被證明是NP-完備的問題,
那麼它的特例可能是NP-完備問題,也可
能不是NP-完備問題
2016/8/7
演算法 _ 第七章
7-14
一些常見的困難問題

0/1打包問題

打包問題的特例

給定的 n 項物品,每一項物品 i 都有其重量 wi
以及價值 pi

這個問題要求我們,在總重量小於等於 C 的前
提下,選出來搬走的物品之總價值要最高

xi = 0, 1-物品不能切割
2016/8/7
演算法 _ 第七章
7-15
一些常見的困難問題

旅行推銷員問題

判斷問題版本則是「給定平面上一些點
以及這些點彼此間的距離,是否存在一
個迴路將所有這些點連結起來,而且這
個迴路的邊長總和小於等於常數C?」

這個問題的判斷問題版本就是NP-完備問
題
2016/8/7
演算法 _ 第七章
7-16
一些常見的困難問題
2016/8/7
演算法 _ 第七章
7-17
一些常見的困難問題



頂點涵蓋問題
給定一個圖 G = (V, E)。如果存在一組頂點 S  V 使得
任何屬於 E 的一個邊 (u, v) 都滿足要麼 u  S 不然就是
v  S,那麼我們就說 S 是一個頂點涵蓋
例如,{A,D} 與 {B,C,E} 都是頂點涵蓋,因為所有的邊
都跟 A 或 D(B、C、或E)相連
C
A
D
2016/8/7
B
演算法 _ 第七章
E
7-18
一些常見的困難問題

這個問題的最佳化版本問的是「請找出
最小的頂點涵蓋S,即S最小化。」

它的判斷問題版本則是「是不是存在一
個頂點涵蓋 S 使得S k,其中k是一個
常數?」

這個問題的判斷問題版本就是NP-完備問
題
2016/8/7
演算法 _ 第七章
7-19
一些常見的困難問題

著色問題

給定一個圖 G = (V, E),我們要為頂點 V上色

上色的原則是相鄰的兩個頂點 u, v必須著不同
的顏色
C
A
E
B
2016/8/7
D
演算法 _ 第七章
7-20
一些常見的困難問題

這個問題的最佳化版本問的是「請找出
使用最少顏色的著色方法。」

它的判斷問題版本則是「是不是存在一
種著色方法只使用k種顏色?」

這個問題的判斷問題版本就是NP-完備問
題
2016/8/7
演算法 _ 第七章
7-21
一些常見的困難問題


集合涵蓋問題
給定 F = {S1, S2, …, Sk},而且S1  S2
 …  Sk = { u1, u2, …, un}。如果T  F
使得
 Si   Si
Si T
Si F
則我們說 T 是 F 的一個集合涵蓋
2016/8/7
演算法 _ 第七章
7-22
一些常見的困難問題

F = {S1 = {a1, a3}, S2 = {a2, a4}, S3 = {a2,
a3}, S4 = {a4}},則 T1 = {S1, S3, S4} 與 T2
= {S1, S2} 都是 F 的一個集合涵蓋

T2 因為又滿足所屬元素(S1, S2)兩兩交
集為空集合,因此還稱為是 F 的精準涵
蓋
2016/8/7
演算法 _ 第七章
7-23
一些常見的困難問題

這個問題的最佳化版本問的是「請找出
最小的集合涵蓋 T,即T最小化」

它的判斷問題版本則是「是不是存在一
個集合涵蓋 T 使得T k,其中 k 是一
個常數?」

這個問題的判斷問題版本就是NP-完備問
題
2016/8/7
演算法 _ 第七章
7-24
一些常見的困難問題

精準涵蓋問題

所有定義與集合涵蓋問題同,但是問的是「請
找出最小的精準涵蓋 T,即T最小化」

「是不是存在一個精準涵蓋 T 使得T k,其
中 k 是一個常數?」

這個問題的判斷問題版本就是NP-完備問題
2016/8/7
演算法 _ 第七章
7-25
一些常見的困難問題

子集合之和的問題

給定一個正整數所成的集合 S = { a1,
a2, …, an }以及一個常數 C

判斷是不是存在一個 S 的子集合 T 使得
a
ai T
2016/8/7
i
C
演算法 _ 第七章
7-26
一些常見的困難問題

S = {7, 5, 19, 1, 12, 8, 14}

如果 C = 21,則回答“是”,因為 7 + 14
= 21

如果 C = 11,則回答“否”。

這個問題是NP-完備問題
2016/8/7
演算法 _ 第七章
7-27
一些常見的困難問題

切割問題

給定一個正整數所成的集合 S = { a1,
a2, …, an }

判斷是不是存在一個 S 的切割 P 使得
a
ai P
2016/8/7
i

a
ai P
i
演算法 _ 第七章
7-28
一些常見的困難問題

S = {1, 3, 8, 4, 10}。

{1, 8, 4} 與 {3, 10} 是 S 的一個切割,
1+8+4 = 3+10 = 13

因此回答“是”。

這個問題是NP-完備問題
2016/8/7
演算法 _ 第七章
7-29
一些常見的困難問題

裝箱問題

給定一個箱子的容量 C 以及 n 個物件,
每一個物件所占的空間大小分別是 ci,
其中 ci  0, 1  i  n

我要將這 n 個物件分配到各箱子中,被
分配放入到同一個箱子中的物件之總占
空間不得大於 C
2016/8/7
演算法 _ 第七章
7-30
一些常見的困難問題

這個問題的最佳化版本問的是「請找出
一種分配方法使得所需要的箱子數目最
少」

它的判斷問題版本則是「是不是存在一
種分配方法使得所需要的箱子數目小於
等於 k,其中 k 是一個常數?」

這個問題的判斷問題版本就是NP-完備問
題
2016/8/7
演算法 _ 第七章
7-31
一些常見的困難問題



最大完全子圖問題
給定一個圖 G = (V, E)。如果存在一組頂點 S 
V 使得 S 裡的任意兩個頂點間都有一個邊相連,
則我們稱 S 是 G 裡的完全子圖
{A, B, C, D}、{C, D, E}、與 {E, F} 都是完全子
圖,其中 {A, B, C, D} 是最大的完全子圖
A
C
E
2016/8/7
B
演算法 _ 第七章
D
F 7-32
一些常見的困難問題

這個問題的最佳化版本問的是「給定一
個圖 G = (V, E),請找出最大的完全子圖」

它的判斷問題版本則是「給定一個圖G =
(V, E),它是不是存在一個頂點數大於等
於 k 的完全子圖,其中 k 是一個常數?」

這個問題的判斷問題版本就是NP-完備問
題
2016/8/7
演算法 _ 第七章
7-33
一些常見的困難問題



漢米爾頓迴圈問題
給定一個圖 G = (V, E), V= n,所謂的漢米爾
頓迴圈指的是一個含有 n 個邊,而且拜訪每個
頂點恰好一次,最後又回到起點的迴圈
迴圈 1-2-8-7-6-5-4-3-1是一個漢米爾頓迴圈
2016/8/7
1
2
3
4
8
7
6
5
演算法 _ 第七章
7-34
一些常見的困難問題

給定一個圖 G = (V, E),這個問題問的是
「這個圖有漢米爾頓迴圈嗎?」

這個問題是NP-完備問題
2016/8/7
演算法 _ 第七章
7-35
一些常見的困難問題

藝廊問題

給定一個藝廊的平面圖,我們要安排警
衛的人數與位置使得警衛的人數要最少,
但是藝廊裡的每一個角落都至少要有一
個警衛監視得到

每一位警衛都可以旋轉以監視 360°
2016/8/7
演算法 _ 第七章
7-36
一些常見的困難問題
2016/8/7
演算法 _ 第七章
7-37
一些常見的困難問題

這個問題的最佳化版本問的是「請找出一種警
衛位置的分配方法使得所需要的警衛數目最少」

它的判斷問題版本則是「是不是存在一種警衛
位置的分配方法使得所需要的警衛人數小於等
於 k,其中 k 是一個常數?」

這個問題的判斷問題版本就是NP-完備問題
2016/8/7
演算法 _ 第七章
7-38
一些常見的困難問題

VLSI 佈局問題

給定一個區域範圍 A 以及 n 個矩形的高
hi 與寬 wi,其中 hi 與 wi 都是整數,1  i
n

我們要判斷是不是存在一種佈局方式將
這 n 個矩形放置到 A 裡,而且放置的方
式滿足下列條件:
2016/8/7
演算法 _ 第七章
7-39
一些常見的困難問題

矩形的邊都跟 x 軸或 y 軸平行。

矩形的角放在整數座標位置。

矩形不能重疊。

兩個矩形間至少間隔一個單位距離 

這個問題是NP-完備問題
2016/8/7
演算法 _ 第七章
7-40
一些常見的困難問題
A

2016/8/7
演算法 _ 第七章
7-41
NP-完備
2016/8/7
演算法 _ 第七章
42
NP與多項式時間驗證

許多很難解的問題,要驗證它們的答案
是否正確卻是很容易的

如果給定的圖確實含有漢米爾頓迴圈,
那麼別人很容易就可以說服你這個事實


他只需要告訴你這個迴圈是,例如“1-2-87-6-5-4-3-1”就可以了
我們可以檢視該圖看看它所給的答案是
不是真的是漢米爾頓迴圈
2016/8/7
演算法 _ 第七章
7-43
NP與多項式時間驗證

因此,雖然我們知道目前還沒有有效率
的演算法來解漢米爾頓迴圈問題,但是
很顯然地我們要驗證所給的迴圈是不是
漢米爾頓迴圈是很容易的事

不是多項式時間內可驗證:判斷一個圖
是否恰好包含一個漢米爾頓迴圈
2016/8/7
演算法 _ 第七章
7-44
NP與多項式時間驗證

定義 NP 為所有可以在多項式時間內驗證
完畢的判斷問題所成的集合

注意!多項式時間內可驗證與多項式時
間內可解是兩個很不同的觀念

P  NP

2016/8/7
這是因為如果我們可以在多項式的時間內解
掉一個問題,那麼我們當然就可以在多項式
的時間內驗證所求得解的正確性
演算法 _ 第七章
7-45
NP與多項式時間驗證

NP = P 嗎?

不知道!

大部分的專家都認為 NP  P

不過,沒有人有辦法提出證明
2016/8/7
演算法 _ 第七章
7-46
NP與多項式時間驗證
P
NP-完備
簡單
2016/8/7
困難
演算法 _ 第七章
7-47
轉換



第二章:A  B(讀成“A reduced to B”)
意味著 A 是比較簡單的問題而 B 則是比
較難的問題
A P B:意味著 B 是更困難的問題
讀成“A reduced to B in polynomial time”,
加入下標 P 只是強調這個轉換的過程花
多項式時間
2016/8/7
演算法 _ 第七章
7-48
轉換

漢米爾頓迴圈問題 P 有向圖的漢米爾頓
迴圈問題
1
2
3
4
1
2
3
4
8
7
6
5
8
7
6
5
(a)
2016/8/7
(b)
演算法 _ 第七章
7-49
轉換
定理 7.1:如果 A P B 且 B  P,則 A  P。
定理 7.2:如果 A P B 且 A  P,則 B  P。
定理 7.3:如果 A P B 且 B P C,則 A P C。
2016/8/7
演算法 _ 第七章
7-50
NP-完備性

定理7.4【Cook】:SAT  P 若且唯若 NP = P
定義:假設 B 是一個判斷問題。如果 B 滿足下面兩
個條件,則我們說 B 是一個 NP-完備問題:
(1)
B  NP,而且
(2)
對於任何一個屬於 NP 的問題 A,A P B 成立。
2016/8/7
演算法 _ 第七章
7-51
NP-完備性

NP-完備問題是所有 NP 問題中最困難的,
因為所有的NP問題都 P NP-完備問題;
反之則不一定成立

所有的NP-完備問題的困難度一樣


2016/8/7
因為所有的NP-完備問題都屬於 NP 問題,
而所有的 NP 問題都 P NP-完備問題
因此所有的NP-完備問題也都 P任何一個
NP-完備問題
演算法 _ 第七章
7-52
NP-完備性

如果你可以用多項式的時間解掉一個NP完備問題 B,那麼任何一個 NP 裡的問題
A 將都將可以在多項式時間內解掉,即
NP = P

SAT是第一個NP-完備問題
2016/8/7
演算法 _ 第七章
7-53
一些NP-完備問題的證明範例

因為所有 NP 問題都 P NP-完備問題,因此上
述定義可以簡化成:
定義:假設 B 是一個判斷問題。如果 B 滿足下面
兩個條件,則我們說 B 是一個 NP-完備問題:
(1)
B  NP,而且
(2) 存在一個 NP-完備問題 A,A P B 成立。
2016/8/7
演算法 _ 第七章
7-54
證明3-SAT是一個NP-完備問題


很顯然地,3-SAT  NP,因為要驗證一
種真假值指派是否使得整個布林公式為
真是相當容易的事
我們要證明SAT P 3-SAT
2016/8/7
演算法 _ 第七章
7-55
證明3-SAT是一個NP-完備問題

如果在 F 的子句中只包含一個字元,那
麼把這子句轉換成 F’ 的四個子句:
L1  y1  y 2
 L1  y1  y 2
 L1  y1  y 2
 L1  y1  y 2
2016/8/7
演算法 _ 第七章
7-56
證明3-SAT是一個NP-完備問題

如果在 F 的子句中包含有兩個字元,例
如 L1  L2,那麼把這子句轉換成 F’ 的兩
個子句:
L1  L2  y1
 L1  L2  y1
2016/8/7
演算法 _ 第七章
7-57
證明3-SAT是一個NP-完備問題

如果在 F 的子句中包含有三個字元,那
麼把這子句直接拷貝成 F’ 的子句
2016/8/7
演算法 _ 第七章
7-58
證明3-SAT是一個NP-完備問題

如果在 F 的子句中包含超過三個字元,例如 L1
 L2    Lk,那麼如下地把這子句轉換成 F’
裡的 k-2 個子句:
L1  L2  y1
 L3  y1  y 2
 L4  y 2  y3


 Lk 2  y k 4  y k 3
 Lk 1  Lk  y k 3
2016/8/7
演算法 _ 第七章
7-59
證明3-SAT是一個NP-完備問題
SAT :
x1 v x2
-x3
x1 v -x2 v x3 v -x4 v x5
SAT
2016/8/7
S
轉換
演算法 _ 第七章
x1
x1
-x3
-x3
-x3
-x3
x1
x3
-x4
3-SAT :
v x2
v x2
v y2
v -y2
v y2
v -y2
v -x2
v -y4
v x5
v y1
v -y1
v y3
v y3
v -y3
v -y3
v y4
v y5
v -y5
3-SA
S
7-60
證明3-SAT是一個NP-完備問題




“”
當子句裡的字元數目  3時,這個命題很
明顯地成立
我們看子句裡的字元數目  4的情況
由於有一種真假值的指派使得 F 為真,
因此至少有一個 Li 為真。它在 F’ 裡所對
應的子句是 Li  yi2  yi1
2016/8/7
演算法 _ 第七章
7-61
證明3-SAT是一個NP-完備問題

令 yi-1為 false

yj  true,  j < i-1而yj  false,  j > i-1

這將使得所有其他的子句也都為真

換句話說,我們找到一種真假值的指派
使得 F’ 為真
2016/8/7
演算法 _ 第七章
7-62
證明3-SAT是一個NP-完備問題


“”
任何一種使得F’為真的真假值指派都不
可能只靠 yi 與 yi,因此至少每一個子句
Li 為 true
2016/8/7
演算法 _ 第七章
7-63
證明子集合之和的問題是NP-完
備問題


很顯然地,子集合之和的問題  NP,驗
證幾個給定的集合裡的數字和是否等於
另一個給定的常數 C 是一件很簡單的事
精準涵蓋問題 P 子集合之和的問題
2016/8/7
演算法 _ 第七章
7-64
精準涵蓋問題 P 子集合之和
的問題

精準涵蓋問題的輸入資料 :
F = { S1, S2, …, Sk }
 Si   u1,u2, ..., un 
Si F

子集合之和問題的輸入資料 :
A = { a1, a2, …, ak }其中
aj = 1in eji(k+1)i-1 其中 eji = 1 if ui  Sj
eji = 0 if otherwise.
C = 0in-1 (k+1)i = ((k+1)n - 1) / k
2016/8/7
演算法 _ 第七章
7-65
精準涵蓋問題 P 子集合之和
的問題
u1=1, u2=2, u3=3, n=3
E : S1={1,2}, S2={3}, S3={1,3}, F = {S1, S2, S3}
S
i
  u1,u2, ..., un ={1,2,3}
S i F
S : a1 = 40+41 = 5
a2 = 42 = 16
a3 = 40+42 = 17
2016/8/7
C = 40+41+42 = 21
演算法 _ 第七章
7-66
精準涵蓋問題 P 子集合之和
的問題



為什麼 k+1?
S1 = {1}, S2 = {1,3}, S3 = {1,4}, S4 = {2}, 選擇 k-2 = 2
A1 = 20 = 1
a2 = 20+22 = 5
a3 = 20+23 = 9
a4 = 21 = 2
C = 20+21+22+23 = 15
= 1+5+9 X
If  k is selected, repeated elts may cause kxki=ki+1.
2016/8/7
演算法 _ 第七章
7-67
證明切割問題是NP-完備問題


很顯然地,驗證給定的解是否是給定的
正整數集合的切割是很容易的事
我們證明子集合之和的問題 P切割問題
2016/8/7
演算法 _ 第七章
7-68
子集合之和的問題 P 切割問題
證明:
子集合之和的問題 :
A = { a1, a2, …, an }, C
切割問題 :
B = { b1, b2, …, bn+2 }, 其中 bi = ai, 1 i  n
bn+1 = C+1
A
bn+2 = (  ai )+1C
1in
C = ai  ( ai )+bn+2 = ( ai )+bn+1
aiS
2016/8/7
aiS
aiS
 切割 : { bi  aiS {bn+2}
與演算法
{ b_i 第七章
aiS }{bn+1}
C
S
S’
7-69
證明頂點涵蓋問題是NP-完備問
題


很顯然地,驗證給定的頂點子集合是否
構成頂點涵蓋是一件很容易的事
證明最大完全子圖問題 P頂點涵蓋問題
2016/8/7
演算法 _ 第七章
7-70
最大完全子圖問題 P 頂點涵蓋
問題
C
A
C
A
E
E
B
D
F
B
F
(b) G
(a) G
2016/8/7
D
演算法 _ 第七章
7-71