微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 k 独立集问题简化为 3-SAT

如何解决如何将 k 独立集问题简化为 3-SAT

所以我得到了这个作业问题,我们被要求在合取范式下将 k 独立集可满足性问题简化为 3-SAT 子句集。

所以对于 G(V,E) 我们有顶点集
V = {x1,x2,x3,x4,x5,x6}
和边集
E = { e1 = (x1,x3),e2 = (x1,x5),e3 = (x1,x6),e4 = (x2,e5 = (x2,e6 = (x3,x4),e7 = (x3,e8 = (x5,x6) }

我对此的第一种方法是每个边都有一个子句,因为我们不能在独立集合中的两个顶点之间有边:
e1: (¬x1 v ¬x3)
e2: (¬x1 v ¬x5)
e3: (¬x1 v ¬x6)
e4: (¬x2 v ¬x5)
e5: (¬x2 v ¬x6)
e6: (¬x3 v ¬x4)
e7: (¬x3 v ¬x5)
e8: (¬x5 v ¬x6)

但问题是,以 k = 3 为例,如何编写子句以确保至少有 3 个不同的变量 (xi) 设置为 true ?
这可以使用加权 2 可满足性来实现,但仅使用旧的 3-SAT 似乎很难实现。
有关如何进行的任何提示

解决方法

如果你关心的是这个 G 和 k = 3,那么写子句可能是最简单的 (xi ∨ xj ∨ xk ∨ x) 对所有 {i,j,k,ℓ} ⊆ V 然后将它们减少到 3-CNF,例如, (x ∨ y ∨ z ∨ w) 变成 (v ∨ w) x ∨ y) ∧ (¬v ∨ z ∨ w),其中 v 是一个新变量。

一般来说,你会想要

  1. 定义一个布尔电路来计算 x1 + ... + xn ≥ k(你可以在 {{3 }} 使用 two's complement arithmetic 然后反转符号位)。

  2. 将此电路转换为 3-CNF 公式。首先,用几个二输入门替换具有两个以上输入的门。然后为电路中的每个节点创建一个变量。对于每个门写四个子句来限制输出,每个可能的输入一个,例如,如果有一个带有输入 x 和 y 以及输出 z 的与门,那么写子句 (x ∨ y ∨ ¬z) ∧ (x ∨ ¬y ∧ ¬z) ∧ (¬x ∨ y ∨ ¬z) ∧ (¬x ∨ ¬y ∨ z)。异或门将是 (x ∨ y ∨ ¬z) ∧ (x ∨ ¬y ∧ z) ∧ (¬x ∨ y ∨ z) ∧ (¬x ∨ ¬y ∨ ¬z)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。