我尝试使用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])
...
因此我有两个问题:
indomain_max
http://www.minizinc.org/2.0/doc-lib/doc-annotations-search.html)编辑:在opt.maxres日志中,上限永远不会缩小。
为了记录,我在这里找到了对来源中选项的更详细描述opt_params.pyg
编辑抱歉打扰了,我最近再次潜入这里。无论如何,我认为这可能对其他人有用。我发现我实际上必须调用Optimize.upper
方法才能获得上限,而模型仍然不是与此上限对应的模型。我已经能够将它添加为新约束,并调用求解器(没有优化,只有SAT),但这可能不是最好的主意。通过阅读this我觉得我应该在求解器超时后调用Optimize.update_upper
,但是python接口没有这样的方法(?)。至少我现在可以获得上限和相应的模型(以我猜测的不必要的计算为代价)。
答案 0 :(得分:3)
Z3找到硬约束的解决方案,并记录目标和软约束的当前值。如果您要求模型,则会返回找到的最后一个模型(具有目标最远值的最后一个模型)。 maxres策略主要改善软约束的下限(例如,任何解决方案必须具有至少xx的成本)并且只要可能改进上限(可选解决方案具有最多yy的成本)。除了缩小可能的最佳值范围之外,下限不会告诉您太多。超时后,上限可用。 您可以尝试其他策略之一,例如名为“wmax”的策略 执行分支和修剪。通常情况下,maxres确实会更好,但是你可能有更好的经验(取决于问题)和wmax来改善上限。
我没有获得模型流的模式。它原则上是可能的,但它需要一些(非平凡的)重组。对于Pareto前端,您可以对Optimize.check()进行连续调用以获得连续的前端。