在玩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)吗?
此致 约翰
答案 0 :(得分:2)
默认情况下,Z3一次解决一个目标并找到按字典顺序排列的最佳解决方案。首先,它试图从“第一”满足尽可能多的软约束。与软约束相关联的权重是惩罚,因为不满足约束。也就是说,它不是奖励,因此最大惩罚是4(= 1 + 3),并且可以满足两个约束以使惩罚为0。 这是其他max-sat求解器和格式中使用的约定。 也许令人困惑,因为它暗示了最小化惩罚。
由于目标一次解决一个,很明显其他软约束都不能满足,因此nuz返回“second”和“third”的最大惩罚。
对于(maxim(+ x y))目标,“first”的等式限制x和y的值。