本周的内容是NP问题,NP的全称是Non-deterministic Polynomial,即多项式复杂程度的非确定性问题。百度上对NP的解释是,P/NP问题是在理论信息学中计算复杂度理论里至今没有解决的问题。通俗的说,是将不可知的问题转化为已知的问题,进而计算器复杂度。
首先介绍多项式时间的约减,即Polynomial-Time Reductions,通过解决另一个不同问题的假设的子程序,使用不包含子程序在内的多项式时间来解决一个问题的方法。主观上,一个多项式时间约减证明了第一个问题不比第二个问题难,因为只要对于第二个问题有有效的解决办法,那么对于第一个问题就一定也存在解决方法。
根据计算的复杂度,我们可以将问题分为两类,一种是可以在多项式时间内解决的,另一种是不能在多项式时间内被解决的。下面的表格给出了一些算法。
一些问题被证明需要指数时间:
1.给定一台图灵机,它能否在最多k步的时候停止?
2.给定一个nxn的棋盘,黑棋能够保证赢吗?
一个不乐观的消息是几十年来大量的基础问题都忽略了分类。这一节的内容是表明这些基本问题是计算等价的,似乎是一个非常难问题的不同表现。
假设我们可以在多项式时间内解决X问题,那么我们在多项式时间内能解决其他什么问题吗?这里引入Reduction的定义。
Reduction:问题X可以多项式约减为问题Y,如果问题X的任意实例可以使用下面的条件被解决:
A) 多项式数量的标准计算步骤加上,
B) 可以解决问题Y的oracle多项式数目次的调用,这里,oracle是特殊硬件提供的可以在单步中解决Y的实例的计算模型。
表示为
这里,X是已知的可以在多项式时间内解决的问题,Y是不可知复杂度的问题。中间的符号表示,有方法将X转换为Y,有点类似于小于等于符号的含义是表明X的复杂度小于等于Y的复杂度,一般情况下,符号中p的上面会有一个m,表示可以是many to one reduction,也就是可以是多对一的映射。如果X有polynomial-time解,那么该解是下界;如果Y有polynomial-time解,那么该解是上界。
因此多项式时间的约减的目的是根据问题的相对困难度来对问题分类的。如果有,y可以在多项式时间内被解决,那么X一定也能在多项式时间内被解决;如果,X不能够在多项式时间内被解决,那么y也不能在多项式时间内被解决。
我们也可以建立等价性,这里的等价是指的reduction的成本。如果和,那么我们可以表示为。
下面有三个基本的约减策略,通过简单等价约减、从特殊案例到一半案例的约减和通过子程序的编码来约减。
一、简单等价约减
首先定义独立集(IndependentSet, 我们在Matroid中已经学习过),给定一个图G=(V, E)和一个整数k,存在一个顶点的子集,,对于每一条边至多其中一个端点在S中。
如下图:
对于上图,存在一个大小大于等于6的独立集,但是不存在大小大于等于7的独立集。
下面定义一个顶点覆盖集,给定一个图G=(V, E)和一个整数k,存在一个顶点的子集,,对于每一条边至少其中一个端点在S中。
例如:
对于上图,存在一个大小小于等于4的顶点覆盖集,但是不存在一个大小小于等于3的顶点覆盖集。
对于顶点覆盖集合和独立集,有
其实从上面两个图,我们就可以看出,两个集合互补。S是一个独立集当且仅当V-S是一个顶点覆盖集。
从上面等价条件来,我们可以从和来证明。
:
令S为任意的独立集,考虑一条任意的边(u, v), 因为S为独立集
因此,V-S包含(u, v).
:
令V-S为任意的顶点覆盖集,考虑两个顶点u∈S和v∈S,因为V-S是一个顶点覆盖集,观察到(u, v)?E,因此,不存在S中的两个顶点连接同一条边。因此,S是一个独立集。
二、从特殊案例到一半案例的约减
定义集合覆盖:
集合覆盖(Set Cover):给定一个元素的集合U,一个U的子集的集合S1,S2,…Sm,和一个整数k,存在一个集合含有小于等于k个这样的集合的并等于U。
例:
上面的例子中,S2和S5即为满足的集合。
顶点覆盖集合(Vertex cover)可以约减为集合覆盖(Set Cover),即
证明:
给定一个顶点覆盖集合的实例G=(V,E),k,我们建立了一个集合覆盖实例,其大小等于顶点覆盖实例的大小。
创建过程:
创建集合覆盖实例:
集合覆盖的大小小于等于k当且仅当顶点覆盖的大小小于等于k。
三、通过子程序的编码来约减。
首先定义
literal:一个布尔变量或者它的否定:
clause子句:literal的析取:
合取范式(Conjunction Normal Form, CNF):子句clause的联合的一个命题公式
SAT:给出一个CNF公式它是否满足真命题的赋值
3-SAT:每一个子句包含恰好3个literals的SAT
上面的例子是一个SAT,但不是一个3-SAT。第3个clause再加一个literal就为3-SAT。
3-SAT可以约减到独立集,即
证明:
给定一个3-SAT的实例我们建立一个独立集的实例(G,K),有一个大小为k的独立集当且仅当是可以满足的。
创建过程:
G对于每一个子句包含3个顶点,对每一个literal有1个;再一个三角形中在一个子句中连接3个literals;连接每一个literal到自身的否定。
3可满足性可以约减到独立集。
G包含一个大小为的独立集,当且仅当是可满足的。
证明:
→
令S为大小为k的独立集,那么S在每一个三角形中包含恰好一个顶点,将这些literal全部设置为true,,其余的变量也保持一致,那么真命题赋值是一致的且所有的子句都满足
←
给定一个满足的命题, 从每一个三角形中选择一个为真的literal。那么这就是一个大小为k的独立集。
总结一下以上三种基本的约减方法:
传递性:
如:
决策问题:是够存在一个大小小于等于k的顶点覆盖?
搜索问题:找到有着最小基数的顶点覆盖
自约减性:搜索问题决策问题,将会应用到这一章节的所有问题中,并且
证明我们对于决策问题的聚焦。
例如:
我们想要找到具有最小技术的顶点覆盖
方法为:
(二进制)搜索找到最小顶点覆盖的基数k*
找到一个顶点v使得G-{v}有一个大小小于等于k*-1的顶点覆盖(在任何的最小顶点覆盖中的任意顶点都有这个性质)
将v包含到这个顶点覆盖中
递归找到一个最小的顶点覆盖G-{v}
下面开始探讨重点的NP问题
首先是决策问题。
X是字符串的一个集合,有一个实例字符串s,那么设计一个算法A解决问题X:使得A(s)=yes当且仅当s∈X
如果算法A是对于每一个字符串s运行在一个多项式时间内的,那么A(s)将会在最多第p(|s|)步终止,其中p(·)是某一个多项式。
定义P:
对一个有着多项式运行时间的算法的决策问题
NP问题:
认证算法的意图:
Certifier(证明者)是从管理的角度来看待事情的,并不能自己决定是否有s∈X,相反,他可以检验一个提出的证明这个s∈X。
定义:算法C(s,t)是一个问题X的证明者,如果对于每一个字符串s有s∈X当且仅当存在一个字符串t使得C(s,t) = yes.
NP是指存在一个多项式Certifier的决策问题,这是相对于P而言的定义。
例子:
给出一个整数s,s是一个合数(质数的反义)吗?
Certificate :s的一个重要的因子t,存在这样的一个凭证存在当且仅当s是一个合数。
Certifier:
如一个实例:
s = 437699
Certificate: t = 541 或者809
结论是:合数是一个NP问题
SAT:给出一个CNF公式是否存在一个满足条件的命题?
Certificate:对于n个布尔变量的真值的赋值
Certifier:检查中的每一个子句,是够含有至少一个真的literal
例如:
实例s
Certificate:
结论:SAT是一个NP问题
哈密顿环(Hamiltonian Cycle)
哈密顿环是:给定一个无向图G=(V, E), 存在一个简单环C能够访问每一个结点
Certificate:n个结点的排列
Certifier:检验排列中是否包含V中的每一个结点恰好出现一次,并且在排列中每一对相邻的结点之间是否存在一条边。
结论:哈密顿环是一个NP问题
那么P是否等于NP呢?
所有的完全多项式非确定性问题,都可以转换为一类叫做满足性问题的逻辑运算问题。既然这类问题的所有可能答案,都可以在多项式时间内计算,人们于是就猜想,是否这类问题,存在一个确定性算法,可以在多项式时间内,直接算出或是搜寻出正确的答案呢?这就是著名的NP=P?的猜想。
如果yes:那么有效的算法对3-Color,TSP, FACTOR, SAT…
如果No:没有有效的算法对3-Color,TSP, FACTOR, SAT…
一致的舆论为p≠NP
最后讨论的是NP完全问题。
问题X多项式约减(polynomial reduces, Cook提出的)到问题Y,如果问题X的任意实例可以使用下面的来解决:
A. 多项式数目的标准计算步骤,加上
B. 可以解决问题Y的oracle的多项式数目的调用
多项式转换(polynomialtransforms, Karp提出的)是指问题X多项式转换为问题Y如果给定一个任意的输入x给X,我们可以生成一个输出y使得x是X的一个yes实例当且仅当y是Y的一个yes实例。
多项式转换是一个对于Y而言只有一个oracle调用的多项式约减,就在对X的算法的最后。几乎所有之前的约减都是这种形式。
那么这两个对于NP而言是相同的吗?
NP完全问题是最难的问题。它的定义是:NP中的一个问题Y有这样的一个性质:对于NP中的任意问题X,有通俗上定义为,如果任何一个NP问题都能通过一个多项式时间算法转换为某个NP问题,那么这个NP问题就称为NP完全问题(Non-deterministic Polynomial complete
problem)。NP完全问题也叫做NPC问题。
完全多项式非确定性问题可以用穷举法得到答案,一个个检验下去,最终便能得到结果。但是这样算法的复杂程度,是指数关系,因此计算的时间随问题的复杂程度成指数的增长,很快便变得不可计算了。
定理:假设y是一个NP完全问题,那么y可以在多项式时间内解决当且仅当P=NP
证明:
←如果P=NP,那么因为y是一个NP问题,因此可以在多项式时间内被解决
→假定y可以在多项式时间内被解决,令X为任意一个NP问题。因为,我们可以在多项式时间内解决X,可以得出,又因为已知,因此有P=NP。
下面描述一个电路可满足性问题,在理论计算机科学中,电路可满足性问题(CIRCUIT-SAT)是决定一个给定的布尔电路是否有一个可以使得输出为true的输入的赋值的决策性问题。
给出一个由AND,OR和NOT门的联合电路,是否存在一个方法设置电路的输入使得其输出为1?
我们可以验证,CIRCUIT-SAT是一个NP完全问题。
证明:任何一个将固定数目的n位作为输入并且产生一个yes/no的输出的算法都可以被这样的一个电路来表示。并且,如果该算法花费多项式时间,那么电路也是多项式大小。(固定为n位是非常重要的,反应了算法和电路之间的基本区别)
考虑一个NP问题X,它有一个多项式时间certifier C(s, t).为了决策s是否在X中,我们需要知道是否存在一个长度为p(|s|)的凭证t使得C(s, t)=yes。
我们将C(s, t)看做是一个|s|+p(|s|)位的算法(输入为s,凭证为t),将其转化为一个多项式时间的电路K。前|s|位是用s硬编码的,剩下的p(|s|)位是t的位,那么电路K是可满足的当且仅当C(s,t)=yes。
例如:
上面的电路就创建了一个电路K,它的输入这样被设置使得K输出为真当且仅当图G有一个大小为2的独立集。
那么如何建立一个NP完全问题呢?
一旦我们建立了第一个NP完全问题,那么其他的也就是一个道理了。
建立问题y的完全NP问题的步骤:
1) 表明Y是一个NP问题
2) 选择一个完全NP问题X
3) 证明
可以证明3-SAT是一个NP完全问题。
下面这个图显示了NP完全问题以及可以多项式约减到另一个问题。
NP完全问题的6个种类和典型例子:
a) 包装问题:SET-PACKING,INDEPENDENT SET
b) 覆盖问题:SET-COVER, VERTEX-COVER
c) 约束满足问题:SAT, 3-SAT
d) 序列问题:HAMILTONIAN-CYCLE, TSP
e) 分区问题:3D-MATCHING, 3-COLOR
f) 数值问题:SUBSET-SUM, KNAPSACK
大部分的NP问题要么是P要么就是完全NP问题。
NP的对称:我们只需要有对于yes实例的简单证明即可。
1. SATvs. TAUTOLOGY
可以证明对于一个给定的赋值,一个CNF公式是可以满足的,那么如何证明一个公式不可满足呢?
2. HAM-CYCLEvs. NO-HAM-CYCLE
给定一个哈密顿环可以证明一个图是哈密顿,那么如何证明一个图不是哈密顿呢?
co-NP是NP决策问题的补集。
那么,NP=co-NP呢?
一致的舆论是不等于的。
如果有NP≠co-NP,那么P≠NP。但可以得出,,
质数问题是一个NP∩co-NP的问题
(Pratt定理)一个奇数是一个质数当且仅当存在一个整数1<t<s,使得对于所有s-1的所有素除子p有
FACTORIZE:给定一个整数x,找出它的素因子
FACTOR:给定两个整数x和y,找出x是否有一个小于y的非凡因子。
定理:
FACTOR是一个NP∩co-NP的问题。