【发布时间】:2020-08-26 18:53:14
【问题描述】:
我有一个问题,我要将变量分配给集合。每个集合都有可以分配给它的变量的限制,并且每个变量都可以分配给总集合的某个子集。
例子:
-
a可以在集合中A或B -
b可以成套B -
c可以在集合中A或B -
d可以成套A
因此,我们可以有A: a, d; B: b, c 或A: c, d; B: a,b(集合中变量的顺序无关紧要)。
我目前正在使用 z3 执行以下操作(此处使用 solve 编写,也可以使用 Solver 表示)。通过下面的代码,如果a_in_A = True 则变量a 在集合A 中。
solve(If(a_in_B, 1, 0) + If(b_in_B, 1, 0) + If(c_in_B, 1, 0) <= 2,
If(a_in_A, 1, 0) + If(c_in_A, 1, 0) + If(d_in_A, 1, 0) <= 2,
If(a_in_A, 1, 0) + If(a_in_B, 1, 0) == 1,
If(b_in_B, 1, 0) == 1,
If(c_in_A, 1, 0) + If(c_in_B, 1, 0) == 1,
If(d_in_A, 1, 0) == 1)
我可以对集合中的变量进行加权,如下所示。在这种情况下,我们将只剩下A: a, d; B: b, c 作为解决方案,尽管这可以扩展。
solve(If(a_in_B, 4, 0) + If(b_in_B, 3, 0) + If(c_in_B, 3, 0) <= 6,
If(a_in_A, 4, 0) + If(c_in_A, 3, 0) + If(d_in_A, 3, 0) <= 7,
If(a_in_A, 4, 0) + If(a_in_B, 4, 0) == 4,
If(b_in_B, 3, 0) == 3,
If(c_in_A, 3, 0) + If(c_in_B, 3, 0) == 3,
If(d_in_A, 3, 0) == 3)
但是,我还想在c 等其他特征中输入必须在a 之后的集合。因此,我们将被简化为只有A: a, d; B: b, c 的解决方案。我如何将这些要求添加到 z3 求解器表达式(或完全以其他方式)?
【问题讨论】:
标签: algorithm set combinations z3 z3py