将Pyomo设置为Python词典

时间:2017-01-06 22:11:48

标签: python anaconda python-3.5 linear-programming pyomo

例如,我想从一个名为dictOfList的列表的Python词典中创建一个Pyomo Sets的词典。 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 Sets的Python词典中,如下所示:

model.dictOfSets = {}
for el in dictOfList:
    model.dictOfSets[el] = Set(initialize=dictOfList[el])

然后,如果我使用另一个简单的for循环显示集合的值:

for el in dictOfList:
    model.dictOfSets[el].display()

似乎没有正确构建集合,因为它在正在运行的控制台中显示:

_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 Set ?现在,我使用了普通的Python列表,但它在较大的模型中导致了很长的处理时间,而且我知道最好使用Pyomo Sets来提高构建约束的性能。

1 个答案:

答案 0 :(得分:2)

Set未完全构建,因为它们永远不会被分配给Block或模型对象。虽然不完全是你所要求的(你的模型上实际上并没有dict Set},但要获得你想要的效果最简单的方法就是实际创建已编入索引 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]

要实际创建dictSet的{​​{1}},您还需要将每个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=关键字明确设置索引Set的“维度”:

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)]