如何在 pyomo 中使用集合和范围集的多级索引?

Posted

技术标签:

【中文标题】如何在 pyomo 中使用集合和范围集的多级索引?【英文标题】:How to use multi-level indexing in pyomo with a set and a rangeset? 【发布时间】:2017-02-15 18:02:54 【问题描述】:

我在pyomo 的模型中有多个级别的索引,我需要能够像这样索引变量:

model.b['a',1]

但由于某种原因,这似乎是不可能的。我可以像这样使用多级索引:

model = ConcreteModel()
model.W = RangeSet(0,1)
model.I = RangeSet(0,4)
model.J = RangeSet(0,4)
model.K = RangeSet(0,3)

model.B = Var(model.W, model.I, model.J, model.K)
model.B[1,2,3,0]  # access the variable using the indices - THIS WORKS!!

但是这不起作用:

model = ConcreteModel()
model.W = Set(['a','b'])
model.I = RangeSet(0,4)

model.b = Var(model.W, model.I)  # I can't even create this - throws exception

...它抛出异常:

TypeError: Cannot index a component with an indexed set

为什么第一个有效,第二个无效?

【问题讨论】:

【参考方案1】:

问题是当你写的时候

model.W = Set(['a','b'])

您实际上是在创建一个索引 Set 对象,而不是使用提供列表中的值的 Set。这是因为所有 Pyomo 组件构造函数都将位置参数视为索引集。

您可以通过在值列表之前添加“initialize”关键字来解决此问题

model.W = Set(initialize=['a','b'])

如果您提供的是整数列表而不是字符串,情况也是如此

model.I = Set(initialize=[0,1,2,3,4])

【讨论】:

好的,谢谢。但是,为什么model.W = RangeSet(0,1) model.I = RangeSet(0,4) 有效?我不需要这些的“初始化”关键字,它们是组件构造函数。 RangeSet 是一个非常专业的组件,只能用于生成连续数字范围的特定情况。它不接受关键字参数,只能通过三种方式构造model.W = RangeSet(stop) # returns the set [1, 2, ..., stop] model.W = RangeSet(start, stop) # returns the set [start, start+1,...,stop] model.W = RangeSet(start, stop, step) # returns [start, start+step, ... end] where end = start+i*step and end <= stop 好的,谢谢。这是另一个您可能会感兴趣的相关问题:***.com/questions/39908555/…

以上是关于如何在 pyomo 中使用集合和范围集的多级索引?的主要内容,如果未能解决你的问题,请参考以下文章

皮莫 | Couenne 求解器 |将索引变量域限制为两个整数值

Pyomo Blocks:关于时间相关问题的索引块与非索引块

mongoDB_08索引的操作

列出一些数据集的索引超出范围?

如何在pyomo的目标函数中使用最小值和最大值

如何在 Google Colab 中使用 Pyomo 解决抽象模型