pyomo:获取所有具有不同集合的变量

问题描述 投票:0回答:1

我正在研究一个包含不同参数和变量的安静的大型优化问题。 这些参数和变量处理不同的集合,例如:

mdl.A = Var(mdl.t, mdl.X, domain=NonNegativeReals)
mdl.B = var(mdl.X, domain=NonNegativeReals)
mdl.C = Var(mdl.t, mdl.X, mdl.Y, domain=NonNegativeReals)

解决模型后,我尝试从每个参数和变量中获取所有数据。但是现在,我正在努力处理一些应该处理它的代码。 现在,我通过

获得每个参数和变量的所有名称
model_vars = mdl.component_map(ctype=pyo.Var)

并且可以像这样迭代 model_vars

for k in model_vars.keys():
v = model_vars[k]

现在,我必须决定哪个集合正在处理参数或模型。我已经尝试过 v.index_set().name,在某些情况下我用它得到了参数集。然而,并非在所有情况下,输出都像“variablename_index”

有人知道一个聪明的方法吗,我如何在遍历模型的所有参数和变量时想象变量集?

提前致谢! 马蒂亚斯

python variables set pyomo
1个回答
0
投票

我想你会有更好的运气

component_objects()
。我不确定
component_map()
的返回对象是什么或如何使用它。医生说这是
PseudoMap
.

下图显示在

ipython
中,我喜欢用它来做实验,因为你可以获得自动完成来建议事情并查看dox等

请注意,当您构建多索引的事物时,例如

m.y
pyomo
会创建一个将它们汇总的综合索引。我不知道如何放松回到基本元素,如果你需要这样做......这似乎有点奇怪。但这可能不是必需的,因为您可以轻松地与综合索引(我的术语)进行交互。

In [36]: from pyomo.environ import *

In [37]: m = ConcreteModel()

In [38]: m.A = Set(initialize=[1,2,3])

In [39]: m.B = Set(initialize=['A', 'B', 'C'])

In [40]: m.x = Var(m.A, initialize=2.0)

In [41]: m.y = Var(m.A, m.B, initialize=3.0)

In [42]: for mv in m.component_objects(ctype=Var):
    ...:     print(mv, mv.index_set().name)
    ...:     for idx in mv.index_set():
    ...:         print(f'   {mv.name} {idx}: {value(mv[idx])}')
    ...: 
x A
   x 1: 2.0
   x 2: 2.0
   x 3: 2.0
y y_index
   y (1, 'A'): 3.0
   y (1, 'B'): 3.0
   y (1, 'C'): 3.0
   y (2, 'A'): 3.0
   y (2, 'B'): 3.0
   y (2, 'C'): 3.0
   y (3, 'A'): 3.0
   y (3, 'B'): 3.0
   y (3, 'C'): 3.0

In [43]: m.y.index_set().dimen
Out[43]: 2
© www.soinside.com 2019 - 2024. All rights reserved.