我在去年8月的一篇帖子中看到,Z3不支持优化。 但是它也表示开发人员正计划增加这样的支持。
我在源代码中找不到任何暗示已经发生的事情。
任何人都可以告诉我,如果我认为没有支持是正确的,或者是否已添加,但我不知道错过了它?
谢谢, 奥马尔
答案 0 :(得分:3)
如果您的优化具有整数值目标函数,那么一种合理运行的方法是运行二进制搜索以获得最佳值。假设您正在解决约束C(x,y,z)
,最大化目标函数f(x,y,z)
。
(x0, y0, z0)
找到任意解决方案C(x,y,z)
。f0 = f(x0, y0, z0)
。这将是你的第一个下限。C(x,y,z) ∧ f(x,y,z) > 2 * L
,其中L
是您的最佳下限(最初,f0
,无论你发现什么都更好。)C(x,y,z) ∧ 2 * f(x,y,z) > (U - L)
。如果公式可满足,则可以使用模型计算新的下限。如果它不可满足,(U - L) / 2
是一个新的上限。步骤3.如果您的问题不允许最大值,则不会终止,因此如果您不确定,可能需要绑定它。
您当然应该使用push
和pop
来逐步解决问题的连续性。您还需要能够为中间步骤提取模型并评估它们的f
。
我们在Kaplan的工作中使用了这种方法并取得了相当的成功。
答案 1 :(得分:1)
Z3目前不支持优化。这是在TODO列表中,但尚未实现。以下幻灯片描述了将在Z3中使用的方法:
用无穷小计算的库已经实现,可在unstable
(正在进行中)分支中使用,也可在rise4fun在线使用。