np完全问题的例子_如何证明一个问题是NP-Hard或NP-Complete?

NP-hard vs NP-Complete

判断一个问题是不是NP-Complete有两个步骤:

  1. 判断是否NP,就是算法结果的正确性能不能在多项式时间内验证
  2. 判断是否NP-hard,要判断NP-hard,我们可以使用一个叫Reduction的技巧。直观来说,如果你能用你的问题的求解器来求解另一个已知是NP-hard问题,那么你的问题也是NP-Hard的。

Reduction

Reduction是将两个算法建立联系的一个过程。我们说X reduce 到Y,意味着,假设现在有一个Y的黑盒求解器,于是我们设计一个多项式算法来用Y的求解器来求解问题X。
也就是说,当这个求解器是多项式时间的时候,意味着X也可以多项式求解。那如果我们已经知道X是很难求解,如果X可以reduce到Y,那么意味着Y跟X一样难解,因为只有困难的求解器才能解决困难的问题。
而这正是证明问题Y是NP-hard或NP-complete的思路,只要找到一个Np-hard或者NP-complete的问题X可以reduce到Y就可以了。

那么NP-hard是什么?

40d85df5d8905aee66162c91778daf2d.png

如上图,在所有NP(non-deterministic polynomial-time)问题中(结果正确性可以在多项式时间验证),有些问题是特别难的,如NP-complete问题,有些问题很简单,如P问题,可以在多项式时间解决。

那如果我们找到一个特别的问题H,使得所有NP问题都可以reduce到问题H上,那这个问题H肯定特别难,因为我们能用这个问题H解决所有的NP问题,因此我们称这个问题H为NP-Hard问题。

这个经过reduce的问题H不一定是NP问题,于是才有上述示意图的上部分,即有一部分NP hard问题是落在圈外的。如果问题H是属于NP的话,那么问题H就是NP-complete问题,NP完全是NP和NP-hard的交集。

NP定义: 可以在多项式时间验证结果正确性的问题。NP-hard定义: 对于问题H,所有NP问题都可以reduce到H。

这意味着,如果NP-hard可以用多项式解决,那么所有NP问题都可以用多项式解决。不过目前还没人找到多项式算法。

SAT Problem

在实际中,我们判断一个问题是不是NP-hard,通常不会去根据这个定义来判断,而是使用Reduction来判断,就是找到一个已经被证明是NP-complete的问题,然后尝试reduce。

总的来说,判断一个NP问题是不是NP-Complete的两个方法

  1. 找到一个NP-Complete问题,经过证明可以reduce to 你的问题,这意味着你的方法可以解决这个NP-Complete问题,那很显然,这个解决方法也是NP-Complete的。
  2. 所有的NP问题都可以reduced到你的问题

很显然,方法1简单多的,我们只要找到一个现成的 NP-Complete问题就可以了,然而,这个世界上,总得有第一个NP-Complete问题才能够用这个方法,这第一个NP-Complete问题的证明,注定了只能用方法2,那就是要证明所有NP问题都可以reduced到这个问题上,而万幸的是这第一个NP-Complete问题在40年前被找到了,它就是著名的SAT问题。

SAT实际上并没有真的遍历所有的算法一个个去reduce,相反,他证明了所有的算法都是可以编码为boolean formula问题,这意味着所有算法都可以使用SAT的求解器去求解,因为他们本质上就是boolean formula问题。至于怎么证的,太难了这里就不讲了。

现在我们介绍一下SAT问题。对于任意的boolearn foumula我们总能写成以下标准式:

equation?tex=%28+..%5Clor+...%5Clor+..%29+%5Cland+%28+..%5Clor+...%5Clor+..%29+%5Cland+...其中
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,NP问题是指可以在多项式时间内验证一个解的问题集合,而NP完全问题则是NP问题中最难的问题,所有NP问题都可以在多项式时间内约化为NP完全问题。而NAE-3SAT问题是指判断一个由若干个逻辑变量和若干个逻辑表达式组成的布尔公式是否存在一组真假值,使得每个逻辑表达式至少有一个变量取值为真,至少有一个变量取值为假。 为了证明NAE-3SAT问题NP完全问题,我们需要证明两个方面:首先证明NAE-3SAT问题一个NP问题,其次证明所有NP问题都可以在多项式时间内约化为NAE-3SAT问题。 对于第一个问题,我们可以设计一个多项式时间的算法来验证一个NAE-3SAT问题的解是否正确。具体地,我们只需要检查每个逻辑表达式是否至少有一个变量取值为真,至少有一个变量取值为假,并且检查所有逻辑表达式的值是否都为真。这个算法的时间复杂度是多项式时间,因此NAE-3SAT问题一个NP问题。 对于第二个问题,我们需要证明所有NP问题都可以在多项式时间内约化为NAE-3SAT问题。我们可以通过将一个NP问题的实例转化为一个NAE-3SAT问题的实例来实现这个约化。具体地,我们可以将一个NP问题的实例表示为一个布尔公式,然后将这个布尔公式转化为一个NAE-3SAT问题的实例。具体地,我们可以将每个逻辑表达式转化为一个NAE-3SAT问题的子问题,其中每个子问题都包含一个逻辑表达式中的所有变量和一个附加的变量,这个附加的变量表示逻辑表达式的值是否为真。然后,我们将所有子问题的结果通过逻辑与连接起来,得到一个最终的NAE-3SAT问题的实例。 由于NP问题可以在多项式时间内约化为NAE-3SAT问题,而NAE-3SAT问题一个NP问题,因此NAE-3SAT问题NP完全问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值