Pyomo:用两个索引初始化变量

Pyomo: Initialize variable with two indices

我正在寻找一种方法来初始化具有两个索引的 pyomo 中的变量。我的第一个想法是使用嵌套字典,第一个索引在字典的上层,第二个索引在字典的下层。

使用这种方法,我得到以下错误:

错误:从数据=None 构建组件'p_norm_generator' 失败: KeyError:“索引 'PV' 对索引组件无效 'p_norm_generator'"

有人知道如何正确实施初始化吗?

代码如下所示:

#Electricity generation
p_nom_dict['PV'] = p_nom_pv_dict
p_nom_dict['Onshore'] = p_nom_wind_onshore_dict

generators = ['PV', 'Onshore']
model.GENERATOR = generators
model.p_norm_generator = Param(model.GENERATOR, model.TIME, initialize=p_nom_dict)

具有多个索引的事物的数据源需要由具有适当索引的元组进行索引。所以在你上面的例子中,你的源字典需要有 (model.GENERATOR, model.TIME) 的元组作为键。

这是一个玩具示例:

from pyomo.environ import *

sources = ['sun', 'wind', 'voodoo']
time_periods = list(range(4))

data = {    ('sun', 2):     24,
            ('wind', 3):    60,
            ('voodoo', 1):  12}

m = ConcreteModel()
# sets
m.sources = Set(initialize=sources)
m.time = Set(initialize=time_periods)

# param
m.energy = Param(m.sources, m.time, initialize=data)

# check it....
m.pprint()

产量:

3 Set Declarations
    energy_index : Dim=0, Dimen=2, Size=12, Domain=None, Ordered=False, Bounds=None
        Virtual
    sources : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=None
        ['sun', 'voodoo', 'wind']
    time : Dim=0, Dimen=1, Size=4, Domain=None, Ordered=False, Bounds=(0, 3)
        [0, 1, 2, 3]

1 Param Declarations
    energy : Size=3, Index=energy_index, Domain=Any, Default=None, Mutable=False
        Key           : Value
           ('sun', 2) :    24
        ('voodoo', 1) :    12
          ('wind', 3) :    60

4 Declarations: sources time energy_index energy*