gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:20:35 32 4
gpt4 key购买 nike

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

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

from z3 import *
l = Real("l")
w = Real("w")
b = Real("b")
v = Real("v")
opt = Optimize()
width = 63.6
height = 51

opt.add(b+l <= width)
opt.add(w+b+w+l+w <= height)
opt.add(w > 0)
opt.add(b > 0)
opt.add(l > 0)
opt.add(v == w*b*l)
opt.maximize(w * b * l)
# h = opt.maximize(v)


print(opt.check())
# print(opt.upper(h))
print(opt.model())

输出:
unknown
[w = 1, b = 1, l = 47, v = 47]

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

最佳答案

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

如果添加:

print(opt.reason_unknown())

调用 check 后,您将看到:
(incomplete (theory arithmetic))

在这些情况下,对 model 的调用将返回一些在解决问题时获得的中间结果 z3,但绝不保证它是最优的。

您的问题是非线性的,因为您正在乘以变量。 ( wbl 。)Z3 可以解决实数上的非线性可满足性问题,但不能解决优化问题。例如,请参见此处: z3Opt optimize non-linear function using qfnra-nlsat

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

关于optimization - z3py 中的 Optimize() 未找到最佳解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56790818/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com