Optimization z3最小化和超时

Optimization z3最小化和超时,optimization,z3,minimization,Optimization,Z3,Minimization,我尝试使用z3解算器解决最小化问题。我试图获得一个超时,并返回到目前为止最好的解决方案。我使用PythonAPI和超时选项“smt.timeout” 这实际上会在大约1秒后超时。但是,较大的超时不能提供较小的目标。最后,我又开始了长篇大论 set_option("verbose", 2) 我认为z3会依次评估我目标的较大值,直到问题可以满足: (opt.maxres [0:6117664]) (opt.maxres [175560:6117664]) (opt.maxres [236460:6

我尝试使用z3解算器解决最小化问题。我试图获得一个超时,并返回到目前为止最好的解决方案。我使用PythonAPI和超时选项“smt.timeout”

这实际上会在大约1秒后超时。但是,较大的超时不能提供较小的目标。最后,我又开始了长篇大论

set_option("verbose", 2)
我认为z3会依次评估我目标的较大值,直到问题可以满足:

(opt.maxres [0:6117664])
(opt.maxres [175560:6117664])
(opt.maxres [236460:6117664])
(opt.maxres [297360:6117664])
...
(opt.maxres [940415:6117664])
(opt.maxres [945805:6117664])
...
因此,我有两个问题:

  • 相反,我是否可以告诉z3从上限开始,然后依次返回目标函数值较小的模型(就像minizin注释
    indomain_max
  • 看起来解算器仍然返回了我的问题的一个令人满意的实例。怎么找到的?如果它试图依次计算我的目标的较大值,那么当超时发生时,它不应该找到一个可满足的实例
编辑:在opt.maxres日志中,上限从不缩小

作为记录,我在这里的源代码中找到了对选项更详细的描述


编辑抱歉打扰了,我最近又一次陷入了这一困境。无论如何,我认为这可能对其他人有用。我发现我实际上必须调用
Optimize.upper
方法才能得到上界,而模型仍然不是对应于这个上界的模型。我已经能够添加它作为一个新的约束,并调用一个解算器(没有优化,只是SAT),但这可能不是最好的主意。通过阅读,我觉得应该在解算器超时后调用
Optimize.update\u upper
,但是python接口没有这样的方法(?)。至少我现在可以得到上界和相应的模型(以不必要的计算为代价)。

Z3找到硬约束的解决方案,并记录目标和软约束的当前值。如果您请求模型,则返回找到的最后一个模型(具有迄今为止目标最佳值的最后一个模型)。maxres策略主要改进软约束的下界(例如,任何解决方案的成本必须至少为xx),并尽可能改进上界(可选解决方案的成本最多为yy)。下限除了缩小可能的最佳值范围之外,不会告诉你太多。当您超时时,上限可用。 您可以尝试其他策略之一,例如称为“wmax”的策略 执行分支和修剪。通常,maxres的性能明显更好,但您可能在使用wmax改进上界方面有更好的经验(取决于问题)


我没有一个模式,你可以得到一个模型流。这在原则上是可能的,但需要一些(非琐碎的)重组。对于帕累托前沿,您可以进行连续调用来优化。check()可以获得连续前沿

谢谢你的回答,我不能编辑,但你的意思可能是最佳的,而不是可选的。我不知道如何使用wmax策略而不是maxres策略。我尝试了
set_选项(“opt.maxres.wmax”,True)
,但我没有看到任何显著的变化(opt.maxres日志是相同的)。因此我设法更改了模型,然后使用
optsmt
,根据日志可以找到更好的上限。但是,当超时时,返回的模型不是目前为止具有最佳值的模型(目标值不同于我可以使用
objective.upper
)访问的模型)。你知道我如何得到相应的模型吗?这里使用C++ API的问题是:
(opt.maxres [0:6117664])
(opt.maxres [175560:6117664])
(opt.maxres [236460:6117664])
(opt.maxres [297360:6117664])
...
(opt.maxres [940415:6117664])
(opt.maxres [945805:6117664])
...