z3 Optimize 不会在 Solver 产生结果的地方产生结果

z3 Optimize does not produce result where Solver produces one

我正在编写一个函数来识别掉落的物体何时会落到地面上。它以某个高度值 y 和某个初始速度 y0 开始。它考虑了重力加速度 (9.81m/s) 并尝试确定 dty == 0.

代码(下方)可以很好地确定质量将在什么时候撞击地面。但是,我不得不找出必须使用 Solver 而不是 Optimize 的困难方法。 (结果:unknown)。有人可以解释这是为什么吗? 优化不应该也能找到解决办法吗? (显然在这种情况下只有一个)

这是我的代码:

from z3 import *

vy0, y0 = Reals("vy0 y0")  # initial velocity, initial position
dt, vy, y = Reals("dt vy y")  # time(s), acceleration, velocity, position
solver = Solver()  # Optmize doesn't work, but why?
solver.add(vy0 == 0)
solver.add(y0 == 3)

solver.add(dt >= 0)  # time needs to be positive
solver.add(vy == vy0 - 9.81 * dt)  # the velocity is initial - acceleration * time 
solver.add(y == y0 + vy/2 * dt)  # the position changes with the velocity (s = v/2 * t)
solver.add(y == 0)
# solver.minimize(dt)  # Optmize doesn't work, but why?
print(solver.check())
print(solver.model())

Z3 的优化器仅适用于线性约束。您有一个非线性项(由于涉及 vydt 的乘法),因此优化求解器放弃 Unknown.

然而,可满足性求解器可以处理非线性实数约束;因此给你一个模型没有问题。

有关 Z3 中非线性优化的更多信息,只需搜索该术语即可。你会看到很多人问类似的问题!这是一个示例:z3Opt optimize non-linear function using qfnra-nlsat

(请注意,与纯粹的可满足性相比,非线性优化对于实数来说是一个更难的问题。因此,这不仅仅是 "not having implemented it yet." 的问题)