在新的python脚本中读取gurobi优化(“results.sol”)的结果

时间:2017-07-13 10:40:32

标签: python optimization gurobi

我正在尝试运行滚动范围优化,其中我有多个优化脚本,每个脚本都会生成自己的结果。我想使用model.write(“results.sol”)编写每个结果,而不是将结果打印到每个间隔的屏幕,然后将它们读回结果处理脚本(单独的python脚本)。

我尝试使用Python使用read(“results.sol”),但无法识别文件格式。有什么方法可以读取/处理Gurobi输出的.sol文件格式吗?如果你以后不能读取.sol文件并生成图表等,这似乎很奇怪。

也许我错过了一些令人眼花缭乱的事情。

1 个答案:

答案 0 :(得分:1)

如果没有看到你的代码就很难回答,因为我们必须猜测你在做什么。

但是......

使用时

model.write("out.sol")

Gurobi将使用它自己的格式来编写它(从文件后缀中推断出所写的内容)。

这可以通过以下方式轻松阅读:

model.read("out.sol")

如果您使用

x = read("out.sol")

您正在使用python的基本IO工具,当然python不会解释该格式的文件。此外,这样的读取是文本模式(可能需要二进制文件;不确定)。

一般规则:如果您使用类模型的类方法编写解决方案,那么也要使用类模型的类方法进行读取。

上述用法通常用于恢复模型的某些状态(例如MIP-start)。如果你想绘制它,你将不得不做进一步的工作。在这种情况下,使用python的IO工具可能是个好主意,您应该尊重格式described here。这可以作为csv或手动读取(与我之前的评论相反:它是文本模式;不是二进制)。

因此,假设链接中的示例位于文件gur.sol中:

import csv
with open('gur.sol', newline='\n') as csvfile:
    reader = csv.reader((line.replace('  ', ' ') for line in csvfile), delimiter=' ')
    next(reader)  # skip header
    sol = {}
    for var, value in reader:
        sol[var] = float(value)
    print(sol)

输出:

{'z': 0.2, 'x': 1.0, 'y': 0.5}

说明:

  • 代码很难看,因为python的csv模块有一些限制
    • Delimiter是这种格式的两个空格,我们需要破解代码来读取它(因为此函数中只允许一个字符)
  • 代码可能是为python 3量身定做的(我正在使用的;可能next()方法在py2中会有所不同)
  • pandas会更好地用于此目的(具有非常好的csv_reader的巨大工具)