2016-10-06 5 views
1

나는 pyomo 내 모델에서 지수의 여러 수준을 가지고 있고,이 같은 인덱스 변수 수 있어야합니다 :pyomo에서 집합과 범위 집합을 사용하여 다중 수준 인덱싱을 사용하는 방법은 무엇입니까?

model.b['a',1] 

을하지만 어떤 이유로 가능하지 않는 것 같습니다. 나는이 같은 다단계 인덱싱을 사용할 수 있습니다

model = ConcreteModel() 
model.W = RangeSet(0,1) 
model.I = RangeSet(0,4) 
model.J = RangeSet(0,4) 
model.K = RangeSet(0,3) 

model.B = Var(model.W, model.I, model.J, model.K) 
model.B[1,2,3,0] # access the variable using the indices - THIS WORKS!! 

을하지만 그러나, 작동하지 않습니다

TypeError: Cannot index a component with an indexed set 

이유는 첫 번째 작업을 수행합니다

model = ConcreteModel() 
model.W = Set(['a','b']) 
model.I = RangeSet(0,4) 

model.b = Var(model.W, model.I) # I can't even create this - throws exception 

를 ... 그것은 예외를 throw 두 번째 작품이 아닌 작품?

답변

2

문제는 당신이

model.W = Set(['a','b']) 

를 쓸 때 당신이 실제로 인덱스 설정 객체가 아닌 제공된 목록에서 값으로 세트를 만드는 것입니다. 이것은 모든 Pyomo 구성 요소 생성자가 위치 인수를 인덱싱 세트로 취급하기 때문입니다.

당신은, 당신은 정수 문자열이 아닌

model.I = Set(initialize=[0,1,2,3,4]) 
+0

괜찮의 목록을 제공하는 경우에도 동일한 사실이 될 것이다 값

model.W = Set(initialize=['a','b']) 

의 목록하기 전에 "초기화"키워드를 추가하여이 문제를 해결할 수 있습니다 감사. 그러나, 왜'model.W = RangeSet (0,1) model.I = RangeSet (0,4)'가 작동합니까? 나는 이들을 위해 "initialize"키워드가 필요 없으며, 그것들은 컴포넌트 생성자이다. – Candic3

+1

RangeSet은 일련의 숫자를 생성하는 특정 경우에만 사용할 수있는 매우 특수화 된 구성 요소입니다. 키워드 인수를 허용하지 않으며 세 가지 방법으로 만 생성 할 수 있습니다. 'model.W = RangeSet (stop) # [1, 2, ..., stop] 세트를 반환합니다. model.W = RangeSet (시작, (start, stop, step) #은 [start, start + step, ... end]를 반환합니다. + i * 단계와 끝 <= 정지 ' –

+0

좋습니다, 감사합니다. 이것은 흥미로운 또 다른 관련 질문입니다. http://stackoverflow.com/questions/39908555/how-to-define-an-integral-as-an-objective-function-in-pyomo/39908672#39908672 – Candic3