Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyomo:将结果保存到CSV文件_Python_Pyomo - Fatal编程技术网

Python Pyomo:将结果保存到CSV文件

Python Pyomo:将结果保存到CSV文件,python,pyomo,Python,Pyomo,寻找保存我的Pyomo结果的方法花了我2个小时:( 在成功解决问题后,我需要保存我的最优变量值和双变量值。让我们从最优变量开始 我的模型中有三个变量,120个“p”变量和3个指数,120个“I”变量和576个“F”变量和3个指数。它们的指数是不同的。以下是我的求解语句: solver = pyomo.opt.SolverFactory('gurobi') results = solver.solve(m, tee=True, keepfiles=True) m.display() result

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

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

我的模型中有三个变量,120个“p”变量和3个指数,120个“I”变量和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
作为
的类型。然后我尝试了下一件事:

list_of_vars = [v for v in m.component_objects(ctype=pe.Var, active=True, descend_into=True)]
print(list_of_vars)
之后,我得到了另一个
list\u of_vars
对象作为一个列表的类型,其中3个元素为“”,这也是合理的

那么,下一步我需要做什么?我如何将
m.solutions
list\u 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链接它们:

result_P = [ i + tuple([j]) for i,j in zip(ind, val)]
现在我们获得了tuple
result\u p
,其中包含我们想要的所有索引和值。之后,将此元组转换为数组,然后再转换为CSV是很简单的:

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

Gabriel

var列表中的元素类型为
。作为Pyomo开发者,我强烈推荐选项1而不是选项2。我认为,在选项2中,索引和变量片可能以不同的顺序迭代,这将使生成的数组无效。如果索引集没有排序,或者在Python3.5中迭代顺序可能是不确定的,则可能会出现这种情况。