使用Z3命令行工具和超时查找次优解决方案(目前为止的最佳解决方案)

时间:2018-01-25 07:24:13

标签: z3 smt

我看到一个post谈到了如何使用Z3的python API来获得最小化问题的次优解决方案

我有一个MAXSMT问题,我想知道在指定超时时如何使用Z3命令行工具找到次优解决方案?

单独使用-t:timeout选项假设给我一个次优的解决方案?

Z3解算器用150秒为我的MaxSMT问题寻找最佳解决方案

我使用z3 -t:140000 smt2 <filename>将超时设置为140秒。但是z3求解器返回未知(而不是sat和非零目标值)。我也尝试超时145秒,并看到类似的结果。当我将超时设置为&gt; 150,我得到了最佳解决方案

我是否想添加更多内容以获得次优解决方案?

1 个答案:

答案 0 :(得分:3)

νZ - Maximal Satisfaction with Z3Maximum Satisfiability Using Core-Guided MaxSAT Resolution中显示的maxres引擎通过一系列松弛接近来自不可满足区域的最佳解决方案。 因此,maxres引擎不应能够找到任何次优模型:它找到的输入公式的第一个模型也是最佳模型

如果您不需要次优模型但只需次优值,那么您可以考虑采用上部的最新近似值maxres找到的绑定值。

从命令行看,通过启用maxres选项,可以verbose打印任何更低/更高绑定改进:

~$ ./z3 -v:1 smtlib2_maxsmt.smt2 
(optimize:check-sat)
(optimize:sat)
(maxsmt)
(opt.maxsat mutex size: 2 weight: 1)
(opt.maxres [1:2])
(opt.maxres [1:1])
found optimum
is-sat: l_true
Satisfying soft constraints
1: |(not (<= y 0))!1| |-> true 
1: |(not (<= y 0))!2| |-> true 
1: |(not (<= 0 y))!3| |-> false 
sat
(objectives
 (goal 1)
)
(model 
  (define-fun y () Int
    1)
  (define-fun x () Int
    (- 1))
)

如果我正确地解释它,在(opt.maxres [1:2])中,1是最新的下限,2是给定目标的最新上限。请注意,在链接的帖子Nikolaj Bjorner中,maxres 可能更新maxres搜索中的上限,但我不知道这种情况发生的频率,所以这个解决方案在实践中可能不是很有效

或者,您可能想尝试使用其他 MaxSMT 引擎,该引擎接近来自可满足区域的最佳解决方案,例如: wmax,但可能比maxres慢。

可以使用以下选项选择z3使用的MaxSAT引擎:

(set-option:opt.maxsat_engine [wmax|maxres|pd-maxres])

也可以通过命令行设置它,如下所示:

~$ ./z3 -v:1 opt.maxsat_engine=wmax smtlib2_maxsmt.smt2 
(optimize:check-sat)
(optimize:sat)
(maxsmt)
(opt.maxsat mutex size: 2 weight: 1)
(opt.wmax [1:2])
(opt.wmax [1:1])
is-sat: l_true
Satisfying soft constraints
1: |(not (<= y 0))!1| |-> true 
1: |(not (<= y 0))!2| |-> true 
1: |(not (<= 0 y))!3| |-> false 
sat
(objectives
 (goal 1)
)
(model 
  (define-fun y () Int
    1)
  (define-fun x () Int
    (- 1))
)

请注意,还有一个选项可以在wmax引擎中启用maxres,但我不确定它应该做什么,因为输出似乎没有改变:

(set-option:opt.maxres.wmax true)