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")
有人对如何正确定义此变量有任何建议吗?
答案 0 :(得分:2)
Pyomo不支持那样的索引集(尽管在GAMS中似乎并不重要,但我实际上并未意识到Pyomo中索引集的用例)。您可以按以下方式进行处理(此处使用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')]
使用组合的Set创建参数:
model.eb = po.Param(model.J_O)
最后一行会抛出错误,表明使用J和O的任何无效组合初始化参数。或者,您也可以为所有组合初始化参数
po.Param(model.J * model.O)
,并且仅针对有效组合进行初始化,但是稍后可能会咬住您。另外,model.J_O
可能对于变量和约束也很方便,这取决于您的模型公式。