繁体   English   中英

在z3py中查找给定约束的变量的最大值

[英]Find maximum value of a variable given constraints in z3py

例如,给定以下 4 个约束, axintsbarray ,将int映射到int

a >= 0
b[0] == 10
x == 0
b[x] >= a

find_max(a) => 10
find_min(a) => 0

z3py 可以做这样的事情吗?

好,当然。

您可以通过多个单目标优化搜索逐步执行此操作,也可以使用z3提供的更有效的盒装又称多独立)组合来处理多目标优化。

定义 4.6.3。 (多重独立 OMT [LAK+14、BP14、BPF15、ST15b、ST15c])。 <φ,O>为多目标 OMT 问题,其中φ是基础 SMT 公式, O = {obj_1, ..., obj_N}N个目标函数的排序列表。 我们称多独立 OMT 问题也称为盒装 OMT 问题 [BP14, BPF15] ,即在一次运行中找到一组模型{M_1, ...,M_N}的问题,使得每个M_i使obj_i在通用公式上最小φ

备注 4.6.3。 解决多独立 OMT 问题<φ, {obj_1, ..., obj_N }>类似于独立解决N个单目标 OMT 问题<φ, obj_1>, ..., <φ, obj_N> 然而,与后一种方法相比,前者允许对搜索进行分解,从而获得显着的性能提升 [LAK+14, BP14, ST15c]。

[来源,页。 104 ]

例子:

from z3 import *

a = Int('a')
x = Int('x')
b = Array('I', IntSort(), IntSort())

opt = Optimize()

opt.add(a >= 0)
opt.add(x == 0)
opt.add(Select(b, 0) == 10)
opt.add(Select(b, x) >= a)

obj1 = opt.maximize(a)
obj2 = opt.minimize(a)

opt.set('priority', 'box')   # Setting Boxed Multi-Objective Optimization

is_sat = opt.check()
assert is_sat

print("Max(a): " + str(obj1.value()))
print("Min(a): " + str(obj2.value()))

Output:

~$ python test.py 
Max(a): 10
Min(a): 0

请参阅有关该主题的出版物,例如

1. Nikolaj Bjorner 和 Anh-Dung Phan。 νZ - 对 Z3 的最大满意度。 在 Proc International Symposium on Symbolic Computation in Software Science,Gammat,突尼斯,2014 年 12 月。EasyChair Proceedings in Computing (EPiC)。 [PDF]

2. Nikolaj Bjorner、Anh-Dung Phan 和 Lars Fleckenstein。 Z3 - 优化 SMT 求解器。 在过程中。 TACAS,LNCS 第 9035 卷。 施普林格,2015。 [施普林格] [[PDF]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM