在新的 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)
我正在尝试 运行 滚动优化,其中我有多个优化脚本,每个脚本都生成自己的结果。我不想在每个时间间隔将结果打印到屏幕上,而是想使用 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)