第十章 NP 完全问题
10.1 引言
首先说明一下问题的复杂性和算法的复杂性的区别,下面只考虑时间复杂性。算法的复杂性是指解决问题的一个具体的算法的执行时 间,这是算法的性质;问题的复杂性是指这个问题本身的复杂程度,是问题的性质。比如对于排序问题,如果我们只能通过元素间的相互比较来确定元素间的相互位置,而没有其他的附加可用信息,则排序问题的复杂性是O(nlgn),但是排序算法有很多,冒泡法是O(n^2),快速排序平均情况下是O(nlgn)等等,排序问题的复杂性是指在所有的解决该问题的算法中最好算法的复杂性。问题的复杂性不可能通过枚举各种可能算法来得到,一般都是预先估计一个值,然后从理论上证明。
如果∏是任意一个问题,对∏存在着一个算法,他的时间复杂度是)(k n O ,其中n 是输入规模,k 是非负整数,则认为存在一个解问题∏的多项式时间算法。多项式时间算法是一个有效算法。
把存在多项式时间算法的问题,称为易解决问题;把时间复杂度是以指数函数或排列时间算法的问题,称为难解问题。
为什么用多项式作为划分的标准呢?
1) 对于使用的多项式算法来说,多项式的次数很少大于三;
2) 多项式时间可解问题类具有很好的封闭性。即加、减、组合
等运算封闭;
3) 对很多合理的计算模型来说,在一个模型上用多项式时间可
解的问题,在另一个模型上也可以在多项式时间内获得解
决。
有两类问题:一类是判定问题,另一类是优化问题。判定问题的只牵涉到两种情况:yes 或no。优化问题则牵涉到极值问题(最大化或最小化)。判定问题很容易转换为优化问题。
为了研究问题的复杂性,我们必须将问题抽象,为了简化问题,我们只考虑一类简单的问题,判定性问题,即提出一个问题,只需要回答yes或者no的问题。任何一般的最优化问题都可以转化为一系列判定性问题,比如求图中从A到B的最短路径,可以转化成:从A到B是否有长度为1的路径?从A到B是否有长度为2的路径?…从A 到B是否有长度为k的路径?如果问到了k的时候回答了yes,则停止发问,我们可以说从A到B的最短路径就是k。
如果一个判定性问题的复杂度是该问题的一个实例的规模n的多项式函数,则我们说这种可以在多项式时间内解决的判定性问题属于P类问题。P类问题就是所有复杂度为多项式时间的问题的集合。
10.2 P(Polynomial)类
定义:确定性算法
设A是求解问题∏的一个算法,如果在展示问题∏的一个实例时,在整个执行过程中每一步都只有一种选择,则称A是确定性算法。
比如加减乘除之类计算问题是确定性的,你只要按照公式推导,按部就班一步步来,就可以得到结果。
定义:P类判定问题
如果某个判定问题∏,存在着一个非负整数K ,对输入规模为n 的实数,能够以)(k n O 的时间运行一个确定的算法,得到yes 或no 的答案,则该判定问题∏是一个P 类判定问题。
例如:
1. 最短路径的判定问题:给定有向赋权图G=(V ,E)(权为正整数),正整
数k 及两个顶点s,t ∈V,是否存在一条由s 到t ,长度至多为k 的路径?
2.
可排序的判定问题:给定n 个元素的数组,是否可以按非降顺序排序?
定义:补集下封闭性
令C 是一类问题,如果对C 中的任何问题C ∈∏,∏的补也在C 中,则称C 类问题在补集下封闭。
定理:
P 类问题在补集下是封闭的。
例:不可排序的判定问题:给定n 个元素的数组,是否不可以按非降顺序排序?
是不是每个判定问题都能够在多项式时间内求解呢?否!
事实上,某些判定问题是不能用任何算法求解的。这种问题称为不可判定问题。
例:阿兰.图灵在1936年给出一个著名的例子,称为停机问题。给定一段计算机程序和它的一个输入,判断该程序对于该输入是否会中止,还是无限运行下去。 结论:两种输出都有可能。即必定存在无法判定的问题。
证明:用反证法。假设A 是一个能够求解停机问题的算法,即对于任何程序P 和它的输入I
?????=不会停机
对于输入如果程序会停机对于输入如果程序I P 0I P 1),(I p A
把程序P 看成是它自己的一个输入,利用算法A 对于(P,P)的输出构造下面这个程序
?????===不会停机
对于输入即程序如果停机会停机对于输入即程序如果不停机P P 0,P)P,(P P 1,P)P,()(A A p Q
然后用Q 来代替P ,得到:
?????===不会停机
对于输入即程序如果停机会停机对于输入即程序如果不停机Q Q 0,Q)Q,(Q Q 1,Q)Q,()(A A Q Q 产生矛盾。
结论:两种输出都有可能。即必定存在无法判定的问题。
问题: 是否存在可以判定但是难解的问题呢?存在!
有许多重要问题,我们既没有找到他们的多项式类型算法,也无法证明这样的算法存在。
10.3 NP 类问题
如果有些问题存在着以多项式时间运行的非确定性算法,则这些问题属于NP (Non-Deterministic )类问题。
注意: NP 中的N 是指Non-Deterministic 而不是Non-Polynomial
比如,找大质数的问题。没有一个公式,你一套公式,就可以一步步推算出来,下一个质数应该是多少?再比如,大的合数分解质因数的问题,也没有一个公式,把合数代进去,就直接可以算出,它的因子各自是多少?也没有这样的公式。
这种问题的答案,是无法直接计算得到的,只能通过间接的“猜算”来得到结果。这也就是非确定性问题。
问题 的非确定性算法由两个阶段组成:猜测阶段和验证阶段。 猜测阶段:对输入规模为n 的输入实例x,产生一个输出结果y ,这个输出可能是x 的解,也可能不是,甚至它的形式也不是希望的解的形式。如果再运行一次,可能得到与前一次不同的解,但是总能在多项
式时间
)(k n O 来输出这个结果。 验证阶段:用一个确定性算法来验证两件事情。
1)检查上一阶段所产生的输出y 是否具有正确的形式,如果不具备,算法答案为no ,结束。
2)如果输出y 具有正确的形式,则算法继续检查y 是否是问题输入实例x 的解。如果是,回答yes 结束;否则算法答案为no ,结束。 同样这个阶段的运行时间,也能在多项式时间)(k n O 来输出这个结果。
定义10.3 :NP 问题
判定性问题类NP 由这样的判定问题组成:对于他们存在着多项式时间内运行的不确定性算法。
有些问题很难找到多项式时间的算法(或许根本不存在),比如找出无向图中的哈米尔顿回路问题,但是我们发现如果给了我们该问题的一个答案,我们可以在多项式时间内判断这个答案是否正确。
比如说对于哈米尔顿回路问题(是否存在一条回路,使得图中每个顶点在回路中出现一次且仅有一次),给一个任意的回路,我们很容易判断他是否是哈米尔顿回路(只要看列表中是否是n+1个顶点,除第一个和最后一个相同外,其余顶点都不相同就可以了)。这种可以在多项式时间内验证一个解是否正确的问题称为NP问题。显然,所有的P 类问题都是属于NP问题的,但是现在的问题是,P是否等于NP?这个问题至今还未解决。
M.Garey 和D.Johnson所写的经典专著罗列了几百个这样的问题。
注意,NP问题不一定都是难解的问题,比如简单的数组排序问题是P类问题,但是P属于NP,所以也是NP问题.
10.4 NP完全问题(NPC)
P类问题:可以用多项式时间的确定性算法来进行判定或求解。
NP类问题:可以用多项式时间的确定性算法来检查和验证它的解。
所以:
NP P
P类问题是确定性计算模型下的易解问题类;而NP类问题是非确定性计算模型下的易验证问题类,但还不知道是否有P=NP或者P<>NP,证明其中之一,便可以拿百万美元大奖。
插曲:美国麻州的克雷(Clay)数学研究所于2000年5月24日在巴
黎法兰西学院宣布了一件被媒体炒得火热的大事:对七个“千僖年数学难题”的每一个悬赏一百万美元。以下是这七个难题。
“千僖难题”之一:P (多项式算法)问题对NP (非多项式算法)问题
“千僖难题”之二:霍奇(Hodge)猜想
“千僖难题”之三:庞加莱(Poincare)猜想
“千僖难题”之四:黎曼(Riemann)假设
“千僖难题”之五:杨-米尔斯(Yang-Mills)存在性和质量缺口
“千僖难题”之六:纳维叶-斯托克斯(Navier-Stokes)方程的存在性与光滑性
“千僖难题”之七:贝赫(Birch)和斯维讷通-戴尔(Swinnerton-Dyer)猜想
NP完全问题排在百万美元大奖的首位,足见他的显赫地位和无穷魅力。
非确定性问题通常有个算法,它不能直接告诉你答案是什么,但可以告诉你,某个可能的结果是正确还是错误的。这个可以告诉你“猜算”的答案正确与否的算法,假如可以在多项式时间内算出来,就叫做多项式非确定性问题。而如果这个问题的所有可能答案,都是可以在多项式时间内进行正确与否的验算的话,就叫完全多项式非确定问题。即NP完全问题(记为NPC问题,其中C代表complete)。
定义:NP完全问题
一个判定问题D是NP完全问题,条件是:
1.它属于NP类型;
2.NP中的任何问题都能够在多项式时间内化简为D.
完全多项式非确定性问题可以用穷举法得到答案,一个个检验下
去,最终便能得到结果。但是这样算法的复杂程度,是指数关系,因此计算的时间随问题的复杂程度成指数的增长,很快便变得不可计算了。
Cook 1971年发现,所有的完全多项式非确定性问题,都可以转换为一类叫做满足性问题的逻辑运算问题,即所谓的合取范式可满足性问题,是否可以把真或者假赋给一个给定的合取范式类型的布尔表达式中的变量,使得整个表达式为真。
既然这类问题的所有可能答案,都可以在多项式时间内计算,人们于是就猜想,是否这类问题,存在一个确定性算法,可以在指数时间内,直接算出或是搜寻出正确的答案呢?这就是著名的NP=P?的猜想。
解决这个猜想,无非两种可能,一种是找到一个这样的算法,只要针对某个特定NP完全问题找到一个算法,所有这类问题都可以迎刃而解了,因为NPC问题存在着一个令人惊讶的性质,即如果一个NPC问题存在多项式时间的算法,则所有的NP问题都可以在多项式时间内求解,即P=NP成立!!这是因为,每一个NPC问题可以在多项式时间内转化成任何一个NP问题。另外的一种可能,就是这样的算法是不存在的。那么就要从数学理论上证明它为什么不存在。
NPC问题的历史并不久,cook在1971年找到了第一个NPC问题,此后人们又陆续发现很多NPC问题,现在可能已经有3000多个了。比如前面说的哈米尔顿回路问题就是一个NPC问题。所以,我们一般认为NPC问题是难解的问题,因为他不太可能存在一个多项式时间的
算法(如果存在则所有的NP 问题都存在多项式时间算法,这太不可思议了,但是也不是不可能)。
类似哈米尔顿回路/路径问题,货郎担问题,集团问题,最小边覆盖问题(注意和路径覆盖的区别),等等很多问题都是NPC 问题,所以都是难解的问题。
目前还没有一个NP 完全问题有多项式时间算法。
NP 完全问题有一个方面特别诱人,就是这类问题中,有几个问题在表面上看来与有着多项式时间算法的问题非常相似,如:
1. 最短与最长简单路径:求最短路经问题是P 类问题,而寻找两个
顶点间最常简单路径问题是困难的。仅确定图是否包含一条简单路径,其至少有已知数量的边的问题是NP 完全的。
2. 欧拉回路与哈密尔顿回路:
3. 2-CNF 可满足与3-CNF 可满足性
可满足性是指对公式中的变量取1或0的话,公式取值为1,则该公式是可满足的。
称一个布尔公式为k 合取范式或k-CNF 是指用AND 连接若干个OR 子句,且每个子句中恰有k 个布尔变量或者其否定形式。 如2-CNF 为 )2()(321x x x x ∨∧∨-
,是P 类问题;而3-CNF 为NP 完全问题。
作为一名优秀的人间工作者,一定要懂得关于NP 完全问题的基本原理。如果能确定一个NP 完全问题,就可以提供充足的论据说明其难处理。好的做法是开发一种近似算法或解决墨中已处理问题的特例,
而不是寻找区的问题确切解的一种快速算法。