每当我搜索2-Sat的算法时,我都会找回问题决策形式的算法:是否存在满足所有子句的合法值集。但是,这不允许我轻松找到一组令人满意的布尔值。
如何有效地找到满足2-Sat实例的合法值集?
我正在使用boost库在c ++中工作,并且会欣赏可以轻松集成的代码。
提前致谢
答案 0 :(得分:1)
如果您有一个决策算法来检测是否存在对2-SAT的有效分配,您可以使用它来实际找出实际分配。
首先在整个表达式上运行2-SAT决策算法。假设它说有一个有效的作业。
现在,如果x_1是文字,则将x_1指定为0.现在为结果表达式计算2-SAT(因此,您必须指定一些其他文字,例如,如果出现x_1或x_3,则还需要将x_3设置为1)。
如果得到的表达式是2 - 可满足,则可以将x_1设为0,否则将x_1设为1。
现在你可以找到关于每个文字的内容。
对于更有效的算法,我建议您尝试使用蕴涵图方法。
您可以在此处找到更多信息:http://en.wikipedia.org/wiki/2-satisfiability
相关部分:
一个2可满足的实例是 当且仅当每个变量都可解 该实例属于不同的 强烈连接的组成部分 蕴涵图比否定 相同的变量。强烈的 可以在中找到连接的组件 基于MATLAB的算法的线性时间 深度优先搜索,线性相同 时间限制也适用于 2-满足性。
每个强连通分量中的文字全部为零或全部为1。
答案 1 :(得分:0)
至少有一种算法列出了Tomas Feder对2-sat问题的所有解决方案:http://www.springerlink.com/content/j582276p06276l12/