将 Pyomo 集构建成 Python 字典
Build Pyomo Sets into a Python dictionnary
例如,我想从名为 dictOfList
的 Python 列表词典中创建一个 Pyomo 集词典。 dictOfList
构建如下:
dictOfList= {}
dictOfList[1] = [10,11,12]
dictOfList[2] = [20,21]
dictOfList[3] = [31,32,33,34]
现在,我想将值 [10,11,12]
、[20,21]
和 [31,32,33,34]
放入名为 dictOfSets
的 Pyomo 集的 Python 字典中如下:
model.dictOfSets = {}
for el in dictOfList:
model.dictOfSets[el] = Set(initialize=dictOfList[el])
然后,如果我使用另一个简单的 for 循环显示集合的值:
for el in dictOfList:
model.dictOfSets[el].display()
似乎 Set 构建不正确,因为它在 运行 控制台中显示:
_unknown_ : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None
Not constructed
_unknown_ : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None
Not constructed
_unknown_ : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None
Not constructed
有没有办法在 Python 词典中 构建 Pyomo 集?现在,我使用了普通的 Python 列表,但它导致我在较大的模型中处理时间很长,而且我知道最好使用 Pyomo 集来提高构建约束的性能。
Set
未完全构建,因为它们从未分配给 Block
或模型对象。虽然不完全是你想要的(你实际上并没有在你的模型上得到 dict
of Set
s),但要获得你想要的效果,最简单的方法是实际创建索引 Set
:
dictOfList= {}
dictOfList[1] = [10,11,12]
dictOfList[2] = [20,21]
dictOfList[3] = [31,32,33,34]
model.S = Set(dictOfList.keys(), initialize=dictOfList)
如果您打印模型(model.pprint()
),您将得到:
2 Set Declarations
S : Dim=1, Dimen=1, Size=9, Domain=None, ArraySize=3, Ordered=False, Bounds=None
Key : Members
1 : [10, 11, 12]
2 : [20, 21]
3 : [31, 32, 33, 34]
S_index : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
[1, 2, 3]
要实际创建 Set
的 Python dict
,您还需要将每个人 Set
分配给模型,以便正确构建。像这样的东西可以工作:
model.dictOfSets = {}
for el in dictOfList:
model.dictOfSets[el] = Set(initialize=dictOfList[el])
setattr(model, 'dictOfSets_member_%s' % (el,), model.dictOfSets[el])
for el in dictOfList:
model.dictOfSets[el].display()
给予
dictOfSets_member_1 : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(10, 12)
[10, 11, 12]
dictOfSets_member_2 : Dim=0, Dimen=1, Size=2, Domain=None, Ordered=False, Bounds=(20, 21)
[20, 21]
dictOfSets_member_3 : Dim=0, Dimen=1, Size=4, Domain=None, Ordered=False, Bounds=(31, 34)
[31, 32, 33, 34]
编辑: 如果您显式创建索引 Set
的索引,您可以有更复杂的索引。即:
model.S_IDX = Set(initialize=dictOfList.keys())
model.S = Set(model.S_IDX, initialize=dictOfList)
通过显式创建集合,您可以拥有任意复杂的键。请注意,在某些情况下,您可能必须使用 dimen=
关键字显式设置索引集的 "dimension":
dictOfList = { (1,2): [10,11,12],
(2,3): [20,21],
(1,3): [31,32,33,34],
}
model.S_IDX = Set(initialize=dictOfList.keys(), dimen=2)
model.S = Set(model.S_IDX, initialize=dictOfList)
如果您希望元组具有不同的长度,则尤其如此:
dictOfList = { (1,): [10,11,12],
(2,3): [20,21],
(1,3,4): [31,32,33,34],
}
model.S_IDX = Set(initialize=dictOfList.keys(), dimen=None)
model.S = Set(model.S_IDX, initialize=dictOfList)
其中 model.pprint()
给出:
2 Set Declarations
S : Dim=None, Dimen=1, Size=9, Domain=None, ArraySize=3, Ordered=False, Bounds=None
Key : Members
(1,) : [10, 11, 12]
(1, 3, 4) : [31, 32, 33, 34]
(2, 3) : [20, 21]
S_IDX : Dim=0, Dimen=None, Size=3, Domain=None, Ordered=False, Bounds=None
[(1,), (1, 3, 4), (2, 3)]
例如,我想从名为 dictOfList
的 Python 列表词典中创建一个 Pyomo 集词典。 dictOfList
构建如下:
dictOfList= {}
dictOfList[1] = [10,11,12]
dictOfList[2] = [20,21]
dictOfList[3] = [31,32,33,34]
现在,我想将值 [10,11,12]
、[20,21]
和 [31,32,33,34]
放入名为 dictOfSets
的 Pyomo 集的 Python 字典中如下:
model.dictOfSets = {}
for el in dictOfList:
model.dictOfSets[el] = Set(initialize=dictOfList[el])
然后,如果我使用另一个简单的 for 循环显示集合的值:
for el in dictOfList:
model.dictOfSets[el].display()
似乎 Set 构建不正确,因为它在 运行 控制台中显示:
_unknown_ : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None
Not constructed
_unknown_ : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None
Not constructed
_unknown_ : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None
Not constructed
有没有办法在 Python 词典中 构建 Pyomo 集?现在,我使用了普通的 Python 列表,但它导致我在较大的模型中处理时间很长,而且我知道最好使用 Pyomo 集来提高构建约束的性能。
Set
未完全构建,因为它们从未分配给 Block
或模型对象。虽然不完全是你想要的(你实际上并没有在你的模型上得到 dict
of Set
s),但要获得你想要的效果,最简单的方法是实际创建索引 Set
:
dictOfList= {}
dictOfList[1] = [10,11,12]
dictOfList[2] = [20,21]
dictOfList[3] = [31,32,33,34]
model.S = Set(dictOfList.keys(), initialize=dictOfList)
如果您打印模型(model.pprint()
),您将得到:
2 Set Declarations
S : Dim=1, Dimen=1, Size=9, Domain=None, ArraySize=3, Ordered=False, Bounds=None
Key : Members
1 : [10, 11, 12]
2 : [20, 21]
3 : [31, 32, 33, 34]
S_index : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
[1, 2, 3]
要实际创建 Set
的 Python dict
,您还需要将每个人 Set
分配给模型,以便正确构建。像这样的东西可以工作:
model.dictOfSets = {}
for el in dictOfList:
model.dictOfSets[el] = Set(initialize=dictOfList[el])
setattr(model, 'dictOfSets_member_%s' % (el,), model.dictOfSets[el])
for el in dictOfList:
model.dictOfSets[el].display()
给予
dictOfSets_member_1 : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(10, 12)
[10, 11, 12]
dictOfSets_member_2 : Dim=0, Dimen=1, Size=2, Domain=None, Ordered=False, Bounds=(20, 21)
[20, 21]
dictOfSets_member_3 : Dim=0, Dimen=1, Size=4, Domain=None, Ordered=False, Bounds=(31, 34)
[31, 32, 33, 34]
编辑: 如果您显式创建索引 Set
的索引,您可以有更复杂的索引。即:
model.S_IDX = Set(initialize=dictOfList.keys())
model.S = Set(model.S_IDX, initialize=dictOfList)
通过显式创建集合,您可以拥有任意复杂的键。请注意,在某些情况下,您可能必须使用 dimen=
关键字显式设置索引集的 "dimension":
dictOfList = { (1,2): [10,11,12],
(2,3): [20,21],
(1,3): [31,32,33,34],
}
model.S_IDX = Set(initialize=dictOfList.keys(), dimen=2)
model.S = Set(model.S_IDX, initialize=dictOfList)
如果您希望元组具有不同的长度,则尤其如此:
dictOfList = { (1,): [10,11,12],
(2,3): [20,21],
(1,3,4): [31,32,33,34],
}
model.S_IDX = Set(initialize=dictOfList.keys(), dimen=None)
model.S = Set(model.S_IDX, initialize=dictOfList)
其中 model.pprint()
给出:
2 Set Declarations
S : Dim=None, Dimen=1, Size=9, Domain=None, ArraySize=3, Ordered=False, Bounds=None
Key : Members
(1,) : [10, 11, 12]
(1, 3, 4) : [31, 32, 33, 34]
(2, 3) : [20, 21]
S_IDX : Dim=0, Dimen=None, Size=3, Domain=None, Ordered=False, Bounds=None
[(1,), (1, 3, 4), (2, 3)]