理论计算机科学基础(9)——NP完全问题

理论计算机科学基础随堂笔记。第7章-2:NP完全问题

使用教材:《计算理论导引》(原书第3版) Michael Sipser 著,机械工业出版社

第7章-2 NP完全问题

7-2.1 多项式时间归约

多项式时间归约$\leq_m^p$定义如下:

\[A\leq_m^p B\ via\ f\Leftrightarrow f\in FP且\forall x, x\in A当且仅当 f(x)\in B\]

多项式归约亦有传递性和封闭性。

传递性:$A\leq_m^p B\ via\ f, B\leq_m^p C\ via\ g\Rightarrow A\leq_m^p C\ via\ g\circ f$

封闭性:P,NP以及coNP类对多项式归约封闭,例如,若有$A\leq_m^p B$,则$B\in P\Rightarrow A\in P$。

7-2.2 NP类的结构

  • NP难(NP-hard)

若$\forall L\in NP$,都有$L\leq_m^p A$,则$A$是NP难的。

  • NP完全(NP-complete, NPC)

若$A\in NP$,且$A$是NP难的,则$A$是NP完全的。

Ledner定理 假设$P\neq NP$,则存在语言$L$,$L\in NP-NPC-P=NPI$。

定理 $A$是NP难的,且$A\in P$,则$P=NP$。

例1 证明问题$U$是NP完全的。$U$定义如下

\[U=\left\{\langle N, x, 1^k\rangle\mid NTM\ N在k步内接受x\right\}\]

证明首先,证明$U\in NP$:

为此,将$U$改写为等价定义

\[U=\left\{\langle N,x,1^k\rangle\mid \exists y,“N沿路径y接受x”\right\}\]

首先,路径y的长度不超过k步,因此$\lvert y\rvert =O(k)=poly(\lvert \langle N,x,1^k\rangle\rvert)$。

其次,引号里的内容“N沿路径y接受x”是多项式时间内可判定的,这只需要在N上输入x,执行y,按照运行结果决定接受或拒绝即可。

由此我们证明了$U$是NP问题。

其次,证明$\forall L\in NP, L\leq_m^p U$:

$\forall L\in NP,\exists $NTM $N_L$,满足$L=L(N_L)$,对任意规模为$n$的输入,它的运行时间(即运行步数)是多项式时间$n^{k_1}$。

做多项式时间归约$L\leq_m^p U$:$x\mapsto \langle N_L,x,1^{n^{k_1}}\rangle$,这里n是x的长度。

那么,$x\in L\Leftrightarrow N_L$在$\lvert x\rvert^{k_1}$步内接受$x\Leftrightarrow \langle N_L,x,1^{\lvert x\rvert^{k_1}}\rangle \in U$。因此任意NP问题都可以多项式时间归约到U上。

综上,U是NP完全问题。

7-2.3 库克-列文-卡普定理

NP完全问题为解决P与NP问题提供了一个重大的突破。历史上第一个被证明为NP完全的问题是SAT问题,由库克、列文、卡普参与完成证明,常省称为库克定理。

库克定理 SAT是NP完全问题。

证明:我们知道任意布尔公式都有合取范式(CNF),因此SAT问题与cnf-SAT问题等价,其中cnf-SAT问题定义为:

\[cnf-SAT=\left\{\langle \phi \rangle\mid \phi 是可满足的CNF\right\}\]

下面证明cnf-SAT是NP完全的。

首先,证明$cnf-SAT\in NP$:

cnf-SAT可以重新表述为:

\[cnf-SAT=\left\{\langle \phi=\phi(x_1,x_2,...,x_n)\rangle\mid \exists赋值a=(a_1,a_2,...,a_n), \phi(a)=1\right\}\]

显然对于给定的赋值a,一台验证机总可以在多项式时间内检验a是否是使得$\phi$满足的赋值。

其次,证明cnf-SAT是NP难的,即$\forall L\in NP,L\leq_m^p cnf-SAT$:

任取一个NP问题L,设N是在时间$n^k$内(事实上是$n^k-3$时间内,不过并不影响)判定L的NTM,它的字母表是$C=Q\cup\Gamma\cup${#}。

对于输入$w\in L$,做多项式时间归约$L\leq_m^pcnf-SAT$:$w\mapsto \phi_{N,w}:=\phi_{cell}\wedge \phi_{start}\wedge \phi_{move}\wedge \phi_{accept}$,这样$w$一定存在一个N上的接受计算历史,用布尔公式$\phi_{N,w}$来描述这个接受计算历史。为此,先定义画面如下

7.1

它代表N在输入w上的一个计算分支的格局。设cell[i,j]表示第i行第j列的格子,定义变元$x_{i,j,s}$,它表示cell[i,j]中有字母s。

$\phi_{N,w}$的各个子公式定义如下:

① $\phi_{cell}$:表示检查画面的一个格子中有且只有一个字母,对应布尔运算的语言为:

\[\phi_{cell}=\bigwedge_{1\leq i,j\leq n^k}\bigg[\bigg(\bigvee_{s\in C}x_{i,j,s}\bigg)\wedge\bigg(\bigwedge_{\substack{s,t\in C\\ s\neq t}}\Big(\overline{x_{i,j,s}}\wedge \overline{x_{i,j,t}}\Big)\bigg)\bigg]\]

$\phi_{start},\phi_{move},\phi_{accept}$表示它是一个接受计算格局。判定一个格局是否为接受计算格局已经在前面提到过,共需要三步,这里分别用$\phi_{start},\phi_{move},\phi_{accept}$表示。它们定义如下:

② $\phi_{start}$:表示画面第一行为初始格局$c_0=q_0w_1w_2…,w_n\sqcup \sqcup …\sqcup $(后面的空白符表示补齐到长度为$n^k$),对应布尔运算的语言为:

\[\phi_{start}=x_{1,1,\#}\wedge x_{1,2,q_0}\wedge x_{1,3,w_1}\wedge ...\wedge x_{1,n+2,w_n}\wedge x_{1,n+3,\sqcup}\wedge ...\wedge x_{1,n^k-1,\sqcup}, \wedge x_{1,n^k,\#}\]

③ $\phi_{move}$:表示第i个到第i+1个格局间的转移符合转移函数。为此定义窗口,它是一个$2\times 3$的方格,如上面图中所示。设想让窗口从画面左上角到右下角滑动,对于每个窗口,检查它是否是合法的(合法窗口只有有限个,因此可以在有限步之内检查完毕),如果所有的窗口都是合法的,我们就可以断定所有的格局转移都是符合转移函数的。

简单地说,$\phi_{move}$用“所有窗口都合法”来描述。不妨用窗口顶部中央处的格子代表该窗口,即“(i,j)-窗口”表示该窗口顶部中央的格子为cell[i,j]。再约定描述一个窗口时,从上到下,从左到右阅读,例如,窗口a,b,c,d,e,f表示如下的窗口:

7.2

则$\phi_{move}$对应布尔运算的语言为:

\[\phi_{move}=\bigwedge_{\substack{1\leq i<n^k \\ 1<j < n^k}}\bigg[\bigvee_{\substack{a,b,c,d,e,f \\ 是一个合法窗口}}\Big(x_{i,j-1,a}\wedge x_{i,j,b}\wedge x_{i,j+1,c}\wedge x_{i+1,j-1,d}\wedge x_{i+1,j,e}\wedge x_{i+1,j+1,f}\Big)\bigg]\]

④ $\phi_{accept}$:表示最后一个格局是接受格局。只需要某一行是接受格局即可,这就是说这一行中某一格子中的字母是接受状态,因此

\[\phi_{accept}= \bigvee_{1\leq i,j\leq n^k}x_{i,j,q_{accept}}\]

最后,证明这个归约的确是多项式时间内可以完成的。首先,因为画面是一个$n^k\times n^k$的表格,因此它有$n^{2k}$个格子,所以一共有$O(n^{2k})$个变元。其次,$\phi_{cell}$中一共要检查$n^{2k}$个格子,每个格子长度固定,因此它的长度(以变元数为基准)是$O(n^{2k})$;$\phi_{start}$长度为$O(n^k)$,$\phi_{move}$和$\phi_{accept}$长度都是$O(n^{2k})$,因此它是多项式时间归约。

这就完成了库克定理的证明。■