z3 - 变量的初始值
问题描述
我想以一种有效的方式为 z3py 中的变量设置初始值。
x,y = Ints(x,y)
s = Solver()
s.add(x>10)
s.check()
s.model()
我希望输出值是例如 x = 11,y = 0,而不是结果 x = 11,y = 7。
一种方法是:
x,y = Ints(x,y)
s = Optimize()
s.add_soft(x==0)
s.add_soft(y==0)
s.add(x>10)
s.check()
s.model()
但是由于我的程序包含许多变量,因此需要很多计算时间。有什么更好的方法吗?
解决方案
减速是因为您正在强制优化器运行,这对于此目的来说是一种过度杀伤力。(优化求解器可以处理 max-sat 问题,在这里可以完成这项工作,但成本很高,并且在这种情况下不需要。)
相反,只需遍历模型并查看是否有分配:
from z3 import *
def model_with_zeros(s, vs):
m = s.model()
result = []
for v in vs:
val = m.eval(v)
if val.eq(v):
result.append((v, 0))
else:
result.append((v, val))
return result
x, y = Ints('x y')
s = Solver()
s.add(x > 10)
print s.check()
print model_with_zeros(s, [x, y])
这打印:
sat
[(x, 11), (y, 0)]
请注意,您必须将求解器和您感兴趣的变量显式传递给model_with_zeros
函数;因为这里的技巧正是要查看求解器未触及哪些变量。
如果您想要不同的初始值,则可以修改model_with_zeros
以分别为每个变量考虑该值。
推荐阅读
- c# - C#基于现有Stream创建HttpClient
- kubernetes - Ingress .yml 文件未应用于 GKE,但在 minikube 中运行良好
- xamarin-zebble - 无法创建新的 Zebble 项目
- sql-server - EF Core 3.0 中所有表共有的基本实体
- xslt - XSLT 替换命名空间并添加新的(未使用的)命名空间
- python-3.x - 尝试导入 pyPDF2 时找不到模块
- azure - Azure 阻止租户删除需要删除不存在的域服务
- firebase - firebase 通知在后台颤振中不起作用
- python - 指定重新采样时的开始时间
- ios - 如何修复来自 react-native-video 上的 s3 aws 的 IOS 渲染流视频上的“AVFoundationErrorDomain - 代码 -11800”?