gpt4 book ai didi

python - 通过 Pyomo 的索引集索引的变量

转载 作者:行者123 更新时间:2023-12-01 00:17:20 26 4
gpt4 key购买 nike

我试图弄清楚如何使用索引集对变量进行索引:

例如:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com