コンピュータアルゴリズム2 11. 計算困難問題 ・NP完全問題 ・決定不能

コンピュータアルゴリズム2
11. 計算困難問題
・NP完全問題
・決定不能問題
田浦
http://www.logos.ic.i.u-tokyo.ac.jp
/~tau/lecture/software/
Roadmap




易しい問題
難しい(困難な)問題
NP完全問題
 NP, NP困難, NP完全
 NP完全であることが意味すること
 有名なNP完全問題
 NP完全性の証明
決定不能問題
易しい問題



定義: 入力のサイズnに対して,nのある多項式で抑えられる
( nk)時間で終了するアルゴリズムが存在する問題
 n : 入力の大きさ,k : nに無関係な定数
クラスPに属する問題とも言う
 P : Polynomial time
これまで述べてきた数々の問題(整列,探索,グラフの最短
距離,etc.)はすべてクラスPに属する問題
言葉の慣習




多項式時間
 nのある多項式で抑えられる時間
 注: この定義によれば n log n 時間なども多項式
多項式時間アルゴリズム
 多項式時間で終了するアルゴリズム
 バブルソート,クイックソート,マージソート,コンテナへの
挿入,優先度キューへの挿入,Dijkstra, ... はみな多項式
時間アルゴリズム
(ある問題が)多項式時間で解ける
 それを解く多項式時間アルゴリズムが存在すること
つまり,クラスP = 多項式時間で解ける問題
計算困難な問題



定義: 易しくない問題
 つまり多項式時間アルゴリズムが存在しない問題
実践的意味:
 入力のサイズが尐し大きくなると計算時間がかかりすぎて
事実上解けない問題
注: 解法を思いつくことの難しさ(いわゆる人間にとっての問
題の難しさ)とは別の概念
多項式でない計算時間の例



指数関数時間
 2n, 1.3n, ...
階乗
 n!
これらの計算時間は,しばしば,多くの可能性を「しらみつぶ
しにあたる」時に現れる
多項式でない計算時間を持つアル
ゴリズムの例



問題: 充足可能性(SAT): ある命題論理式の解(式の値が真と
なる,変数への真偽値の割り当て)があるかどうか?
 アルゴリズム: 0/1のすべての組み合わせ(2n通り. n : 未知
数の数)を試す
問題: k 彩色(k-COLOR): グラフの頂点に,隣接(辺で結ばれ
た)頂点が同じ色にならないよう色を塗る.k色で塗れるか?
 アルゴリズム: すべての色の塗り方(kn通り. n : 頂点の数)
を試す
問題: ナップサック(KNAPSACK): n個の整数と目標値bに対し,
n個の中からいくつかを選んでその和=bとできるか?
 アルゴリズム: 各整数を含めるか否かをすべて (2n通り)試
す
注



以上の議論は「多項式時間でないアルゴリズム」の例を示し
たもの
以上でこれらの問題に「多項式時間アルゴリズムは存在しな
い(これらの問題は難しい)」と結論できるわけではない
仮になかったとしても,上記よりよいアルゴリズムがない,と
言っているのでもない(2n よりは1.84nの方がマシ)
難しいことが証明されている問題の
例

ネズミとネコのゲーム[岩田 NP完全問題入門]
 有向グラフの頂点上にチーズ一個,ネコ一匹,ネズミが多
数いる
 交互にネコとネズミ(一匹)を隣の頂点に移動
 一匹のネズミがチーズにたどり着けばネズミの勝ち
NP完全問題 序論


しかし,実用上現れる多くの問題は,易しいことも難しいこと
も証明されていない
 多項式時間アルゴリズムは見つかっていない
 それが存在しないことも証明されていない
 おそらく存在しないと信じられている
しかもそのような問題の多くがこれから述べる「NP完全問
題」と呼ばれる問題であり,ある意味でどれも同程度に難し
いことがわかっている
 NP完全問題のどれか一つが易しいとわかればすべての
NP完全問題は易しく,その逆も然り


NP完全問題の定義を理解し,ある問題がNP完全問題であ
ることを証明する基本手法を身につけることは重要
理由
 実際にそのような問題がしばしば現れるから
 多数のNP完全問題が知られているため,ある問題がNP
完全であることは容易にわかることが多いから
 ある問題がNP完全とわかれば,その問題はたぶん,計算
困難であることが示唆されるから
 近似解で我慢する
 よくある入力に絞って経験則を用いる
クラスNP (1)


NP : Non-deterministic Polynomial time (非決定的多項式時間)
 問題としては出力が1または0の2通りのもの(決定問題; decision
problem)を考える
 「非決定的選択実行文」(複数の文から一つを実行する文)を持つプログ
ラミング言語を考える
 either S1 or S2 : S1またはS2のどちらかを実行
NPの直感的説明
 この言語を使って多項式時間で終了するアルゴリズムが存在し,
 正解が1であるような入力に対しては「運がよければ」1を出力する
 「運がよければ」 = either S1 or S2で常に「よい」選択をすれば
 正解が0であるような入力に対しては「常に」0を出力する
クラスNP (2)
非決定的選択実行文を持つ言語で書かれたプログ
ラムの
 出力は,すべての選択の中で1を返すものが一
つでもあれば1, そうでなければ0, とする
 実行時間は,すべての選択の中で最大のもの,
とする
 ある問題がNPに属するとは,
 その問題を解く,非決定的選択実行文を持つ言
語で書かれたアルゴリズムが存在し,
 実行時間は入力の大きさnの多項式時間
こと

S2
S1
S1
S2
多項式
...
1 0 0 0
0 1
0 1
言葉の慣習




非決定的アルゴリズム
 非決定的選択実行文を持つ言語で書かれたアルゴリズム
非決定的多項式時間アルゴリズム
 実行時間が入力の大きさnの多項式時間である非決定的
アルゴリズム
非決定的に多項式時間で解ける
 ある問題を解く,非決定的多項式時間アルゴリズムが存
在すること
つまりあらためて整理すると
 クラスNP = 非決定的に多項式時間で解ける問題
 クラスP = 多項式時間で解ける問題
注


多くの教科書・本では,
 (プログラミング言語の代わりに)チューリングマシン,
 (either S1 or S2 という構文を持つプログラミング言語の変
わりに)非決定的チューリングマシン
というマシンを用いてP, NPの定式化をする(本質的には同じ
こと)
NPに属する問題の例


先にあげた SAT, k-COLOR, KNAPSACKなどがすべてNPに属すること
は容易にわかる
 すべての組み合わせを試すかわりに「非決定的選択実行」に頼る
SAT (E) { /* E(x0, ..., xn–1) : 論理式 */
for (i = 0; i < n; i++) {
either xi = 0 or xi = 1;
x0 = 0
x0 = 1
}
x1 = 0
x1 = 1
if (E(x0, ..., xn–1) == 1)
return 1;
n
else
return 0;
}
...
NPの別の直感的理解


以下を満たすような問題
 「解候補」が与えられたとき,それが本当に解か(1を返す
か)どうかを多項式時間で検査できる
 解候補の数が2多項式個程度
 各々の解候補は多項式時間で生成できる
「多項式」は入力の大きさの多項式の意味
NPに関して容易にわかること


P  NP
 決定的に多項式時間で解けるなら非決定的に多項式時
間で解ける
NP  EXPTIME
 EXPTIME : 2多項式 時間で解ける問題の集合
 非決定的に時間T(n)で解けたら,すべての非決定的選択
実行 (高々 cT(n)回)において両方の可能性を試すことで,
非決定的選択実行無しでも2cT(n)時間で解ける
NPに関してわかっていないこと


P  NPか, 実は(意外にも) P = NP か? (P=NP問題, PNP予想)
NP  EXPTIMEか, 実は NP = EXPTIMEか?
PNP予想の可能な帰結


可能性1: PNPが証明される
 一つでよいから,NPに属する問題で「Pには属していない
(多項式時間では解けない)ことが証明される」ものが見つ
かる
可能性2: P=NPが証明される
 NPに属するすべての問題が,実はPに属している(多項式
時間で解ける)ことが証明される
 同じ事として,NPに属する問題の中で最も難しいものが,
一つでよいから,実はPに属していることが証明される
NP完全問題
NP困難(NP-hard)問題,
NP完全(NP-complete)問題


NP困難
 直感的意味: NPに属するどの問題よりも尐なくとも同程度
には難しい
NP完全
 NP困難であって,NPに属するもの
 直感的意味: NPの中で最も難しい
NP困難の定義



AB
定義: 問題 A が B に多項式時間で還元可能(polynomialtime reducible)
 問題Aの任意の入力 a をその大きさの多項式時間で,問
題Bへの入力 b = f (a)に変換でき,
 「a に対する解 = f (a)に対する解」が成り立つ
意味「Bが解ければAも解ける」「Bは尐なくともAと同程度に
は難しい」
定義: 問題BがNP困難
 NPに属するどの問題もBに多項式時間で還元可能
NP
B (NP-hard)
NP完全

NPでありかつNP困難である
 NPの中で他のどの問題よりも尐なくとも同程度に難しい
NP
B (NP-complete)
NP困難性を証明する方法(1)

一番最初にNP困難であることを証明するのは大変
 文字通り「NPで解けるすべての問題」が,実はその問題を
解く事に帰着することの証明が必要
 NP完全であることが示された最初の問題: SAT
 Cook. The Complexity of Theorem-Proving Procedures
NP困難性を証明する方法(2)


ひとたび一つのNP困難問題が見つかった後は?
 ある一つのNP困難問題Aが,その問題Bに帰着する(多項
式時間還元可能である)ことを示せば,BのNP困難性が示
せる
 つまり,BはAと尐なくとも同程度に難しい
新しい問題のNP困難性を言うのにほとんど常に用いられる
論法
 「例のあれ(例: SAT)を解くのにこれ(新問題)が使える」
MY-NEW-PROBLEM-2
MY-NEW-PROBLEM-1
SAT
有名なNP完全問題(1)


充足可能性(SAT): 命題論理式を1にする変数への値(0/1)の
割り当てがあるか?
 入力: n変数(x1, ..., xn)命題論理式 (0-1変数, , , からな
る式)E
 出力: E=1に解が存在すれば1, さもなければ0
3-CNFの充足可能性(3SAT): 上記で,命題論理式を各節が
3リテラルから成るCNF (Conjunctive Normal Form)に限定し
たもの
 例: (x1x2x3)  (x1x3x4)  (x2 x3  x4) 
(x1x2 x4)
有名なNP完全問題(2)


ナップサック問題(KNAPSACK): n個の物体からいくつかを
選び出して合計の重さを指定通りにできるか?
 入力: n個の整数a1, ..., an と 整数w
 出力: n個の0-1変数x1, ..., xnを未知数としa1x1+...+anxn= w
に解があれば1, さもなければ0
集合打問題(HITTING-SET): 互いに重なりのあり得るn個の
有限集合がある.一つの集合からちょうど一つの元を選び出
せるか
 入力: n個の有限集合 S1, ..., Sn
 出力: 集合 A  S1  ...  Snで,| A  Si |= 1 (i = 1, ..., n)を
満たすものがあれば1, さもなければ0
有名なNP完全問題(3)

0-1整数計画問題(0-1 INTEGER-PROGRAMMING): n個の
0-1変数に関する整数係数連立一次方程式に解があるか?
 入力: 整数行列Cと整数ベクトルd
 出力: Cx = dとなる0-1ベクトルが存在すれば1, さもなけれ
ば0
有名なNP完全問題(4)


クリーク(CLIQUE): n頂点のグラフに,指定された大きさのク
リーク(完全部分グラフ)があるか?
 入力: グラフGと整数k
 出力: Gがk頂点の完全グラフを部分グラフとして含めば1,
さもなければ0
同型部分グラフ(SUBGRAPH): n頂点のグラフが指定された
グラフを部分グラフとして含むか?
 入力: グラフGとH
 出力: GがHを部分グラフとして含めば1, さもなければ0
有名なNP完全問題(5)


ハミルトン閉路(HAMILTON): n頂点のグラフに全頂点を一
度ずつ通る閉路があるか?
 入力: グラフ
 出力: 全頂点を一度ずつ通る閉路があれば1, さもなけれ
ば0
巡回セールスマン(TSP):n点間の距離が与えられ,全点を与
えられた総距離以内の閉路でつなげるか?
 入力: n点間の距離行列 d(i, j) (1  i  n, 1  j  n)と 総距
離T
 出力: d(p1, p2) + d(p2, p3) + ... + d(pn – 1, pn) + d(pn, p1)  T
なる1, 2, ..., n の順列(p1, ..., pn)が存在すれば1, さもなけ
れば0
有名なNP完全問題(6)

k-彩色(k-COLOR) : n頂点のグラフの隣り合う頂点が同じ色
にならないように頂点をある決まったk ( 3)色でぬれるか
 入力: グラフG
 出力: 頂点を上記を満たすようk色でぬれれば1, さもなけ
れば0
この他に数千のNP完全問題が知られている
http://www.nada.kth.se/~viggo/problemlist/
A compendium of NP optimization problems
可能な多項式時間還元の鎖
KNAPSACK
HITTING-SET
0-1 INTEGER-PROGRAMMING
3SAT
CLIQUE
SUBGRAPH
HAMILTON
TSP
k-COLOR
A

初級
中級
上級
B : A が B に多項式時間還元可能
以降: HAMILTON  TSP, SAT  KNAPSACK
初級編: HAMILTON  TSP



考え方: HAMILTONを解くのにTSPで解けないか?
 全頂点を回る閉路を見つける問題を,TSP (規定時間で全
頂点を回れるか)に変換できないか?
G = V, Eのハミルトン閉路を見つけるのに,以下のように
TSPにおける頂点間の距離を設定する
 辺 (a, b)  E ならば d(a, b) = 1,
 そうでなければ d(a, b) = n + 1
 そして,総距離 = n とする
あきらかにこのTSPに解があることと,Gにハミルトン閉路が
有ることは同値
3SAT  KNAPSACK




3CNFとは
3SATの組み合わせ構造
3SATをKNAPSACK風連立一次方程式へ
3SATをKNAPSACKへ
CNF, 3CNFとは




リテラル(literal): 変数またはその否定
 x または x
節(clause): いくつかのリテラルをORで結合したもの
 l1  ...  ln (li : リテラル)
和積標準形(Conjunctive Normal Form; CNF): いくつかの節
をANDで結合したもの
 C1  ...  Cm (Ci : 節)
3CNF : CNFで各節の大きさ(リテラル数)が3
 例: (x1x2x3)  (x1x3x4)  (x2 x3  x4)  (x1x2
x4)
3SATの組み合わせ構造



つまりは各節から尐なくとも一つ1となるリテラルを選べということ
 (x1x2x3)  (x1x3x4)  (x2x3x4)  (x1x2
x4)
書き換えの一歩
 x1x2x3  x1 + x2 + x3  1
xは,xと独立な変数yとみなした上でx + y = 1を課す
x1  x2  x3
x1  x3  x4
x2  x3  x4
x1  x2  x4
x1 + x2 + x3  1
y1 + y3 + x4  1
x2 + x3 + x4  1
y1 + y2 + y4  1
x1 + y1 = 1
x2 + y2 = 1
x3 + y3 = 1
x4 + y4 = 1
KNAPSACK風連立方程式
不等式を等式へ変換
 x + y + z  1  d, e{0,1} x + y + z + d + e = 3

x1 + x2 + x3  1
y1 + y3 + x4  1
x2 + x3 + x4  1
y1 + y2 + y4  1

x1 + y1 = 1
x2 + y2 = 1
x3 + y3 = 1
x4 + y4 = 1
x1 + x2 + x3 + z1 + z2 = 3
y1 + y3 + x4 + z3 + z4 = 3
x2 + x3 + x4 + z5 + z6 = 3
y1 + y2 + y4 + z7 + z8 = 3
が解を持つ
x1 + y1 = 1
x2 + y2 = 1
x3 + y3 = 1
x4 + y4 = 1
が解を持つ
ここまでのところ

与えられた3CNFの充足可能性を,等価な0/1の方程式Ax =
bに変換した
b
A : 0-1行列
x
3
3
= ...
3
1
...
1
m (節の数)
n (変数の数)
2n+2m
0-1ベクトル
KNAPSACKへの変換

Aの各列ベクトルaiとbを一つの(2n+2m+1)進整数とみなす
 例: n = m = 4 の場合
0
1
0
0
1
1
1

(1110010)17=25640964
元の方程式はこうして得られた整数を係数とするナップサック問題
a1’ x1 + ... + a2n’ x2n = b’ と等価 (○’ は ベクトル○を変換して得た整数)
決定不能(undecidable)問題とは


正しいアルゴリズムが存在しない決定問題
決定不能であることが「証明されている」問題が有る
コンピュータで問題が「解ける」とい
うこと
問題は入力と出力の間の関係として規定される
 一般にある問題に対する可能な入力は可算個ある
 つまり「問題」とは自然数を領域とした「関数」に他ならない
 ある問題の特定の入力のことをその問題の「インスタンス(実例)」とも
言う
 あるプログラムが,ある問題のすべての可能な入力(実例)に対して
 常に停止する(無限ループに陥らない)
 常に正しい答えを出す
とき,そのプログラムは,その問題を解く(正しいアルゴリズムである)という
 ある問題を解くプログラムが存在するとき,その問題は決定可能であると
いう(コンピュータでその問題が解ける)

可算集合

可算集合
 自然数との一対一対応がつく集合を可算集合(coutable
set)という
 字面から, 可算=数えられる=有限, というのは誤解
 あくまで可算は「無限」の一種
可算集合の例







自然数の集合 N = { 0, 1, 2, 3, … }
自然数2つの組の集合
 N2 = { (0,0), (0,1), (1,0), (0,2), (1,1), (2,0), … }
 明らかに自然数Nよりも「大きい」気がするがそれでも可算
有理数の集合
自然数100個の組
有限個の自然数の組
代数的な数の集合
有限個の文字からなる文字列
 すべてのプログラムの集合も可算
可算でない集合の例





自然数の部分集合すべての集合
 2N = { S | S  N }
自然数から要素数2以上の有限集合への関数の集合
 N  E (|E|  2)
 実際2N は N { 0, 1 }に他ならない
(長さ無限の)自然数列, ビット列の集合
 自然数列は「N  N」の要素, ビット列は N { 0, 1 }の要
素に他ならない
実数の集合(とくに[0, 1])
 [0, 1]は2進小数展開により無限のビット列に他ならない
ここで挙げたものはどれも「連続濃度」を持つ集合
2Nは可算でない
S1
1
1
0
S2 ... T ?
1 ...
1 ...
0 ...
...
...
S0
0 0
1 1
2 1
...

カントールの対角線論法
2Nが可算だとする(= S0, S1, S2, …)
 T = { i | i  Si }
 TはNの部分集合だがどのSiとも明らかに一致しない
...

決定不能な問題





「問題」とは自然数を領域とする関数のことであった
自然数を領域とする関数の集合は可算集合ではない
一方すべてのプログラム(有限の文字列)の集合は可算集合
よってプログラムで表現できない問題(自然数を領域とする
関数)が存在すること自体はこれで示せていることになる
具体的に(人間が解きたくなる問題で)見つけるのはまた別の
話
決定不能な問題の例


整数係数多項式(ディオファントス方程式)の整数解
 入力: n 変数の,整数係数の多項式P
 例: x100 + y100 – z100 = 0
 出力: P(x1, x2, ..., xn) = 0 に整数解が存在すれば1, しなけ
れば0
プログラムの停止性の判定
 入力: プログラムPとそれに対する入力X (文字列)
 出力: PにXを与えて実行して,停止するなら1, 停止しなけ
れば0

P0
0
1
1
P1
1
1
0
...
...

プログラム(文字列)は可算個
 P0, P1, P2, ... と書く
入力(文字列)も可算個
 X0, X1, X2, ... と書く
「停止性の判定」とは Pi に Xj を入力
すると停止するかどうかをすべてのi, j
X0
に対して判定すること
X1
 このプログラム halt(i, j) が存在す
X2
るとして矛盾を導く
...

...
停止性の判定は決定不能(証明)
P2
1
1
0
...
...
...
...
P0
0
1
1
P1
1
1
0
...
...
...

confuse(i) {
if (halt(i, i) = 0)
return; /* 終了 */
else
halt
無限ループに入る;
}
confuse自身もプログラムだから,どこ
X0
かの列に対応している (Pc とする)
X1
X2
...

confuse
P2
1
1
0
...
...
...
...
P1
1
1
0
...
...
confuse(i) {
if (halt(i, i) = 0)
return;
else
無限ループに入る;
}
X0
X1
X2
P0
0
1
1
...

= 0  halt(c, c) = 0  confuse(c)は作り方により停止する
(矛盾)
= 1  halt(c, c) = 1  confuse(c)は作り方により停止しな
い (矛盾)
confuse
halt(i, i)
...

P2
1
1
0
...
...
...
...
おしまい
本講義の続き





プログラムの正しさ
計算量
基本アルゴリズム
 整列
 探索
 グラフ
 (文字列)
NP完全
決定不能
データベース(大量のデータからの探索,B木)
情報システム工学(杉本?)
文法の認識・構文解析
後期B演習(田浦)
形式言語理論・オートマトン
ソフトウェア基礎理論(近山)
ネットワークフロー,最適化(線形計画法)
システム数理工学(藤井・山地)
チューリングマシン,計算モデル
ソフトウェア基礎理論(近山)
計算困難な問題に対するアプローチ
システム工学基礎(伊庭)