Pyomo:将结果保存到CSV文件

时间:2019-01-26 00:12:16

标签: python pyomo

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

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

我的模型中有三个变量,具有3个索引的120个“ P”变量,具有3个索引的120个“ I”变量和具有3个索引的576个“ F”变量。它们的索引是不同的。以下是我的solve语句:

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文件?非常感谢!

Gabriel

1 个答案:

答案 0 :(得分:0)

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

我发现了两种有效解决此问题的方法。

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=',')

Gabriel