编码“至少 k /最多 k 这些布尔变量的好方法必须是”Z3中的约束,对于任意 k < / em>和布尔变量的数量?
我正在考虑通过引入新的PB变量(使用this encoding)将“至少 k ”作为伪布尔问题进行投射,通过双条件将它们与我的布尔变量相关联(例如x == true iff y == 1
),并断言它们的总和大于或等于 k 。这是一种合理的方法,还是我应该使用更简单/更有效的编码?
答案 0 :(得分:5)
最简单的方法是使用算术编码基数约束。 所以,如果你想说a + b + c <= 2,其中a,b,c是Bool,那么你可以 将其表示为(如果a 1 0)+(如果b 1 0)+(如果c 1 0)> = 2。 底层求解器Simplex经常做一个非常合理的工作 使用此编码。
还有许多其他方法可以处理基数约束。 一种是将基数约束编译成“分类电路”,并且存在 这方面相当发达的方法。未来版本的Z3将具有直接性 支持基数约束,更普遍的是伪布尔不等式。 如果您有许多基数限制并且感觉非常冒险 欢迎您尝试“选择”分支 这正在发展中。它使用伪布尔不等式的专用格式 还包括一种模式,其中它检测“(如果a 0 0)+(如果b 1 0)+(如果c 1 0)> = 2”不等式作为PB不等式。也就是说,我会首先尝试非常简单的编码,看看基于单纯形的引擎如何适用于您的域。