NPC

 

     这里的想说的NPC不是Non-Player-Controled,非玩家控制角色,而是Non-determinisitc Polynomial complete problem,它属于一类很特殊的问题,迄今为止,没有人能够找出求解NPC问题的多项式时间的算法,同时也没有人能够证明对于这类问题不存在多项式时间算法;

     最短(Bellman -Ford)与最长简单路径,欧拉游程(Fleury)和哈密顿回路,2-CNF可满足性和3-CNF可满足性,这些问题看起来差别很小,但是成对的问题中前者存在多项式时间的算法,而后者属于NPC问题,不存在多项式时间的算法;其实算法中关于这个问题的研究感觉也仅仅存在理论意义,应该平时很少会接触到这些东西,异或是真的在实际应用中一个算法的模拟对应的是一个NPC的问题,你证明了这个算法不存在多项式时间解决的算法,此时你只能够改变解决方案或者利用近似的算法进行解决,唯一能够想象的应用场景就是这样,不过这种场景也是少之又少吧,所以还是作为一个学术的问题或者算法中一个经典的问题作为了解,不过话说如果真的有人能够找到其中一个NPC问题的多项式时间算法或者证明了这种算法的不存在性,其对计算机科学的贡献就非常的巨大了,这一类问题均是想通的,解决其中一个所有的都可以解决了,这正是这一类问题的奇妙所在,后面证明NPC问题的方法也体现了这一点,如过仅仅想了解一些概念接下来的稍微介绍一下概念,后面是一些NPC问题的证明可以忽略~

    P类问题:多项式时间内可解的问题;

    NP类问题:多项式时间内“可验证”的问题;这里的可验证针对某一个问题给出其中一个解决方案,能够在问题输入规模的多项式时间内验证此个解决方案是正确的;

    从上面的概念可以看出,P中的任何问题也都属于NP;但是关于P和NP的范围,仍是一个不可解的问题,P属于NP的子集,但是是否为真子集?

    NPC类问题,首先这个问题必须属于NP类,但是这个问题的解决难度大于或者等于所有NP中问题的“难度”;难度的定义可以简单理解为一个转换的过程,如果一个问题的所有解决方案可以通过多项式时间转换至另一个问题的解决方案,并且可以通过目的问题的解决问题判定是否属于原问题的解决方案,则成目的问题的难度大于原问题的难度,因为这个过程是单方向的,原问题的所有解决方案可以映射至目标问题集中,但是目标问题集中的部分问题无对应的映射,图示则如下:
   

NPC_第1张图片

    理解了这个难度问题就可以理解NPC问题了,NPC问题的“难度”是相当的,并且难度大于所有的NP类问题,所以如果解决了一个NPC问题,也就是说设计了一个NPC问题的多项式时间算法,则所有的NP类问题可以转换为NPC问题,则说明所有NP类和NPC类问题都存在一个多项式时间的算法,是不是很诱人,这还是一个非常大的问题的;

    一些常见的NPC问题举例,并且证明结构:

   

NPC_第2张图片

从上至下的问题分别是:

布尔组合电路的可满足性:此问题是一切NPC类问题的鼻祖,证明方法在算法导论中也只是领略了一点,还是一知半解,因为涉及到硬件知识了,就是靠这个问题才知道NPC这个集合非空,然后接下来各种NPC问题被证明;

布尔公式可满足性:布尔变量+布尔连接词+括号组成的公式;

3-CNF可满足性:3-CNF也是布尔公式,形式比较特殊,由子句组成,子句之间用“与”连接,子句由三个变量(or变量的非)的“或”组成;

团问题:无向图中的团是一个顶点子集,其中每一对顶点之间由E中的一条边相连;

顶点覆盖问题:覆盖无向图中所有边E的顶点组成的集合;

哈密顿回路:有向图的简单回路,包含V中每个顶点;

旅行商问题:

子集和问题:

 

 

如果只是想要了解看到这里就可以了,下面简单的描述NPC类各种问题的证明方法:

1、证明L属于NP类问题;

2、选取一个已知的NP完全语言L‘

3、描述一种算法来计算一个函数f,它把L’中的每个解决方案x映射到L中的一个解决方案f(x)

4、对于所有的x,函数f满足x属于L‘当且仅当f(x)属于L

5、证明计算函数算法具有多项式运行时间

上面的证明简单的说就是找到一个NP问题,然后该问题的难度如果大于或等于一个已经的NPC问题,则该问题是NPC问题!

刚开始的证明基础是布尔组合电路的可满足性,这个问题设计电路知识,简单的来说,所有的问题编程运行的时候都要在电脑上运行,电脑可以看作一个布尔电路,所以所有NP可以转换为该问题,然后该问题的一个解决方案,就是输入的赋值能够在多项式时间内检验其正确性,所以第一个NPC问题就诞生了,以后问题的证明就可以利用这个已知的NPC问题和上面的证明方法了~

接下来证明方法重要的就是多项式时间的转换的方法!首先,证明属于NP类问题只要找到一个解决方案能够在多项式时间内验证,则属于NP;然后利用多项式时间转换的方法和一个已知的NPC即可证明。

 

不知道所提的量子计算机是不是和布尔电路的可满足性问题的NPC相关,我只是假设可能量子计算机的概念就是他本身突破了这个布尔电路满足性的NPC问题,所以他能够增加很多速度,这里只是作为一个无知的人随便猜想一下~了解这方向的人可以告诉我一下;

 

公式可满足性:利用布尔组合电路的可满足性,转换方法:

 

NPC_第3张图片

这个转换比较显而易见,如上图所示;针对每个门电路,利用一个等价的公式,然后所有利用与连接起来,最后连接布尔电路的输出,这样的转换就正确率。如果布尔电路满足,则通过这个多项式的转换至右边的公式时同样能够满足,所以这种转换是正确的;

3-CNF可满足性:

 

NPC_第4张图片

首先将一个布尔公式转换成一个二叉树,如上面所示,这是转换的第一个步骤;

NPC_第5张图片

然后针对二叉树利用和第一个一样的原理进行改写,改写成如上图所示的公式;

NPC_第6张图片

针对改写后的每项内容,其最多包含3个基本元素,这样利用真值表可以将上面的三个基本元素转换成下面的形式;DNF的形式(析取范式);取反之后可以得到合取范式的形式;

有的项目包含1个元素或者2个元素的则利用上面两条规则转换至3个元素,最后转换为3-CNF的形式,整个转换过程花费多项式时间;所以证明成立~

团问题:

 

NPC_第7张图片

利用3-CNF证明,首先是NP类问题,接着3-CNF进行转换,每个子句的三个元素作为节点,然后连接,两种情况不存在连接:

1、一个元素和它的非形式不进行连接;

2、子句内的元素不进行连接;

这样就转换为团问题的图了,团问题就也为NPC问题了。

顶点覆盖问题:

NPC_第8张图片

NPC_第9张图片

这里利用团问题进行证明,首先属于NP问题,然后图的团问题转换原图的顶点覆盖问题~

假设G包含一个团V'是V的子集,且V'=k,我们断言,V-V'是G补图中的一个顶点覆盖,设u,v是E补图中的任意边,则u,v不属于E,这说明u或v至少有一个不属于V',因为V’中的每一对顶点都有一条E中的边相连接。等价的,u或者v至少有一个属于V-V',这意味着边u,v被V-V'所覆盖。由于u,v是从E的补图中任意选取的边,所以E的补图中的所有边都被V-V'中的一个顶点所覆盖。

反之,假设G的补图具有一个顶点覆盖V'属于V,其中V‘=V-k,那么,对于所有u,v属于V,如果u,v属于E的补图,那么u属于V’或者v属于V’或者都属于V’ ,与此相对,对所有u,v属于V,如果u不属于V'且v不属于V',则有u,v属于E,换句话说,V-V'是一个团,其规模为V-V'=k,证明结束。

哈密顿回路问题,

 

旅行商问题,这个问题的证明比较简单,首先该问题本属于一个最优化问题,但是最优化问题都可以通过转换至判定问题。

比如TSP={<G,c,k>:G=(V,E)是一个完全图,c是V*V→Z上的一个函数,k属于Z且G包含一个费用至多为k的旅行商的旅行回路}

这个问题在给出一个实例之后必定能够在多项式的时间对其验证,那么它就属于NP问题。然后通过哈密顿回路证明其为NPC问题。

设G图为一个哈密顿环,构造TSP问题如下,建立完全图G‘,其中定义费用函数

c(i,j)=0  如果i,j属于哈密顿回路中的边

              1  如果i,j不属于哈密顿回路中的边

现在说明图G中具有一个哈密顿回路,当且仅当图G'中有一个费用至多为0的回路。假定图G中有一个哈密顿回路h,h中的每条边都属于E,因此在G‘中的费用为0,因此,h在G’中是费用为0的回路。反之,假定图G‘中有一个费用为h’至多为0的回路。由于E‘中边的费用只能是0和1,所以回路h’的费用就是,且回路上每条边的费用必为0。因此,h‘仅包含E中的边。这样,我们就得出结论,h’是图G中的一个哈密顿回路。

 

子集和问题;

利用3-CNF进行归约证明

根据一个给定的3-CNF构造如下的一个数字期望和和子集合如下:

NPC_第10张图片

其中t的位数是n+k位,其中n是子元素的个数及x下标的个数,k是子句的个数,这里n=3,k=2,所以构造上表。

s1,s1',s2,s2'属于松弛标量,就是在相应的Ci处分别设置1,2,后面证明起松弛的作用,保证后k位满足4;

vi,vi‘是唯一的~,相应位置xi处均标1,主要差别是Ci处标记,如果子句包含xi,则vi处标记1,包含非xi,则vi’处标记1~,这里比较乱,看下表比较清晰了。

接下来就是根据表进行证明3-CNF的满足性等价于这个集合去子集合满足目标t。

如果xi为1,则取vi集合,否则取vi‘集合,这样就满足了t的前n位,同时3-CNF满足,表示子句至少有一个为真,则取的满足前n位的集合子句中至少有一个为1,则其中一个子句必定至少为1,至多为3,然后加上后面的松弛变量si,si’就可以构造出满足t的子集合;

反之,同样的原理,子集必定包含vi或者vi‘其中一个,满足vi,则xi=1,否则xi=0,这样赋值必定能够满足3-CNF,

所以证明结束,子集和问题是一个NPC问题;

你可能感兴趣的:(c)