2-SAT变量值

时间:2019-04-21 14:42:25

标签: algorithm 2-satisfiability kosaraju-algorithm

2-SAT问题,为变量求值

我正在使用此solution来查找给定公式的可满足性。 (通过检查SCC)。如果公式是可满足的,是否有任何有效的方法(在我的情况下,有效的方法并不比多项式时间差)如何找到每个变量的值?

它不一定是C ++,我只是使用相同的算法。

1 个答案:

答案 0 :(得分:2)

如链接的答案中所述,您可以将2-SAT问题转换为蕴涵图,因为(x | y)<=>(〜x => y)&(〜y => x)

要进行令人满意的分配,我们需要为每个变量 x 选择 x 〜x ,以便:

  1. 如果我们选择术语 x ,那么我们还选择了 x 隐含图的传递闭合中包含的所有内容,对于〜x < / strong>;和
  2. 如果我们选择 x ,那么在隐含图的传递闭包中,我们还选择了所有隐含〜x 的取反。

由于我们构造隐含图的方式,规则(2)已被规则(1)覆盖。如果图中有(a =>〜x),则图中也有(x =>〜a)。另外,如果(a => b)和(b =>〜x),那么我们就有(x =>〜b)和(〜b =>〜a)

因此,实际上只有规则(1)。这导致了类似于拓扑排序的线性时间算法。

如果我们要将图中的每个SCC折叠为单个顶点,则结果将是非循环的。图中必须至少有一个SCC,这没有外向的含义。

所以:

  1. 将所选分配初始化为空;
  2. 选择一个没有外向影响的SCC。如果它与当前分配中的任何内容都不矛盾,则将其所有条款添加到当前分配中。否则,添加所有术语的否定,并为每个直接包含它的SCC添加至少一个矛盾。
  3. 从图形中删除选定的SCC,然后返回(2),直到图形为空。

重复直到图形为空。该过程将始终终止,因为删除SCC不会引入周期。

步骤(2)确保在我们从图形中删除SCC之前,当前赋值确定所有与之有牵连的真假。

如果问题实例是可满足的,那么您将获得对问题中提到的每个变量的满意分配。