1、第9章 NP完全理论,第九章 NP完全理论,目录 易解问题和难解问题 P类和NP类问题 NP完全问题 NP完全问题的近似算法,教学目标,理解易解问题和难解问题 理解P类与NP类的概念 理解NP完全问题的概念 理解近似算法的性能比及相对误差的概念 通过实例理解NP完全问题的近似算法,在计算机算法理论中,最深刻的问题之一是:从计算的观点来看,我们要解决的问题的内在复杂性如何,它是“易”计算的还是“难”计算的。如果我们知道一个问题的计算时间下界,我们就可以较正确地评价解决该问题的各种算法的效率,进而确定对已有算法还有多少改进的余地。,在许多情况下,要确定一个问题的内在计算复杂性是很困难的。问题的计算
2、复杂性可以通过解决问题所需计算量的多少来度量。如何区分一个问题是“易”还是“难”呢?人们通常将可以在多项式时间内解决的问题看作是“易”解问题,而将需要指数函数时间解决的问题看作是“难”问题。这里所说的多项式时间和指数函数时间是针对问题的规模而言的,即解决问题所需的时间是问题规模的多项式还是指数函数。,为什么科学家要用多项式函数作为标准定义问题的难易程度? (1)为有过多时间要求的问题提供一个好的标准; (2)多项式函数在加、乘运算下是自封闭的,并且在那些有用的分析算法复杂性函数类中,多项式函数是最小函数类; (3)多项式时间复杂性的分析结果,对于常用的各种计算机模型,具有不变性。存在多项式时间
3、算法的问题称为易解问题, 需要在指数时间内解决的问题称为难解问题。,计算模型,在进行问题的计算复杂性分析之前,首先必须建立求解问题所用的计算模型,包括定义该计算模型中所用的基本运算,其目的是为了使问题的计算复杂性分析有一个共同的客观尺度。 三种主要的计算模型:随机存取机RAM (Random Access Machine)随机存取存储程序机RASP (Random Access Stored Program Machine)图灵机(Turing Machine)这三个计算模型在计算能力上是等价的,但计算速度不同。,随机存取机RAM,随机存取机所描述的形式计算机是一台单累加器计算机。它不允许程序
4、修改其自身。其结构如下:,随机存取机RAM,随机存取机:由只读输入带、只写输出带、程序存储部件、内存储器、指令计数器组成。注:输入带、输出带可无限长;内存储器由一系列寄存器组成,并且可存放任意大小的整数,寄存器个数无限。,随机存取机RAM,RAM的程序不是存放在内存储器中,程序是一个带标号的指令序列。 RAM设有:算术运算指令、输入输出指令、存取指令、转移指令。 RAM的寻址方式:直接寻址和间接寻址。 RAM的指令由操作码和操作数组成。操作数有三种形式:=i(直接数), i(直接地址), *i(间接地址) RAM的基本指令集(略),随机存取机RAM,2. RAM程序,一个RAM程序定义了从输入
5、带到输出带的一个映射。可以对 这种映射关系作2种不同的解释。,解释一:把RAM程序看成是计算一个函数若一个RAM程序P总是从输入带前n个方格中读入n个整数 x1,x2,xn,并且在输出带的第一个方格上输出一个整数y 后停机,那么就说程序P计算了函数f(x1,x2,xn)=y,解释二:把RAM程序当作一个语言接受器。将字符串S=a1a2an放在输入带上。在输入带的第一个方 格中放入符号a1,第二个方格中放入符号a2,第n个方格中 放入符号an。然后在第n+1个方格中放入0,作为输入串的结束标 志符。如果一个RAM程序P读了字符串S及结束标志符0后,在输出 带的第一格输出一个1并停机,就说程序P接
6、受字符串S。,随机存取机RAM,3. RAM程序的耗费标准,标准一:均匀耗费标准在均匀耗费标准下,每条RAM指令需要一个单位时间;每 个寄存器占用一个单位空间。以后除特别注明,RAM程序的复杂 性将按照均匀耗费标准衡量。,标准二:对数耗费标准对数耗费标准是基于这样的假定,即执行一条指令的耗费 与以二进制表示的指令的操作数长度成比例。在RAM计算模型下, 假定一个寄存器可存放一个任意大小的整数。因此若设l(i)是整 数i所占的二进制位数,则,随机存取存储程序机RASP,1. RASP的结构RASP的整体结构类似于RAM,所不同的是RASP的程序是存储在寄存器中的。每条RASP指令占据2个连续的寄
7、存器。第一个寄存器存放操作码的编码,第二个寄存器存放地址。RASP指令用整数进行编码。RASP指令集中不需要间接寻址,其余指令与RAM指令集一样。,随机存取存储程序机RASP,2. RASP程序的复杂性不管是在均匀耗费标准下,还是在对数耗费标准下,RAM程序和RASP程序的复杂性只差一个常数因子。在一个计算模型下T(n)时间内完成的输入-输出映射可在另一个计算模型下模拟,并在kT(n)时间内完成。其中k是一个常数因子。空间复杂性的情况也是类似的。,图灵机,1. 多带图灵机,图灵机,1. 多带图灵机,根据有限状态控制器的当前状态及每个读写头读到的带符号,图灵机的一个计算步可实现下面3个操作之一或
8、全部。 (1)改变有限状态控制器中的状态。 (2)清除当前读写头下的方格中原有带符号并写上新的带符号。 (3)独立地将任何一个或所有读写头,向左移动一个方格(L)或向右移动一个方格(R)或停在当前单元不动(S)。,图灵机,k带图灵机可形式化地描述为一个7元组(Q,T,I,b,q0,qf),其中: (1)Q是有限个状态的集合。 (2)T是有限个带符号的集合。 (3)I是输入符号的集合,IT。 (4)b是惟一的空白符,bT-I。 (5)q0是初始状态。 (6)qf是终止(或接受)状态。 (7)是移动函数。它是从QTk的某一子集映射到Q (TL,R,S)k的函数。,图灵机,1. 多带图灵机,图灵机M
9、的时间复杂性T(n)是它处理所有长度为n的输入所需的最大计算步数。如果对某个长度为n的输入,图灵机不停机,T(n)对这个n值无定义。,图灵机的空间复杂性S(n)是它处理所有长度为n的输入时,在k条带上所使用过的方格数的总和。如果某个读写头无限地向右移动而不停机,S(n)也无定义。,与RAM模型类似,图灵机既可作为语言接受器,也可作为计算函数的装置。,非确定性图灵机,非确定性图灵机( NDTM ):一个k带的非确定性图灵机M是一个7元组:(Q,T,I,b,q0,qf)。与确定性图灵机不同的是非确定性图灵机允许移动函数具有不确定性,即对于QTk中的每一个值(q;x1,x2,xk),当它属于的定义域
10、时,Q(TL,R,S)k中有惟一的一个子集(q;x1,x2,xk)与之对应。可以在(q;x1,x2,xk)中随意选定一个值作为它的函数值。,在图灵机计算模型中,移动函数是单值的,即对于QTk中的每一个值,当它属于的定义域时,Q(TL,R,S)k中只有惟一的值与之对应,称这种图灵机为确定性图灵机,简记为DTM(Deterministic Turing Machine)。,非确定性图灵机,确定性和非确定性图灵机的区别在于:确定性图灵机的每一步只有一种选择,而非确定性图灵机却可以有多种选择。由此可见,非确定性图灵机的计算能力比确定性图灵机的计算能力强的多。对于一台时间复杂性为T(n)的非确定性图灵机
11、,可以用一台时间复杂性为O(C T(n) )的确定性图灵机来模拟,其中C为一常数。如果T(n)是一个合理的时间复杂性函数,M是一台时间复杂性为T(n)的非确定性图灵机,可以找到一个常数C和一台确定性图灵机M,使得它们可接受的语言相同,且M的时间复杂性为O(C T(n) ),9.2 P类与NP类问题,本书的许多算法都是多项式时间算法,即对规模为n的输入,算法在最坏情况下的计算时间为O(nk),k为一个常数。是否所有的问题都在多项式时间内可解呢?No,9.2 P类与NP类问题,一般地,将可由多项式时间算法求解的问题看作是易处理的问题。而将需要超多项式时间才能求解的问题看作是难处理的问题。有许多问题
12、,从表面上看似乎并不比排序或图的搜索等问题更困难,然而至今人们还没有找到解决这些问题的多项式时间算法,也没有人能够证明这些问题需要超多项式时间下界。也就是说,在图灵机计算模型下,这类问题的计算复杂性至今未知。为了研究这类问题,人们提出了另一个能力更强的计算模型非确定性图灵机计算模型,简记NDTM。在这个计算模型下,许多问题就可以在多项式时间内求解。,P类问题,定义2 如果对于某个判定问题 ,存在一个非负整数k,对于输入规模为n的实例,能够以O(nk)的时间运行一个确定性算法,得到是或否的答案,则该判定问题 是一个P类问题。 从定义2可以看出,P类问题是一类能够用确定性算法在多项式时间内求解的判
13、断问题。事实上,所有易解问题都属于P类问题。例如最短路径判定问题(SHORTEST PATH)就属于P类问题。,NP类问题,定义4 如果对于某个判定问题,存在一个非负整数k,对于输入规模为n的实例,能够以O(nk)的时间运行一个不确定算法,得到是或否的答案,则该判定问题是一个NP类问题。 从定义4可以看出,NP类问题是一类能够用不确定算法在多项式时间内求解的判定问题。 对于NP类判定问题,重要的是它必须存在一个确定算法,能够以多项式时间来验证在猜测阶段所产生的答案。,P类问题和NP类问题的关系,(1)P类问题可以用多项式时间的确定性算法来进行判定或求解。 (2)NP类问题可以用多项式时间的不确
14、定性算法来进行判定或求解,关键是存在一个确定算法,能够以多项式的时间来验证在猜测阶段所产生的答案。 大多数研究者相信NP类是比P类要大得多的集合,NP完全问题,NP完全问题是NP类问题的一个子类,是更为复杂的问题。 该类问题有一种奇特的性质:如果一个NP完全问题能在多项式时间内得到解决,那么NP类中的每个问题都可以在多项式时间内得到解决,即P=NP成立!。 这是因为,任何一个NP问题均可以在多项式时间内变换成NP完全问题。,多项式变换技术,定义5 令 是一个判定问题,如果: (1) NP,即问题属于NP类问题 (2)对NP中的所有问题 ,都有 p则称判定问题是一个NP完全问题,简记为NPC。,
15、如果问题Q1的任何一个实例,都能在多项式时间内转化成问题Q2的相应实例,从而使得问题Q1的解可以在多项式时间内利用问题Q2相应实例的解求出,称问题Q1是可多项式变换为问题Q2的,记为Q1p Q2,其中p表示在多项式时间内完成输入和输出的转换。 多项式变换关系是可传递的。,典型的NP完全问题,Cook在他1971年的论文中指出:所谓的合取范式可满足性问题就是NP完全问题 。 几个典型的NP完全问题。 (1)图着色问题COLORING (2)路径问题LONG-PATH (3)顶点覆盖问题VERTEX-COVER (4)子集和问题SUBSET-SUM (5)哈密尔顿回路问题HAM-CYCLE (6)
16、旅行商问题TSP (7)装箱问题BIN-PACKING,9.4 NP完全问题的近似解法,一般来说,近似算法所适应的问题是最优化问题,即要求在满足约束条件的前提下,使某个目标函数值达到最大或者最小。对于一个规模为n的问题,近似算法应该满足下面两个基本的要求:(1)算法的时间复杂性:要求算法能在n的多项式时间内完成。 (2)解的近似程度:算法的近似解应满足一定的精度。通常,用来衡量精度的标准有近似比和相对误差。,近似算法,迄今为止,所有的NP完全问题都还没有多项式时间算法。对于这类问题,通常可采取以下几种解题策略。 (1)只对问题的特殊实例求解 (2)用动态规划法或分支限界法求解 (3)用概率算法
17、求解 (4)只求近似解 (5)用启发式方法求解 本章主要讨论解NP完全问题的近似算法。,近似算法的性能,若一个最优化问题的最优值为c*,求解该问题的一个近似算法求得的近似最优解相应的目标函数值为c,则将该近似算法的性能比定义为= 。在通常情况下,该性能比是问题输入规模n的一个函数(n),即 (n)。,该近似算法的相对误差定义为= 。若对问题的输入规模n,有一函数(n)使得 (n),则称(n)为该近似算法的相对误差界。近似算法的性能比(n)与相对误差界(n)之间显然有如下关系:(n)(n)-1。,近似算法的性能,对有些NP完全问题,可以找到这样的近似算法,其性能比可以通过增加计算量来改进。也就是
18、说:在计算量和解得精度之间有一个折中。较少的计算量得到较粗糙的近似解,而较多的计算量可以获得较精确地近似解。近似格式:一个最优化问题的近似格式是指带有近似精度0的一类近似算法。对于固定的0,该算法的相对误差界为。多项式时间近似格式:对固定的0和问题的一个输入规模为n的实例,用近似格式表示的近似算法是多项式时间算法。,9.4.1 顶点覆盖问题,问题描述:无向图G=(V,E)的顶点覆盖是它的顶点集V的一个子集VV,使得若(u,v)是G的一条边,则vV或uV。顶点覆盖V的大小是它所包含的顶点个数|V|。,VertexSet approxVertexCover ( Graph g ) cset=;e1
19、=g.e;while (e1 != ) 从e1中任取一条边(u,v);cset=csetu,v;从e1中删去与u和v相关联的所有边;return c ,Cset用来存储顶点覆盖中的各顶点。初始为空,不断从边集e1中选取一边(u,v),将边的端点加入cset中,并将e1中已被u和v覆盖的边删去,直至cset已覆盖所有边。即e1为空。,9.4.1 顶点覆盖问题,图(a)(e)说明了算法的运行过程及结果。(e)表示算法产生的近似最优顶点覆盖cset,它由顶点b,c,d,e,f,g所组成。(f)是图G的一个最小顶点覆盖,它只含有3个顶点:b,d和e。,算法approxVertexCover的性能比为2
20、。,9.4.1 顶点覆盖问题,顶点覆盖问题的近似算法性能:实例中的最优值为3(b,d,e),有这三个顶点则可访问到所有边。该近似算法的最优值为6(b,c,d,e,f,g),通过这六个顶点可以访问到所有边。 结论:cset是近似解的最优值,cset*是精确解的最优值,|cset|=2|cset*|。,9.4.2 装箱问题,1、问题描述:设有n个物品w1,w2,wn和若干个体积均为C的箱子b1,b2,bk,。N个物品的体积分别为s1,s2,sn且有si=C(1=i=n)。要求把所有物品分别装入箱子且物品不能分割,使得占用箱子数最少的装箱方案。 2、算法的设计方案:把n个物品划分为若干个子集,每个子
21、集的体积和小于等于C,然后取子集个数最少的划分方案。这种划分的方案数有(n/2)n/2种,在多项式时间内不能保证找到最优装箱方案。考虑用探索式方法求近似解,9.4.2 装箱问题,方法一:首次适宜法 (1)把箱子按下标1,2,k,标记,所有的箱子初始化为空; (2)将物品按w1,w2,wn的顺序装箱; 装箱过程:第一个物品装入第一个箱子,如果第一个箱子还能装下第二个物品,则继续装入,否则,将第二个物品装入第二个箱子。 一般地:为了装入物品wi,先找到能装wi的下标最小的箱子bk,在将wi装入bk,重复这一过程,直到把所有物品都装入箱子为止。,9.4.2 装箱问题,首次适宜法的算法描述: Int
22、firstfit(int n, int c, int c,int s) int I,j,k=0;for(i=1;i=n;i+)bi=0; /箱子初始化为空for(i=1;i=n;i+) /物品按顺序装入箱子 j=1;while(C-bjsi) /查找能容纳物品i的下标最小的箱子jj+;bj=bj+si;k=max(j,k); /已装入物品的箱子的最大下标return k; ,9.4.2 装箱问题,方法二:最适宜法类似于首次适宜法,不同的是,为了装入物品wi,首先检索能容纳si,并且装入物品wi后使得剩余容量最小的箱子bk,在把物品装入该箱子,重复这些步骤,直到把所有物品都装入箱子为止。,9.4
23、.2 装箱问题,最适宜法的算法描述: Int firstfit(int n,int c,int b,int s) int I,j,k=0; / k表示箱子的下标for(i=1;i0 ,9.4.3 旅行售货员问题,问题描述:给定一个完全无向图G=(V,E),其每一边(u,v)E有一非负整数费用c(u,v)。要找出G的最小费用哈密顿回路。,比如,费用函数c往往具有三角不等式性质,即对任意的3个顶点u,v,wV,有:c(u,w)c(u,v)+c(v,w)。当图G中的顶点就是平面上的点,任意2顶点间的费用就是这2点间的欧氏距离时,费用函数c就具有三角不等式性质。,旅行售货员问题的一些特殊性质:,9.4
24、.3 旅行售货员问题,具有三角不等式性质的旅行售货员问题仍然是NP完全问题。不太可能找到解此问题的多项式时间算法。转而寻求解此问题的有效地近似算法。当费用函数c具有三角不等式性质时,可以设计出一个近似算法,其性能比为2。而对于一般情况下的旅行售货员问题则不肯能设计出具有常数性能比得近似算法。,9.4.3 具有三角不等式性质的 旅行售货员问题,对于给定的无向图G,可以利用找图G的最小生成树的算法设计找近似最优的旅行售货员回路的算法。,void approxTSP (Graph g) (1)选择g的任一顶点r;(2)用Prim算法找出带权图g的一棵以r为根的最小生成树T;(3)前序遍历树T得到的顶
25、点表L;(4)将r加到表L的末尾,按表L中顶点次序组成回路H,作为计 算结果返回; ,当费用函数满足三角不等式时,算法找出的旅行售货员回路的费用不会超过最优旅行售货员回路费用的2倍。,9.4.3 具有三角不等式性质的 旅行售货员问题举例,(b)表示找到的最小生成树T;(c)表示对T作前序遍历的次序;(d)表示L产生的哈密顿回路H; (e)是G的一个最小费用旅行售货员回路。,9.4.3 一般的旅行售货员问题,在费用函数不一定满足三角不等式的一般情况下,不存在具有常数性能比的解TSP问题的多项式时间近似算法,除非P=NP。换句话说,若PNP,则对任意常数1,不存在性能比为的解旅行售货员问题的多项式
26、时间近似算法。,9.4.4 集合覆盖问题,问题描述:由一个有限集X及X的一个子集族F组成。子集族F覆盖了有限集X。也就是说X中每一元素至少属于F中的一个子集,即 。对于F中的一个子集 ,若C中的X子集覆盖了X,即 ,则称C覆盖了X。集合覆盖问题就是要找到F中覆盖X的最小子集C*,使得,9.4.4集合覆盖问题,集合覆盖问题的例子: 用12个黑点表示集合X。F=S1,S2,S3,S4,S5,S6 如右图所示: 该例子的最小集合覆盖C=S3,S4,S5,9.4.4 集合覆盖问题,对于集合覆盖问题,可以设计出一个简单的贪心算法,求该问题的一个近似最优解。 算法描述:Set greedySetCover(X,F)U=X; x=null;while(U!=null)选择F中使|SU|最大的子集S;U=U-S;C=CS;return C;,结束语,总而言之,在未来的学习和工作旅途中,无论大家通过何种方式与算法打交道,前方的道路仍旧会像从前一样令人激动。能够像算法学这样肯定地做出这种保证的科学和工程领域并不多。希望大家在这个领域能有令人满意的收获。,