2017-01-06 9 views
0

예를 들어, dictOfList이라는 목록의 파이썬 사전에서 Pyomo Sets의 사전을 만들고 싶습니다. dictOfList은 다음과 같이 내장되어 있습니다 :Python 빌드 Python dictionnary로 설정

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 세트의 사전으로 파이썬에 넣어되는 값 싶습니다

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

다음을, 루프의 다른 간단한 사용하여 집합의 값을 표시하는 경우 :

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

것 같습니다 셋 (Sets)가 제대로 구축되지 않은 것처럼, 그것은 실행중인 콘솔이 표시됩니다 이후 :

_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 

파이썬 사전도를 내부 Pyomo 설정 를 구축 할 수있는 방법이 있습니까? 지금 당장은 일반 파이썬 목록을 사용했지만 큰 모델에서는 처리 시간이 매우 길어졌습니다. Pyomo Sets를 사용하여 구속 조건을보다 빠르게 수행하는 것이 더 좋습니다.

답변

1

SetBlock 또는 모델 객체에 할당되지 않기 때문에 완전히 구성되지 않았습니다. 하는 동안에는 는 인덱싱되지 정확히, 가장 쉬운 것은 당신이 실제로 생성되어 원하는 효과를 얻기 위해 수행 할 수가 요구된다 (실제로 모델에 dictSet의의와 끝까지하지 않음)Set :

이 모델 ( model.pprint())를 인쇄하는 경우
dictOfList= {} 
dictOfList[1] = [10,11,12] 
dictOfList[2] = [20,21] 
dictOfList[3] = [31,32,33,34] 
model.S = Set(dictOfList.keys(), initialize=dictOfList) 

, 당신은 얻을 것이다 :

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의의 dict을 만들려면 당신은 또한 얻을 수 있도록 모델에 각각 Set을 할당해야 홍보 operly 건설. 이 같은 뭔가 일할 수 :

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

당신이 (= dictOfList를 초기화 dictOfList.keys()) 라인'model.S = 설정을 사용하여 말했듯이'했다. 또한 세트를 모델에 연결하는 방법을 좋아합니다. 다음 번 질문 일 것입니다. 당신의 도움을 주셔서 감사합니다! –

+0

좋아, 나는 더 열심히 하나 : 만약 우리가 dictionnary 키가 튜플 인 경우에는? –

+1

길이가 모두 같은 경우 명시 적으로 S_index 세트를 만듭니다. 합리적인 형식을 얻을 수 있도록 답변을 업데이트하겠습니다. – jsiirola