python - 如何按顺序打印 z3 求解器结果 print(s.model()) ?

标签 python python-3.x z3 z3py

假设我有一个包含 10 个变量的列表

v = [Real('v_%s' % (i+1)) for i in range(10)]

我想添加一个像这样的简单约束

s = Solver()
for i in range(10):
    s.add(v[i] == i)
if s.check() == sat:
    print(s.model())

所以一个令人满意的模型是 v_1 = 0, v_2 = 1 .... v_10 = 9 。然而 print(s.model()) 的输出完全无序,当我在更大的模型中有很多变量时,这让我感到困惑。对于这个例子,我的计算机的输出是 v_5, v_7, v_4, v_2, v_1, v_3, v_6, v_8, v_9, v_10 ,但我想按 v_1, v_2, ..., v_10 的顺序输出该模型的变量。谁能告诉我z3Py有没有这种功能?谢谢!

最佳答案

您可以将模型转换为列表并以您喜欢的任何方式对其进行排序:

from z3 import *

v = [Real('v_%s' % (i+1)) for i in range(10)]

s = Solver()
for i in range(10):
    s.add(v[i] == i)
if s.check() == sat:
    m = s.model()
    print (sorted ([(d, m[d]) for d in m], key = lambda x: str(x[0])))

打印:

[(v_1, 0), (v_10, 9), (v_2, 1), (v_3, 2), (v_4, 3), (v_5, 4), (v_6, 5), (v_7, 6), (v_8, 7), (v_9, 8)]

请注意,名称按字典顺序排序,因此 v_10 位于 v_1 之后、v_2 之前。如果您希望 v_10 出现在最后,您可以根据您的需要进行进一步处理。

关于python - 如何按顺序打印 z3 求解器结果 print(s.model()) ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52100801/

相关文章:

python + beautiful soup,在没有属性帮助的情况下导航解析树?

python - wxWidgets:BoxSizer 内的面板未按预期运行

python - 如何一次计算所有每个 numpy 值的概率?

python - Z3 Solver() 中约束的大小

z3 - Z3并行版什么时候重新激活?

python - 为什么在 argparse 中, 'True' 总是 'True' ?

python - 表示 float 的字符串

python-3.x - 无法在 databricks 上安装 pyomo 求解器 ipopt

python - 如何使用 StdLib 和 Python 3 在一个范围内并行化迭代?

performance - Z3:如何提高性能?