感谢您尝试此实验分支。 这些日子里,开发仍然在不断发展,但大部分功能都相当稳定,您可以尝试一下。
回答你的问题。有一种本地方式可以使用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]
小量指非基准数(无限)。你可以任意设置它很小。 该模型再次只使用标准数字,所以它挑选了一些数字,在这种情况下为9.
感谢您的回答!目前,我只是为一个非常大的数字添加一个约束(x <= BAZILLION),并返回无穷大,其中x确实是BAZILLION:P检查'.upper()'显然更好。 – 2014-09-27 19:14:00
好的,但我该如何使用API来检查无限? – Modass 2016-07-29 14:08:10