Performance 如何检查Z3优化问题的进度

Performance 如何检查Z3优化问题的进度,performance,optimization,z3,minimize,maximize,Performance,Optimization,Z3,Minimize,Maximize,我有一个问题,我在一个smt库文件中编码,以便输入Z3。有很多限制,但实际上,我对最小化一个变量感兴趣: (minimize totalCost) (check-sat) 解算器连续运行数小时。比简单地使用断言将totalCost设置为低于某个值并运行check-sat要长得多。有没有办法让Z3定期打印totalCost的最低值,以及实现该值的所有可变值?那将非常有帮助。提前谢谢 如果通过命令行运行z3,则可以尝试选项-v:1,该选项可使OMT解算器打印成本函数

我有一个问题,我在一个smt库文件中编码,以便输入Z3。有很多限制,但实际上,我对最小化一个变量感兴趣:

        (minimize totalCost)
        (check-sat)

解算器连续运行数小时。比简单地使用断言将totalCost设置为低于某个值并运行check-sat要长得多。有没有办法让Z3定期打印totalCost的最低值,以及实现该值的所有可变值?那将非常有帮助。提前谢谢

如果通过命令行运行
z3
,则可以尝试选项
-v:1
,该选项可使OMT解算器打印成本函数上下限的任何更新

例如

~$ z3 -v:1 optimathsat/tools/release_files/examples/optimization/smtlib2_binary.smt2
...
(optsmt upper bound: 57)
(optsmt upper bound: 54)
(optsmt upper bound: 157/3)
(optsmt upper bound: 52)
(optsmt upper bound: 154/3)
(optsmt upper bound: 50)
(optsmt upper bound: 149/3)
(optsmt upper bound: 97/2)
(optsmt upper bound: 145/3)
(optsmt upper bound: 48)
(optsmt upper bound: 95/2)
(optsmt upper bound: 140/3)
(optsmt upper bound: 46)
(optsmt upper bound: 181/4)
(optsmt upper bound: 45)
(optsmt upper bound: 134/3)
(optsmt upper bound: 89/2)
(optsmt upper bound: 177/4)
(optsmt upper bound: 44)
(optsmt upper bound: 43)
(optsmt upper bound: 171/4)
(optsmt upper bound: 128/3)
(optsmt upper bound: 85/2)
(optsmt upper bound: 42)
(optsmt upper bound: 81/2)
(optsmt upper bound: 202/5)
(optsmt upper bound: 40)
(optsmt upper bound: 199/5)
(optsmt upper bound: 193/5)
(optsmt upper bound: 77/2)
(optsmt upper bound: 192/5)
(optsmt upper bound: 115/3)
(optsmt upper bound: 191/5)
(optsmt upper bound: 189/5)
(optsmt upper bound: 217/6)
(optsmt upper bound: 36)
(optsmt upper bound: 69/2)
(optsmt upper bound: 137/4)
(optsmt upper bound: 34)
(optsmt upper bound: 65/2)
(optsmt upper bound: 223/7)
(optsmt upper bound: 63/2)
(optsmt upper bound: 218/7)
(optsmt upper bound: 216/7)
(optsmt upper bound: 123/4)
(optsmt upper bound: 61/2)
(optsmt upper bound: 211/7)
(optsmt upper bound: 241/8)
(optsmt upper bound: 30)
(optsmt upper bound: 208/7)
(optsmt upper bound: 59/2)
(optsmt upper bound: 115/4)
(optsmt upper bound: 57/2)
(optsmt upper bound: 113/4)
(optsmt upper bound: 253/9)
(optsmt upper bound: 251/9)
(optsmt upper bound: 250/9)
(optsmt upper bound: 221/8)
(optsmt upper bound: 55/2)
(optsmt upper bound: 192/7)
(optsmt upper bound: 191/7)
(optsmt upper bound: 109/4)
(optsmt upper bound: 217/8)
(optsmt upper bound: 27)
sat
(objectives
 (objective 27)
)

这仅在使用的优化算法从可满足区域开始推进搜索时有用。一些优化引擎,如MaxRes,从不可满足(即超过最优)区域开始接近最优解,因此不提供任何部分解(但是,在某些情况下,它们可能会更快).

如果您想坚持使用优化解算器,那么查看Patrick描述的详细模式是最佳选择。当然,输出可能很难理解,甚至可能没有您需要的所有数据。如果深入研究,您可以“instrument”z3源代码打印出更多内容。但这需要做更多的工作,需要研究源代码

但是我突然想到z3在你的约束下做得很好,是优化引擎减慢了速度?这并不奇怪,因为优化解算器的性能不如常规解算器,原因显而易见。如果您怀疑是这种情况,您可能希望通过执行外部循环进行优化:执行
检查sat
,获取
总成本
的值,然后再次询问,但添加额外的约束,即
总成本
小于提供的当前值。对于某些问题,这可以快速收敛:如果解空间足够小,并且您使用许多不同的理论,则此技术的性能会优于优化解算器。您还可以实现排序的“二进制”搜索:例如,如果解算器给您一个成本
100
的解决方案,您可以询问是否有成本小于
50
的解决方案;如果
sat
,你会要求
25
,如果
unsat
,你会要求
75
。根据您的问题,这可能非常有效


请注意,如果您实现上述技巧,还可以在增量模式下使用解算器,并且它将重用从以前学习到的所有引理。优化解算器本身不是增量的,所以这是循环技术的另一个优点。另一方面,如果约束的解决方案太多,或者没有全局最小值,那么循环技术可以永远运行:因此,您可能希望观察循环计数并在某个阈值后停止。

谢谢您的回答。详细选项有助于查看进度。我希望有一种方式可以说‘运行15分钟,然后返回‘待定’或找到的最低成本,以及必要的模型/变量分配。’我将按照您的建议尝试以增量模式运行。以前,我运行的时候有一些限制,比如maxCost<100等,但是在从零开始的单个会话中,我花了很长时间希望最小化会更快。你可以给z3一个时间限制,但我认为它不会在超时过期时转储“当前”值。(检查
-T
-T
选项。)如Patrick所述,根据约束条件,此当前值甚至可能不可用。尝试二进制搜索的增量模式;那可能是你最好的选择。