如何在 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 求解器 |将索引变量域限制为两个整数值