如何获得2-Sat值

时间:2010-02-22 16:50:34

标签: c++ algorithm boost 2-satisfiability

每当我搜索2-Sat的算法时,我都会找回问题决策形式的算法:是否存在满足所有子句的合法值集。但是,这不允许我轻松找到一组令人满意的布尔值。

如何有效地找到满足2-Sat实例的合法值集?

我正在使用boost库在c ++中工作,并且会欣赏可以轻松集成的代码。

提前致谢

2 个答案:

答案 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/