【问题标题】:Pyomo: Save results to CSV filesPyomo:将结果保存到 CSV 文件
【发布时间】:2019-06-19 19:55:23
【问题描述】:

寻找保存 Pyomo 结果的方法花了我 2 个小时 :(

成功解决问题后,我需要保存我的最优变量值和对偶变量值。让我们从最优变量开始。

我的模型中有三个变量,120 个带有 3 个索引的“P”变量,120 个带有 3 个索引的“I”变量和 576 个带有 3 个索引的“F”变量。他们的指数不同。以下是我的解决语句:

solver = pyomo.opt.SolverFactory('gurobi')
results = solver.solve(m, tee=True, keepfiles=True)
m.display()

results.write()
m.solutions.load_from(results)

这里一切似乎都很好,我获得了m.solutions 作为<pyomo.core.base.PyomoModel.ModelSolutions at 0xa23c7bcf8> 的类型。然后我又试了下:

list_of_vars = [v for v in m.component_objects(ctype=pe.Var, active=True, descend_into=True)]
print(list_of_vars)

之后,我得到了另一个list_of_vars对象作为列表类型,其中3个元素为'',这也是合理的。

那么下一步我需要做什么?如何将 m.solutionslist_of_vars 转换为数据框或列表或 csv 文件?非常感谢!

加布里埃尔

【问题讨论】:

  • list_of_var 中的元素的类型为<pyomo.core.base.var.IndexedVar object at 0xa23c7bf98>

标签: python pyomo


【解决方案1】:

好的,让我回答我自己的问题:)

我找到了两种有效解决这个问题的方法。

1)。手动写入 CSV 文件

变量记为P,模型名记为m,解后,即执行如下命令,

results = solver.solve(m, tee=True)

我们将在元组中获得最优变量值,例如m.P。元组的索引值可以通过使用它们的索引来检索。以我的三索引案例为例,将其保存为 csv 文件:

with open('P.csv', 'w') as f:
    f.write('index1, index2, index3, value\n')
    for (n1,n2,n3) in index_set:
        f.write('%s, %s, %s, %s\n' % (n1, n2, n3, m.P[(n1,n2,n3)].value))

2)。元组到数组的转换

当我们需要首先通过使用 OOP 理论中的广播从最佳结果中划分索引和值时,这种方式在某种程度上更加棘手。 Pyomo 开发者可能会忘记编写一种迭代方式来直接从他们构建的格式中导入它们以保存最佳解决方案,因此我们必须使用它:

ind = list(m.P)
val = list(m.P[:,:,:].value)

然后使用 zip 链接它们:

result_P = [ i + tuple([j]) for i,j in zip(ind, val)]

现在我们获得了元组result_P,其中包含我们想要的所有索引和值。之后将这个元组转换为数组,然后转换为 CSV 是很简单的:

result_P = np.asarray(result_P)
np.savetxt('result_P.csv', result_P, delimiter=',')

加布里埃尔

【讨论】:

  • 作为 Pyomo 开发人员,我强烈推荐选项 1 而不是选项 2。我认为在选项 2 中,索引和变量 slice 可以以不同的顺序迭代,这会使你的结果数组无效.如果您的索引集未排序或在 Python 3.5 中迭代顺序可能是不确定的,则可能会出现这种情况。
猜你喜欢
  • 2022-01-05
  • 2019-03-25
  • 2014-02-20
  • 2011-03-21
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
相关资源
最近更新 更多