问题

求解 #sat 问题,有很多算法DPLL算法和用于各种编程语言的实施。据我所知,他们都在CNF上取得一个布尔公式作为输入,并输出满意解释的数量。

数学约束,另一方面是一个定义实例的另一种方式SAT问题并且通常用于离散优化,其中一个人试图在这些约束上优化一些功能。 是否有一个程序将数学限制为输入并输出满足解释的数量?

示例

我们代表布尔公式 $ q=(a \ lor b)\ wedge(c \ lor d)$ 作为 $$ a + b \ geq 1 \\ c + d \ geq 1 $$ 或作为矩阵 $ a $ 和支持向量< SPAN Class=“Math-Container”> $ B $ $$ A= \ begin {bmatrix} 1和1&0&0 \\ 0&0和1&1 \结束{bmatrix} \\ b=begin {bmatrix} 1&1 \ neg {bmatrix} $$

所有变量 $ a,b,c,d \ in \ {0,1 \} $ 。我们知道有程序带有 $ q $ 作为输入,输出解释的数量,但是有程序需要 $ a $ < / span>和 $ b $ 作为输入(或类似的结构)并输出相同数量的解释?

有帮助吗?

解决方案

我知道两个合理的方法。

方法#1 计数凸多特孔内的整数点数。

您提供的线性不等式,与不平等 $ 0 \ le a,b,c,d \ le 1 $ 定义了一个凸多台。现在,你想要计算在该多晶孔中的整数点数落在该多特渗透物中。

有标准算法,您可以直接申请。如果您搜索“计算多特焦点的整数点”或“多托的晶格点”,您将找到许多研究论文。查看,例如 https://cstheory.stackexchange.com/q/22280/5038

方法#2 转换为cnf,然后使用#sat求解器。

您可以始终将约束转换为CNF公式。每个线性不等式都可以转换为一组CNF子句。形式的线性不等式 $ x_i + \ dots + x_j \ ge 1 $ 立即对应于cnf子句 $(x_i \ lor \ dots \ lor x_j)$ 。对于表单的更一般的线性不等式 $ x_i + \ dots + x_j \ ge c $ ,您希望表达至少 $ C $ 超出 $ k $ 变量 $ x_i,\ dots,x_j $ 是真的。有许多标准的编码方式。查看 https://cstheory.stackexchange.com/q/23771/5038 set 编码1 SAT溶剂的N-N约束

(一种方法是转换计算 $ x_i + \ dots + x_j $ 的布尔电路,并将其与 $ C $ ,然后使用 tseitin变换转换为cnf转换为cnf。您可以使用标准加法器和比较器电路创建这样的布尔电路。但是,还有许多其他方式。)

一旦您具有相当于该组约束的CNF公式,那么您可以使用任何非货架#sat求解器来将解决方案的数量计数为CNF公式。


很难说这两种方法中的哪一种更好;您可能需要在您处理的情况下尝试它们,以确定。我期待如果您具有表单的线性不等式 $ x_i + \ dots + x_j \ ge $ 其中 $ C $ 很大,然后接近#1可能是优越的;但是,如果 $ c $ 通常很小,则接近#2可能是优越的。

其他提示

您可以直接使用约束而不是子句使用DPLL。这需要修改数据结构和传播算法,但它可以所有相同的工作。

一旦设置约束的所有变量,除了一个之外,可能发生单位传播。

一旦设置约束的所有变量,可能会发生冲突。

算法的其余部分保持不变。

对布尔变量的约束只是隐藏的CNF子句的集合(潜在的是许多根据约束的条款)。

这个问题已经是回答.Stackexchange用于混合整数编程软件,具有现有软件和脚本的示例(CPLEX,SCIP,...)。

这与CDCL算法比DPLL更类似于DPLL:当找到新的解决方案时,添加了一个新的约束以禁止它,并且搜索恢复,直到问题变得不可行。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top