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

标签 python variables optimization indexing pyomo

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

例如:

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/

相关文章:

javascript - 延迟加载 addthis 脚本? (或延迟加载依赖于已触发事件的外部 js 内容)

tensorflow - Keras 上的 clipnorm 和 clipval 有什么区别

python - 作为目标执行方法的线程会发生什么

python - 如何在 Django 中下载临时文件?

python - 如何在 Pandas 数据框中显示特定数字

c# - 我怎样才能让一个函数修改一个变量C#

python - 骑自行车度过一个日期

python - 这些是函数绑定(bind)变量还是它们叫什么?

静态变量中的 qt tr()

c++ - 按值返回内联函数