Pyomo:将结果保存到 CSV 文件
Pyomo: Save results to CSV files
寻找保存我的 Pyomo 结果的方法花了我 2 个小时:(
我需要在成功解决问题后保存我的最优变量值和对偶变量值。让我们从最佳变量开始。
我的模型中有三个变量,120 个 'P' 个变量和 3 个索引,120 个 'I' 个变量和 3 个索引,576 个 'F' 个变量和 3 个索引。他们的指标不同。以下是我的解决语句:
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
对象类型的list,3个元素为'',也是合理的。
那下一步我需要做什么呢?如何将 m.solutions
或 list_of_vars
转换为数据框或列表或 csv 文件?非常感谢!
加布里埃尔
好的,让我回答我自己的问题:)
我找到了两种有效解决这个问题的方法。
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 压缩 link 它们:
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 结果的方法花了我 2 个小时:(
我需要在成功解决问题后保存我的最优变量值和对偶变量值。让我们从最佳变量开始。
我的模型中有三个变量,120 个 'P' 个变量和 3 个索引,120 个 'I' 个变量和 3 个索引,576 个 'F' 个变量和 3 个索引。他们的指标不同。以下是我的解决语句:
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
对象类型的list,3个元素为'',也是合理的。
那下一步我需要做什么呢?如何将 m.solutions
或 list_of_vars
转换为数据框或列表或 csv 文件?非常感谢!
加布里埃尔
好的,让我回答我自己的问题:)
我找到了两种有效解决这个问题的方法。
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 压缩 link 它们:
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=',')
加布里埃尔