我试图弄清楚如何使用索引集对变量进行索引:
例如:
model = AbstractModel()
model.J = Set()
model.O = Set(model.J)
我想定义一个在两个集合上索引的变量。有人能帮我吗?我尝试了以下方法:
model.eb=Param(model.J, model.O)
这给出了
TypeError("Cannot index a component with an indexed set")
有人对如何正确定义此变量有任何建议吗?
最佳答案
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)
然后您可以定义一个组合 Set,其中包含 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
对于变量和约束也可能很方便,具体取决于您的模型公式。
关于python - 通过 Pyomo 的索引集索引的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59237082/