有没有办法操纵z3中的上界?

有没有办法操纵z3中的上界?,z3,z3py,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 boun

我正在尝试使用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)

我想知道是否有任何方法可以将上限设置为更低的级别,以获得更快的输出。

如果您知道存在上限,为什么不将其作为额外的断言:

(断言(

当然,这并不能保证加快速度;一般来说,如果你弄错了,可能会错过最佳点。但这是一个简单的尝试

通常,向解算器提供的信息越多,其收敛速度越快


请注意,z3在优化过程中并没有真正的“搜索”。相反,它通过算法确定并约束边界。因此没有真正的“开始”“价值。关于优化如何在z3中工作的更多参考资料,请参阅Patrick最近的一个优秀答案:

我不知道界限,但我确实知道z3最初的上限与最终值相差很远。了解Z3是否这样做有助于快速找到一个可满足的解决方案,然后更容易找到解决方案以最小化目标。有关详细信息,请参阅我的扩展答案和Patrick之前的文章。@Mayursath如果您知道目标函数的安全下限,然后,您的问题可能会受益于二进制/自适应搜索优化技术。