简单的问题。我有一个非常大的CNF文件,代表一个m x n矩阵。让我们说> 10000变量与相关的术语。因此,作为第一步,我想分区CNF文件,或者甚至更好地将矩阵拆分为100的变量,以便并行求解概念。是否有任何描述适用的规则?
感谢所有帮助。
问候 阿德里安
答案 0 :(得分:1)
您可以使用graph partitioning之类的Metis工具将CNF
子句聚类为不共享任何变量的独立集合。
如果无法识别真正断开的群集,则“链接变量”的数量可能足够小以枚举其值。这样的枚举基本上为连接变量赋予暂定值,并在搜索过程中消除它们。付出的代价是你必须为每个价值组合运行搜索。
Cryptominisat,Riss3g或Lingeling等现代SAT解算器会应用各种预处理措施来降低问题的大小。但是,如果没有额外的步骤,10000个变量可能是一个可行的大小。
CNF规模本身并不是可靠的指标或问题的复杂性。 Tseitin encoding是一种经常用于减少CNF中子句数量的技术。
正如this post中所建议的那样:2009年7月25日MagnusBjörk撰写的一篇很好的论文,其中包含许多有关SAT编码工作的有用参考资料:“成功的SAT编码技术”: http://jsat.ewi.tudelft.nl/addendum/Bjork_encoding.pdf