聚合对 SCIP 中的 SAT 问题意味着什么?

What does Aggregation mean for SAT problems in SCIP?

在 SCIP Optimization Suite 6.0 论文中,有一节是关于 Aggregation Presolver 的。给出的示例是具有 2 个变量 a1x1+a2x2=b 的线性约束,其中以 x1 或 x2 为主题,然后将其代入其他约束。当这是一个线性程序时,我理解逻辑。

但是,对于 SAT 问题,我的 problem 文件和 transproblem 文件显示如下:

[logicor] <c301>: logicor(<x591>[B],<~x666>[B]); (This comes from problem file)
[logicor] <c302>: logicor(<~x591>[B],<x666>[B]);

转换为

[binary] <t_x666>: obj=-0, global bounds=[-0,1], local bounds=[-0,1], aggregated: +1<t_x591>

[logicor] <c1402>: logicor(<x538>[B],<x138>[B]); (This comes from problem file)
[logicor] <c1403>: logicor(<~x538>[B],<~x138>[B]);

转换为

  [binary] <t_x138>: obj=-0, global bounds=[-0,1], local bounds=[-0,1], aggregated: 1 -1<t_x538>

由于逻辑或限制,我不明白聚合在这两种情况下是如何工作的。有人可以向我解释一下吗?谢谢!

(很多猜测,因为我不太了解 scip 内部结构)

例子

[logicor] <c301>: logicor(<x591>[B],<~x666>[B]); (This comes from problem file)
[logicor] <c302>: logicor(<~x591>[B],<x666>[B]);

等同于(布尔算法):

~591 -> ~x666
x591 -> x666

这真的很像 4 个案例中的第 2 个(来自 presol_implics.h):

x=0 ⇒ y=lb and x=1 ⇒ y=ub : aggregate y == lb + (ub − lb)x

与:

lb = 0 
ub = 1

导致:

aggregate y == lb + (ub − lb)x
<-> x666 == 0 + (1-0) x591 
<-> x666 == +1 x591

for comparison:
[binary] <t_x666>: obj=-0, global bounds=[-0,1], local bounds=[-0,1], aggregated: +1<t_x591>

所以如果 scip 的输出意味着 t_x666x666 的替换版本,这对我来说有些意义。

最终的聚合项也符合事实-table:

a    b    (a | ~b) & (~a | b)
0    0        1
0    1        0
1    0        0
1    1        1

-> 基本上是异或取反 -> 相等 -> 真当且仅当两者相等

由于蕴涵图是推理 2-sat 子句的自然之物,我倾向于说,这确实是 scips 内部机制的一部分。