z3 - Z3 求解器中 MAxSMT 和用户定义成本函数的组合

标签 z3 smt

我正在使用 Z3 来优化带有一些软约束(带有加权 MaxSMT)的成本函数。我很好奇 MaxSMT 和用户定义的成本函数如何交互。求解器是否最小化 MaxSMT 成本和目标函数两者,是否有优先级机制?我找不到任何相关文档,如果我遗漏了什么,请告诉我。

最佳答案

@alias从技术角度回答了问题;我从可用性的角度解释了这个问题,所以我添加了一个包含一些细节的答案。


正如@alias所述,使用assert-soft将隐式目标函数推送到内部目标堆栈上。要观察的关键点是,这发生在第一个 assert-soft 公式中的位置。每组具有公共(public) id 的软子句的语句 <id> .


z3 OMT求解器支持3种多目标组合方法:盒装词典编排帕累托优化。最后两种是众所周知的多目标优化方法。 盒装(又名多独立)优化类似于顺序解决具有相同输入公式和不同成本函数的多个、独立、单目标问题;只是通过一次优化搜索滑动即可更快地完成此操作。

可以在调用 (check-sat) 之前的任何时间点直接在公式内设置优化组合。 :

(set-option :opt.priority VALUE)

哪里VALUE可以是 box , lexpareto .

z3使用的多目标组合默认情况下是字典优化


以下示例使用词典优化,展示 z3 的行为如何变化取决于如何assert-softminimize/maximize命令是交错的。

示例一:全部assert-soft语句出现在 minimize 之前命令。隐式 MaxSMT 目标优先于 LIRA 目标。

(set-option :produce-models true)
(declare-fun x () Int)
(declare-fun y () Int)
(assert (<= 0 x))
(assert (<= 0 y))
(assert-soft (< 2 x) :weight 1 :id pb)
(assert-soft (< 2 y) :weight 1 :id pb)
(minimize (+ x y))
(check-sat)
(get-model)
(get-objectives)

结果

~$ z3 example_01.smt2
sat
(model 
  (define-fun y () Int
    3)
  (define-fun x () Int
    3)
)
(objectives
 (pb 0)
 ((+ x y) 6)
)

示例 II:所有 assert-soft语句出现在 minimize 之后命令。 LIRA 目标优先于隐式 MaxSMT 目标。

(set-option :produce-models true)
(declare-fun x () Int)
(declare-fun y () Int)
(assert (<= 0 x))
(assert (<= 0 y))
(minimize (+ x y))
(assert-soft (< 2 x) :weight 1 :id pb)
(assert-soft (< 2 y) :weight 1 :id pb)
(check-sat)
(get-model)
(get-objectives)

结果

~$ z3 example_02.smt2
sat
(model 
  (define-fun y () Int
    0)
  (define-fun x () Int
    0)
)
(objectives
 ((+ x y) 0)
 (pb 2)
)

示例 III: assert-soft 的交错带有 minimize 的语句命令。隐式 MaxSMT 目标优先于 LIRA 目标。

(set-option :produce-models true)
(declare-fun x () Int)
(declare-fun y () Int)
(assert (<= 0 x))
(assert (<= 0 y))
(assert-soft (< 2 x) :weight 1 :id pb)
(minimize (+ x y))
(assert-soft (< 2 y) :weight 1 :id pb)
(check-sat)
(get-model)
(get-objectives)

结果

~$ z3 example_03.smt2
sat
(model 
  (define-fun y () Int
    3)
  (define-fun x () Int
    3)
)
(objectives
 (pb 0)
 ((+ x y) 6)
)

注意:其他 OMT 求解器使用不同的多目标组合默认值并处理 assert-soft陈述不同,因此在尝试各种求解器时要记住这一点。

关于z3 - Z3 求解器中 MAxSMT 和用户定义成本函数的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57773821/

相关文章:

python - 以 SMT2 格式保存 Z3 解算器的 "state"

python - Z3:如何从8位数组中选择4个字节?

z3 - 代入 z3 公式中的函数符号

verification - SMT求解器的局限性

c++ - 直接将子句添加到 z3 求解器

z3 - 创建一个固定大小的数组并对其进行初始化

z3 - "pull-nested-quantifiers"选项似乎在 UFBV 的上下文中引起问题?

z3 - 在 Z3 中定义单射函数

python - 如何添加要求整型变量属于数组的约束?

smt - 增量削弱 Maxsat