Aritalab:Lecture/Algorithm/CooksTheorem

From Metabolomics.JP
< Aritalab:Lecture | Algorithm(Difference between revisions)
Jump to: navigation, search
m
m (SAT問題と3SAT問題)
 
(26 intermediate revisions by one user not shown)
Line 1: Line 1:
==クックの定理==
+
注:このページを理解するためには、[[Aritalab:Lecture/Algorithm/NP|P, NP という問題クラスの概念]]と[[Aritalab:Lecture/Automata/TM|チューリングマシン]]の知識が必要です。
クックは1971年に論理式の充足可能性問題がNP完全であることを証明しました。
+
 
 +
==クックの功績==
 +
[http://en.wikipedia.org/wiki/Stephen_Cook クック (Stephen Cook)] は1971年に論理式の充足可能性問題がNP完全であることを証明しました。
 +
この論文が計算量理論にもたらした功績は複数あります。
 +
* 問題を多項式時間で変換することの重要性を説いた
 +
* 非決定性の判定問題に焦点を当てた
 +
* 充足可能性問題がNP完全であることを証明した
 +
 
 +
この功績により、クックは[http://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E8%B3%9E Turing賞]を受賞しています。
 
;参考文献 : Garey MR, Johnson DS "Computers and Intractability" ''WH Freeman & Co.'' 1979
 
;参考文献 : Garey MR, Johnson DS "Computers and Intractability" ''WH Freeman & Co.'' 1979
  
 
==論理式の充足可能性問題==
 
==論理式の充足可能性問題==
ブール変数の集合 U = { u<sub>1</sub>, u<sub>2</sub> ... u<sub>m</sub> } に対する真偽の割り当て t: U &rarr; {T, F} を考えます。変数が m 個あれば、割り当てパターンは 2<sup>m</sup> 通りあります。
+
ブール変数の集合 U = { u<sub>1</sub>, u<sub>2</sub> ... u<sub>m</sub> } に対する真偽の割り当て U &rarr; {T, F} を考えます。変数が m 個あれば、割り当てパターンは 2<sup>m</sup> 通りあります。
U に含まれる複数個のブール変数 u またはその否定 ¬u を &or; (or) でつないだものを節といいます。
+
U に含まれる複数個のブール変数 u またはその否定 ¬u を論理和 (or) &or; でつないだものを節といいます。
 
節が真になるとき、その節は充足されたといいます。
 
節が真になるとき、その節は充足されたといいます。
 
例えば{ u<sub>1</sub>, ¬u<sub>2</sub>, u<sub>3</sub> } という節は、 u<sub>1</sub> = F かつ u<sub>2</sub> = T かつ u<sub>3</sub> = F でない限り充足されます。(充足する真偽の割り当ては7パターンあります。)
 
例えば{ u<sub>1</sub>, ¬u<sub>2</sub>, u<sub>3</sub> } という節は、 u<sub>1</sub> = F かつ u<sub>2</sub> = T かつ u<sub>3</sub> = F でない限り充足されます。(充足する真偽の割り当ては7パターンあります。)
  
節の集合 C が充足可能であるとは、C に含まれる節を全て充足するようなブール変数の集合 U に対する真偽の割り当て t が存在することをいいます。この定義を用いて、充足可能性問題 (SAT: Satisfiability Problem) は以下のように書けます。
+
節の集合 C が充足可能であるとは、C に含まれる節を全て充足するようなブール変数の集合 U に対する真偽の割り当てが存在することをいいます。この定義を用いて、充足可能性問題 (SAT: Satisfiability Problem) は以下のように書けます。
  
 
:「変数の集合 U 上の節集合 C に対して、それを充足する真偽の割り当てが存在するか?」
 
:「変数の集合 U 上の節集合 C に対して、それを充足する真偽の割り当てが存在するか?」
Line 16: Line 24:
 
: C = { {¬u<sub>1</sub>, u<sub>2</sub>}, {u<sub>1</sub>, ¬u<sub>2</sub>} } は充足可能 ( u<sub>1</sub> = u<sub>2</sub> = T のとき)
 
: C = { {¬u<sub>1</sub>, u<sub>2</sub>}, {u<sub>1</sub>, ¬u<sub>2</sub>} } は充足可能 ( u<sub>1</sub> = u<sub>2</sub> = T のとき)
 
: C = { {u<sub>1</sub>, u<sub>2</sub>}, {u<sub>1</sub>, ¬u<sub>2</sub>}, {¬u<sub>1</sub>} } は充足不可能
 
: C = { {u<sub>1</sub>, u<sub>2</sub>}, {u<sub>1</sub>, ¬u<sub>2</sub>}, {¬u<sub>1</sub>} } は充足不可能
となります。充足可能性を判定するには、2<sup>m</sup> 通りに近い真偽パターンを試す以外に方法が無いと考えられています。
+
となります。充足可能性を判定するには、2<sup>m</sup> 通りに近い真偽パターンを試す以外に方法が無さそうです。それゆえNP完全、クラスNPの中でも最も難しいとされる問題クラスに属しています。(ただしP &ne; NP は証明されていません。) 充足可能性は英語で SATISFIABILITY なので、SAT問題と呼ばれます。
  
==Cookの定理==
+
==クックの定理==
 
; 充足可能性問題 (SAT) はNP完全である
 
; 充足可能性問題 (SAT) はNP完全である
  
 
SATがNPに入ることは明らかです。正解となる論理変数の割り当てを知っていれば、節が充足されることを検証するのは簡単です(線形時間しか要しません)。
 
SATがNPに入ることは明らかです。正解となる論理変数の割り当てを知っていれば、節が充足されることを検証するのは簡単です(線形時間しか要しません)。
 
SATがNP完全であることを示すには、NPに属するあらゆる問題が、SATの一例とみなせることを示さなくてはなりません。しかし、あらゆるNP問題を逐一SATに変換していては埒が明きません。
 
SATがNP完全であることを示すには、NPに属するあらゆる問題が、SATの一例とみなせることを示さなくてはなりません。しかし、あらゆるNP問題を逐一SATに変換していては埒が明きません。
そのかわり、非決定性チューリング機械 (NDTM) の全動作パターンを、SATで特定できることを示します。
+
そのかわり、非決定性チューリング機械 (NDTM) の全動作パターン、すなわち、(多項式時間で終了する)あらゆるプログラムをSATで特定できることを示します。
  
入力文字列を x 、計算が終わるまでに必要な多項式時間ステップを p(n) (n = |X|) とします (受理状態も含めます)。 この時間内で、NDTM ''M'' = (&Gamma;, Q, &delta;, x) はテープ位置 -p(n) から p(n) + 1 の内側しか処理できないことを利用します。''M'' の状態数やテープ記号数も有限ですから、これらに関する処理を有限個の変数で記述することが可能です。
+
入力文字列を x 、計算が終わるまでに必要な多項式時間ステップを p(n) (n = |X|) とします (受理状態も含めます)。 この時間内で、NDTM ''M'' = (&Gamma;, Q, &delta;, x) はテープ位置 &minus; p(n) から p(n) + 1 の内側しか処理できないことを利用します。''M'' の状態数やテープ記号数も有限ですから、これらに関する処理を有限個の変数で記述することが可能です。
  
 
{| class="wikitable"
 
{| class="wikitable"
+ ''M'' の記述に用いる変数
+
|+ ''M'' の記述に用いる変数
 
|-
 
|-
 
! 変数 || 意味 || パラメータ || 大雑把な個数
 
! 変数 || 意味 || パラメータ || 大雑把な個数
Line 44: Line 52:
 
| 2 p(n)<sup>2</sup> * v
 
| 2 p(n)<sup>2</sup> * v
 
|}
 
|}
: r ... 初期状態 q<sub>0</sub>、受理状態 q<sub>Y</sub>, q<sub>N</sub> も含めた全状態数 |Q|
+
ただし
: v ... 空白記号や入力記号も含めた、テープ記号数 | &Gamma; |
+
: r ... 初期状態 q<sub>0</sub>、受理状態 q<sub>Y</sub>, q<sub>N</sub> も含めた全状態数 |Q| のこと、
 +
: v ... 空白記号 (b = s<sub>0</sub>とする) や入力記号も含めた、テープ記号数 | &Gamma; | のこと
 +
です。 r や v は NDTM の構造で決まる定数とみなせるので、変数の総数は p(n)<sup>2</sup> オーダーであることがわかります。
  
これらの変数を用いて次表に示す節を作成し、NDTM ''M'' の動きを規定します。
+
これらの変数を用いて次表に示す6つの節グループを作成し、NDTM ''M'' の動きを規定しましょう。
  
 
{| class="wikitable"
 
{| class="wikitable"
! グループ || 意味 || 節の構成 || 変数の範囲 || 節の個数(大雑把に)
+
! width="10%"| グループ
 +
! width="20%"| 意味
 +
! width="40%"| 節の構成
 +
! width="15%"| 変数の範囲
 +
! width="15%"| 節の個数(大雑把に)
 
|-
 
|-
| rowspan="2"| 状態に関する制約
+
| rowspan="2"| 1. 状態に関する制約
 
| 時刻 i において ''M'' はいずれかの状態にある
 
| 時刻 i において ''M'' はいずれかの状態にある
 
| { Q [ t<sub>i</sub>, q<sub>0</sub> ],  Q [ t<sub>i</sub>, q<sub>Y</sub> ],  Q [ t<sub>i</sub>, q<sub>N</sub> ],  Q [ t<sub>i</sub>, q<sub>3</sub> ],  ... ,  Q [ t<sub>i</sub>, q<sub>r</sub> ] }  
 
| { Q [ t<sub>i</sub>, q<sub>0</sub> ],  Q [ t<sub>i</sub>, q<sub>Y</sub> ],  Q [ t<sub>i</sub>, q<sub>N</sub> ],  Q [ t<sub>i</sub>, q<sub>3</sub> ],  ... ,  Q [ t<sub>i</sub>, q<sub>r</sub> ] }  
Line 63: Line 77:
 
| p(n) * r<sup>2</sup>/2
 
| p(n) * r<sup>2</sup>/2
 
|-
 
|-
| rowspan="2" | ヘッド位置に関する制約
+
| rowspan="2" | 2. ヘッド位置に関する制約
 
| 時刻 i においてヘッドはいずれかのテープ位置にある
 
| 時刻 i においてヘッドはいずれかのテープ位置にある
| { H [ t<sub>i</sub>, -p(n) ],  H [ t<sub>i</sub>, -p(n)+1 ],  ...,  H [ t<sub>i</sub>, p(n)+1</sub> ] }
+
| { H [ t<sub>i</sub>, &minus;p(n) ],  H [ t<sub>i</sub>, &minus;p(n)+1 ],  ...,  H [ t<sub>i</sub>, p(n)+1 ] }
 
| 0 &le; i &le; p(n)
 
| 0 &le; i &le; p(n)
 
| p(n)
 
| p(n)
Line 71: Line 85:
 
| 時刻 i においてヘッドは二つの位置を同時に取らない
 
| 時刻 i においてヘッドは二つの位置を同時に取らない
 
| { ¬H [ t<sub>i</sub>, j ],  ¬H [ t<sub>i</sub>, j' ] }
 
| { ¬H [ t<sub>i</sub>, j ],  ¬H [ t<sub>i</sub>, j' ] }
| 0 &le; i &le; p(n), <br/> -p(n) &le; j < j' &le; p(n)+1
+
| 0 &le; i &le; p(n), <br/> &minus;p(n) &le; j < j' &le; p(n)+1
 
| p(n) * 2 p(n)<sup>2</sup>
 
| p(n) * 2 p(n)<sup>2</sup>
 
|-
 
|-
| rowspan="2" | テープに書く記号に関する制約
+
| rowspan="2" | 3. テープに書く記号に関する制約
 
| 時刻 i においてテープ位置 j にはいずれかの記号 k がある
 
| 時刻 i においてテープ位置 j にはいずれかの記号 k がある
 
| { S [ t<sub>i</sub>, j, s<sub>0</sub> ],  S [ t<sub>i</sub>, j, s<sub>1</sub> ],  ...,  S [ t<sub>i</sub>, j, s<sub>v</sub> ] }  
 
| { S [ t<sub>i</sub>, j, s<sub>0</sub> ],  S [ t<sub>i</sub>, j, s<sub>1</sub> ],  ...,  S [ t<sub>i</sub>, j, s<sub>v</sub> ] }  
| 0 &le; i &le; p(n),  <br/> -p(n) &le; j &le; p(n)+1
+
| 0 &le; i &le; p(n),  <br/> &minus;p(n) &le; j &le; p(n)+1
 
| p(n) * 2 p(n)
 
| p(n) * 2 p(n)
 
|-
 
|-
 
| 時刻 i においてテープ位置 j は二種の記号を同時に取らない
 
| 時刻 i においてテープ位置 j は二種の記号を同時に取らない
 
| { ¬S [ t<sub>i</sub>, j, s<sub>k</sub> ],  ¬S [ t<sub>i</sub>, j, s<sub>k'</sub> ] }
 
| { ¬S [ t<sub>i</sub>, j, s<sub>k</sub> ],  ¬S [ t<sub>i</sub>, j, s<sub>k'</sub> ] }
| 0 &le; i &le; p(n),  <br/> -p(n) &le; j &le; p(n)+1,  <br/> 0 &le;k < k' &le; v
+
| 0 &le; i &le; p(n),  <br/> &minus;p(n) &le; j &le; p(n)+1,  <br/> 0 &le;k < k' &le; v
 
| p(n) * 2 p(n) * v
 
| p(n) * 2 p(n) * v
 
|-
 
|-
| ''M'' の初期設定に関する制約
+
| rowspan="2"| 4. ''M'' の初期設定に関する制約
| 初めはテープに入力 x = k<sub>1</sub>k<sub>2</sub>...k<sub>n</sub>のみ
+
| 時間0の初期状態では、テープが左端でヘッドは空白記号をみている
| { Q [ t<sub>0</sub>, q<sub>0</sub> ] },  { H [ t<sub>0</sub>, 1 ] },  { S [ t<sub>0</sub>, 0, s<sub>0</sub> ] }<br/> { S [ t<sub>0</sub>, 1, k<sub>1</sub> ] },  { S [ t<sub>0</sub>, 2, k<sub>2</sub> ] },  ... { S [ t<sub>0</sub>, n, k<sub>n</sub> ] },  <br/> { S [ t<sub>0</sub>, n+1, b ] },  { S [ t<sub>0</sub>, n+2, b ] },  ... { S [ t<sub>0</sub>, p(n)+1, b ] }
+
|{ Q [ t<sub>0</sub>, q<sub>0</sub> ] },  { H [ t<sub>0</sub>, 1 ] },  { S [ t<sub>0</sub>, 0, s<sub>0</sub> ] }
 +
| -
 +
| 3
 +
|-
 +
| テープに入力 x = k<sub>1</sub>k<sub>2</sub>...k<sub>n</sub>のみ書かれている
 +
|{ S [ t<sub>0</sub>, 1, k<sub>1</sub> ] },  { S [ t<sub>0</sub>, 2, k<sub>2</sub> ] },  u... { S [ t<sub>0</sub>, n, k<sub>n</sub> ] },  <br/> { S [ t<sub>0</sub>, n+1, b ] },  { S [ t<sub>0</sub>, n+2, b ] },  ... { S [ t<sub>0</sub>, p(n)+1, b ] }
 +
| -
 
| p(n)
 
| p(n)
 
|-
 
|-
| 受理状態に関する制約
+
| 5. 受理状態に関する制約
 
| 時刻 p(n) には ''M'' が状態 q<sub>Y</sub> に到達
 
| 時刻 p(n) には ''M'' が状態 q<sub>Y</sub> に到達
 
| { Q [ t<sub>p(n)</sub>, q<sub>Y</sub> ] }
 
| { Q [ t<sub>p(n)</sub>, q<sub>Y</sub> ] }
 +
| -
 
| 1
 
| 1
 
|-
 
|-
| rowspan="2" | 状態遷移に関する制約
+
| rowspan="2" | 6. 状態遷移に関する制約
| 時刻 i にテープ j をアクセスしなければ j の中身は i+1 に変化しない
+
| 時刻 i にテープ位置 j をアクセスしない場合 j の中身はs<sub>l</sub>のまま変化しない
 
| { ¬S [ t<sub>i</sub>, j, s<sub>l</sub> ],  H [ t<sub>i</sub>, j ],  S [ t<sub>i+1</sub>, j, s<sub>l</sub> ] }
 
| { ¬S [ t<sub>i</sub>, j, s<sub>l</sub> ],  H [ t<sub>i</sub>, j ],  S [ t<sub>i+1</sub>, j, s<sub>l</sub> ] }
| 0 &le; i &le; p(n),  <br/> -p(n) &le; j &le; p(n)+1,  <br/> 0 &le; l &le; v
+
| 0 &le; i &le; p(n),  <br/> &minus;p(n) &le; j &le; p(n)+1,  <br/> 0 &le; l &le; v
 
| 2 p(n)<sup>2</sup> * v
 
| 2 p(n)<sup>2</sup> * v
 
|-
 
|-
| 時刻 i
+
| 時刻 i における状態遷移が &delta;(q<sub>k</sub>,s<sub>l</sub>) = (q<sub>k'</sub>,s<sub>l'</sub>,&Delta;) で表現される
 +
| { ¬H[ t<sub>i</sub>, j ], ¬Q[ t<sub>i</sub>, q<sub>k</sub> ], ¬S[ t<sub>i</sub>, j, s<sub>l</sub> ],<br/> H[ t<sub>i+1</sub>, j + &Delta; ] }<br/>{ ¬H[ t<sub>i</sub>, j ], ¬Q[ t<sub>i</sub>, q<sub>k</sub> ], ¬S[ t<sub>i</sub>, j, s<sub>l</sub> ],<br/> Q[ t<sub>i+1</sub>, q<sub>k'</sub> ] } <br/>{ ¬H[ t<sub>i</sub>, j ], ¬Q[ t<sub>i</sub>, q<sub>k</sub> ], ¬S[ t<sub>i</sub>, j, s<sub>l</sub> ],<br/> S[ t<sub>i+1</sub>, j, s<sub>l'</sub> ] } <br/>
 +
| 0 &le; i < p(n),<br/>&minus;p(n) &le; j &le; p(n) + 1,<br/>0 &le; k &le; r,<br/>0 &le; l &le; v
 +
| 6 * p(n)<sup>2</sup>* r * v
 +
|}
  
 +
===節の解釈===
 +
表中にでてくる節の形には大きく分けて以下の5パターンあります。
 +
 +
;1. { L<sub>1</sub>, L<sub>2</sub>, ... L<sub>k</sub> } : この形は、どれか一つでもTrueであれば満たされるので、選択肢を記述するために使われます。
 +
 +
;2. { ¬L<sub>1</sub>, ¬L<sub>2</sub> } : この形は、両方が真であるときに限り満たせないので、選択肢の排他性を記述するために使われます。
 +
表のうちグループ1からグループ3までの制約はこの2パターンで書かれています。
 +
 +
;3. { L } : この形は L が必ず True であることを意味します。初期設定や受理状態など、グループ4とグループ5の制約がこのパターンで書かれています。
 +
 +
;4. { ¬L<sub>1</sub>, L<sub>2</sub>, L<sub>3</sub> } : この形は、( if not L<sub>2</sub> then L<sub>1</sub> &rarr; L<sub>3</sub> ) という論理式に読みかえられます。
 +
 +
;5. { ¬L<sub>1</sub>, ¬L<sub>2</sub>, ¬L<sub>3</sub>, L<sub>4</sub> } : この形は、( L<sub>1</sub> &and; L<sub>2</sub> &and; L<sub>3</sub> &rarr; L<sub>4</sub> ) という論理式に読みかえられます。こうするとグループ6に属す節は以下の内容を記述していることがわかります。
 +
* if not H [ t<sub>i</sub>, j ] &rarr; (S [ t<sub>i</sub>, j, s<sub>l</sub> ] &rarr;  S [ t<sub>i+1</sub>, j, s<sub>l</sub> ]) <br/> もしヘッドがテープ位置 j を見ていないなら、テープ位置の内容 s<sub>l</sub> は時刻 i+1 になっても s<sub>l</sub> のまま
 +
* (H[ t<sub>i</sub>, j ] &and; Q[ t<sub>i</sub>, q<sub>k</sub> ] &and; S[ t<sub>i</sub>, j, s<sub>l</sub> ]) &rarr; H[ t<sub>i+1</sub>, j + &Delta; ] (Q, Sも同様) <br/>もしヘッドがテープ位置 j で状態 (q<sub>k</sub>,s<sub>l</sub>) を満たすなら、時刻 i+1 には状態は (q<sub>k'</sub>,s<sub>l'</sub>) となり、ヘッドは&Delta;移動する
 +
 +
表に出てくる節の個数は p(n)<sup>3</sup> のオーダーで抑えられますし、各節の中には p(n) オーダーの変数しか現れません。
 +
結果として、いかなる NDTM のプログラムを与えられても、プログラムの全動作を入力文字列 p(n)<sup>4</sup> オーダーのSAT問題として記述できることがわかりました。
 +
 +
==NP完全性のインパクト==
 +
クックの定理から以下のことがわかります。
 +
 +
{|
 +
| 問題 x がクラスNPに属する ||&hArr; || 定義より、x に多項式時間でYESという NDTM のプログラムが存在
 +
|-
 +
| ||&hArr; || クックの定理により NDTM の入力とプログラム(の可能な全動作列)を多項式時間で変換したSAT問題が存在
 
|}
 
|}
 +
 +
つまり、SAT問題の表現能力はチューリングマシンのあらゆる動作列、すなわちクラスNPに属する全ての問題を包含しているのです。そのため、どんなSAT問題を与えられても多項式時間で解くアルゴリズムがあるとするならば、クラス NP に属するいかなる問題でもO(p(n)<sup>4</sup>)時間でSAT問題に変換することで、それらを多項式時間で解くことになります。つまり、SAT問題は NP に属するどの問題と比較しても同等以上に難しい、NP完全であることが示されています。
 +
 +
==SAT & 3SAT==
 +
 +
SAT問題は複雑な論理式が多く使われており、解くのが十分に難しそうです。しかし、各節にリテラルをちょうど3つしか含まないように制約を設けた3-SATISFIABILITYもNP完全であることが簡単に示せます。
 +
 +
;3SAT問題はNP完全
 +
 +
3SATを充足させる変数の T, F が与えられたらすぐにYESと判断できるため、3SAT &isin; NP です。
 +
ここで SAT から 3SAT への変換を考えます。SATにおける各節 C を以下のように変換します。
 +
 +
* 変数を1個含む場合 C = { z }
 +
: C にしか使わない変数を二つ x<sub>1</sub>, x<sub>2</sub> 用意し、次の4節で置き換えます。 { { z, x<sub>1</sub>, x<sub>2</sub> } &and; { z, &not;x<sub>1</sub>, x<sub>2</sub> } &and; { z,  x<sub>1</sub>, &not;x<sub>2</sub> } &and; { z,  &not;x<sub>1</sub>, &not;x<sub>2</sub> } }
 +
 +
* 変数を2個含む場合 C = { z<sub>1</sub>, z<sub>2</sub> }
 +
: C にしか使わない変数 x を用意し、次の2節で置き換えます。 { { z<sub>1</sub>, z<sub>2</sub>, x } &and; { z<sub>1</sub>, z<sub>2</sub>, &not;x } }
 +
 +
* 変数を3個含む場合はそのまま使います。
 +
 +
* 変数を k (> 3) 個含む場合 C = { z<sub>1</sub>, z<sub>2</sub>, ... z<sub>k</sub> }
 +
: C にしか使わない変数を k&minus;3 個用意し { x<sub>1</sub>, x<sub>2</sub>, ... x<sub>k-3</sub> } 、次の k&minus;2 節で置き換えます。
 +
: C' = { { z<sub>1</sub>, z<sub>2</sub>, x<sub>1</sub> } &and; { &not;x<sub>1</sub>, z<sub>3</sub>, x<sub>2</sub> } &and; { &not;x<sub>2</sub>, z<sub>4</sub>, x<sub>3</sub> } } ... &and; { &not;x<sub>k-3</sub>, z<sub>k-1</sub>, z<sub>k</sub> } }
 +
 +
もとの節に含まれる変数の数が 3 個以下の場合、上記の変換において、もとの節における変数のアサインメントで充足可能 &hArr; 置き換えた節が充足可能 であることがすぐにわかります。 新しく導入する変数のアサインメントは T でも F でもよいからです。変数を k 個含むときだけ少し面倒です。
 +
 +
もとの節 C = { z<sub>1</sub>, z<sub>2</sub>, ... z<sub>k</sub> } が充足可能な時、少なくともある変数 z<sub>m</sub> が T になっています。もし m が 1 か 2 の場合は x<sub>1</sub> ... x<sub>k-3</sub> を全て F にすれば、変換後の節 C' が充足されます。もし m が k&minus;1 か k の場合は、x<sub>1</sub> ... x<sub>k-3</sub> を全て T にすれば節 C' が充足されます。もし m が l の場合は、 x<sub>1</sub> ... x<sub>l-2</sub> をすべて T にし、 x<sub>l-1</sub> ... x<sub>k-3</sub> を全て F にすれば C' が充足されます。 T となるリテラルが1個以上の場合は T の数が増えるだけなので、C' の充足性に変化はありません。
 +
 +
逆に、置き換えた節 C' が充足可能である時は、必ず z<sub>1</sub> ... z<sub>k</sub> のいずれかが T にならざるを得ませんから(背理法ですぐに証明できます)、もとの節 C が充足可能になります。
 +
 +
以上をまとめると、任意のSAT問題を与えられたら、節の数とほぼ同数の変数を追加に用意するだけで等価な 3SAT 問題を構成できることが示せました。
 +
このように問題を変換 (reduce) することで、[[Aritalab:Lecture/Algorithm/Reducibility|様々な問題がNP完全であることを証明]]できます。重要な組み合わせ問題に対してこれをCookの定理の翌年に示したのが、現在はバイオインフォマティクスを研究している Richard M Karp でした。

Latest revision as of 08:58, 14 October 2011

注:このページを理解するためには、P, NP という問題クラスの概念チューリングマシンの知識が必要です。

Contents

[edit] クックの功績

クック (Stephen Cook) は1971年に論理式の充足可能性問題がNP完全であることを証明しました。 この論文が計算量理論にもたらした功績は複数あります。

  • 問題を多項式時間で変換することの重要性を説いた
  • 非決定性の判定問題に焦点を当てた
  • 充足可能性問題がNP完全であることを証明した

この功績により、クックはTuring賞を受賞しています。

参考文献 
Garey MR, Johnson DS "Computers and Intractability" WH Freeman & Co. 1979

[edit] 論理式の充足可能性問題

ブール変数の集合 U = { u1, u2 ... um } に対する真偽の割り当て U → {T, F} を考えます。変数が m 個あれば、割り当てパターンは 2m 通りあります。 U に含まれる複数個のブール変数 u またはその否定 ¬u を論理和 (or) ∨ でつないだものを節といいます。 節が真になるとき、その節は充足されたといいます。 例えば{ u1, ¬u2, u3 } という節は、 u1 = F かつ u2 = T かつ u3 = F でない限り充足されます。(充足する真偽の割り当ては7パターンあります。)

節の集合 C が充足可能であるとは、C に含まれる節を全て充足するようなブール変数の集合 U に対する真偽の割り当てが存在することをいいます。この定義を用いて、充足可能性問題 (SAT: Satisfiability Problem) は以下のように書けます。

「変数の集合 U 上の節集合 C に対して、それを充足する真偽の割り当てが存在するか?」

例えばU = { u1, u2 } において

C = { {¬u1, u2}, {u1, ¬u2} } は充足可能 ( u1 = u2 = T のとき)
C = { {u1, u2}, {u1, ¬u2}, {¬u1} } は充足不可能

となります。充足可能性を判定するには、2m 通りに近い真偽パターンを試す以外に方法が無さそうです。それゆえNP完全、クラスNPの中でも最も難しいとされる問題クラスに属しています。(ただしP ≠ NP は証明されていません。) 充足可能性は英語で SATISFIABILITY なので、SAT問題と呼ばれます。

[edit] クックの定理

充足可能性問題 (SAT) はNP完全である

SATがNPに入ることは明らかです。正解となる論理変数の割り当てを知っていれば、節が充足されることを検証するのは簡単です(線形時間しか要しません)。 SATがNP完全であることを示すには、NPに属するあらゆる問題が、SATの一例とみなせることを示さなくてはなりません。しかし、あらゆるNP問題を逐一SATに変換していては埒が明きません。 そのかわり、非決定性チューリング機械 (NDTM) の全動作パターン、すなわち、(多項式時間で終了する)あらゆるプログラムをSATで特定できることを示します。

入力文字列を x 、計算が終わるまでに必要な多項式時間ステップを p(n) (n = |X|) とします (受理状態も含めます)。 この時間内で、NDTM M = (Γ, Q, δ, x) はテープ位置 − p(n) から p(n) + 1 の内側しか処理できないことを利用します。M の状態数やテープ記号数も有限ですから、これらに関する処理を有限個の変数で記述することが可能です。

M の記述に用いる変数
 変数 意味 パラメータ 大雑把な個数
Q[ti, qk] 時間 i において M が状態 qkにある時に限り True 0 ≤ i ≤ p(n)
0 ≤ k ≤ r
p(n) * r
H[ti, j] 時間 i において M のヘッドが
テープ位置 j にある時に限り True
0 ≤ i ≤ p(n)
-p(n) ≤ j ≤ p(n) + 1
2 p(n)2
S[ti, j, sk] 時間 i においてテープ位置 j に
記号 sk が書かれている時に限り True
0 ≤ i ≤ p(n)
-p(n) ≤ j ≤ p(n) + 1
0 ≤ k ≤ v
2 p(n)2 * v

ただし

r ... 初期状態 q0、受理状態 qY, qN も含めた全状態数 |Q| のこと、
v ... 空白記号 (b = s0とする) や入力記号も含めた、テープ記号数 | Γ | のこと

です。 r や v は NDTM の構造で決まる定数とみなせるので、変数の総数は p(n)2 オーダーであることがわかります。

これらの変数を用いて次表に示す6つの節グループを作成し、NDTM M の動きを規定しましょう。

グループ 意味 節の構成 変数の範囲 節の個数(大雑把に)
1. 状態に関する制約 時刻 i において M はいずれかの状態にある { Q [ ti, q0 ], Q [ ti, qY ], Q [ ti, qN ], Q [ ti, q3 ], ... , Q [ ti, qr ] } 0 ≤ i ≤ p(n) p(n)
時刻 i において M は二つの状態を同時に取らない { ¬Q [ ti, qj ], ¬Q [ ti, qj' ] } 0 ≤ i ≤ p(n),
0 ≤ j < j' ≤ r
p(n) * r2/2
2. ヘッド位置に関する制約 時刻 i においてヘッドはいずれかのテープ位置にある { H [ ti, −p(n) ], H [ ti, −p(n)+1 ], ..., H [ ti, p(n)+1 ] } 0 ≤ i ≤ p(n) p(n)
時刻 i においてヘッドは二つの位置を同時に取らない { ¬H [ ti, j ], ¬H [ ti, j' ] } 0 ≤ i ≤ p(n),
−p(n) ≤ j < j' ≤ p(n)+1
p(n) * 2 p(n)2
3. テープに書く記号に関する制約 時刻 i においてテープ位置 j にはいずれかの記号 k がある { S [ ti, j, s0 ], S [ ti, j, s1 ], ..., S [ ti, j, sv ] } 0 ≤ i ≤ p(n),
−p(n) ≤ j ≤ p(n)+1
p(n) * 2 p(n)
時刻 i においてテープ位置 j は二種の記号を同時に取らない { ¬S [ ti, j, sk ], ¬S [ ti, j, sk' ] } 0 ≤ i ≤ p(n),
−p(n) ≤ j ≤ p(n)+1,
0 ≤k < k' ≤ v
p(n) * 2 p(n) * v
4. M の初期設定に関する制約 時間0の初期状態では、テープが左端でヘッドは空白記号をみている { Q [ t0, q0 ] }, { H [ t0, 1 ] }, { S [ t0, 0, s0 ] }  - 3
テープに入力 x = k1k2...knのみ書かれている { S [ t0, 1, k1 ] }, { S [ t0, 2, k2 ] }, u... { S [ t0, n, kn ] },
{ S [ t0, n+1, b ] }, { S [ t0, n+2, b ] }, ... { S [ t0, p(n)+1, b ] }
- p(n)
5. 受理状態に関する制約 時刻 p(n) には M が状態 qY に到達 { Q [ tp(n), qY ] } - 1
6. 状態遷移に関する制約 時刻 i にテープ位置 j をアクセスしない場合 j の中身はslのまま変化しない { ¬S [ ti, j, sl ], H [ ti, j ], S [ ti+1, j, sl ] } 0 ≤ i ≤ p(n),
−p(n) ≤ j ≤ p(n)+1,
0 ≤ l ≤ v
2 p(n)2 * v
時刻 i における状態遷移が δ(qk,sl) = (qk',sl',Δ) で表現される { ¬H[ ti, j ], ¬Q[ ti, qk ], ¬S[ ti, j, sl ],
H[ ti+1, j + Δ ] }
{ ¬H[ ti, j ], ¬Q[ ti, qk ], ¬S[ ti, j, sl ],
Q[ ti+1, qk' ] }
{ ¬H[ ti, j ], ¬Q[ ti, qk ], ¬S[ ti, j, sl ],
S[ ti+1, j, sl' ] }
0 ≤ i < p(n),
−p(n) ≤ j ≤ p(n) + 1,
0 ≤ k ≤ r,
0 ≤ l ≤ v
6 * p(n)2* r * v

[edit] 節の解釈

表中にでてくる節の形には大きく分けて以下の5パターンあります。

1. { L1, L2, ... Lk
この形は、どれか一つでもTrueであれば満たされるので、選択肢を記述するために使われます。
2. { ¬L1, ¬L2
この形は、両方が真であるときに限り満たせないので、選択肢の排他性を記述するために使われます。

表のうちグループ1からグループ3までの制約はこの2パターンで書かれています。

3. { L } 
この形は L が必ず True であることを意味します。初期設定や受理状態など、グループ4とグループ5の制約がこのパターンで書かれています。
4. { ¬L1, L2, L3
この形は、( if not L2 then L1 → L3 ) という論理式に読みかえられます。
5. { ¬L1, ¬L2, ¬L3, L4
この形は、( L1 ∧ L2 ∧ L3 → L4 ) という論理式に読みかえられます。こうするとグループ6に属す節は以下の内容を記述していることがわかります。
  • if not H [ ti, j ] → (S [ ti, j, sl ] → S [ ti+1, j, sl ])
    もしヘッドがテープ位置 j を見ていないなら、テープ位置の内容 sl は時刻 i+1 になっても sl のまま
  • (H[ ti, j ] ∧ Q[ ti, qk ] ∧ S[ ti, j, sl ]) → H[ ti+1, j + Δ ] (Q, Sも同様)
    もしヘッドがテープ位置 j で状態 (qk,sl) を満たすなら、時刻 i+1 には状態は (qk',sl') となり、ヘッドはΔ移動する

表に出てくる節の個数は p(n)3 のオーダーで抑えられますし、各節の中には p(n) オーダーの変数しか現れません。 結果として、いかなる NDTM のプログラムを与えられても、プログラムの全動作を入力文字列 p(n)4 オーダーのSAT問題として記述できることがわかりました。

[edit] NP完全性のインパクト

クックの定理から以下のことがわかります。

問題 x がクラスNPに属する 定義より、x に多項式時間でYESという NDTM のプログラムが存在
クックの定理により NDTM の入力とプログラム(の可能な全動作列)を多項式時間で変換したSAT問題が存在

つまり、SAT問題の表現能力はチューリングマシンのあらゆる動作列、すなわちクラスNPに属する全ての問題を包含しているのです。そのため、どんなSAT問題を与えられても多項式時間で解くアルゴリズムがあるとするならば、クラス NP に属するいかなる問題でもO(p(n)4)時間でSAT問題に変換することで、それらを多項式時間で解くことになります。つまり、SAT問題は NP に属するどの問題と比較しても同等以上に難しい、NP完全であることが示されています。

[edit] SAT & 3SAT

SAT問題は複雑な論理式が多く使われており、解くのが十分に難しそうです。しかし、各節にリテラルをちょうど3つしか含まないように制約を設けた3-SATISFIABILITYもNP完全であることが簡単に示せます。

3SAT問題はNP完全

3SATを充足させる変数の T, F が与えられたらすぐにYESと判断できるため、3SAT ∈ NP です。 ここで SAT から 3SAT への変換を考えます。SATにおける各節 C を以下のように変換します。

  • 変数を1個含む場合 C = { z }
C にしか使わない変数を二つ x1, x2 用意し、次の4節で置き換えます。 { { z, x1, x2 } ∧ { z, ¬x1, x2 } ∧ { z, x1, ¬x2 } ∧ { z, ¬x1, ¬x2 } }
  • 変数を2個含む場合 C = { z1, z2 }
C にしか使わない変数 x を用意し、次の2節で置き換えます。 { { z1, z2, x } ∧ { z1, z2, ¬x } }
  • 変数を3個含む場合はそのまま使います。
  • 変数を k (> 3) 個含む場合 C = { z1, z2, ... zk }
C にしか使わない変数を k−3 個用意し { x1, x2, ... xk-3 } 、次の k−2 節で置き換えます。
C' = { { z1, z2, x1 } ∧ { ¬x1, z3, x2 } ∧ { ¬x2, z4, x3 } } ... ∧ { ¬xk-3, zk-1, zk } }

もとの節に含まれる変数の数が 3 個以下の場合、上記の変換において、もとの節における変数のアサインメントで充足可能 ⇔ 置き換えた節が充足可能 であることがすぐにわかります。 新しく導入する変数のアサインメントは T でも F でもよいからです。変数を k 個含むときだけ少し面倒です。

もとの節 C = { z1, z2, ... zk } が充足可能な時、少なくともある変数 zm が T になっています。もし m が 1 か 2 の場合は x1 ... xk-3 を全て F にすれば、変換後の節 C' が充足されます。もし m が k−1 か k の場合は、x1 ... xk-3 を全て T にすれば節 C' が充足されます。もし m が l の場合は、 x1 ... xl-2 をすべて T にし、 xl-1 ... xk-3 を全て F にすれば C' が充足されます。 T となるリテラルが1個以上の場合は T の数が増えるだけなので、C' の充足性に変化はありません。

逆に、置き換えた節 C' が充足可能である時は、必ず z1 ... zk のいずれかが T にならざるを得ませんから(背理法ですぐに証明できます)、もとの節 C が充足可能になります。

以上をまとめると、任意のSAT問題を与えられたら、節の数とほぼ同数の変数を追加に用意するだけで等価な 3SAT 問題を構成できることが示せました。 このように問題を変換 (reduce) することで、様々な問題がNP完全であることを証明できます。重要な組み合わせ問題に対してこれをCookの定理の翌年に示したのが、現在はバイオインフォマティクスを研究している Richard M Karp でした。

Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox