Pyomo 调用集合的值

Pyomo calling the value of a set

让我们考虑以下集合:

m.sub_sit = pyomo.Set(
    initialize=[site],
    doc='site of sub problem')

在这种情况下,m.sub_sit 是由 create_model() 函数使用参数 'Mid':

创建的
inst = create_model(site='Mid')

我通过调用 inst.sub_sit.pprint() 获得的结果:

在:

inst.sub_sit.pprint()

输出:

sub_sit : site of sub problem
    Dim=0, Dimen=1, Size=1, Domain=None, Ordered=False, Bounds=None
    ['Mid']

我真正想要输出的是'Mid',这样我就可以用'Mid'索引其他对象,然后在我的代码中使用它。

例如:

In1: PiZero
In2: PiZero[inst.sub_sit[1]]
In3: PiZero['Mid']
输出 1:

 sub_sit
 Mid   -1.0
 Name: sub_costs, dtype: float64

Out2: -1.0

Out3: -1.0

问题:从 m.sub_sit pyomo set 对象调用这个 'Mid' 字符串,比我建议的更好吗?

btw m.sub_sit.value 给出了一个输出,几乎是我所需要的:{'Mid'}

首先将ordered=True添加到m.sub_sit。然后 'Mid' 可以用 inst.sub_sit[1] 调用。它应该是有序集,否则会产生错误,你不能调用无序集的第一个对象。

m.sub_sit = pyomo.Set(
    initialize=[site],
    ordered=True,
    doc='site of sub problem')

在:

inst.sub_sit[1]

输出:

'Mid'

您永远不必使用方括号索引 Pyomo 集。如果您发现自己想要这样做,那么您可能需要重新考虑使用 Pyomo Set 而不是原生 Python 列表的动机。

如果您的目标是遍历 Pyomo 集合中的值并使用这些值索引到 Pandas 个对象,那么您可以执行以下操作:

for s in m.sub_sit:
    v = PiZero[s]
    # Do something with v

或者,您可以将 Pyomo Set 转换为列表并改为使用该列表:

s = list(m.sub_sit)

但是,如果你要这样做,你真的需要 Pyomo 套装吗?

如果您想了解更多一起使用 Pandas 和 Pyomo 的示例,请查看 this github 传感器放置包的存储库。特别是您可以看到使用 Pandas DataFrame 中的值创建 Pyomo 集的示例,以及如何编写使用 DataFrame 中的数据的约束。