Python 如何将多次迭代的pyomo解决方案(仅包括参数、目标和变量)写入excel/csv文件?

Python 如何将多次迭代的pyomo解决方案(仅包括参数、目标和变量)写入excel/csv文件?,python,pandas,pyomo,Python,Pandas,Pyomo,我有一个pyomo模型和一个可变参数模型。通过for循环,模型能够迭代并找到最优解。但我不知道如何将包括参数值、目标、所有迭代的变量在内的解决方案写入excel/csv文件 这是for循环 for RapeseedPrice in range(300, 600, 100): # change the value of parameter model.Prices model.Prices["rapeseed"] = RapeseedPrice print("When pr

我有一个pyomo模型和一个可变参数模型。通过for循环,模型能够迭代并找到最优解。但我不知道如何将包括参数值、目标、所有迭代的变量在内的解决方案写入excel/csv文件

这是for循环

for RapeseedPrice in range(300, 600, 100):
    # change the value of parameter model.Prices
    model.Prices["rapeseed"] = RapeseedPrice
    print("When price of rapeseed = {}".format(RapeseedPrice))
    opt = SolverFactory('ipopt')
    opt.solve(model, tee = True) 
    results = opt.solve
    model.display()
如果包括以下三个for循环,则可以访问所需的所有值:

for RapeseedPrice in range(300, 600, 100):
    # change the value of parameter model.Prices
    model.Prices["rapeseed"] = RapeseedPrice
    print("When price of rapeseed = {}".format(RapeseedPrice))
    opt = SolverFactory('ipopt')
    opt.solve(model, tee = True) 
    results = opt.solve
    model.display()
    for parmobject in model.component_objects(Param, active=True):
        nametoprint = str(str(parmobject.name))
        print ("Parameter ", nametoprint) # doctest: +SKIP
        for index in parmobject:
            vtoprint = value(parmobject[index])
            print (" ",index, vtoprint) # doctest: +SKIP
    for o in model.component_data_objects(Objective, active=True):
        print(o, value(o)) 
    for v in model.component_data_objects(Var, active=True):
        print(v, value(v)) 
我期望一个excel文件,它以列的形式显示不同的交互,以行的形式显示所有参数、目标和变量

            it1        it2       it3
param 1
param 2
param 3
...
objective
var 1
var 2
var 3
...


类似的方法应该可以将您的值放入Pandas数据框中,并从中很容易输出到csv文件:

from pyomo.environ import *
import pandas as pd

m = ConcreteModel()

m.s = Set(initialize=[1,2,3])
m.p = Param(initialize=1, mutable=True)
m.x = Var(m.s, bounds=(1,3))
m.obj = Objective(expr=m.p*sum(m.x[k]**2 for k in m.s))

solver = SolverFactory('ipopt')

all_data={}
for j in range(1,4):

    m.p = j
    solver.solve(m)

    data = {}

    for i in m.component_data_objects(Param):
        data[i.name] = value(i)
    for i in m.component_data_objects(Var):
        data[i.name] = value(i)
    for i in m.component_data_objects(Objective):
        data[i.name] = value(i)

    all_data['Solve '+str(j)] = pd.Series(data)

df = pd.DataFrame(all_data)

让我回答我自己的问题

为此,我们需要进口:

import pandas as pd
import numpy as np
from copy import deepcopy 
首先,您需要获取标题:

header0 = []
header1 = []

for parmobject in model.component_objects(Param, active=True):
        nametoprint = str(str(parmobject.name))        
        for index in parmobject:
                header0.append(nametoprint)
                header1.append(index)
for o in model.component_data_objects(Objective, active=True):
        header0.append("Objective")
        header1.append(str(o.name))
for v in model.component_data_objects(Var, active=True):
        header0.append("Variable")
        header1.append(str(v.name))

MultiHeaders = [header0, header1]
其次,你必须获得价值观:

AllData = []
pov_data = []

for RapeseedPrice in range(100, 500, 100): 

    model.Prices['rapeseed'] = RapeseedPrice

    # solve the model
    opt.solve(model) 

    # access pov_dat  
    for parmobject in model.component_objects(Param, active=True):
            for index in parmobject:
                    vtoprint = value(parmobject[index])
                    pov_data.append(vtoprint)
    for o in model.component_data_objects(Objective, active=True):
            pov_data.append(value(o))

    for v in model.component_data_objects(Var, active=True):
            pov_data.append(value(v)) 

    AllData.append(deepcopy(pov_data))
    pov_data.clear()
第三,将数据与标题合并到数据框中:

CDFarm_results = pd.DataFrame(data = np.array(AllData), columns = 
     MultiHeaders)
最后,将数据框保存到excel文件中

writer = pd.ExcelWriter('CDFarm_results_pandas.xlsx', engine='xlsxwriter')
CDFarm_results.to_excel(writer, 'Sheet1')
writer.save()
请看我的要点:此脚本能够将所有参数、目标和变量的名称和值保存到excel文件中


最终的excel如下所示:

此代码适用于存储变量和目标,但不适用于参数。我试图只保存变量和目标,这非常有效。对于参数行,它表示:numpy.float64对象没有属性名。然后,我将参数代码修改为以下内容:请参见model.component_objectsParam中parmobject的下一个注释,active=True:nametoprint=strsttrparmobject.name用于parmobject中的索引:vtoprint=valueparmobject[index]data[index]=vtoprint,但这些代码可以存储每个pamameter;但不是模型价格。这是因为模型。价格是可变的吗?