我正在尝试使用SAT solver
解决一个大的 CNF公式。公式(DIMACS格式)有4,697,898,048 = 2^32 + 402,930,752
个子句,我找到的所有SAT求解器都有问题:
- (P)lingeling报告“有太多条款”(即比标题行指定的条款多,但事实并非如此)
- CryptoMiniSat4& picosat声称读取标题行为402,930,752条款,即2 ^ 32太少
- Glucose似乎解析了98,916,961个子句,然后reports to have solved the formula as UNSAT使用简化,但这是 不太可能是正确的(这个公式的初始部分很短 很可能是SAT)。
是否有人知道可以处理这么大的文件的SAT求解器?或者是否有类似编译器开关的东西可以回避这种行为?我相信所有求解器都是针对 64bit linux 编译的。 (当谈到处理这么大的数字时,我有点像菜鸟。抱歉。)
答案 0 :(得分:6)
我是CryptoMiniSat的开发者。在CNF如此庞大的大多数情况下,问题不在于SAT求解器,而是将原始问题转化为CNF并不足够仔细。我假设您没有手动编写CNF - 您遇到了使用自动化工具转换为CNF的问题。
将问题转化为CNF的行为称为编码,它在学术界有大量文献。它本身就是一个完整的主题,或者更恰当地说,它是整个主题。请参阅有关约束规划(CP),伪布尔约束(PB),ANF到CNF转换技术(参见crypo研讨会/会议)和电子电路编码(搜索AIG,Tseitin编码及其变体和外观)的研究论文在参考)。这些是很重要的主题,但还有很多其他主题。看一眼这些将使你的CNF减少至少3个数量级,可能更多。