SAT
形式:AND of OR clauses, Conjunctive Normal Form. 一个 SAT 是多个 clause 取 AND 的结果,每一个 clause 是多个变量取 OR 的结果。
(x1∨¬x2)∧(¬x1∨x3∨x4)∧(x2∨¬x3) from SAT to 3SAT
3SAT: 在 SAT 的基础上,满足每一个 clause 只包含三个变量。
Clique 团
Clique Problem 是指: 给定一张图 $G=(V,E)$ 和一个整数 $k$,检查是否存在 $|V'|=k$ 的 clique.
证明
首先,clique problem 是 NP 问题。这个比较好证明。
其次,我们尝试把 3SAT 归约到 Clique. 对于每一个 clause ci=x1∨x2∨x3,建立三个节点 ni,1,ni,2,ni,3.
对于图中不属于同一个 clause 的两个节点 xi,xj,只要 xi=¬xj,就建立一条边。
我们令 k=m,检查图里是否存在大小为 k 的 clique.
Subset Sum
给定 n 个元素 {a1,a2,…an} 和一个数 T,是否存在能从这 n 个元素里找到一个子集,使得其和为 T?
证明
我们证明 3SAT∝pSubset Sum
考虑 3SAT 有 n 个变量和 m 个 clause,对于每一个 3SAT 变量 xi,在 subset sum 里创建两个变量 ti,fi
我们令 set 里的变量均有 n+m 位,前 n 位记为变量部分,后 m 位记为子句部分。
- ti 变量部分第 i 位设置为 1,子句部分若 clausej 包含 xi 则子句部分的第 j 位设置为 1
- fi 变量部分第 i 位设置为 1,子句部分若 clausej 包含 ¬xi 则子句部分的第 j 位设置为 1
同时,对每一个子句 clausei,创建变量 ci,其变量部分为全 0,子句部分仅第 i 位为 1.
考虑如何构造 T,令 T 的变量部分的每一位都是 1,子句部分的每一位都是 3.
3SAT ⟹ Subset Sum
如果 3SAT 存在一种合法的方案 S,对于 xi∈S,如果 xi=true,则往 subset 里添加 ti,否则添加 fi.
又因为对每一个子句而言,至少有一个 xi 或者 ¬xi 为真,因此最多选两个 cj 一定可以让 T 子句部分的第 j 位为 3.
3SAT ⟸ Subset Sum
考虑某个子集的元素:
- 如果包含 ti,则令 xi=true
- 如果包含 fi,则令 xi=false
因此对于每一个 clausej 而言,因为 cj 最多被选 2 次,而 T 对应位置为 3,所有至少有一个 xi∈clausej=true,即 clause 为真,从而 3SAT 满足。
Equal Sum Partition
给定数集 {a1,a2,…,an},能否选出子集,使得子集的和恰好为总和的一半?
证明
我们证明 Subset Sum∝pEqual Sum Partition
令 s=∑ai,
- 如果 t=2s,那么问题不变
- 如果 t>2s,那么添加一个数 an+1=2t−s
- 否则 t<2s,那么添加一个数 an+1=s−2t
General Knapsack 背包问题
存在 n 个物品,每一个都有重量 wi 和价值 vi。给出重量限制 W 和价值目标 V,能否选出一些物品 S,使得 ∑i∈Swi≤W 并且 ∑i∈Svi≥V.
证明
思路:我们证明 Subset Sum∝pKnapsack
【归约】令物品 wi=vi=ai,且 W=V=T.
Hamiltonian Path 哈密顿路径
有向图下的哈密顿路径
证明
我们证明 3SAT∝pH-Cycle
【归约】
令 3SAT 有 n 个变量和 m 个子句。对于一个变量 xi:
- 让其对应一行节点 rowi,包含 3m+3 个节点,这一行的相邻节点之间连双向边
- 在这一行节点中,从第二个节点开始,每三个节点代表一个 clause cj,颜色顺序为黄、绿、绿
- 额外有一个黄色节点,分别指向这一行的开头结尾两个节点
- 规定 xi=true 则往左走,否则往右走
- 一行的开头结尾两个节点又分别指向 xi+1 的额外黄色节点
对于每一个子句 cj,找到其所包含的三个变量的行 rowi 中,对应 cj 的两个绿色节点 rowi,1,rowi,2,分别连不同方向的有向边。
- 如果是 xi,则连边方向为:靠左的绿色节点
3SAT ⟹ H-Path
如果一个合法的 3SAT 方案存在
最长路径
旅行商问题