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

Python 如何按升序排列Z3生成的模型中的值?,python,z3,z3py,Python,Z3,Z3py,我正在使用Z3生成一个优化的时间表。在检查可满足性之后,我生成模型并将其存储到文本文件中。但是,我观察到Z3并没有真正按照任何顺序排列模型中的值。有没有办法让Z3按升序排列它们 这是它生成的变量值之一 有没有一种方法可以让这个上升呢?(基本上是重复下面的答案:) 您可以将模型转换为列表,并按自己喜欢的任何方式对其进行排序。下面是一个例子: from z3 import * v = [Real('v_%s' % (i+1)) for i in range(10)] s = Solver()

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

这是它生成的变量值之一

有没有一种方法可以让这个上升呢?

(基本上是重复下面的答案:)

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

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
最后出现,您可以根据需要进行进一步处理

在您的例子中,
car
可能是一个数组值,也可能是一个未解释的函数。对于这种特定情况,您必须单独查询您感兴趣的索引,并将它们收集到您自己的数据结构中,以便按您喜欢的顺序显示它们。长话短说,z3将为您提供价值观,但如何“呈现”这些价值观取决于您。(如果你陷入困境,请用一个其他人可以复制的例子发布你的尝试,以进一步帮助你。)

(基本上重复以下答案:)

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

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
最后出现,您可以根据需要进行进一步处理


在您的例子中,
car
可能是一个数组值,也可能是一个未解释的函数。对于这种特定情况,您必须单独查询您感兴趣的索引,并将它们收集到您自己的数据结构中,以便按您喜欢的顺序显示它们。长话短说,z3将为您提供价值观,但如何“呈现”这些价值观取决于您。(如果你陷入困境,请用一个其他人可以复制的例子发布你的尝试,以进一步帮助你。)

在cpp中有这样简单的方法吗?@GermanShepherd Sure。这种事情在z3有接口的所有语言中都是可能的。你试过什么?请随意提问。谢谢@alias。是的,我可以用cpp来做。有没有这样简单的方法可以用cpp来做呢?@GermanShepherd当然。这种事情在z3有接口的所有语言中都是可能的。你试过什么?请随意提问。谢谢@alias。是的,我可以用cpp做。