1

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

在此处输入图像描述

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

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

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

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

有谁有想法吗?任何关于 SMT 求解器、Z3 或其他算法的评论将不胜感激......

4

4 回答 4

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,完全符合您的喜好。

于 2011-12-14T17:34:09.170 回答
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 支持的算术和其他域的布尔约束组合时,这仍然很有用,但标准优化问题可以通过专用优化工具更好地解决。

于 2011-12-16T16:07:41.523 回答
1

您的问题不完全是可满足性之一,而是优化或更具体的混合整数规划之一。使用任何求解器解决这个问题应该不会太难,例如(因为您标记了您的问题 Z3 并且您似乎正在使用 Windows)Microsoft Solver Foundation,它还提供免费版本。

于 2011-12-14T14:42:49.540 回答
1

我相信这个页面会非常有用。该示例已得到很好的解释,它将有助于通读整篇文章。

于 2012-03-03T07:58:17.607 回答