Z3最大化API:切换目标

时间:2014-10-06 09:41:07

标签: optimization z3

关于Z3中最大化API的另一个问题。 如果我在中途切换最大化目标,我会得到错误的答案:

from z3 import Real, Optimize

x = Real('x')
y = Real('y')
opt = Optimize()

opt.add(x >= 0)
opt.add(y >= 0)    
opt.add(x + y <= 15)

print "Optimizing", x
h = opt.maximize(x)
print opt.check()
print opt.upper(h)
print opt.model()

print "Optimizing", y
h = opt.maximize(y)
print opt.check()
print opt.upper(h)
print opt.model()

后者对opt.model()的调用会返回y = 0,而答案应该是15。 这是一个错误还是根本不受支持的功能? (每次我想切换目标时,我应该手动重新添加约束吗?)

此外,当我删除非负性约束时会出现一个单独的错误,但这是一个单独的问题(对于无界目标的处理不好,我猜?)

from z3 import Real, Optimize

x = Real('x')
y = Real('y')
opt = Optimize()

opt.add(x + y <= 15)

print "Optimizing", x
h = opt.maximize(x)
print opt.check()
print opt.upper(h)
print opt.model()

死于

Optimizing x
terminate called after throwing an instance of 'std::bad_typeid'
  what():  std::bad_typeid
fish: Job 1, 'python opt.py' terminated by signal SIGABRT (Abort)

1 个答案:

答案 0 :(得分:0)

感谢关于崩溃的错误报告。这不应该发生。

您报告的第一个问题。添加目标的语义是附加的。也就是说,您指示引擎优化x和y(在第二次调用中)。它默认选择x,y的词典组合。在词典排序中,值(15,0)支配其他值。