【问题标题】:How to get pyomo VarData/values from slice of indexed variable?如何从索引变量切片中获取 pyomo VarData/值?
【发布时间】:2019-09-01 21:57:11
【问题描述】:

我正在使用由多个集合索引的 pyomo 变量。我已经沿着一些集合创建了切片,并希望使用这些切片来访问变量值,给定切片集合的索引。

我希望能工作的代码是:

from pyomo.environ import *

m = ConcreteModel()
m.time = Set(initialize=[1,2,3])
m.space = Set(initialize=[1,2,3])
m.comp = Set(initialize=['a','b','c'])
m.v = Var(m.time, m.space, m.comp, initialize=1)
slice = m.v[:, :, 'a']
for x in m.space:
    value_list = []
    for t in m.time:
        value_list.append(slice[t, x].value)
        # write value_list to csv file

但这给了我:

>>> value_list
[<pyomo.core.base.indexed_component_slice._IndexedComponent_slice object at 0x7f4db9104a58>, <pyomo.core.base.indexed_component_slice._IndexedComponent_slice object at 0x7f4db9104a58>, <pyomo.core.base.indexed_component_slice._IndexedComponent_slice object at 0x7f4db9104a58>]

而不是我希望的值列表。

是否可以仅从通配符索引访问与变量切片对应的值?

我尝试使用 _IndexedComponent_slice 的一些方法,但没有成功。例如:

>>> for item in slice.wildcard_items(): item
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/rparker1/Idaes/pyomo/pyomo/core/base/indexed_component_slice.py", line 194, in <genexpr>
    return ((_iter.get_last_index_wildcards(), _) for _ in _iter)
  File "/home/rparker1/Idaes/pyomo/pyomo/core/base/indexed_component_slice.py", line 350, in __next__
    _comp = _comp.__getitem__( _call[1] )
AttributeError: '_GeneralVarData' object has no attribute '__getitem__'

我希望某种方法可以为我提供一个将通配符索引映射到 vardata 对象的字典,但找不到。非常感谢您对查找此类字典或其他解决方案的任何帮助。

【问题讨论】:

    标签: python pyomo


    【解决方案1】:

    _IndexedComponent_slice 对象有点棘手,因为它们旨在与分层模型一起使用。因此,它们应该被视为更多的特殊迭代器,而不是字典的视图。特别是,这些“类切片”对象将__getitem____getattr____call__ 的分辨率推迟到迭代时间。因此,当您说 slice.value 时,该属性查找实际上不会发生,直到您遍历切片。

    获取变量值的最简单方法是遍历切片:

    value_list = list(m.v[:, :, 'a'].value)
    

    如果您想要一个可以像字典一样处理的新组件(就像原来的 Var),那么您想要使用切片创建一个 Reference 组件:

    r = Reference(m.v[:, :, 'a'])
    

    这些可以像任何其他组件一样附加到模型,并且(对于常规切片)将采用引用对象的 ctype(因此在这种情况下,r 看起来和行为就像 @ 987654332@).

    【讨论】:

    • 感谢您的回复。我已经使用Reference 组件实现了这一点。出于好奇,将操作推迟到迭代时间如何让这些对象更好地与分层模型一起工作?
    • 延迟解析使我们能够支持“链式切片表示法”。考虑一个模型,其索引块b 包含索引变量x。这支持 for v in model.b[:].x[:]:model.b[:].x[:].fix(0) 之类的语法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2022-01-10
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多