【发布时间】:2018-07-15 00:43:12
【问题描述】:
在优化任务中使用混合的assert 和assert-soft 时,例如maximize,如果软断言会导致非最佳结果,则忽略它们。
是否可以将“软性”限制为仅可满足性搜索?即:如果软断言完全可以满足,则保留它,然后在优化中将其视为“硬”断言?
展示上述内容的示例:
(declare-fun x () Int)
(declare-fun y () Int)
(assert (< (+ x y) (* x y)))
(assert (>= x 0))
(assert (>= y x))
;(assert-soft (>= (* 4 x) y)); x->2, y->500
(assert (>= (* 4 x) y)); x->16, y->62
(assert (<= (* x y) 1000))
(maximize (+ x y))
(set-option :opt.priority pareto)
(check-sat)
(get-value (x y (+ x y) (* x y)))
(check-sat)
(get-value (x y (+ x y) (* x y)))
;...
这需要满足以下用例:
- 鉴于包含大量 (>1000) 个变量(大多数具有有限域)的复杂固定规则集,用户可以为其中任何一个选择所需的值,这可能会导致与规则集发生冲突。
- 变量的各个值具有评级/权重。
因此,给定一组用户选择的(可能是冲突的)选择、规则集本身以及所有可能选择的集合的评级,一个所有变量的解决方案将被找到,在尊重用户所有非冲突选择的同时,最大化总评分。
我的想法是使用 assert-soft 进行用户选择以消除冲突的选择,同时将其与 z3 的优化相结合以获得“最佳”解决方案。然而,这失败了,这就是这个问题的原因。
【问题讨论】:
-
您的问题似乎有点模棱两可:如果您的软子句组承认多个相同权重且互斥的可满足软子句子集怎么办?您真的想将可满足软子句的同一子集保留为硬子句,还是探索所有子句?
-
@PatrickTrentin:实际上,我处理的问题让用户在具有复杂规则的模型中做出一些(可能无法满足)选择(这将被建模为软断言)。优化步骤应根据目标函数找到最佳解决方案,尽可能尊重用户的选择,即:只要满足,就不会被丢弃。
-
从您提出问题的方式来看,我无法判断优化目标函数和尊重用户选择之间的优先顺序。因此,我想说使用 Pareto 优化,如您的示例所示,正是您想要的。这并没有修复可满足子句组,而是实际上探索了所有这些子句。
-
@PatrickTrentin:我得到的结果不同:对于“硬”断言情况,始终只返回一个结果,对于“软”断言情况,结果是不同的,但也是不变的。看起来我将不得不使用硬断言,并且在冲突状态下向用户展示未饱和的核心并让他解决冲突。
-
当我使
(>= (* 4 x) y)变软时,我得到2解决方案而不是一个。一种解决方案,其中满足约束(可满足),并且其中一种解决方案被证伪。你在制作(>= (* 4 x) y)软的时候评论了(assert (>= (* 4 x) y));行吗?
标签: optimization z3 smt