【发布时间】:2021-03-25 10:33:56
【问题描述】:
我一直在使用 Z3PY 中的优化器,并且在我的项目中只使用 Z3 ints 和 (x
我创建了 26 个 Z3 整数。然后我添加了硬约束,它不应小于 1 或大于 26。此外,所有数字都必须是唯一的。根本没有添加其他约束。 换句话说,求解器将找到的解决方案是一个简单的顺序 [1,2,3,4,5....最多 26]。以求解器发现的方式排序。
我的意思是这是一件简单的事情,除了我提到的那些之外,真的没有任何限制。求解器在 0.4 秒或类似的时间内解决了这个问题,快速且足够。这是预期的。但是如果我将变量的数量增加到 49(当然现在的约束是它不应低于 1 或超过 49),求解器大约需要 1 分钟才能求解。对于这么简单的任务,这似乎真的很慢?应该是这样吗,有人知道吗?时间复杂度真的大大增加了吗?
(我知道我可以在这个特定的实验中使用 Solver() 而不是 Optimizer(),它会在一秒钟内解决,但实际上我需要使用 Optimizer 来完成,因为我有很多软限制工作。)
编辑:为我的示例添加一些代码。
I declare an array with Z3 ints that I call "reqs".
The array is consisting of 26 variables in one example and 49 in the other example I am talking about.
solver = Optimize()
for i in (reqs):
solver.add(i >= 1)
for i in (reqs):
solver.add(i <= len(reqs))
d = Distinct(reqs)
solver.add(d)
res = solver.check()
print(res)
【问题讨论】:
-
优化引擎预计不会高效;他们也没有像现有的求解器经常做的那样得到关注和加速技巧。但是每个基准测试都是不同的,所以你应该发布具体的例子来看看可以做什么,如果有的话。
-
我现在已将代码添加到原始帖子中。但是,是的,我明白了。但是感觉有点奇怪,从 26 个变量变为 49 个变量时速度要慢得多。使用 Yices(在 SMTlib2 中编写和执行)需要一毫秒或其他时间。在这里使用 Z3PY 需要一分钟,有 49 个变量。