我有伪布尔问题,我需要用sat4j解决它。
有人可以帮助我吗?
这是我的问题:
我有一个名为的变量列表:a,b,c,d,e,f
我有一个值列表:#1,#2,#3 .....
h(a,#1)表示将#1分配给
我有一些示例约束:
h(a,#1)=1
h(a,#1)+h(b,#1)+h(c,#1)=1
h(a,#1)+h(a,#5)>=1
h(b,#2)+h(b,#3)+h(b,#4)>=1
如上所述的许多约束。 最后,我想要一个结果,分配哪些值到哪个值。
我如何用sat4J解决它?我该如何表示约束?
答案 0 :(得分:0)
如果我将您的问题理解为伪布尔满意度问题,可以直接将其编码为OPB file:
* #variable= 7 #constraint= 4
1 x1 = 1;
1 x1 1 x2 1 x3 = 1;
1 x1 1 x4 >= 1;
1 x5 1 x6 1 x7 >= 1;
我将h(a,#1)
x1
,h(b,#1)
x2
,h(c,#1)
x3
h(a,#5)
,x4
任意编码为h(b,#2)
x5
,h(b,#3)
为x6
,h(b,#4)
为x7
,-1 x1 -1 x4 >= -1;
-1 x2 -1 x5 -1 x6 -1 x7 >= -1;
为=
。 (您可能希望添加约束,如
java -jar org.sat4j.pb.jar yourfile.opb
声明每个变量最多只有一个值,或者c
只有一个值。)
然后运行
s SATISFIA@KyleJones You don’t need to manually build adders and comparators to use a pseudo-boolean solver like `org.sat4j.pb`.BLE
v x1 -x2 -x3 -x4 x5 -x6 -x7
输出(忽略以x1
开头的许多注释行):
x5
当x2
,x3
,x4
,x6
和x7
为假时,表示>>> from itertools import combinations_with_replacement
>>> list(combinations_with_replacement(x, 2))
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 2), (2, 3), (2, 4), (2, 5), (3, 3), (3, 4), (3, 5), (4, 4), (4, 5), (5, 5)]
和{$my_var|escape:'html_all':'utf-8'} <- 1.6 way
为真
(我确信有一种方法可以使用org.sat4j.pb
Java API做同样的事情,但也许这个命令行配方为您提供了一个起点来帮助您解决这个问题。)