Z3PY 非常慢,有很多变量?

如何解决Z3PY 非常慢,有很多变量?

我一直在使用 Z3PY 中的优化器,并且在我的项目中只使用 Z3 整数和类似 (x

我创建了 26 个 Z3-int。然后我添加了硬约束,它不应小于 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)

解决方法

每个基准都是独一无二的,不可能想出一个在所有情况下都同样适用的好策略。但是你描述的场景很简单,可以处理。性能问题来自这样一个事实:Distinct 为求解器创建了太多不等式(数量为二次),并且随着您增加变量数量,优化器很难处理它们。

根据经验,如果可以,您应该避免使用 Distinct。对于这种特殊情况,对变量进行严格排序就足够了。 (当然,根据您的其他约束,这可能并不总是可行,但您所描述的似乎可以从这个技巧中受益。)所以,我会这样编码:

from z3 import *

reqs = [Int('i_%d' % i) for i in range(50)]

solver = Optimize()

for i in reqs:
  solver.add(i >= 1,i <= len(reqs))

for i,j in zip(reqs,reqs[1:]):
  solver.add(i < j)

res = solver.check()
print(res)
print(solver.model())

当我运行这个时,我得到:

$ time python a.py
sat
[i_39 = 40,i_3 = 4,...
 i_0 = 1,i_2 = 3]
python a.py  0.27s user 0.09s system 98% cpu 0.365 total

这很时髦。希望您可以将其推广到您的原始问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res