nuZ:使用带有权重和id的软断言

时间:2015-06-12 06:50:34

标签: optimization z3

在玩nuZ时我偶然发现了这个:

(declare-fun x () Int)
(declare-fun y () Int)

(assert-soft (= x 1) :weight 1 :id first)
(assert-soft (= y 4) :weight 3 :id first)

(assert-soft (= x 2) :weight 1 :id second)
(assert-soft (= y 5) :weight 3 :id second)

(assert-soft (= x 3) :weight 1 :id third)
(assert-soft (= y 6) :weight 3 :id third)

(maximize (+ x y))

(check-sat)
(get-model)

给了我这个结果(使用Z3不稳定分支4.4.0):

first |-> 0
second |-> 4
third |-> 4
(+ x y) |-> 5
sat
(model
  (define-fun x () Int
    1)
  (define-fun y () Int
    4)
)

我真的不明白输出。我知道第一步的重量正在最大化。

当权重相等时,不应该最大化目标(+ x y)吗?

此致 约翰

1 个答案:

答案 0 :(得分:2)

默认情况下,Z3一次解决一个目标并找到按字典顺序排列的最佳解决方案。首先,它试图从“第一”满足尽可能多的软约束。与软约束相关联的权重是惩罚,因为不满足约束。也就是说,它不是奖励,因此最大惩罚是4(= 1 + 3),并且可以满足两个约束以使惩罚为0。 这是其他max-sat求解器和格式中使用的约定。 也许令人困惑,因为它暗示了最小化惩罚。

由于目标一次解决一个,很明显其他软约束都不能满足,因此nuz返回“second”和“third”的最大惩罚。

对于(maxim(+ x y))目标,“first”的等式限制x和y的值。