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

Reading results of gurobi optimisation ("results.sol") in new python script

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

我试过使用 read("results.sol") using Python,但无法识别文件格式。有什么办法可以read/process Gurobi输出的.sol文件格式吗?如果您稍后无法读取 .sol 文件并生成绘图等,这似乎很奇怪。

也许我错过了一些非常明显的东西。

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

不过……

当你使用

model.write("out.sol")

Gurobi 将使用它自己的格式来写入它(写入的内容是根据文件后缀推断的)。

以下人员可以轻松阅读:

model.read("out.sol")

如果你用过

x = read("out.sol")

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

一般规则:如果您使用 class 模型的 class 方法编写解决方案,则使用 [=62 的 class 方法阅读=] 模型也是。

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

所以假设来自 link 的示例在文件 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 模块有一些限制
    • 这种格式的分隔符是两个空格,我们需要破解代码才能读取它(因为此函数只允许一个字符)
  • 代码可能会根据 python 3(我正在使用的;可能 py2 中的 next() 方法会有所不同)
  • pandas 对于这个目的会好得多(巨大的工具,非常好的 csv_reader)