如何构造问题之间的约简来证明问题是NP完全的?


27

我正在上一门复杂的课程,而在减少NPC问题之间却遇到了麻烦。如何找到问题之间的减少点?有没有我可以使用的一般技巧?我应该如何处理一个要求我证明问题是NPC的问题?


4
令人失望的是,我认为没有一种方法可以解决所有问题。就像生活中的许多问题一样,每个问题都是独一无二的。希望,随着时间的流逝,您会正确地直觉如何解决每个问题。
Ran G.

1
是否有一些有关如何解决此类问题的有用指南?当我看到一个问题要求我证明它是NPC时,我完全迷失了。我应该如何对待他们?
2012年

Answers:


45

没有神奇的子弹。NP硬度证明很难。但是,所有此类证明都有一个通用框架。谁与NP-硬度证明斗争感到困惑很多学生什么他们应该做的,这显然使得它无法弄清楚如何做到这一点。因此,这里是什么做的,证明一个问题NP难问题。

首先,除非您只是做家庭作业,否则您必须决定将哪个NP难题解决为您的问题。这在很大程度上是“气味”的问题。如果数字3出现问题陈述的任何地方,尝试从降低或或。(是的,我很认真。)如果您的问题涉及寻找最佳子序列或排列或路径,请尝试从或。如果您的问题要求具有特定属性的最小子集,请尝试;如果它要求具有特定属性的最大子集,请尝试3 C o l o r 3 P a r t i t i o n H a m i l t o n i a n C y c l e H a m i l t o n i a n P a t a ħ ç q ü Ë ñ d è3小号一种Ť3CØØ[R3P一种[RŤ一世Ť一世ØñHamiltonianCycleHamiltonianPathCliqueIndependentSet。如果您的问题涉及在飞机上做某事,请尝试或。等等。如果您的问题没有“闻到”的味道,或可能是您最好的选择。PlanarCircuitSATPlanarTSP3SATCircuitSAT

显然,您需要已经精确地 知道了如何定义所有这些问题,并且减少的问题越简单越好。因此,作为清凉的结果可能会在年底,我不建议从减少或或或S ^ ü p è [R 中号[R Ø [R Ø sMinesweeperTetrisOneCheckersMoveSuperMarioBros

二是实际减少。要将问题X(您知道的一个是NP-hard)简化为问题Y(您要证明的一个是NP-hard),您需要描述一种将X 的任意实例转换为Y的合法实例的算法。约简算法需要对X实例的每个“特征”执行特定的操作;每个“特征”的输出部分通常称为小工具

但是功能是什么?这取决于问题X。例如:

  • 要转换的实例,您需要为输入变量中的每个变量和每个子句提供一个小工具。每个可变小工具应具有对应于“真”和“假”的两个“状态”。每个子句小工具还应具有多个“状态”,每个状态都会以某种方式强制该子句中的至少一个文字为真。(状态不是归约算法输出的一部分。)3小号一种Ť

  • 要转换的实例,您需要为输入图的每个顶点和每个边分别配备一个小工具,并需要一个小工具来定义这三种颜色。3CØØ[R

  • 变换的一个实例,则需要为每个输入小工具,每根电线,以及用于在所述输入电路中的每个栅极。P一种ñ一种[RC一世[RCü一世Ť小号一种Ť

小工具的实际形式取决于问题Y,即您要简化为的问题。例如,如果您要解决关于图形的问题,则您的小工具将是小的子图;请参阅Wikipedia文章。如果您要解决有关调度的问题,则每个小工具将是一组要调度的作业。如果您要解决有关Mario的问题,则每个小工具都是一组积木,砖块和Koopas。

如果两个问题都涉及同一种对象,这可能会造成混淆。例如,如果X和Y都是关于图的问题,则您的算法将要将一个图(X的实例)转换为另一个图(Y的实例)。明智地选择您的表示法,以免混淆这两个图形。我也强烈建议您使用多种颜色的墨水。

最后,您的约简算法必须满足三个属性:

  • 它以多项式时间运行。(这通常很容易。)

  • 如果给您的归约算法输入X 的实例作为输入,它将产生Y 的实例作为输出。

  • 如果您的归约算法产生了一个Y 的实例作为输出,则必须给它一个X 的实例作为输入。

这里有一个重要的微妙之处。您还原算法只能在一个方向, X的实例的Y实例,但证明该算法正确,需要大约两个方向上的转变推理。您还必须记住,归约算法无法确定X的给定实例是正数还是负数,这将需要在多项式时间内解决NP难题。

就是。该如何随实践而来。


5
对于从还原(通常是具有相似的“局部/全局结构”的问题),最好首先尝试对3 S A T的单子句实例执行此操作。这样可以使您了解需要为子句使用哪些小工具。在找到了子句的小工具之后,您的归约操作将为每个子句放置一个这些小工具,然后以某种方式强制执行全局条件(即,出现在不同子句中的变量的出现的真值应一致,命题变量p不能是- [R ü ê在一个子句和˚F 一个3小号一种Ť3小号一种ŤpŤ[RüË在另一个)。F一种sË
卡韦

1
关于“如果简化算法将Y 的例作为输出,则必须给定X作为例作为输入”:尽管将这种情况写为“如果对简化算法给出了例似乎更为直观” X作为输入,它会产生Y作为输出的实例”,请注意,这两个条件是等价的,并且JeffE编写它的方式通常使构造证明变得容易得多,因为在每种情况下,您都有“某些东西”( X的正实例或Y的正实例)。
j_random_hacker

11

JeffE概述了最常见的策略:知道许多NP完全问题,找到一个非常合适的问题并进行轻松归纳。

另一个有效的策略是始终使用3SAT(或其他任何问题)。这可能会使某些简化变得更加复杂,但是好处是您有很多经验可以表达其他类型问题的可满足性。因此,您可以节省寻找一个好的减价伙伴(包括死胡同)的时间,并希望您的经验将使您能够更快地进行减价,即使难度更大。

这种方法也具有一些元的美:(3)SAT是(几乎)直接证明NP完整性的少数问题之一。因此,仅依靠该证明可以使您的“证明树”保持平坦,避免冗长的归约链。


3
当一元给定边界时,直接证明有界停止问题是NP-完全的不是太难,并且是容易地证明存在某些 NP-完全问题的简便方法,即使该问题本身也无济于事。
亚历克斯十布林克

3
我不确定这是唯一直接被证明是NP完全问题的说法。实际上,如果严格地解释它,那肯定是错误的。库克在1971年的论文中谈到TAUT不是SAT(他使用库克归约法,而不是Karp归约法)(很容易观察到,证明也证明在Karp归约法下SAT是NP完全的)。
卡夫

@Kaveh Huh?重言式是Co-Np完整的,因此未知是NP(-complete)。我没看过库克的论文。
艾伯特·亨德里克斯

1
@Albert,那么您应该阅读它。使用Cook归约法,您无法区分NP和coNP。
卡夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.