可以使用smt / z3进行优化

时间:2012-11-18 04:22:20

标签: z3

SMT求解器能否有效地找到伪布尔问题的解决方案(或赋值),如下所述:

\sum {i..m} f_i x1 x2.. xn *w_i

其中f_i x1 x2 .. xn是布尔函数,w_i是Int类型的权重。

为方便起见,我将重点介绍第1页和第3页中的内容,这些内容足以指定 伪布尔问题。

2 个答案:

答案 0 :(得分:3)

SMT求解器通常解决这个问题:给定一个逻辑公式,可选地使用基础理论中的函数和谓词(例如算术理论,位向量理论,数组),是否满足或不满足。 它们通常不会为您指定目标函数 并且通常没有内置的优化程序。

一些特殊情况是仅使用布尔值或布尔值与位向量或整数的组合的公式。伪布尔约束可以使用位向量来表示整数或编码(考虑溢出语义),或者可以将它们直接编码到SAT中。对于使用属于伪布尔问题类的有界整数的一些公式,Z3将尝试自动缩减为位向量。这仅适用于标记为QF_LIA的SMT-LIB2格式的benchmkars,或者如果您明确调用执行此缩减的策略(适用“qflia”策略),则适用。

虽然Z3没有直接暴露目标函数,但增加的问题 具有客观功能的SMT求解器在研究界得到了积极的追求。 Nieuwenhuis和Oliveras在SAT 2006中提出的一种方法是建立 解决“加权最大SMT”问题作为自定义理论。 Yices附带内置功能 加权最大SMT的功能,Z3没有,但可以编写自定义 理论,它执行加权最大SMT求解器的回溯搜索,但没有 开箱即用。

有时人们会尝试使用量化公式来指定目标函数。 理论上,人们可以希望量化消除程序可以解决 为了目的。 在性能方面,这通常非常糟糕。量化消除 是一种过度装备,而我们所拥有的惯例效率不高。

答案 1 :(得分:0)

对于您的问题,如果您想从总和中找到一个优化的(最大或最小)结果,则Z3具有此功能。您可以使用Z3库的 Optimize 类而不是Solver类。该类分别为“ maximization ”和“ minimization ”提供了两种方法。您可以传递需要优化的SMT变量,Optimization类模型将为您提供解决方案。它实际上使用 Microsoft.Z3 库与C#API配合使用。为了给您带来不便,我附上了一段代码:

Optimize opt; // initializing object
opt.MkMaximize(*your variable*);
opt.MkMinimize(*your variable*);
opt.Assert(*anything you need to do*);