由带有Pyomo的索引集索引的变量

问题描述 投票:1回答:1

im试图弄清楚如何用索引集索引一个变量:

例如:

model = AbstractModel()

model.J = Set() 
model.O = Set(model.J) 

我想在两个Set上定义一个索引的变量。有人能帮我吗?我尝试了以下方法:

model.eb=Param(model.J, model.O)

给出

TypeError("Cannot index a component with an indexed set")

有人对如何正确定义此变量有任何建议吗?

python variables optimization indexing pyomo
1个回答
2
投票

Pyomo不支持这样的索引集(我实际上并不知道Pyomo中索引集的用例,尽管它们在GAMS中似乎很重要)。您可以按以下方式进行处理(此处使用ConcreteModel进行说明):

为作业和操作的所有唯一值定义集合(我假设您具有一些将操作映射到作业的数据结构:]

import pyomo.environ as po
import itertools

model = po.ConcreteModel()

map_J_O = {'J1': ['O11', 'O12'],
           'J2': ['O21']}

unique_J = map_J_O.keys()
model.J = po.Set(initialize=unique_J)
unique_O = set(itertools.chain.from_iterable(map_J_O.values()))
model.O = po.Set(initialize=unique_O) 

然后您可以定义一个组合集合,其中包含J和O的所有有效组合:

model.J_O = po.Set(within=model.J * model.O, 
                   initialize=[(j, o) for j in map_J_O for o in map_J_O[j]])

model.J_O.display()
# Output:
#J_O : Dim=0, Dimen=2, Size=3, Domain=J_O_domain, Ordered=False, Bounds=None
#    [('J1', 'O11'), ('J1', 'O12'), ('J2', 'O21')]

使用组合的集合创建参数:

model.eb = po.Param(model.J_O)

最后一行将抛出错误,该错误使用J和O的任何无效组合来初始化参数。或者,您也可以为所有组合初始化参数

po.Param(model.J * model.O)

并且仅针对有效组合进行初始化,但是稍后可能会咬住您。另外,根据模型的制定,model.J_O对于变量和约束也可能很方便。

© www.soinside.com 2019 - 2024. All rights reserved.