3.3.3. 添字クラス Element

添字は Element というクラスで表現されます. 添字とは数式 \(x_{i}\)\(i\) に相当するものを意味します. 添字と集合を対応させるには,キーワード引数 set を用います.頭文字の s は小文字である事に注意してください. 添字を用いることで 変数クラス Variable制約式クラス Constraint定数クラス Parameter, 整数変数クラス IntegerVariable0-1 整数変数クラス BinaryVariable, 式 クラス を要素ごとに設定できます. 以下の例では,3 個の変数 y[1], y[2], y[3],3 個の定数 b[1], b[2], b[3] を定義しています.:

S = Set(value=[1, 2, 3])
i = Element(set=S)
y = Variable(index=i)
b = Parameter(index=i)

Element の value キーワードを用いることにより,集合を経由せずに直接添字を定義することもできます. 次の例は,上の記述と同じ意味です.:

i = Element(value=[1, 2, 3])
y = Variable(index=i)
b = Parameter(index=i)

添字のキーワード引数 index には Element を指定するかわりに, その Element に対応する Set を指定することもできます. 次の例は,上の記述と同じ意味です.:

S = Set(value=[1, 2, 3])
y = Variable(index=S)
b = Parameter(index=S)

添字は複数導入することも可能です. 次の例では 6 個の変数 x[1,'p'], x[1,'q'], x[2,'p'], x[2,'q'], x[3,'p'], x[3,'q'] を定義しています.:

S = Set(value=[1, 2, 3])
T = Set(value=['p', 'q'])
i = Element(set=S)
j = Element(set=T)
x = Variable(index=(i,j))

一つの集合に対して複数の添字を定める事もできます. 次の例では 12 個の定数 a[1,'p','p'], a[1,'p','q'], a[1,'q','p'], a[1,'q','q'], a[2,'p','p'], a[2,'p','q'], a[2,'q','p'], a[2,'q','q'], a[3,'p','p'], a[3,'p','q'], a[3,'q','p'], a[3,'q','q'] を定義しています. 集合 T に対して 2 つの添字 j, k が定められています.:

S = Set(value=[1, 2, 3])
T = Set(value=['p', 'q'])
i = Element(set=S)
j = Element(set=T)
k = Element(set=T)
a = Parameter(index=(i,j,k))

添字を持つ対象を個別に記述する場合は,文字列の部分のみを 個別にクォート ' またはダブルクォート " で囲む必要があります.:

x[1,'p','q']

次の例はいずれも誤りです.:

x['1','p','q']
x[1,'p,q']

以下のようにクォートで囲まないと添字は自動展開され,一括して扱われます.(添字の自動展開機能):

x[i,j,k] >= 1

添字は,属する集合が整数値を取る場合には次のような演算子を用いることができます.

+ (加算)

- (減算)

* (乗算)

% (剰余)

/ (浮動小数除算)

// (整数除算)

** (冪)

次の例では,定数 a[1], a[2], a[3] に値 2, 4, 6 を設定しています.:

i = Element(value=[1, 2, 3])
a = Parameter(index=i)
a[i] = 2*i

次の例では,制約式 \(x_{2}+x_{4}+x_{6} \le 5\) を記述しています. 制約式の左辺を定義するために偶数番目の項のみの和を取得しています.:

i = Element(value=[1, 2, 3, 4, 5, 6])
x = Variable(index=i)
ieven = i%2==0
Sum(x[ieven], ieven) <= 5

次の例では,漸化不等式 \(x_{i} \le x_{i+1}\) を定義しています.:

i = Element(value=[1, 2, 3, 4])
x = Variable(index=i)
i4 = i!=4
x[i4] <= x[i4+1]