z3opt python - 最小化方块

时间:2016-07-15 01:28:11

标签: python z3 z3py

我正在考虑使用z3来最小化涉及方块的问题。但是当我写这个简单的例子(在python 3中的z3opt)时:

from z3 import *

a = Real('a')
b = Real('b')

cost = Real('cost')

opt = Optimize()
opt.add(a + b == 3)
opt.add(And(a >= 0, a <= 10))
opt.add(And(b >= 0, b <= 10))
opt.add(cost == a * 10.0 + b ** 2.0)
h = opt.minimize(cost)
print(opt.check())
print(opt.reason_unknown())
print(opt.lower(h))
print(opt.model())

支票返回“未知”:

unknown
(incomplete (theory arithmetic))
-1*oo
[b = 0, cost = 30, a = 3]

我是以错误的方式定义问题还是这是z3的内在限制?

1 个答案:

答案 0 :(得分:2)

νZ - An Optimizing SMT SolverνZ - Maximal Satisfaction with Z3都明确提到支持线性算术优化,而您正在尝试优化非线性目标

我想如果支持非线性目标,作者会提及它,因为它不是次要功能。

解决方法。在您的示例中,显然可以使用解决方法来解决此问题,因为 cost 由两个正面和独立的加数之和给出< / em>,例如将问题转化为词典优化问题,首先将a最小化,然后b

(declare-fun a () Real)
(declare-fun b () Real)
(declare-fun cost () Real)
(assert (= (+ a b) 3))
(assert (<= 0 a))
(assert (<= a 10))
(assert (<= 0 b))
(assert (<= b 10))
(assert (= cost (+ (* 10 a) (* b b))))
(minimize a)
(minimize b)
(check-sat)
(get-model)

并获取

sat
(objectives
 (a 0)
 (b 3)
)
(model 
  (define-fun b () Real
    3.0)
  (define-fun cost () Real
    9.0)
  (define-fun a () Real
    0.0)
)

但我想这是一个最小的例子来解决一个更大的问题,因此它可能没有多大帮助。