簡體   English   中英

將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循環顯示Set的值:

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集? 現在,我使用了普通的Python列表,但是這在大型模型中使我的處理時間非常長,而且我知道最好使用Pyomo Sets來提高構建約束時的性能。

Set尚未完全構造,因為它們從未分配給Block或模型對象。 雖然不正是你所要求的(你實際上並沒有一個最終dictSet ,在你的模型),最簡單的事情做才能得到你想要的是實際創建索引的效果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=關鍵字來顯式設置索引集的“維度”:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM