【发布时间】:2021-04-08 22:18:40
【问题描述】:
一个例子:
from z3 import *
p1,p2, p3 = Reals('p1 p2 p3')
s = Optimize()
s.add(And(Or(p1>=0, p2>0),Or(p1<=10,p3>0)))
print(s.check())
print(s.model())
运行代码,得到输出:
sat
[p3 = 1, p1 = 11, p2 = 1]
没错。但是,获得预期结果很有价值(满足约束And(Or(p1>=0, p2>0),Or(p1<=10,p3>0)),设置较少的变量。
例如,只设置 p1=0(或 range([0,10]) 中的任何值),则满足约束。只需设置一个变量。
所以我的问题是,有没有一种通用的方法来获得最少数量的必要变量?
【问题讨论】:
-
谢谢。有帮助。我知道 Z3 Optimize 对象中有“add_soft”功能。但实际上约束逻辑由数百个变量组成,它们耦合在不同的子句中,例如: (p1>100) || ((p1
-
是的。也许我可以添加软原因并检查已解决的模型以获取哪些变量是冗余的。但是当涉及到耦合变量时,例如:
p1,p2 = Reals('p1 p2') s = Optimize() s.add(And((p1>=100),Or(p1<=150,p2<0))),如何设置软子句? -
我已尝试编辑问题。希望我说清楚。谢谢。
-
哦,我看到变量不再是
booleans,而是变成了Reals。这是一个与原始问题完全不同的问题。 AFAIK,这对于像 Z3 这样的普通 SMT/OMT 求解器来说是不可能的。