Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Z3解算器中MAxSMT与自定义代价函数的组合_Z3_Smt - Fatal编程技术网

Z3解算器中MAxSMT与自定义代价函数的组合

Z3解算器中MAxSMT与自定义代价函数的组合,z3,smt,Z3,Smt,我正在使用Z3优化具有一些软约束的成本函数(使用加权MaxSMT)。我很好奇MaxSMT和用户定义的成本函数是如何相互作用的。解算器是否将MaxSMT成本和目标函数都最小化,是否存在优先级机制?我找不到关于此的任何文档,如果我遗漏了什么,请告诉我。软断言基本上被视为一种约束,如果不满足,将对成本函数造成惩罚: (assert soft F[:weight n |:dwweight d][:id id])-assert soft 约束F,可选具有整数权重n或小数权重 D如果未指定权重,则默认权重为

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

软断言基本上被视为一种约束,如果不满足,将对成本函数造成惩罚:

(assert soft F[:weight n |:dwweight d][:id id])
-assert soft 约束F,可选具有整数权重n或小数权重 D如果未指定权重,则默认权重为1(1.0)。十进制和 积分权重可以自由混合。此外,软约束还可以 可以使用可选的名称id进行标记。这允许组合多个 不同的软目标。图1示出了使用软硬件的情况 限制

因此,在某种意义上,同一个MaxSMT引擎可以一次性处理一般成本函数和软约束。上面的引文和细节在本文中:

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


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


z3
OMT解算器支持3种多目标组合方法:装箱、字典和Pareto优化。最后两种是众所周知的多目标优化方法。装箱(又称多独立)优化类似于顺序求解具有相同输入公式和不同成本函数的多个独立单目标问题;只需在一次优化搜索中快速完成

可以在调用
(检查sat)
之前的任何时间点直接在公式中设置优化组合:

其中,
VALUE
可以是
box
lex
pareto

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


以下示例使用词典优化,展示了
z3
的行为如何根据
assert soft
minimize
/
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)
(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)
示例二:所有
assert soft
语句都出现在
minimize
命令之后。里拉目标优先于隐式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)
示例三:使用
minimize
命令交错
assert soft
语句。隐式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)
(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)


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

AFAIK
:dweight d
不再受到
z3
的正式支持。有理数和整数权重都用
:weight c
指定。我在最近构建的
z3
上测试了这一点。很好的解释!这应该是公认的答案。嗨!我有一个后续问题?在我的问题中,如果我先有一组软约束(MaxSMT目标),然后是另一个目标函数,系统将按词典进行优化。假设第二个目标将针对优化的MaxSMT目标的所有可能分配(解决方案)进行优化是否安全?@KshitijGoyal如果违反该假设,则是一个bug。因此,是的。@PatrickTrentin我不确定。在优化第一个目标后,我们有没有办法看到可能的分配?@KshitijGoyal您可以使用API逐个递增地提取所有可能的分配,或者,您可以检查z3是否有类似optimathsat的“检查所有sat”命令,并在添加第二个目标之前,使用第一个目标的相同最佳解决方案打印所有可能的模型。这是一张相当昂贵的支票,而且最终也没有必要。我很确定这就是我们想要的语义。
(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)
)