这里有一个非常简单的cnf实例,如(x1或x2或x3)&(x1或x2)&(x2或x3 ),公式肯定是可满足的,解为x1 = x2 =x3= 1,这就足够了。因此,我的问题是求解器如何使用DPLL或其他过程生成赋值?谢谢。
发布于 2015-07-09 21:34:39
嗯,基本上,对于CDCL的情况
(CDCL SAT求解器实现DPLL,但可以学习新的子句并按非时间顺序回溯。具有冲突分析的子句学习不会影响可靠性或完整性。冲突分析使用解决操作识别新的子句。因此,每个学习的子句可以通过一系列的解决步骤从原始的子句和其他学习的子句中推断出来。如果cN是新学习的子句,则ϕ是可满足的当且仅当ϕ∪{cN}也是可满足的。此外,修改后的回溯步骤也不会影响可靠性或完整性,因为回溯信息是从每个新学习的子句中获得的。)。(来源:Wikipedia)
它的工作原理如下:
首先选择一个分支变量x1。黄色圆圈意味着一个武断的决定。

现在应用单元传播,其结果是x4必须为1(即True)。灰色圆圈表示单位传播期间的强制变量赋值。生成的图称为蕴涵图。

任意选择另一个分支变量x3。

应用单位传播并找到新的隐含图。

在这里,变量x8和x12分别被强制为0和1。

选择另一个分支变量x2。

找到隐含图。

选择另一个分支变量x7。

找到隐含图。

发现冲突!

找到导致这场冲突的切入点。从cut中,找到一个冲突的条件。

接受这个条件的否定,并将其作为一个子句。

将冲突子句添加到问题中。

不按时间顺序向后跳到适当的决策层。

向后跳转并相应地设置变量值。

(答案完全来自Wikipedia: Conflict-Driven_Clause_Learning#Example)
以下是使用CDCL算法的解算器的列表(肯定不是完整的),您应该查看它们:
https://stackoverflow.com/questions/29621084
复制相似问题