【问题标题】:How to prove that a problem is NP complete?如何证明一个问题是NP完全的?
【发布时间】:2010-11-27 22:30:50
【问题描述】:

我的日程安排有问题。我需要证明这个问题是NP完全的。有什么方法可以证明它是NP完全的?

【问题讨论】:

  • 阅读 Karp 的“组合问题中的可约性”。

标签: algorithm


【解决方案1】:

要显示一个问题是 NP 完全的,你需要:

显示它在 NP 中

换句话说,给定一些信息C,您可以创建一个多项式时间算法V,该算法将为每个可能的输入X验证X是否在您的域中。

示例

证明 顶点覆盖问题(即,对于某些图 G它是否具有大小为 k 的顶点覆盖集,使得 @987654328 中的每条边@ 在覆盖集中至少有一个顶点?)在 NP 中:

  • 我们的输入 X 是一些图形 G 和一些数字 k(这是来自问题定义)

  • 将我们的信息C 视为“图G 中任何可能的顶点子集k

  • 然后我们可以编写一个算法V,给定GkC,将在多项式中返回该顶点集是否是G 的顶点覆盖时间

那么对于每个图G,如果存在一些“G 中可能的顶点子集,大小为k”,这是一个顶点覆盖,那么GNP 中。

注意我们确实不需要需要在多项式时间内找到C。如果可以的话,问题就出在`P。

注意算法V 应该适用于每个 G,对于某些C。对于每个输入,都应该存在信息,这些信息可以帮助我们验证输入是否在问题域中。也就是说,不应该有不存在信息的输入。

证明它是 NP Hard

这涉及到一个已知的 NP 完全问题,例如 SAT,布尔表达式集的形式为:

(A or B or C) and (D or E or F) and ...

表达式是可满足的,即这些布尔值存在一些设置,这使得表达式为真

然后将 NP 完全问题简化为多项式时间内的问题

也就是说,给定SAT 的一些输入 X(或您正在使用的任何 NP 完全问题),为您的问题创建一些输入 Y,这样X 在 SAT 中当且仅当Y 是你的问题。函数f : X -> Y 必须在多项式时间内运行。

在上面的示例中,输入 Y 将是图形 G 和顶点覆盖的大小 k

对于完整证明,您必须同时证明两者:

  • XSAT => Y 在你的问题中

  • Y 在你的问题中 => XSAT

ma​​rcog 的答案与其他几个 NP 完全问题有链接,您可以将其归结为您的问题。

脚注:在步骤 2(证明它是 NP-hard)中,将另一个 NP-hard(不一定是 NP-完全)问题简化为当前问题即可,因为 NP-完全问题是NP 难题的一个子集(也在 NP 中)。

【讨论】:

  • 我想知道这背后是否缺少数据或循环推理。我的意思是如何“证明”问题存在于 NP 而不将其引用到“已经存在于 NP”的其他问题?就像说“它是用铁制成的,因为它的一部分是铁”,这不是铁证。
  • 据我所知,有一个叫做 Cook-Levin 定理的定理指出 SAT 是 NP 完全的。这个证明比我上面概述的要复杂得多,我想我无法用我自己的话来解释它。
  • 更准确地说,Cook-Levin 定理指出 SAT 是 NP 完全的:NP 中的任何问题都可以通过确定性图灵机在多项式时间内简化为确定布尔公式是否存在的问题是可满足的(SAT)。所以这就是你要问的缺失的部分。如果您在 Wikipedia 上查找该定理,则有一个证明,您可以在证明中引用该定理。也就是说,将 SAT 简化为给定问题是我被教导证明 NP 完全性的方法。
  • 所以我的问题最终是 SAT 是否可以用多项式解决,即 P = NP 问题。谢谢您的回答。
  • 您能否解释一下为什么我们不能在第二步中将一个 NP-hard 问题简化为我们想要的问题?它必须是一个 NP 完全问题吗?
【解决方案2】:

您需要将 NP-Complete 问题简化为您遇到的问题。如果减少可以在多项式时间内完成,那么您已经证明您的问题是 NP 完全的,如果问题已经在 NP 中,因为:

它并不比 NP 完全问题更容易,因为它可以在多项式时间内简化为它,这使得问题 NP-Hard。

更多信息请参见http://www.ics.uci.edu/~eppstein/161/960312.html 的末尾。

【讨论】:

  • +1 解释清楚的人。而不是说一堆我几乎听不懂的关键字。
  • 第一句话是从后到前:你需要将已知的NP完全问题归结为你自己的问题。这表明您的问题至少与已知的 NP 完全问题一样困难。 (b) 部分也是不正确的:如果你找到了归约,那么你已经知道你的问题是 NP 难的;唯一的问题是它是否完全存在于 NP 中(有些问题,比如停止问题,不是)。如果它是 NP-hard 并且在 NP 中,那么它是 NP-complete(即“NP-complete”比“NP-hard”更具体)。
  • 我不会说 a) 会导致矛盾,因为我们不知道 P != NP。
【解决方案3】:

为了证明一个问题L是NP完全的,我们需要做以下步骤:

  1. 证明你的问题 L 属于 NP(即给定一个解,你可以在多项式时间内验证它)
  2. 选择一个已知的 NP 完全问题 L'
  3. 描述将 L' 转换为 L 的算法 f
  4. 证明你的算法是正确的(形式上:x ∈ L' 当且仅当 f(x) ∈ L )
  5. 证明算法 f 在多项式时间内运行

【讨论】:

    【解决方案4】:

    首先,你证明它完全存在于 NP 中。

    然后您会发现另一个您已经知道是 NP 完全问题的问题,并展示您如何多项式地将 NP Hard 问题简化为您的问题。

    【讨论】:

    • 没有。你需要证明你可以从一个 NP 完全问题减少到你的 NP 问题,以证明 NP 完整性并证明它在 NP 中。 NP hard 不会涉及到这一点,除非你不能在 NP 中证明它。
    【解决方案5】:
    1. 熟悉 NP 完全问题的子集
    2. 证明 NP 硬度:将 NP 完全问题的任意实例简化为问题的实例。这是一块蛋糕中最大的一块,熟悉 NP Complete 问题是值得的。减少的难度或多或少取决于您选择的 NP Complete 问题。
    3. 证明您的问题在 NP 中:设计一种算法,可以在多项式时间内验证实例是否是解决方案。

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多