2016-10-06 1 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 

を...それが例外をスローします第二のものではなく、仕事ですか?

答えて

2

問題は、あなたが

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

を書くとき、あなたが実際に提供されたリスト内の値でインデックス化Setオブジェクトではなく、セットを作成しているということです。これは、すべての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)'が機能しますか?私はそれらのキーワードを "初期化"する必要はなく、それらはコンポーネントコンストラクタです。 – Candic3

+1

RangeSetは、一連の数値を生成する特定のケースでのみ使用できる非常に特殊化されたコンポーネントです。キーワード引数を受け入れず、3つの方法でしか構築できない 'model.W = RangeSet(stop)#はセット[1,2、...、stop]を返します model.W = RangeSet(start、 (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

関連する問題