Answers:
没有神奇的子弹。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 è。如果您的问题涉及在飞机上做某事,请尝试或。等等。如果您的问题没有“闻到”的味道,或可能是您最好的选择。
显然,您需要已经精确地 知道了如何定义所有这些问题,并且减少的问题越简单越好。因此,作为清凉的结果可能会在年底,我不建议从减少或或或S ^ ü p è [R 中号一[R 我Ø 乙[R Ø s。
二是实际减少。要将问题X(您知道的一个是NP-hard)简化为问题Y(您要证明的一个是NP-hard),您需要描述一种将X 的任意实例转换为Y的合法实例的算法。约简算法需要对X实例的每个“特征”执行特定的操作;每个“特征”的输出部分通常称为小工具。
但是功能是什么?这取决于问题X。例如:
要转换的实例,您需要为输入变量中的每个变量和每个子句提供一个小工具。每个可变小工具应具有对应于“真”和“假”的两个“状态”。每个子句小工具还应具有多个“状态”,每个状态都会以某种方式强制该子句中的至少一个文字为真。(状态不是归约算法输出的一部分。)
要转换的实例,您需要为输入图的每个顶点和每个边分别配备一个小工具,并需要一个小工具来定义这三种颜色。
变换的一个实例,则需要为每个输入小工具,每根电线,以及用于在所述输入电路中的每个栅极。
小工具的实际形式取决于问题Y,即您要简化为的问题。例如,如果您要解决关于图形的问题,则您的小工具将是小的子图;请参阅Wikipedia文章。如果您要解决有关调度的问题,则每个小工具将是一组要调度的作业。如果您要解决有关Mario的问题,则每个小工具都是一组积木,砖块和Koopas。
如果两个问题都涉及同一种对象,这可能会造成混淆。例如,如果X和Y都是关于图的问题,则您的算法将要将一个图(X的实例)转换为另一个图(Y的实例)。明智地选择您的表示法,以免混淆这两个图形。我也强烈建议您使用多种颜色的墨水。
最后,您的约简算法必须满足三个属性:
它以多项式时间运行。(这通常很容易。)
如果给您的归约算法输入X 的正实例作为输入,它将产生Y 的正实例作为输出。
如果您的归约算法产生了一个Y 的正实例作为输出,则必须给它一个X 的正实例作为输入。
这里有一个重要的微妙之处。您还原算法只能在一个方向,从 X的实例来的Y实例,但证明该算法正确,需要大约两个方向上的转变推理。您还必须记住,归约算法无法确定X的给定实例是正数还是负数,这将需要在多项式时间内解决NP难题。
那就是。该如何随实践而来。
JeffE概述了最常见的策略:知道许多NP完全问题,找到一个非常合适的问题并进行轻松归纳。
另一个有效的策略是始终使用3SAT(或其他任何问题)。这可能会使某些简化变得更加复杂,但是好处是您有很多经验可以表达其他类型问题的可满足性。因此,您可以节省寻找一个好的减价伙伴(包括死胡同)的时间,并希望您的经验将使您能够更快地进行减价,即使难度更大。
这种方法也具有一些元的美:(3)SAT是(几乎)直接证明NP完整性的少数问题之一。因此,仅依靠该证明可以使您的“证明树”保持平坦,避免冗长的归约链。