首页 > 其他分享 >NP完全问题

NP完全问题

时间:2023-06-14 23:14:35浏览次数:29  
标签:多项式 完全 问题 vee Clique NP SAT

到现在为止我们讨论的问题都是面对一个问题如何设计出一个高效的算法。现在我们要讨论一个不同的问题,我们可以通过分析证明一些问题是不可能存在高效的算法的。而证明的方法依然是设计算法。

多项式时间复杂度是优秀的复杂度。确定型图灵机能在多项式时间复杂度内解决的问题的集合称为\(P\),这里的P指polynomial time。非确定型图灵机能在多项式时间复杂度内解决的问题的集合称为\(NP\)。特别注意,\(NP\)不是指non polynomial,而是指non-deterministic polynomial time。普通计算机都是确定型图灵机,而“非确定型图灵机”在面临选择(比如搜索类问题)时能同时尝试“选”与“不选”。因此,非确定型图灵机能在多项式复杂度内解决的问题等价于确定型图灵机能在多项式复杂度内“验证”的问题。显然,\(P \subseteq NP\)。最著名的问题就是,是否成立\(P \subsetneq NP\)?或者说是否有\(P=NP\)?举个生动的例子,“不会做但能看懂答案的题”是否等价于“会做的题”?

我们讨论问题的难度:定义多项式时间图灵归约\(f \leq_T^P g\),表示\(g\)是多项式复杂度的图灵机,能够用来解决\(f\),同时要求\(f\)的运行步骤是多项式复杂度的,调用\(g\)的次数也是多项式(多项式乘以多项式依然是多项式)。如果存在一个\(g\),使得对于所有\(NP\)问题\(f\)都有\(f \leq _T^P g\),那么称\(g\)是一个NP-hard问题。注意NP-hard问题不一定是NP问题。如果\(f\)是NP-hard同时也是NP的,那么\(f\)被称为NP-complete问题。如果我们证明了一个NP-complete问题是能多项式解决的,就能证明\(P=NP\)。

SAT问题是一个NP-complete问题。合取范式(CNF)由若干个括号由\(\wedge\)连成,每个括号由布尔变量\(x_i\)或\(\neg x_i\)用\(\vee\)连成。比如\((x_1 \vee x_3 \vee \neg x_4)\wedge(x_2 \vee \neg x_3) \wedge(x_1 \vee x_2)\)。SAT问题就是,输入一个CNF,问是否存在一个\(x_1\)到\(x_n\)的赋值使得CNF的值为true。为什么SAT是NP-complete的证明比较复杂,简单来说就是如果存在多项式时间解决SAT的算法,那么我们就可以模拟非确定型图灵机。由于规约具有传递性,要证明某个问题\(f\)是NP-hard,只需证明SAT\(\leq_T^P f\)。

3-SAT问题是一个特殊的SAT问题,它要求输入的CNF的每个括号里都恰好只有3个布尔变量。显然有3-SAT\(\leq_T^P\)SAT,我们想证明SAT \(\leq_T^P\) 3-SAT。这里用到一个关键的技巧:当\(x_i\)任取时,一定存在一个\(y\)使得\((x_1 \vee x_2 \vee x_3 \vee x_4)=(x_1 \vee x_2 \vee y) \wedge (\neg y \vee x_3 \vee x_4)\)。如果\(y=0\),那么RHS等价于\((x_1 \vee x_2)\),如果\(y=1\),那么RHS等价于\((x_3 \vee x_4)\)。意思是说,如果LHS=1,那么要么\(x_1,x_2\)中有1要么\(x_3,x_4\)中有1。对于前者,只需取\(y=1\),对于后者,只需取\(y=0\);如果LHS=0,只需取\(y=0\),就有RHS=0。

一般地,一定存在一个\(y_i\)的取值使得:\((x_1 \vee x_2 \vee \cdots \vee x_k)=(x_1 \vee x_2 \vee y_1) \wedge (\neg y_1 \vee x_3 \vee y_2) \wedge (\neg y_2 \vee x_4 \vee y_3)\)\(\wedge \cdots \wedge (\neg y_{k-3} \vee x_{k-1} \vee x_k)\)。意思是说,如果LHS=1,那么分类讨论:如果\(x_1,x_2\)中有1,那么取\(y_1=0,y_i=0\);如果\(x_3=1\),那么取\(y_1=1,y_2=0,y_i=0\);如果\(x_4=1\),那么取\(y_2=1,y_1=1,y_3=0,y_i=0\);如果\(x_p=1\),那么取\(y_1\cdots y_{p-2}=1\),\(y_{p-1}\cdots y_{k-3}=0\);如果\(x_{k-1},x_k\)中有1,那么取\(y\)全都取1。如果LHS=0,那么只需取\(y_1=0\),就有RHS=0。

于是对于任何SAT问题, 我们做这样的替换,就能把它转变成3-SAT问题。即SAT \(\leq_T^P\) 3-SAT。因此SAT等价于3-SAT。

SAT可以规约为图论中的独立集问题。图上没有互相连边的点的集合称为一个独立集。我们的问题是:给定一张图,问是否存在一个\(k\)个点的独立集。每个3-CNF(\(n\)个布尔变量,\(m\)个括号)对应着一张图,图上有\(2n\)个节点分别对应\(x_i\)与\(\neg x_i\),将每个括号里的三个点连成三角形,再将所有\(x_i,\neg x_i\)之间相连。每个独立集里最多只能有每个三角形里的一个点,也不可能同时有\(x_i\)与\(\neg x_i\)。假如我们能在这张图里找到一个\(m\)个点的独立集,那么令这\(m\)个点对应的布尔变量取1,这就保证了3-CNF的每个括号里恰好有一个1,因此有SAT问题\(\leq_T^P\)独立集问题。因此独立集问题是一个NP-hard问题。

点覆盖是指选出一个点的集合,使得与这些点相连的所有边覆盖了整张图的所有边。任意取一个独立集,然后反向选择所有不属于独立集的点,这个点集构成\(S\)。假设存在一条边,它的两个端点都不在\(S\)中,那么说明这两个点都在独立集中,这是不可能的,因此\(S\)覆盖了所有边。任意取一个点覆盖,然后反向选择所有不属于点覆盖的点,这个点集构成\(W\)。假设存在一条边,它的两个端点都在\(W\)中,那么这两个端点都不在点覆盖中,这是不可能的,因此\(W\)是独立集。综上,假设存在一个\(u\)个节点的独立集,那么对应地一定存在一个\(n-u\)个节点的点覆盖。假设存在一个\(u\)个节点的点覆盖,那么对应地一定存在一个\(n-u\)个节点的独立集。因此,如果最大独立集是\(m\),那么最小点覆盖就是\(n-m\)。

我们可以构造无向图\(G\)的补图\(G'\):本来没边的都有边,本来右边的都没变(邻接矩阵取反)。一个Clique是指两两互相有边的点的集合。于是,\(G\)中的独立集一定是\(G'\)中的Clique,\(G'\)中的Clique一定是G中的独立集。于是\(G\)中的独立集与\(G'\)中的Clique一一对应,因此求\(G'\)的Clique等价于求\(G\)的独立集。所以有独立集问题\(\leq_T^P\)Clique问题。由规约的传递性得,SAT \(\leq_T^P\)Clique。因此Clique问题是NP-hard问题。

Half Clique询问是否存在一个\(|V|/2\)个节点的Clique。假设我们已经解决了Half Clique,现在要证明我们可以用它来解决Clique。假设询问的\(k< |V|/2\),我们等价地考虑独立集。那么我们在原图的基础上新增\(|V|-2k\)个孤立的节点形成一张新的图。询问新图是否存在\(|V'|/2=|V|-k\)个点的独立集等价于询问原图是否存在\(|V|-k-(|V|-2k)=k\)个点的独立集,因此此时Clique问题可以规约为Half Clique的问题;假设询问的\(k \geq |V|/2\),我们考虑Clique。那么我们在原图的基础上新增\(2k-|V|\)个孤立的节点形成一张新图。询问新图是否存在\(|V'|/2=k\)个节点的Clique等价于询问原图是否存在\(k\)个节点的Clique,因此此时Clique问题也可以规约为Half Clique问题。综上,由于(ii)已经证明了Clique问题是NP-hard,由规约的传递性可得Half Clique问题也是NP-hard。

标签:多项式,完全,问题,vee,Clique,NP,SAT
From: https://www.cnblogs.com/qixingzhi/p/17481573.html

相关文章

  • 成功解决[AssertionError: Input tensor input format are different]
    在使用tensorboardwriter.add_image时writer.add_image('img/fixed_img',denorm(fixed_img.data),0)报如下错误assert(len(tensor.shape)==len(input_format)),"sizeofinputtensorandinputformataredifferent.AssertionError:sizeofinputtensorand......
  • 秒杀(高并发)系统关注的问题
    //如果当前这个场次的商品库存信息已经上架就不需要上架//5、使用库存作为分布式Redisson信号量(限流)//使用库存作为分布式信号量RSemaphoresemaphore=redissonClient.getSemaphore(SKU_STOCK_SEMAPHORE+token);//商品可以秒杀的数量作为信号量semaphore.trySetPerm......
  • Tensorflow01-回归问题
    1线性回归就是给你一堆数据[[x0,y0],[x1,y1],[x2,y2]-----[xn,yn]]然后得出一个y=wx+b来,这里我们引入损失函数loss=\(\sum\)(wxi+b-yi)^2,然后我们就是最小化这个loss从而使得w'x+b'->y2梯度下降法在这里w'=w-lr*\({dy\overdw}\)在这里为什么是减呢,例如:x'=x-0.005*\({dy\ov......
  • 【JS错题总结】作用域链问题
    作用域链上面代码的输出是GoodbyeJack,因为执行到语句typeofname==='undefined' 的时候,函数会从内向外(作用域链)寻找该变量,从语句var name;找到该变量的定义,该变量此时的值为undefined。自执行函数解析和执行一起完成,自己有的不会再向上查找。varname='zhangsan'......
  • 【数据结构和算法面试题】跳台阶问题
    题目来源“数据结构与算法面试题80道”。问题分析:假设为跳台阶的总跳法,当时,;当时,;当时,如果先跳1级台阶,有种方法,如果先跳2级台阶,有种方法,依次类推,可以得到下面的递推公式:方法:intget_kind(intn){ if(n<=0)return0; intresult; int*cal=(int*)malloc(sizeof(int)*n);......
  • 机器学习中的基本问题——log损失与交叉熵的等价性
    1、log损失log损失的基本形式为:log(1+exp(−m))log(1+ex......
  • 机器学习中的常见问题——K-Means算法与矩阵分解的等价
    一、K-Means算法的基本原理K-Means算法是较为经典的聚类算法,假设训练数据集XX为:{x1,x2,⋯,xn}{x1,x2,⋯,xn},其中,每一个样本xjxj为m......
  • 浏览器输入URL到网页完全呈现的过程
    前言临近计算机网络期末考试,最近在复习(预习),写一遍博客讲解加深印象.浏览器输入URL过程图浏览器输入URL过程:当用户在网页上输入网址URL后,浏览器会对网址进行DNS域名解析获得对应的ip地址.之后,浏览器客户端向服务器尝试建立连接,进行TCP三次握手.......
  • 关于函数指针的一些问题小结
    最近接到一个需求,使用sdk提供的消息回调,一般我们是继承sdk的消息类,然后sdk的消息回调(虚函数)会在有消息的时候调用回调指针,从而触发回调不过因为sdk那边又对该消息类二次封装了并提供了一些接口,所以在研究二次封装的方法时,遇到了一些有意思的问题,故记录下typedefvoid(_......
  • SpringSecurity6.0学习常见问题
    环境SpringSecurity6.1版本SpringBoot3.1版本常见问题oauth2客户端请求oauth授权端,响应401检查spring.security.oauth2.client.registration.login-client.client-secret的值很spring.security.oauth2.authorizationserver.client.login-client.registration.client-secret......