我正在尝试寻找解决问题的实用方法(例如在工程方面的努力),其中我有一堆未知值:
val a: Int32 = ???
val c: Int32 = ???
val d: Bool = ???
Run Code Online (Sandbox Code Playgroud)
和表达式二进制树(在内存中),最终返回一个布尔值,例如
((a > 4) || (b == (c+2))) && (a < b) && ((2*d)) || e
Run Code Online (Sandbox Code Playgroud)
我有的布尔运算符and or xor not和32位整数有比较的东西,以及加法,乘法,除法(注意:这些必须尊重32位溢出!)以及一些按位的东西(移位,按位&,| ^).但是,我不一定需要支持所有这些操作[参见:LOL_NO_IDEA]
我想得到三个答案中的一个:
我正在解决的问题都不是太大或太复杂,而且条款太多(最多的是大约数百个).并且有大量的LOL_NO_IDEA可以.然而,我正在解决数以百万计的这些问题,因此不断的成本将会刺痛(例如转换为文本格式,并唤起外部解算器)
因为我是用scala做的,所以使用SAT4J看起来非常吸引人.虽然,文档很糟糕(特别是像我这样的人,他们只关注这个SAT世界几天)
但我目前的想法是,首先将每个Int32变为32个布尔值.这样我可以通过将它作为嵌套布尔表达式来表达像(a <b)这样的关系(比较msb,如果它们是eq,那么下一个等等)
然后当我有一个布尔变量和布尔表达式的大表达式树时 - 然后遍历它,同时逐步建立一个:http: //en.wikipedia.org/wiki/Conjunctive_normal_form
然后将其喂入SAT4J.
然而,所有这些看起来都非常具有挑战性 - 甚至构建CNF似乎效率很低(以天真的方式做,我实现它)并且容易出错.更不用说尝试将所有整数数学编码为布尔表达式.而且我无法为像我这样的人找到好的资源,一个想要使用SAT解决问题的工程师主要是一个黑盒子
我很感激任何反馈,即使它像"哈哈,你的白痴 - 看看X"或"是的,你的想法是正确的.享受!"
scala artificial-intelligence satisfiability conjunctive-normal-form
我找到了一种使用此链接中描述的方式找到所有解决方案的方法。
这工作正常,但速度很慢。由于它从一开始就重新计算约束,因此 i_e 没有利用之前的计算。
现在,我在此链接中看到 ,有一种更有效的方法可以使用 MiniSat 作为库来查找所有解决方案。但那里没有描述方法。
您能否为我指出正确的文档,以便有效地找到所有 SAT 解决方案?
谢谢。
我们知道DPLL算法是回溯+单位传播+纯文字规则。
我有一个例子。有一个示例可以解决DPLL的以下可满足性问题。如果给变量分配“ 0”先于给变量分配“ 1”,那么哪个Unit Clause (UC)或哪个Pure Literal (PL)用于解决此特定示例?
{~A \/ B \/ C}, {A \/ ~B \/ C}, {A \/ B \/ ~C}, {A \/ B \/ C}
Run Code Online (Sandbox Code Playgroud)
在此示例中,使用其中两个(PL and UC)编写。为什么选择其中两个?任何的想法?
有谁知道有一个好的程序可以将每个子句包含任意数量变量的 CNF 文件转换为每个子句包含 3 个变量的 CNF 文件 (3-CNF)?我在计算机科学书籍中看到过这个算法,但在任何地方都找不到实现,如果其他人已经这样做了,我不想浪费时间自己实现它。谢谢!
我读了许多用于找到2-SAT问题的算法,即给定表达式是否可满足,可以在多项式时间内求解.例子(算法).
对于Krom的程序(维基百科),我构建了图,我可以从中轻松验证其在多项式时间内的可满足性.
现在,我想找到这个表达式的解决方案是可以满足的.
我这样想(验证它):首先我采用形成强连通分量的任何字面表示x,并将值赋值为0.然后根据算法,存在edge(x! - > y).因此y不能为0.(因为1 - > 0是假的)并且如果可能的话同样地进行.
否则取x = 0,然后只选择y = 1,同样继续获得任何可满足的实例.
现在,是在多项式时间内找到任何一个的任何可行解决方案
对于这类问题,我没有得到任何多项式算法.