Tldr

文章链接

RoundingSAT 的工作可以看作者自己的网站:RoundingSAT,实验室名字也很有意思:MIAOresearch

Divide and Conquer: Towards Faster Pseudo-Boolean Solving

Abstract

The last 20 years have seen dramatic improvements in the performance of algorithms for Boolean satisfiability—so-called SAT solvers—and today conflict-driven clause learning (CDCL) solvers are routinely used in a wide range of application areas. One serious short-coming of CDCL, however, is that the underlying method of reasoning is quite weak. A tantalizing solution is to instead use stronger pseudo-Boolean (PB) reasoning, but so far the promise of exponential gains in performance has failed to materialize—the increased theoretical strength seems hard to harness algorithmically, and in many applications CDCL-based methods are still superior. We propose a modified approach to pseudo-Boolean solving based on division instead of the saturation rule used in [Chai and Kuehlmann ’05] and other PB solvers. In addition to resulting in a stronger conflict analysis, this also improves performance by keeping integer coefficient sizes down, and yields a very competitive solver as shown by the results in the PseudoBoolean Competitions 2015 and 2016.

简介

由于 SAT 具有很大的局限性,于是,我们转向使用线性伪布尔约束来描述问题,这种约束形式能够表达比 CNF 更多的信息,但结构又与 CNF 很相似,于是基于 CNF 的技术可以应用到 PB 上

一些 PB 求解器仍然是基于归结的,这些求解器会将输入转化为 CNF,再进行求解;主要有两类做法:

  1. eagerly:先转化为 CNF,然后直接调用 CDCL 求解器求解,代表是 MiniSat+,Open-WBO,NaPS
  2. lazily:在修改的 CDCL 求解器中,保持输入的 PB 格式,但仅以子句的形式导出新的信息,代表为 Sat4j

另一种做法是使用切平面法来解决 PB 问题,但这种做法需要将 CDCL 框架拓展到 PB 上,这是十分困难的。

从理论的观点来看,使用切割平面似乎是很可取的,因为这种方法从来不比归结差,甚至可以做到指数级的更强。然而,实际上并非如此,通常基于 CDCL 的求解器优于基于切平面法的 PB 求解器。

在这篇文章中,提出了一个基于 CDCL 的 PB 求解器 RoundingSAT

基于冲突分析的 PB 求解

首先,我们回顾 PB 约束的标准形式:

其中,, ,而 ,将 称为满足度(或者简称为度)

我们将部分真值赋值 看作由 设定为真的文字集合,也就是说如果 ,那么

一个传统的 CDCL 框架如下图所示:

在这里,我们不详细解释 CDCL 是如何工作的,我们希望做的是将 CDCL 中的两个重要部件引入到 PB 中来(重启与子句库之类的技术不在本文的探讨范围内)

单元传播

在 SAT 中,对于任意一条子句,只要有一个文字为真,子句即可为真,因此我们可以很轻松的进行单元传播,而在 PB 中,这种简单的成真条件不存在了,于是我们需要重新考虑传播的方案

首先,我们引入一个记号,对于任意一条约束

可以发现 本质上表示,在给定赋值 的条件下,当前约束的最大值与度的差距

显然当 时,约束是不满足的,我们定义传播如下:

如果文字 未被赋值,且有 ,那么我们称 蕴含/传播了文字 ,也就是说除非将 赋值为真,否则约束 不成立

类比回 SAT

我们可以将文字的系数视为 ,那么子句的 时,我们可以判定,文字 一定为真(因为已经变成了一条单元子句)

存在的重要问题

显然,这里我们会发现一个很严重的问题,当约束不是子句时,我们更难有效的检测约束是否在传播(因为 的值不能期望只通过某一个文字为真就使其大于等于 0)

然而本文并不会详细探讨这个问题

冲突分析

分析的方法是使用广义归结来进行,其定义如下:

给定一对存在冲突的约束 与约束 ,其在文字 的赋值上有冲突,我们假定 ,那么广义归结 定义为:

SAT 中的归结

假定一对存在冲突的子句 ,我们定义归结 如下:

一个简单的 PB 冲突例子

考虑 , ,在 上有冲突,于是

随后,我们反复回退决策层,试图找到最早的那次冲突决策点,从而得到学习子句(这也是 CDCL 中 1UIP 的做法)

存在的问题

我们考虑以下例子,,假定,我们的决策序为 ,此时 trail 中的文字为

随后,在单元传播时,我们会在 中考虑传播 ,trail 变为 ,但此时 发生冲突,我们需要进行冲突分析,根据前文,我们得到 ,然而这个约束直接将 trail 中 的赋值全违反了,此时我们得到的学习子句(学习约束?)就没有任何意义了

弱化与饱和

我们通过两个算子, 来解决这个问题

弱化

从约束中删除一个文字,并从度中减去它的系数

例如对于约束 ,我们考虑对 做弱化操作

可以发现,弱化操作就是直接将某个文字的取值假定为真

饱和

将约束中所有系数的大小降低到刚好不满足约束的程度,形式化的写为

例如对于约束

最终的冲突分析

于是,最终的冲突分析如下所示:

值得注意的是,我们并没有真正的计算 的值,我们通过使用上界来近似计算,以获得更好的效率:

基于 Division 的冲突分析

我们将饱和算子替换为分割算子,其工作原理如下所示:

其中

RoundToOne

首先外面介绍一个组件算法,RoundToOne,其流程如下图所示:

其接受一条约束 ,一个文字 以及当前的 trail 为参数,输出一条约束 ,这条约束是将 上的舍入(这里称为 rounding),且 的系数为 ,约束 还有一个额外的性质:

对于任意 trail 和任意 PB 约束 ,对于文字 我们有如下性质成立:

于是,我们有推论:

若一条约束 是一条未违背的约束,且其在赋值为 的条件下传播了文字 ,即 ,那么我们有 ,否则,如果 ,那么

RoundingSAT 冲突分析

我们的冲突分析算法如下所示:

PB 冲突分析中存在一些特殊情况,使其比 CDCL 更加复杂

  1. 一个归结操作可能会取消当前决策层的所有赋假文字,在这种情况下,分析可能会继续到更早的决策层,甚至可能发生冲突分析能够进行到最高决策层,从而推导出实例是不可满足的

  2. 学习到的约束可能在其断言(激活)级别1被违反,在这种情况下,在调用单元传播之前会重复执行冲突分析。

跳过解析步骤

与 CDCL 冲突分析的另一个有趣对比是,如果    的值非常负,那么可能可以忽略与  ​  的解析步骤,直接从赋值序列    中移除被传播的文字  ,同时仍然保持不变量  

直观上,这似乎可以导致一种更紧凑的分析,仅涉及冲突真正需要的原因,从而可能产生更好的学习约束。然而,当我们通过实验评估这一想法时,结果并未改善,因此最终我们没有采用这一方法。尽管如此,这仍然是一个值得进一步探索的有趣观察。

实验

这部分,对比了算法:

  1. Sat4j
  2. Open-WBO
  3. Sat4jRes+CP(使用了切平面法的 Sat4j)

Benchmark 为 PB 竞赛的例子,分类为 DEC-SMALLINT-LIN

结果如下图所示:

未来工作

一个明显方向是进一步改进我们的求解器。与其他伪布尔求解器一样,RoundingSat 对输入格式很敏感,在 CNF 公式上表现很差。

解决这一问题的一种方法是在可能的情况下将 CNF 重写为更有效的线性约束的规则;特别地,一个重要的挑战是对编码基数约束的子句集合进行 基数检测 AAAI’20

Remarque

  1. 断言级别(Assertion Level)  是冲突驱动子句学习(CDCL)SAT 求解器中的一个重要概念,用于描述在搜索过程中某个约束(或子句)被“断言”或“激活”的决策级别。它表示在搜索树的某个特定层次上,某个约束开始对当前的变量赋值产生影响。