如何将 3-SAT 简化为独立集?

Posted

技术标签:

【中文标题】如何将 3-SAT 简化为独立集?【英文标题】:How can 3-SAT be reduced to Independent set? 【发布时间】:2018-05-19 08:20:35 【问题描述】:

我从here(第 8、9 页)阅读了有关 NP 硬度的信息,在注释中作者将 3-SAT 形式的问题简化为可用于解决最大独立集问题的图形。

在示例中,作者将以下 3-SAT 问题转换为图。 3-SAT 问题是:

(a ∨ b ∨ c) ∧ (b ∨ ~c ∨ ~d) ∧ (~a ∨ c ∨ d) ∧ (a ∨ ~b ∨ ~d)

生成的等效图为:

作者指出两个节点通过一条边连接,如果:

    它们对应于同一子句中的文字 它们对应于一个变量及其逆变量。

我无法理解作者是如何提出这些规则的。

为什么我们需要在变量和它的逆变量之间画边? 假设有两个子句,子句 1 有 (a,b,~c),子句 2 有 (~a,b,c) 将第 1 条连接到第 2 条,为什么我们必须连接 a 和 ~a ?为什么我们不能将 a (clause 1) 与 c (clause 2) 连接起来?

【问题讨论】:

【参考方案1】:

我认为可以解决问题的是reduction 概念。假设您熟悉一个问题,比如 X(即 3-SAT)[这意味着什么熟悉?你知道有多少很难解决 X]。此外,您目前正在分析另一个新问题,例如 Y(即独立集)......

你对 X 的了解如何帮助你想出 Y?如果你能找到它们之间的关系(即归约),那么你可以使用关于 X 到 Y 的知识。像 "Y is hard than X""Y is as hard as X"。所以这个解决方案想要做的是找到两个问题之间的关系。

在可计算性理论和计算复杂性理论中,约简是一种将一个问题转化为另一个问题的算法。从一个问题到另一个问题的简化可以用来表明第二个问题至少和第一个问题一样困难。

您在此处提到的两条规则就是全部(即关系)。

    您不能同时选择一条边的两个顶点。此外,您不能同时设置变量及其否定 TRUE。 子句中必须有一个 TRUE 变量。此外,为了最大化所选顶点的数量,您必须从每个子句中选择一个节点。

这显示了这些规则的来源。

PS:这里指出的是不精确作为解决 3-SAT 到独立集问题的证明。这个解释只是为了让您更深入地了解证明想要执行的程序。证明留给学术笔记。

减少的另一个重要的事情是它自己的时间。另一方面,减少时间(即,将 X 实例转换为 Y 实例所需的时间)必须小于 X 问题时间(o.w 它主导 X 求解时间)。

还有一些符号表明X < Y 与另一个时间顺序作为< 的索引。此外,如果您显示X < YY < X。这意味着这些问题具有相同的难度。

最后一点请注意,引用的注释所说的关于减少的内容...减少是一种算法...

【讨论】:

以上是关于如何将 3-SAT 简化为独立集?的主要内容,如果未能解决你的问题,请参考以下文章

将“a == True:”简化为“a”——这是个好主意吗?

我正在尝试将我的多个数组方法调用简化为 if 语句或更简单的基于条件的语句

如何将此 Laravel PHP 代码简化为一个 Eloquent 查询?

如何简化搜索查询参数?

SSE2:如何将 _m128 简化为一个单词

如何在 Matlab 中简化符号和数字混合表达式