2017-01-06 4 views
0

たとえば、dictOfListという名前のリストのPython辞書からPyomo Setsの辞書を作成したいとします。 dictOfListは、以下のように構築されていますPythonをビルドしてPython辞書に設定する

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]はPythonで次のようにdictOfSetsという名前Pyomoセットのdictionnaryを入れなければなり:

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

その後、他のシンプルなループを使用してセットの値を表示する場合:

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のdictionnaryを内部Pyomo設定を構築する方法はありますか?今は通常のPythonリストを使用していますが、大きなモデルでは処理時間が非常に長くなります.Pyomo Setsを使用する方がビルディングの制約がより速くなります。

答えて

1

Setは、Blockまたはモデルオブジェクトに割り当てられていないため、完全に構築されていません。あなたは(あなたが実際にあなたのモデルにdictSetの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を割り当てる必要がありますSet秒のPythonのdictを作成するにはpr動作可能に構築される。このような何かは仕事ができる:あなたが明示的にインデックスさ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] 

EDITを与えます。つまり、

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

をあなたは 'model.S =セット(dictOfList.keys()、= dictOfListを初期化するには)'働いていたラインを使用して、言ったように。私はまたセットをモデルにリンクして、それが私の次の質問になる方法が好きです。ご協力いただきありがとうございます! –

+0

わかりました。私はもっと難しいです。辞書キーがタプルの場合はどうでしょうか? –

+1

すべてが同じ長さの場合は、明示的にS_indexセットを作成します。私は合理的な書式を得るために答えを更新します。 – jsiirola