组合优化问题常用模型
组合优化问题常常难以求解,我们可以把这些转化为目前已经有成熟求解器的模型。
1. 可满足性问题(Satisfiability, SAT)
上一节已经讲过,SAT 是一个 NPC 问题,很多NP难的组合优化问题都可以归约到SAT。用SAT问题求解另一问题的过程,称作SAT编码。下面给出k-图着色的判定问题归约到SAT的编码方式。
例1. k-图着色问题(k-coloring problem):判定一个无向图 G = ( V , E ) G=(V,E) G=(V,E) 是否可以由 k 种不同的颜色对 V 中所有的顶点着色,其中 E 中任意一条边的两个顶点不能着同一种颜色。判定是否存在一种着色方案满足要求。
编码方式:
- 定义变量 x i , j x_{i,j} xi,j 表示对G中第i个顶点着第j种颜色,共有 k|V| 个变量。
- 为了保证图中每个顶点都着色,定义子句:
c i = ⋁ 1 ≤ j ≤ k x i , j c_{i}=\bigvee_{1 \leq j \leq k} x_{i, j} ci=1≤j≤k⋁xi,j
表明每个顶点至少有一种颜色,这样的子句共有 |V| 条。 - 为了保证图中任意两条边的颜色不同,定义如下子句:
c i , j , k ′ = ¬ x i , k ∨ ¬ x j , k c_{i, j, k}^{\prime}=\neg x_{i, k} \vee \neg x_{j, k} ci,j,k′=¬xi,k∨¬xj,k
其中i,j表示E中的边,k表示某种着色。这样的子句共有k|E|条。
这样就得到了一个k-图着色问题可行的SAT编码。
上面给出的编码简单直接,但并不是最好的编码。但我们可以由此得出编码SAT问题的思路:
1. 考虑约束变量的定义和个数
2. 考虑问题的条件可以用什么子句表达
3. 考虑问题的对称性
目前的SAT求解器有 MiniSAT(主流), Glucose, Maple, ReasonLS等。
2. SAT的变形(MaxSAT, partial MaxSAT, weighted partial MaxSAT)
MaxSAT 问题是SAT问题的变形。
MaxSAT: 给定一个CNF公式,找到一个完备赋值,满足给定的 CNF 公式 F 中最多的子句。
当F中所有的子句都可以被满足的时候,MaxSAT就等同于SAT问题。
partial MaxSAT: 假如将子句分为硬字句和软子句两部分,partial MaxSAT
问题需要尽可能的满足更多的软子句并满足所有的硬字句。
例2. 找图G=(V,E)中的最大团,可以按照如下的策略将其编码成partial MaxSAT 问题:
- 对每一个G中的顶点定义一个变量 x i x_i xi,表示该顶点是否在团中。共有 |V| 个这样的变量。
- 定义一条硬子句,满足图中任意一堆不相邻的顶点,不能都在团中:
c i , j = ¬ x i ∨ ¬ x j c_{i, j}=\neg x_{i} \vee \neg x_{j} ci</