我正在研究一个包含不同参数和变量的安静的大型优化问题。 这些参数和变量处理不同的集合,例如:
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”
有人知道一个聪明的方法吗,我如何在遍历模型的所有参数和变量时想象变量集?
提前致谢! 马蒂亚斯
我想你会有更好的运气
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