algorithm - 是否可以通过 SMT 求解器找到 bool 公式的最优解?

标签 algorithm optimization boolean-expression z3 smt

我有一个很大的 bool 公式要解决,由于密文的原因,我必须在这里粘贴一张图片:

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 ,并且能够判断一个 bool 表达式是否可满足。但问题是如果 Z3可以帮助找到函数 area 的最优解.

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

最佳答案

简而言之,是的。

因为您的公式由量词组成,所以我认为 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) && goal(a, b, c, d, e, f) >= goal(a1, b1, c1, d1, e1, f1))

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

如您所见,该公式是根据您在问题中的要求逐字翻译的。 (a, b, c, d, e, f) 的分配是您需要找到的最佳解决方案。

顺便说一句,Z3 有一个 Linux 发行版并提供 OCaml API,这完全符合您的偏好。

关于algorithm - 是否可以通过 SMT 求解器找到 bool 公式的最优解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8506142/

相关文章:

algorithm - 计算使用冒泡排序算法将第一个k最小元素排序的交换次数

php - PHP 中的代码循环优化

boolean-logic - 有什么好的 bool 表达式简化器吗?

c# - 除以 5 的随机数

algorithm - 通过改变大小增加动态数组时的分摊运行时间

c# - 如何优化 "toExponential"算法的实现以提高精度?

javascript - 网页优化

c++ - MASM 使用 VS 击败未优化的 .cpp 但不是未优化的 .c

boolean-logic - 如何理解德摩根定律的 bool 表达式

c++ - 如何查看 C++ boolean 值中的数字移动?