下面的一些变体可能会起作用。您可以向Var 询问索引集的名称。请注意,二维索引在内部构造为虚拟集。不确定是否有办法将其展开为原生组件。 (请参阅下面的m.display() 结果。)
我会说你的结构看起来很奇怪。如果你正在制作一个具体的模型,你已经知道变量......所以测试它们以查看它们的索引是多少似乎有点循环。也许有更简单的选择。
# accessing indexing sets...
from pyomo.environ import *
m = ConcreteModel()
m.I = Set(initialize=[1,2,3])
m.J = Set(initialize=list('abc'))
m.X = Var(m.I)
m.Y = Var(m.J)
m.Z = Var(m.J, m.I)
for v in m.component_objects(Var):
my_index_name = v.index_set().getname()
if my_index_name == 'I':
print(f'variable {v.getname()} is indexed by I')
m.display()
输出:
variable X is indexed by I
Model unknown
Variables:
X : Size=3, Index=I
Key : Lower : Value : Upper : Fixed : Stale : Domain
1 : None : None : None : False : True : Reals
2 : None : None : None : False : True : Reals
3 : None : None : None : False : True : Reals
Y : Size=3, Index=J
Key : Lower : Value : Upper : Fixed : Stale : Domain
a : None : None : None : False : True : Reals
b : None : None : None : False : True : Reals
c : None : None : None : False : True : Reals
Z : Size=9, Index=Z_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
('a', 1) : None : None : None : False : True : Reals
('a', 2) : None : None : None : False : True : Reals
('a', 3) : None : None : None : False : True : Reals
('b', 1) : None : None : None : False : True : Reals
('b', 2) : None : None : None : False : True : Reals
('b', 3) : None : None : None : False : True : Reals
('c', 1) : None : None : None : False : True : Reals
('c', 2) : None : None : None : False : True : Reals
('c', 3) : None : None : None : False : True : Reals
Objectives:
None
Constraints:
None