Optimization z3py中的Optimize()未找到最佳解决方案

Optimization z3py中的Optimize()未找到最佳解决方案,optimization,mathematical-optimization,z3,z3py,Optimization,Mathematical Optimization,Z3,Z3py,我试图使用z3py作为一个优化解算器来最大化从一张纸上切下的长方体的体积。python API提供了Optimize()对象,但使用它似乎不可靠,给我的解决方案显然不准确 我尝试过使用h=opt.maximize,然后使用opt.upper(h)以及简单地检查模型,以及在将长方体添加到模型之前和之后定义长方体的体积v=w*b*l,以及将目标设置为w*b*l,而不是v。他们都没有给我任何类似于好的解决方案的东西 从z3导入* l=真实(“l”) w=真实(“w”) b=真实(“b”) v=实(“v

我试图使用z3py作为一个优化解算器来最大化从一张纸上切下的长方体的体积。python API提供了Optimize()对象,但使用它似乎不可靠,给我的解决方案显然不准确

我尝试过使用
h=opt.maximize
,然后使用
opt.upper(h)
以及简单地检查模型,以及在将长方体添加到模型之前和之后定义长方体的体积
v=w*b*l
,以及将目标设置为
w*b*l
,而不是
v
。他们都没有给我任何类似于好的解决方案的东西

从z3导入*
l=真实(“l”)
w=真实(“w”)
b=真实(“b”)
v=实(“v”)
opt=Optimize()
宽度=63.6
高度=51
选择添加(b+l 0)
选择添加(l>0)
选择添加(v==w*b*l)
选择最大化(w*b*l)
#h=选择最大化(v)
打印(opt.check())
#打印(可选上部(h))
打印(opt.model())
产出:

unknown
[w = 1, b = 1, l = 47, v = 47]

这绝对不是最大值。将所有值设置为10可以提供更好的解决方案来满足约束。

Z3的优化器不会处理非线性问题。事实上,这正是它打印
unknown
的原因。当您看到调用
check
返回
unknown
时,确切地说:Z3不知道问题是否可满足,更不用说是否找到了最佳解决方案

如果您添加:

print(opt.reason_unknown())
调用
检查
后,您将看到:

(incomplete (theory arithmetic))
在这些情况下,调用
model
将返回在处理问题时获得的一些中间结果
z3
,但决不能保证它是最优的


你的问题是非线性的,因为你在乘变量。(
w
b
l
)Z3可以解决实上的非线性可满足性问题,但不能解决优化问题。例如,请参见此处:


(请注意,与纯可满足性相比,非线性优化对于REAL来说是一个非常困难的问题。因此,这不仅仅是一个“尚未实现它”的问题。

“您的问题是非线性的,因为您正在乘以变量。(w、b和l。)Z3可以解决实上的非线性可满足性问题,但不能解决优化问题。谢谢你澄清这一点。我假设Z3也可以做非线性(多项式)优化,但它可以做可满足性问题。