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

使用Z3命令行工具和超时查找次优解决方案(迄今为止的最佳解决方案),z3,smt,Z3,Smt,我看到了一篇关于如何使用Z3的python API来获得最小化问题的次优解决方案的文章 我有一个MAXSMT问题,我想知道当指定超时时,如何使用Z3命令行工具来找到次优的解决方案 仅使用-t:timeout选项是否会给我一个次优的解决方案 Z3解算器花了150秒来为我的MaxSMT问题找到一个最佳解决方案 我使用z3-t:140000 smt2将超时设置为140秒。但z3解算器返回未知(而不是sat和非零目标值)。我还尝试了超时145秒,并看到了类似的结果。当我将超时设置为>150时,我得到了最

我看到了一篇关于如何使用Z3的python API来获得最小化问题的次优解决方案的文章

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

仅使用
-t:timeout
选项是否会给我一个次优的解决方案

Z3解算器花了150秒来为我的MaxSMT问题找到一个最佳解决方案

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


我是否需要添加更多内容以获得次优解?

和中介绍的
maxres
引擎通过一系列松弛从不可满足区域接近最优解。 因此,
maxres
引擎应该无法找到任何次优模型:它找到的输入公式的第一个模型也是最优模型

如果不需要<强>次优模型>,但只有<强>次优值>,则可以考虑采用<代码> Max RES/<代码>的上限值的最新近似值。 在命令行中,似乎可以通过启用

verbose
选项,使
maxres
打印任何下限/上限改进:

~$ ./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))
)
也可以通过命令行进行设置,如下所示:

~$ ./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))
)

谢谢你的回复。您能告诉我如何从命令行告诉z3使用wmax吗?
~$ ./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))
)
(set-option:opt.maxres.wmax true)