寻找方法保存我的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.solutions
或list_of_vars
转换为数据框或列表或csv文件?非常感谢!
Gabriel
答案 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