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