关于sat4j,如何使用sat4j来解决伪布尔问题?

时间:2017-08-17 11:56:05

标签: java boolean sat-solvers constraint-satisfaction sat4j

我有伪布尔问题,我需要用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解决它?我该如何表示约束?

1 个答案:

答案 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) x1h(b,#1) x2h(c,#1) x3 h(a,#5)x4任意编码为h(b,#2) x5h(b,#3)x6h(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
x2x3x4x6x7为假时,

表示>>> 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做同样的事情,但也许这个命令行配方为您提供了一个起点来帮助您解决这个问题。)