有没有办法操纵z3的上限?

时间:2019-02-06 04:19:51

标签: z3 z3py

我正在尝试使用Z3最小化值。我将verbose设置为0,并观察到Z3找到一个上限,并从那里开始工作以最小化该值。示例:

(optimize:check-sat)
(optimize:sat)
(optsmt upper bound: 3460)
(optsmt upper bound: 3455)
(optsmt upper bound: 3445)
(optsmt upper bound: 2430)
(optsmt upper bound: 2425)
(optsmt upper bound: 2325)
(optsmt upper bound: 2155)
(optsmt upper bound: 2150)
(optsmt upper bound: 2145)
(optsmt upper bound: 2135)
(optsmt upper bound: 2125)
(optsmt upper bound: 2055)
(optsmt upper bound: 2045)
(optsmt upper bound: 155)
(optsmt upper bound: 135)
(optsmt upper bound: 115)
(optsmt upper bound: 15)
(optsmt upper bound: 10)

我想知道是否可以将上限设置为更低的水平,以便获得更快的输出。

1 个答案:

答案 0 :(得分:1)

如果您知道有界限,那为什么不把它作为一个额外的断言呢?

(assert (< goal 200))

当然,这不能保证速度加快;如果您弄错了,通常会错过最佳点。但这很简单。

通常,您提供给求解器的信息越多,收敛速度越快。

请注意,z3并不是在优化过程中真正进行“搜索”,而是通过算法确定并约束边界,因此实际上并没有“开始”值。有关z3中优化工作原理的更多参考,请参见帕特里克(Patrick)最近的回答:What is the theory behind Z3 Optimize maximum and minimum functionality?