数理最適化セミナーのご案内

5.9 添字クラスElement

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

Set S;
S = "1 2 3";
Element i(set = S);
Variable y(index = i);
Parameter b(index = i);

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

Set S;
Set T;
S = "1 2 3";
T = "p q";
Element i(set = S);
Element j(set = T);
Variable x(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が定められています.

Set S;
Set T;
S = "1 2 3";
T = "p q";
Element i(set = S);
Element j(set = T);
Element k(set = T);
Parameter a(index = (i, j, k));

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

y["1, p"] >= b["1, p"] + 3;

 また以下のようにダブルクォートで囲まないと添字は自動展開され,制約式が一括して複数定義されます.(添字の自動展開機能

y[i, j] >= b[i, j] + 3;

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

, (順序対)  + (和)  - (差)  / (商)  * (積)
% (余り)  ceil (切り上げ)  floor (切り下げ)

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

Set S = "1 2 3";
Element i(set = S);
Parameter a(index = i);
a[i] = 2 * i;

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

Set S;
S = "1 2 3 4 5 6";
Element i(set = S);
Variable x(index = i);
sum(x[i], (i, i % 2 == 0)) <= 5;

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

Set S = "1 2 3 4";
Element i(set = S);
Variable x(index = i);
x[i] <= x[i + 1], i != 4;

 

 

上に戻る