是否有可能通过SMT求解器找到布尔公式的最优解?

时间:2011-12-14 14:30:51

标签: algorithm optimization boolean-expression z3 smt

我有一个很大的布尔公式要求解决,由于编辑的原因,我必须在此处粘贴图像:

enter image description here

另外,我已经有一个函数area来衡量4个整数的维数:area(c,d,e,f)=|c−d|×|e−f|

我想做的不仅仅是弄清楚公式是否可以满足:我正在寻找一个最佳的6元组(a,b,c,d,e,f),这使得大公式TRUEarea(c,d,e,f)成为大于或等于任何其他6元组的维度,也满足公式。

换句话说,找到大公式的Max(area(c,d,e,f))子喷射。

我想知道SMT求解器是否可以帮助解决这个问题。我知道Z3支持quantifiers,并且能够说明布尔表达式是否可满足。但问题是Z3是否有助于找到函数area的最佳解决方案。

有没有人有任何想法?任何关于SMT求解器,Z3或其他算法的评论都会赞赏......

4 个答案:

答案 0 :(得分:3)

简而言之,是的。

因为您的公式包含量词,所以我不认为Microsoft Solver Foundation是一个合适的选择。正如您所说,Z3支持量词,整数理论,并用于检查可满足性。虽然Z3不直接支持优化,但您可以使用通用量词轻松编码优化问题:

  

sat(a,b,c,d,e,f)=> (forall a1,b1,c1,d1,e1,f1,sat(a1,b1,c1,d1,e1,f1)&&   目标(a,b,c,d,e,f)> =目标(a1,b1,c1,d1,e1,f1))

其中:sat是用于检查可满足性的布尔表达式,goalarea函数,是您的优化目标。

正如您所看到的,该表述从字面上翻译成您在问题中的要求。 (a, b, c, d, e, f)的分配是您需要找到的最佳解决方案。

另外,Z3有一个Linux发行版并提供OCaml API,完全符合您的偏好。

答案 1 :(得分:3)

目标函数使用非线性整数算术和量词。 已经非线性整数算术很难(不可判定) 没有量词,添加量词会使情况更糟。 如果您将排序从Int更改为Real,那么我们就有了 非线性实数的有限量词消除 ((set-option:ELIM_QUANTIFIERS为true) (set-option:ELIM_NLARITH_QUANTIFIERS为true)) 但这似乎并不适合您似乎正在解决的问题。 试着看它是否可以表述为线性或二次优化问题。 有许多工具可以针对二次优化进行调整 (并且它们可能不太倾向于,比如说Z3是布尔搜索)。 试试Solver Foundation,它包含几个优化工具的插件。

可以使用Z3来解决优化问题, 但典型的方法是在外面有一个循环 Z3。首先,您提出要检查的问题是否可以满足, 然后你搜索下一个令人满意的改进任务 当前的(从满意的模型中检索)。 要搜索下一个令人满意的作业,你将断言 分配给您寻找的下一个值的“目标”可以改善“目标” 分配到当前的最佳值。

以下是一些幻灯片http://research.microsoft.com/en-us/people/nbjorner/lecture1.pptx 这应该是相关的。他们非常接近处理这类问题。 本套牌中的最后几张幻灯片说明了如何使用Z3的API进行搜索 楷模。如果您想为其编写解析器,您当然也可以使用文本API 输出格式。有许多方法可以与Z3进行交互以进行优化 问题,但它们都要求你在Z3之上编写优化搜索。 当您具有约束的布尔组合时,这仍然有用 Z3支持的算术和其他域,但标准优化问题 可以通过专用的优化工具更好地解决。

答案 2 :(得分:1)

您的问题不仅仅是可满足性问题,而是优化或更具体的混合整数编程之一。 使用任何解算器(因为您标记了问题Z3并且您似乎使用的是Windows)Microsoft Solver Foundation,它也不会太难解决,它也提供免费版。

答案 3 :(得分:1)

我相信this page会非常有用。这个例子已经得到了很好的解释,它将有助于阅读整篇文章。