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

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

我正在使用 boost 库使用 c++ 工作,并且希望能够轻松集成的代码。

提前致谢

有帮助吗?

解决方案

如果您有用于检测是否存在有效的分配到2-SAT的决定算法,你可以用它来真正找出实际的分配。

首先对整个表达运行2-SAT决定算法。假设它说,有一个有效的分配。

现在如果X_1是文字,分配X_1为0。现在计算2-SAT用于将所得的表达(你将不得不分配因为这样一些其它的文字,例如,如果X_1 OR X_3出现,还需要到集X_3为1)。

如果所得expresion是2-满足的,则可以采取X_1为0,否则取X_1为1。

现在,你可以发现这一点对每个文字。

有关更有效的算法,我建议你尝试使用蕴涵图方法。

您可以在这里找到更多的信息: http://en.wikipedia.org/wiki/ 2-可满足

在相关部分:

  

2满足性实例是   解当且仅当每一个变量   实例的属于不同的   强连通分量的   蕴涵图比的否定   相同的变量。由于强烈   连接的组件可参见   基于由算法线性时间   深度优先搜索,相同的线性   约束时间,适用于好   2-满足性。

在各强连通分量的文字或者是全零或全1。

其他提示

至少有一种算法列出了 2-sat 问题的所有解决方案,作者:Tomas Feder: http://www.springerlink.com/content/j582276p06276l12/

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