我正在考虑使用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的内在限制?
答案 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)
)
但我想这是一个最小的例子来解决一个更大的问题,因此它可能没有多大帮助。