Z3最大化API:可能的错误?

时间:2014-09-26 14:10:46

标签: optimization z3

我目前正在玩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

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。