【发布时间】:2016-05-14 04:58:31
【问题描述】:
我尝试使用 z3 求解器来解决最小化问题。我试图让一个超时,并返回迄今为止最好的解决方案。我使用 python API,超时选项“smt.timeout”与
set_option("smt.timeout", 1000) # 1s 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 从上限开始,并为我的目标函数连续返回具有较小值的模型(例如 Minizinc 注释
indomain_maxhttp://www.minizinc.org/2.0/doc-lib/doc-annotations-search.html) - 看起来求解器仍然返回了我的问题的一个令人满意的实例。它是如何被发现的?如果它试图连续评估我的目标的更大值,那么当超时发生时它应该还没有找到可满足的实例......
edit:在 opt.maxres 日志中,上限从不缩小。
为了记录,我在opt_params.pyg的源代码中找到了更详细的选项描述
编辑很抱歉打扰了,我最近又开始研究这个了。无论如何,我认为这可能对其他人有用。我一直发现我实际上必须调用Optimize.upper 方法才能获得上限,而模型仍然不是对应于这个上限的模型。我已经能够将它添加为一个新的约束,并调用一个求解器(没有优化,只是 SAT),但这可能不是最好的主意。通过阅读this,我觉得我应该在求解器超时后调用Optimize.update_upper,但是python接口没有这样的方法(?)。至少我现在可以得到上限和相应的模型(我猜是以不必要的计算为代价的)。
【问题讨论】:
-
下面是使用 C++ API 的相同问题:Z3: timeout for optimize in C++
标签: optimization z3 minimization