在Pyomo中通过叉积添加变量

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

我正在尝试使用Pyomo创建一个ConcreteModel。我有一个列表,其中包含变量x_ij的索引。

Xindex = [(619, 0), (620, 0), (621, 0), (622, 0), (623, 0), (624, 0), (625, 0), (626, 0), (627, 0), (628, 0), (619, 1), (620, 1), (621, 1), (622, 1), (623, 1), (624, 1), (625, 1), (626, 1), (627, 1), (628, 1), (1098, 2), (1099, 2), (1100, 2), (1101, 2), (1102, 2), (1103, 2), (1104, 2), (1105, 2), (1106, 2), (1107, 2), (1098, 3), (1099, 3), (1100, 3), (1101, 3), (1102, 3), (1103, 3), (1104, 3), (1105, 3), (1106, 3), (1107, 3), (619, 4), (620, 4), (621, 4), (622, 4), (623, 4), (624, 4), (625, 4), (626, 4), (627, 4), (628, 4), (1098, 5), (1099, 5), (1100, 5), (1101, 5), (1102, 5), (1103, 5), (1104, 5), (1105, 5), (1106, 5), (1107, 5), (1098, 6), (1099, 6), (1100, 6), (1101, 6), (1102, 6), (1103, 6), (1104, 6), (1105, 6), (1106, 6), (1107, 6), (1098, 7), (1099, 7), (1100, 7), (1101, 7), (1102, 7), (1103, 7), (1104, 7), (1105, 7), (1106, 7), (1107, 7), (1098, 8), (1099, 8), (1100, 8), (1101, 8), (1102, 8), (1103, 8), (1104, 8), (1105, 8), (1106, 8), (1107, 8), (1098, 9), (1099, 9), (1100, 9), (1101, 9), (1102, 9), (1103, 9), (1104, 9), (1105, 9), (1106, 9), (1107, 9), (1098, 10), (1099, 10), (1100, 10), (1101, 10), (1102, 10), (1103, 10), (1104, 10), (1105, 10), (1106, 10), (1107, 10), (1098, 11), (1099, 11), (1100, 11), (1101, 11), (1102, 11), (1103, 11), (1104, 11), (1105, 11), (1106, 11), (1107, 11), (1098, 12), (1099, 12), (1100, 12), (1101, 12), (1102, 12), (1103, 12), (1104, 12), (1105, 12), (1106, 12), (1107, 12)]

每个元组的第一个元素对应于i,第二个元素对应于j。使用此列表,我想将变量添加到模型m中。但是,我没有在Pyomo User Manual中看到简单的方法。我尝试了以下操作,但无济于事。

m.Xindexi = Set(initialize=[i[0] for i in Xindex])
m.Xindexj = Set(initialize=[j[1] for j in Xindex])
m.Xindex = Set(within = m.Xindexi*m.Xindexj)
m.x = Var(m.Xindexi, m.Xindexj,domain=NonNegativeReals)

是否有办法像创建字典一样做到这一点(类似于Gurobi的Python使用的方法?例如:

m.x = {}
for i in Xindex:
    m.x[i[0],i[1]] = Var(domain=NonNegativeReals)

根据公认的答案,这是我为解决此问题所做的工作。将其添加到此处以供将来参考...

m.Xindexi = Set(initialize=set([i[0] for i in Xindex]))
m.Xindexj = Set(initialize=set([j[1] for j in Xindex]))
m.Xindex = Set(within = m.Xindexi*m.Xindexj,
                  initialize=Xindex)
m.x = Var(m.Xindex,domain=NonNegativeReals)
pyomo
1个回答
1
投票

有很多方法可以做到这一点。这里的基本思想是制作(i,j)的稀疏组合。您可以严格枚举该稀疏集,或者对于模型的其他部分,如果需要一个更完整的(i,j)集,并且只需要对某些变量/参数使用此稀疏集,则可以在其上构造它。 -从数据或您制定的任何设置规则中获取信息。

© www.soinside.com 2019 - 2024. All rights reserved.