NP完全问题

到现在为止我们讨论的问题都是面对一个问题如何设计出一个高效的算法。现在我们要讨论一个不同的问题,我们可以通过分析证明:一些问题是不可能存在高效的算法的。而证明的方法依然是设计算法。

NP-complete问题

多项式时间复杂度是优秀的复杂度。确定型图灵机能在多项式时间复杂度内找到解的问题的集合称为\(P\),这里的P指polynomial time。非确定型图灵机能在多项式时间复杂度内解决的问题的集合称为\(NP\)。特别注意,\(NP\)不是指non polynomial,而是指non-deterministic polynomial time。普通计算机都是确定型图灵机,而“非确定型图灵机”在面临“选择”时能同时尝试“选”与“不选”。因此,非确定型图灵机能在多项式复杂度内解决的问题等价于确定型图灵机能在多项式复杂度内“验证”的问题。显然,\(P \subseteq NP\)。最著名的问题就是,是否成立\(P=NP\)?即是不是所有问题只要是多项式可验证就一定是多项式可解?举个生动的例子,“不会做但能看懂答案的题”是否等价于“会做的题”?

我们讨论问题的难度:定义多项式时间图灵归约\(f \leq_T^P g\),表示我们能够通过多项式复杂度的一些化归操作,调用多项式次数的\(g\),从而能够解决\(f\)。如果存在一个\(g\),使得对于所有\(NP\)问题\(f\)都有\(f \leq _T^P g\),那么称\(g\)是一个NP-hard问题。注意我们并不能保证NP-hard问题也是一个NP问题。如果一个问题既是NP-hard同时也是NP的,那么它就是一个NP-complete问题。如果我们证明了一个NP-complete问题是能多项式解决的,就能证明\(P=NP\)

我们可以从两种角度理解\(f \leq _T^P g\)这一归约。第一,如果\(g\)是容易的,那么根据归约可以推出\(f\)也是容易的。第二,如果\(f\)是困难的,那么\(g\)也一定是困难的(因为如果\(g\)是容易的\(f\)就也是容易的了,这是第一种看法的逆否命题)。

另外,我们也容易发现归约具有传递性,如果\(f \leq_T^P g,g \leq_T^P h\),那么\(f \leq_T^P h\)

归约

SAT \(\leq _T^P\) 3-SAT

SAT问题是一个NP-complete问题。合取范式(CNF)由若干个括号由\(\wedge\)连成,每个括号由布尔变量\(x_i\)\(\neg x_i\)\(\vee\)连成。比如\((x_1 \vee x_3 \vee \neg x_4)\wedge(x_2 \vee \neg x_3) \wedge(x_1 \vee x_2)\)。SAT问题就是,输入一个CNF,问是否存在一个\(x_1\)\(x_n\)的赋值使得CNF的值为true。

3-SAT问题是一个特殊的SAT问题,它要求输入的CNF的每个括号里都恰好只有3个布尔变量。显然有3-SAT\(\leq_T^P\)SAT,我们想证明SAT \(\leq_T^P\) 3-SAT。

这里用到一个关键的技巧:当\(x_i\)任取时,一定存在一个\(y\)使得\((x_1 \vee x_2 \vee x_3 \vee x_4)\)\(=(x_1 \vee x_2 \vee y) \wedge (\neg y \vee x_3 \vee x_4)\)。如果\(y=0\),那么RHS等价于\((x_1 \vee x_2)\),如果\(y=1\),那么RHS等价于\((x_3 \vee x_4)\)。意思是说,如果LHS=1,那么要么\(x_1,x_2\)中有1要么\(x_3,x_4\)中有1。对于前者,只需取\(y=1\),对于后者,只需取\(y=0\);如果LHS=0,只需取\(y=0\),就有RHS=0。

一般地,一定存在\(y_i\)的取值使得:\((x_1 \vee x_2 \vee \cdots \vee x_k)=(x_1 \vee x_2 \vee y_1) \wedge (\neg y_1 \vee x_3 \vee y_2) \wedge (\neg y_2 \vee x_4 \vee y_3)\)\(\wedge \cdots \wedge (\neg y_{k-3} \vee x_{k-1} \vee x_k)\)。意思是说,如果LHS=1,那么分类讨论:如果\(x_1,x_2\)中有1,那么取\(y_1=0,y_i=0\);否则,如果\(x_3=1\),那么取\(y_1=1,y_2=0,y_i=0\);如果\(x_4=1\),那么取\(y_2=1,y_1=1,y_3=0,y_i=0\);如果\(x_p=1\),那么取\(y_1\cdots y_{p-2}=1\)\(y_{p-1}\cdots y_{k-3}=0\);如果\(x_{k-1},x_k\)中有1,那么取\(y\)全都取1。如果LHS=0,那么只需取\(y_1=0\),就有RHS=0。

于是对于任何SAT问题, 我们做这样的替换,就能把它转变成3-SAT问题。即SAT \(\leq_T^P\) 3-SAT。因此SAT和3-SAT之间可以互相归约——它们是等价的!

3-SAT \(\leq _T^P\) Independent Set

SAT(等价于3-SAT)可以归约为图论中的独立集问题(即:给定一张图,问是否存在一个\(k\)个点的独立集)。

每个3-CNF(\(n\)个布尔变量,\(m\)个括号)可以对应一张图,图上有\(2n\)个节点分别对应\(x_i\)\(\neg x_i\),将每个括号里的三个点连成三角形,再将所有\(x_i,\neg x_i\)之间相连。这样,每个独立集里最多只能有每个三角形里的一个点,也不可能同时有\(x_i\)\(\neg x_i\)。假如我们能在这张图里找到一个\(m\)个点的独立集,那么令这\(m\)个点对应的布尔变量取1,这就保证了3-CNF的每个括号里恰好有一个1。这样一切3-SAT问题都可以归约为独立集问题了。

Independent Set \(\leq _T^P\) Vertex Cover

点覆盖是指选出一个点的集合,使得与这些点相连的所有边覆盖了整张图的所有边。

任意取一个独立集,然后反向选择所有不属于独立集的点,这些点构成点集\(S\)。假设存在一条边,它的两个端点都不在\(S\)中,那么说明这两个点都在独立集中,这是不可能的,因此\(S\)覆盖了所有边,它是一个点覆盖。

任意取一个点覆盖,然后反向选择所有不属于点覆盖的点,这些点构成点集\(W\)。假设存在一条边,它的两个端点都在\(W\)中,那么这两个端点都不在点覆盖中,这是不可能的。因此\(W\)是独立集。

所以我们证明了每个独立集的补集都是点覆盖,每个点覆盖的补集都是独立集。假设存在一个\(u\)个节点的独立集,那么对应地一定存在一个\(n-u\)个节点的点覆盖。假设存在一个\(u\)个节点的点覆盖,那么对应地一定存在一个\(n-u\)个节点的独立集。因此,如果最大独立集是\(m\),那么最小点覆盖就是\(n-m\)

因此,图上存在一个大小为\(k\)的独立集当且仅当图上存在一个大小为\(n-k\)的点覆盖。这样就把独立集问题归约到了点覆盖问题。

Independent Set \(\leq _T^P\) Clique

我们可以构造无向图\(G\)的补图\(G'\):本来没边的都有边,本来有边的都没边(邻接矩阵取反)。一个Clique是指两两互相有边的点的集合。于是,\(G\)中的独立集一定是\(G'\)中的Clique,\(G'\)中的Clique一定是G中的独立集。于是\(G\)中的独立集与\(G'\)中的Clique一一对应。因此询问一个图上是否存在一个大小为\(k\)的独立集,只需考虑它的补图上是否存在一个大小为\(k\)的Clique。这样就把独立集问题归约到了Clique问题。

Clique \(\leq _T^P\) Half Clique

Half Clique询问是否存在一个\(|V|/2\)个节点的Clique。假设我们已经解决了Half Clique,现在要证明我们可以用它来解决Clique。

假设询问的\(k< |V|/2\),我们等价地考虑补图的独立集。我们在补图的基础上新增\(|V|-2k\)个孤立的节点形成一张新的图。询问新图是否存在\(|V'|/2=|V|-k\)个点的独立集等价于询问原图是否存在\(|V|-k-(|V|-2k)=k\)个点的独立集,因此此时Clique问题可以归约为Half Clique的问题。

假设询问的\(k \geq |V|/2\),我们考虑Clique。那么我们在原图的基础上新增\(2k-|V|\)个孤立的节点形成一张新图。询问新图是否存在\(|V'|/2=k\)个节点的Clique等价于询问原图是否存在\(k\)个节点的Clique,因此此时Clique问题也可以归约为Half Clique问题。

3-SAT \(\leq _T^P\) 3D Matching

3D Matching是“三维边”情形下的二分图完美匹配,输入若干个三元组,如果能选择其中若干个三元组从而覆盖所有的节点,那么这就构成了一个3D Matching。

image-20230615131956994

对于一个3-SAT,我们为每一个变元构造下图这样一个由四个三元组构成的“元件”,这个元件使得\(p\)的匹配情况只能是“\(p_0,p_2\)被选”或“\(p_1,p_3\)被选”。所以我们就用这样的一个元件某种意义上实现了3-SAT中布尔变量的效果,“\(p_0,p_2\)被选”可以看作该布尔变量取true,“\(p_1,p_3\)被选”可以看作布尔变量取false。对于每一个clause,比如说举个例子\((x \or \neg y \or z)\),它要求如果CNF整体成立,不能同时有\(x\)为false,\(y\)为1,\(z\)为false。因此我们在匹配图上新增两个节点\(a,b\),并增添三个三元组\((a,b,p_{x1})\)\((a,b,p_{y0})\)\((a,b,p_{z1})\)。由于最终\(a,b\)必须被匹配,因此\(p_{x1},p_{y0},p_{z1}\)中至少有一个被匹配了,这就意味着\(p_{x0},p_{y1},p_{z0}\)中至少有一个在元件内被匹配,也就意味着“\(x\)为false,\(y\)为1,\(z\)为false”至少有一个不成立。这样,如果我们找到了我们构造出来的图上的一个3D Matching,我们相应地为布尔变量取值一定能使得3-SAT输出true。这样就把3-SAT归约到了3D Matching。(还有点细节问题,假设一个\(p_1\)被连了多条边,那么可能导致无论如何也不能满足3D Matching成立,但我们可以证明一个3-SAT可以等价地变换为每个变元带正负都不出现超过一次。对于这样的细节问题我们不必太多关注,只需要了解证明的大体想法即可)

image-20230615132051890

3D Matching \(\leq _T^P\) ZOE

ZOE问题(Zero-One Equation)是指给定一个0-1矩阵\(A_{m \times n}\),问能不能找到一个\(n\)维的0-1向量\(x\)使得\(Ax=1\),即是否相乘能得到一个全1向量。

我们可以把一个3D Matching的图转化为一个0-1矩阵\(A\),其中\(A\)的每一列只有3个1,\(A(i,j)=1\)表示\(i\)在第\(j\)个三元组内,否则表示\(i\)不在第\(j\)个三元组内。因此\(x\)向量的选取就是选出一些三元组,\(Ax=1\)表示找到了一个选择三元组的方案使得每个点恰好被选了1次。这样就把3D Matching归约到了ZOE问题。

ZOE \(\leq _T^P\) Subset Sum

Subset Sum问题指的是给一定一个整数的集合\(S\)和一个整数\(W\),问是否存在一个\(S\)的子集其元素之和为\(W\)

ZOE问题中\(Ax\)实际上是在选出\(A\)的一些列向量相加。而\(A\)的每一列可以看作一个01串,ZOE问题能够解决是否能在给定的一些01串里选出若干个使得其“相加”为全1串的问题。如果我们能把01串映射到整数,那么就可以把ZOE问题归约到Subset Sum问题。一个简单的想法是用二进制,但这样的话串的相加就会出现进位问题。为了避免进位,我们可以用\(n+1\)进制,这样串的相加就一定不会导致进位,向量的加法就完全转化为了数的加法了。这样我们就把ZOE问题归约到了Subset Sum问题。

ZOE \(\leq _T^P\) ILP

ILP即Integer Linear Programming(整数规划),我们之前已经讨论过它了,它是要求解必须为整数的线性规划问题。\(Ax=1\)可以转化为整数规划:\(Ax \leq 1, -Ax \leq -1,x \leq 1, -x \leq 0\)。于是ZOE都可以归约为ILP。

ZOE \(\leq _T^P\) Hamilton Cycle

无向图的一个Hamilton Cycle是指从某个节点出发经过每个节点恰好一次然后回到起点的一条路径(环)。我们现在要说明ZOE问题可以归约到询问图上是否存在Hamilton Cycle的问题。

首先把ZOE问题归约到Hamilton Cycle with Paired Edges这一问题。它不仅要求我们找到一个Hamilton Cycle,还给出了一系列边的二元组要求每个二元组里恰好有一条边在我们选择的路径上。(图上是允许出现重边的。)对于\(Ax=1\),我们首先对于每个变元构造一个2重边的路径,然后将他们依次相连,走左边的路就代表变元取1,走右边的路就代表变元取0。再考虑\(Ax=1\)的每一行相当于一个方程,它表示若干个变元相加要恰好为1,也就是这些变元中只能有一个取1而剩下的必须取0。我们为每一个方程构造一个\(k\)-重边,其中\(k\)就是方程中涉及到的系数不为0的变元的个数,每条边分别代表一个变元。现在为了使构造出的图能够反映出\(Ax=1\)的性质,我们增添Paired Edges这一限制。对于每个方程,如果在路径上我们选择了\(x_j\)对应的那条边,就意味着我们把\(x_j\)取了true而其余变量都取了false,这就意味着在右侧变元的重边上\(x_j\)必须走左边的边,其余变量必须走右边的边。这等价于右侧的\(x_j\)的false边不能左侧的\(x_j\)边同时被选,所以我们增加这样的一个限制。在这样的限制下假设我们找到了一个Hamilton Cycle,那么我们也就找到了ZOE的一组解。所以归约成立。

image-20230615141832312

然后我们再把Hamilton Cycle with Paired Edges归约到普通的Hamilton Cycle问题。对于每两条被限制的边对\((a,b),(c,d)\),我们把它拆分重组成如下形式,可见要走完所有的点,如果从\(a\)出发它必定从\(b\)离开,从\(c\)出发则必定从\(d\)离开,不可能存在一种方案同时走过“边”ab和cd。这样我们就避开了Paired Edges这一特殊限制。

image-20230615143349529

SAT: NP-complete

一切NP问题的本质是:给定一个问题的描述,再给定一个输入,我们能够在多项式复杂度内输出true或false。而显然,无论是问题的描述还是输入,最终都可以还原为二进制编码,也就是布尔变量。我们之前已经讨论过,这样的问题最终都归约到与、或、非这三种最基本的逻辑运算,因此其实我们已经论证了一切NP问题都可以归约到SAT!由于SAT是多项式可验证的,所以SAT问题本身就是NP-complete问题。我们在上文中从SAT出发将它归约到了各式各样的问题,同时这些问题也都是多项式可验证的。所以所有这些问题全都是NP-complete的!我们只需要证明上述问题中的任何一个能在多项式复杂度内被“解决”,那么就能够证明\(P=NP\)。如果这样,就说明“生成一个证明”和“读懂一个证明”是同等难度的事,这就给数学家们省下了巨大的麻烦了!我们相信这应该是不可能做到的。也就是我们相信,上述讨论的所有这些问题都是不可能存在简单算法的。当然,这只是我们的猜测。无论如何,\(P\)是否等于\(NP\)都还是一个还没有被解决的问题,并且是计算机科学目前最重要的问题。

posted @ 2023-06-14 22:51  行而上  阅读(455)  评论(0编辑  收藏  举报