NP完全问题
到现在为止我们讨论的问题都是面对一个问题如何设计出一个高效的算法。现在我们要讨论一个不同的问题,我们可以通过分析证明:一些问题是不可能存在高效的算法的。而证明的方法依然是设计算法。
NP-complete问题
多项式时间复杂度是优秀的复杂度。确定型图灵机能在多项式时间复杂度内找到解的问题的集合称为,这里的P指polynomial time。非确定型图灵机能在多项式时间复杂度内解决的问题的集合称为。特别注意,不是指non polynomial,而是指non-deterministic polynomial time。普通计算机都是确定型图灵机,而“非确定型图灵机”在面临“选择”时能同时尝试“选”与“不选”。因此,非确定型图灵机能在多项式复杂度内解决的问题等价于确定型图灵机能在多项式复杂度内“验证”的问题。显然,。最著名的问题就是,是否成立?即是不是所有问题只要是多项式可验证就一定是多项式可解?举个生动的例子,“不会做但能看懂答案的题”是否等价于“会做的题”?
我们讨论问题的难度:定义多项式时间图灵归约,表示我们能够通过多项式复杂度的一些化归操作,调用多项式次数的,从而能够解决。如果存在一个,使得对于所有问题都有,那么称是一个NP-hard问题。注意我们并不能保证NP-hard问题也是一个NP问题。如果一个问题既是NP-hard同时也是NP的,那么它就是一个NP-complete问题。如果我们证明了一个NP-complete问题是能多项式解决的,就能证明。
我们可以从两种角度理解这一归约。第一,如果是容易的,那么根据归约可以推出也是容易的。第二,如果是困难的,那么也一定是困难的(因为如果是容易的就也是容易的了,这是第一种看法的逆否命题)。
另外,我们也容易发现归约具有传递性,如果,那么。
归约
SAT 3-SAT
SAT问题是一个NP-complete问题。合取范式(CNF)由若干个括号由连成,每个括号由布尔变量或用连成。比如。SAT问题就是,输入一个CNF,问是否存在一个到的赋值使得CNF的值为true。
3-SAT问题是一个特殊的SAT问题,它要求输入的CNF的每个括号里都恰好只有3个布尔变量。显然有3-SATSAT,我们想证明SAT 3-SAT。
这里用到一个关键的技巧:当任取时,一定存在一个使得 。如果,那么RHS等价于,如果,那么RHS等价于。意思是说,如果LHS=1,那么要么中有1要么中有1。对于前者,只需取,对于后者,只需取;如果LHS=0,只需取,就有RHS=0。
一般地,一定存在的取值使得: 。意思是说,如果LHS=1,那么分类讨论:如果中有1,那么取;否则,如果,那么取;如果,那么取;如果,那么取,;如果中有1,那么取全都取1。如果LHS=0,那么只需取,就有RHS=0。
于是对于任何SAT问题, 我们做这样的替换,就能把它转变成3-SAT问题。即SAT 3-SAT。因此SAT和3-SAT之间可以互相归约——它们是等价的!
3-SAT Independent Set
SAT(等价于3-SAT)可以归约为图论中的独立集问题(即:给定一张图,问是否存在一个个点的独立集)。
每个3-CNF(个布尔变量,个括号)可以对应一张图,图上有个节点分别对应与,将每个括号里的三个点连成三角形,再将所有之间相连。这样,每个独立集里最多只能有每个三角形里的一个点,也不可能同时有与。假如我们能在这张图里找到一个个点的独立集,那么令这个点对应的布尔变量取1,这就保证了3-CNF的每个括号里恰好有一个1。这样一切3-SAT问题都可以归约为独立集问题了。
Independent Set Vertex Cover
点覆盖是指选出一个点的集合,使得与这些点相连的所有边覆盖了整张图的所有边。
任意取一个独立集,然后反向选择所有不属于独立集的点,这些点构成点集。假设存在一条边,它的两个端点都不在中,那么说明这两个点都在独立集中,这是不可能的,因此覆盖了所有边,它是一个点覆盖。
任意取一个点覆盖,然后反向选择所有不属于点覆盖的点,这些点构成点集。假设存在一条边,它的两个端点都在中,那么这两个端点都不在点覆盖中,这是不可能的。因此是独立集。
所以我们证明了每个独立集的补集都是点覆盖,每个点覆盖的补集都是独立集。假设存在一个个节点的独立集,那么对应地一定存在一个个节点的点覆盖。假设存在一个个节点的点覆盖,那么对应地一定存在一个个节点的独立集。因此,如果最大独立集是,那么最小点覆盖就是。
因此,图上存在一个大小为的独立集当且仅当图上存在一个大小为的点覆盖。这样就把独立集问题归约到了点覆盖问题。
Independent Set Clique
我们可以构造无向图的补图:本来没边的都有边,本来有边的都没边(邻接矩阵取反)。一个Clique是指两两互相有边的点的集合。于是,中的独立集一定是中的Clique,中的Clique一定是G中的独立集。于是中的独立集与中的Clique一一对应。因此询问一个图上是否存在一个大小为的独立集,只需考虑它的补图上是否存在一个大小为的Clique。这样就把独立集问题归约到了Clique问题。
Clique Half Clique
Half Clique询问是否存在一个个节点的Clique。假设我们已经解决了Half Clique,现在要证明我们可以用它来解决Clique。
假设询问的,我们等价地考虑补图的独立集。我们在补图的基础上新增个孤立的节点形成一张新的图。询问新图是否存在个点的独立集等价于询问原图是否存在个点的独立集,因此此时Clique问题可以归约为Half Clique的问题。
假设询问的,我们考虑Clique。那么我们在原图的基础上新增个孤立的节点形成一张新图。询问新图是否存在个节点的Clique等价于询问原图是否存在个节点的Clique,因此此时Clique问题也可以归约为Half Clique问题。
3-SAT 3D Matching
3D Matching是“三维边”情形下的二分图完美匹配,输入若干个三元组,如果能选择其中若干个三元组从而覆盖所有的节点,那么这就构成了一个3D Matching。
对于一个3-SAT,我们为每一个变元构造下图这样一个由四个三元组构成的“元件”,这个元件使得的匹配情况只能是“被选”或“被选”。所以我们就用这样的一个元件某种意义上实现了3-SAT中布尔变量的效果,“被选”可以看作该布尔变量取true,“被选”可以看作布尔变量取false。对于每一个clause,比如说举个例子,它要求如果CNF整体成立,不能同时有为false,为1,为false。因此我们在匹配图上新增两个节点,并增添三个三元组,,。由于最终必须被匹配,因此中至少有一个被匹配了,这就意味着中至少有一个在元件内被匹配,也就意味着“为false,为1,为false”至少有一个不成立。这样,如果我们找到了我们构造出来的图上的一个3D Matching,我们相应地为布尔变量取值一定能使得3-SAT输出true。这样就把3-SAT归约到了3D Matching。(还有点细节问题,假设一个被连了多条边,那么可能导致无论如何也不能满足3D Matching成立,但我们可以证明一个3-SAT可以等价地变换为每个变元带正负都不出现超过一次。对于这样的细节问题我们不必太多关注,只需要了解证明的大体想法即可)
3D Matching ZOE
ZOE问题(Zero-One Equation)是指给定一个0-1矩阵,问能不能找到一个维的0-1向量使得,即是否相乘能得到一个全1向量。
我们可以把一个3D Matching的图转化为一个0-1矩阵,其中的每一列只有3个1,表示在第个三元组内,否则表示不在第个三元组内。因此向量的选取就是选出一些三元组,表示找到了一个选择三元组的方案使得每个点恰好被选了1次。这样就把3D Matching归约到了ZOE问题。
ZOE Subset Sum
Subset Sum问题指的是给一定一个整数的集合和一个整数,问是否存在一个的子集其元素之和为。
ZOE问题中实际上是在选出的一些列向量相加。而的每一列可以看作一个01串,ZOE问题能够解决是否能在给定的一些01串里选出若干个使得其“相加”为全1串的问题。如果我们能把01串映射到整数,那么就可以把ZOE问题归约到Subset Sum问题。一个简单的想法是用二进制,但这样的话串的相加就会出现进位问题。为了避免进位,我们可以用进制,这样串的相加就一定不会导致进位,向量的加法就完全转化为了数的加法了。这样我们就把ZOE问题归约到了Subset Sum问题。
ZOE ILP
ILP即Integer Linear Programming(整数规划),我们之前已经讨论过它了,它是要求解必须为整数的线性规划问题。可以转化为整数规划:。于是ZOE都可以归约为ILP。
ZOE Hamilton Cycle
无向图的一个Hamilton Cycle是指从某个节点出发经过每个节点恰好一次然后回到起点的一条路径(环)。我们现在要说明ZOE问题可以归约到询问图上是否存在Hamilton Cycle的问题。
首先把ZOE问题归约到Hamilton Cycle with Paired Edges这一问题。它不仅要求我们找到一个Hamilton Cycle,还给出了一系列边的二元组要求每个二元组里恰好有一条边在我们选择的路径上。(图上是允许出现重边的。)对于,我们首先对于每个变元构造一个2重边的路径,然后将他们依次相连,走左边的路就代表变元取1,走右边的路就代表变元取0。再考虑的每一行相当于一个方程,它表示若干个变元相加要恰好为1,也就是这些变元中只能有一个取1而剩下的必须取0。我们为每一个方程构造一个-重边,其中就是方程中涉及到的系数不为0的变元的个数,每条边分别代表一个变元。现在为了使构造出的图能够反映出的性质,我们增添Paired Edges这一限制。对于每个方程,如果在路径上我们选择了对应的那条边,就意味着我们把取了true而其余变量都取了false,这就意味着在右侧变元的重边上必须走左边的边,其余变量必须走右边的边。这等价于右侧的的false边不能左侧的边同时被选,所以我们增加这样的一个限制。在这样的限制下假设我们找到了一个Hamilton Cycle,那么我们也就找到了ZOE的一组解。所以归约成立。
然后我们再把Hamilton Cycle with Paired Edges归约到普通的Hamilton Cycle问题。对于每两条被限制的边对,我们把它拆分重组成如下形式,可见要走完所有的点,如果从出发它必定从离开,从出发则必定从离开,不可能存在一种方案同时走过“边”ab和cd。这样我们就避开了Paired Edges这一特殊限制。
SAT: NP-complete
一切NP问题的本质是:给定一个问题的描述,再给定一个输入,我们能够在多项式复杂度内输出true或false。而显然,无论是问题的描述还是输入,最终都可以还原为二进制编码,也就是布尔变量。我们之前已经讨论过,这样的问题最终都归约到与、或、非这三种最基本的逻辑运算,因此其实我们已经论证了一切NP问题都可以归约到SAT!由于SAT是多项式可验证的,所以SAT问题本身就是NP-complete问题。我们在上文中从SAT出发将它归约到了各式各样的问题,同时这些问题也都是多项式可验证的。所以所有这些问题全都是NP-complete的!我们只需要证明上述问题中的任何一个能在多项式复杂度内被“解决”,那么就能够证明。如果这样,就说明“生成一个证明”和“读懂一个证明”是同等难度的事,这就给数学家们省下了巨大的麻烦了!我们相信这应该是不可能做到的。也就是我们相信,上述讨论的所有这些问题都是不可能存在简单算法的。当然,这只是我们的猜测。无论如何,是否等于都还是一个还没有被解决的问题,并且是计算机科学目前最重要的问题。