如何在Python Cplex API中读取变量值?

时间:2019-05-27 12:32:54

标签: python pyomo

我已在Python Cplex API中为MIP问题建模。有什么方法可以读取变量值-可变变量吗?

目前,我正在将变量值读取到列表中,并从LP文件中映射它们”

    for i, j in zip(cpx.variables.get_names(), cpx.solution.get_values()):
        cplex_details_inp.append((i, j))

通过这种方法,我能够一次读取所有变量值, 但是这种方法由于存在500k变量而导致内存问题。

如何明智地读取变量值?我没有找到任何具体的文档或示例。

3 个答案:

答案 0 :(得分:2)

for i in cpx.variables.get_names():
           cplex_details_inp.append([i,cpx.solution.get_values(i)])

有帮助。

致谢

答案 1 :(得分:1)

通过查看reference documentation,我们可以看到调用此函数的各种方法:

  • solution.get_values() 返回问题中所有变量的值。
  • solution.get_values(i) 我必须是变量名或索引。返回索引或名称为i的变量的值。
  • solution.get_values(s) s必须是变量名或索引的序列。返回带有s成员索引的变量的值。等效于[in中的i的[solution.get_values(i)]]
  • solution.get_values(开始,结束) begin和end必须是变量索引或变量名称。返回在开始和结束之间(包括结束)之间具有索引的变量的值。等同于solution.get_values(range(begin,end + 1))。

因此,您可以仅将要读取其变量的变量指定为该函数的参数。要么一一指定变量,要么大块读取变量。

答案 2 :(得分:0)

所有变量都是非零值吗?如果您的解决方案向量稀疏,则以下方法可以解决内存问题:

cplex_details_inp = [[i, cpx.solution.get_values(i)] for i in cpx.variables.get_names() if cpx.solution.get_values(i) > 0]

与始终append列出列表相比,它甚至可以加快处理过程。 为了将很小的变量视为零,您可能需要使用round()

cplex_details_inp = [[i, cpx.solution.get_values(i)] for i in cpx.variables.get_names() if round(cpx.solution.get_values(i), precision) > 0]