找到2个SAT的解决方案数量

时间:2009-11-03 11:22:53

标签: algorithm

我想要一个算法知道是否存在多个解决方案,对于满足1000个文字的2个可满足性问题,假设它是可满足的。请解释一下。

4 个答案:

答案 0 :(得分:3)

根据Wikipedia

  

Feder(1994)描述了一种算法   有效列出所有解决方案   对于给定的2 - 可满足性实例,   并解决了几个相关问题   的问题。[14]算法也是   以计算数量而闻名   解决方案,比它更快   可列出所有解决方案,[15]   并寻找成对的解决方案   与...大不相同   可能的。[16]

特别是

  

Dahllöf,Vilhelm;琼森,彼得;   Wahlström,Magnus(2005),“计数   2SAT和3SAT公式的模型“,   理论计算机科学332   (1-3):265-291,   doi:10.1016 / j.tcs.2004.10.037; Fürer,   马丁; Kasiviswanathan,Shiva Prasad   (2007),“计算2-SAT的算法”   解决方案和色彩   “应用程序”,“算法方面”   信息与管理,讲座   计算机科学笔记,4508,   Springer-Verlag,第47-57页,   DOI:10.1007 / 978-3-540-72870-2

似乎就是你想要的。


这是关于这个主题的文凭论文。它非常冗长,所以应该更容易理解:http://people.inf.ethz.ch/arazen/publications/2sat.pdf

另一个包括伪代码:http://www.engineeringletters.com/issues_v15/issue_2/EL_15_2_12.pdf

但是由于这个问题是一个非常重要的数学问题,在这种情况下你必须忍受数学。

答案 1 :(得分:3)

OP希望知道是否有多个解决方案。第一个2SAT要容易得多:你制作一个有向标记的图形:每个节点对应一个文字(一个变量或它的否定),形式为OR b的每个子句都给你一个从(不是)到b和(和)的有向边。不是b)到a。当且仅当没有从a到(不是a)的任何文字a的路径时,有一个令人满意的赋值。由于Aspvall,Plass和Tarjan,实际上有一个线性时间算法来确定这一点(参考http://en.wikipedia.org/wiki/Strongly_connected_component)。如果图表通过了此测试,您可以通过在图表中选择源节点并查找所有含义(所有路径)来获得解决方案。其中一些节点会使一些其他节点消失(如果节点是a,选择它对应于使该文字为真,以便现在删除节点(不是a))。继续这样做,直到没有更多的源节点。如果有另一个解决方案,那么它必须在您刚刚找到的解决方案中有一个文字,否定。所以依次尝试每一个。这给出了二次算法。我猜想那里可能还有更好的一个。

答案 2 :(得分:1)

我对问题的陈述和你问题的标题感到有点困惑。

如果“知道是否存在多个解决方案”真的是你唯一需要的东西,列出所有解决方案肯定是一种矫枉过正! 找到第一个解决方案,说“A AND NOT B”并添加一个'阻止子句',即一个防护,使SAT解算器远离该解决方案。

在上述示例中,这种约束是“NOT(A AND NOT B)”。把它带到CNF并开心: - )

答案 3 :(得分:-2)

计算2-SAT解决方案是一个难题(甚至可能是NP完全),因为它可能超过多项式解决方案。所以在多项式时间内我们不能列出所有解。 我自己找不到快速算法,所以现在我正在寻找网络。 但是如果存在快速算法,那么我们可以在多项式时间内破坏RSA。