有没有办法在 z3 中操纵上限?
Is there a way to manipulate the upper bounds in z3?
我正在尝试使用 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)
我想知道是否有任何方法可以将上限设置为更低的水平以获得更快的输出。
如果你知道有界限,为什么不把它作为一个额外的断言:
(assert (< goal 200))
当然,这并不能保证加快速度;如果你弄错了,通常会错过最佳点。但尝试是一件简单的事情。
一般来说,您提供给求解器的信息越多,它收敛得越快的可能性就越大。
请注意,z3 并不是真正的 "search” during optimization. Instead it algorithmically determines and constraints the bounds. So there isn't really a "starting" 值。有关优化在 z3 中如何工作的更多参考,请参阅 Patrick 最近的出色回答:
我正在尝试使用 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)
我想知道是否有任何方法可以将上限设置为更低的水平以获得更快的输出。
如果你知道有界限,为什么不把它作为一个额外的断言:
(assert (< goal 200))
当然,这并不能保证加快速度;如果你弄错了,通常会错过最佳点。但尝试是一件简单的事情。
一般来说,您提供给求解器的信息越多,它收敛得越快的可能性就越大。
请注意,z3 并不是真正的 "search” during optimization. Instead it algorithmically determines and constraints the bounds. So there isn't really a "starting" 值。有关优化在 z3 中如何工作的更多参考,请参阅 Patrick 最近的出色回答: