如何在Z3生成的模型中按升序排列值?

时间:2018-12-27 04:57:58

标签: python z3 z3py

我正在使用Z3生成优化的时间表。检查可满足性后,我生成模型并将其存储到文本文件中。但是,我观察到Z3并未真正以任何顺序排列模型中的值。有没有办法让Z3以升序排列它们?

这是它生成的变量值之一。

enter image description here

有没有办法使这种提升?

1 个答案:

答案 0 :(得分:1)

(基本上是从How to print z3 solver results print(s.model()) in order?重复答案)

您可以将模型转换为列表,并按照自己喜欢的方式对其进行排序。这是一个示例:

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_10v_1之后和v_2之前。如果您希望v_10最后出现,可以根据需要进行进一步处理。

对于您来说,car要么是数组值,要么是未解释的函数。对于这种特定情况,您将不得不分别查询感兴趣的索引,并将其收集到自己的数据结构中,以便按自己喜欢的顺序显示它们。长话短说,z3将为您提供值,但是如何“呈现”值取决于您。 (如果遇到困难,请在示例中提供您可以尝试的示例,其他人可以复制该示例以进一步帮助您。)