演算法_第七章 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 yi2 yi1
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 = 1in eji(k+1)i-1 其中 eji = 1 if ui Sj
eji = 0 if otherwise.
C = 0in-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 )+1C
1in
C = ai ( ai )+bn+2 = ( ai )+bn+1
aiS
2016/8/7
aiS
aiS
切割 : { bi aiS {bn+2}
與演算法
{ b_i 第七章
aiS }{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