我目前正在玩Z3的最大化API(opt分支),我偶然发现了以下错误:
每当我给它任何无限制的问题时,它只会返回OPT并在结果模型中给出零(例如,在模型没有约束的情况下最大化Real(' x')。)
Python示例:
from z3 import *
context = main_ctx()
x = Real('x')
optimize_context = Z3_mk_optimize(context.ctx)
Z3_optimize_assert(context.ctx, optimize_context, (x >= 0).ast)
Z3_optimize_maximize(context.ctx, optimize_context, x.ast)
out = Z3_optimize_check(context.ctx, optimize_context)
print out
我认为out
的值为1
(OPT),而它似乎应该是-1
。
答案 0 :(得分:2)
感谢你试用这个实验分支。 这些天开发仍然很多,但大多数功能都相当稳定,欢迎您试用它们。
回答你的问题。有一种使用Z3优化功能的本地方法。 为了解释你的例子,这里有相关内容:
from z3 import *
x = Real('x')
opt = Optimize()
opt.add(x >= 0)
h = opt.maximize(x)
print opt.check()
print opt.upper(h)
print opt.model()
运行时,您将看到以下输出:
sat
oo
[x = 0]
第一行表示断言是可以满足的。 第二行在满足性调用下打印句柄“h”的值。
句柄的值包含一个表达式,该表达式满足对opt.maximize / opt.minimize调用声明的最大化/最小化条件。 在这种情况下,表达式是“oo”。这有点像“黑客”,因为你可能会猜到“oo”意味着无限。如果您将此值解释回Z3,则不会获得无穷大。 (我在这里限制使用Z3,我们不公开非标准数字,Z3的另一部分包括非标准数字,但这是另一个故事)。
请注意,opt.maximize调用返回句柄“h”, 后来用于查询什么是最佳值。 最后一行是满足约束的一些模型。 当目标有界时,模型将是什么 你期望,但在这种情况下,目标是无限的。 没有有限的最佳价值。
请尝试例如:
x = Real('x')
opt = Optimize()
opt.add(x >= 0)
opt.add(x <= 10)
h = opt.maximize(x)
print opt.check()
print opt.upper(h)
print opt.model()
这次你得到一个设置x = 10的模型,这也是最大值。
您也可以尝试:
x = Real('x')
opt = Optimize()
opt.add(x >= 0)
opt.add(x < 10)
h = opt.maximize(x)
print opt.check()
print opt.upper(h)
print opt.model()
输出现在是:
sat
10 + -1*epsilon
[x = 9]
epsilon是指非标准数字(无穷小)。你可以任意设置它。 同样,模型仅使用标准数字,因此它会选择一些数字,在本例中为9。