最適化セミナーのご案内

5.11 添字クラスElement

 添字はElementというクラスで表現されます.添字とは数式$x_{i}$$i$に相当するものを意味します.集合クラスSetと併用することで,変数Variable,制約式Constraint,定数Parameter,整数変数IntegerVariable,式Expressionの次元を設定できます.添字と集合を対応させるには,引数setを用います.頭文字のsは小文字である事に注意してください.以下の例では,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);

 添字の引数indexにはElementを指定するかわりに,そのElementが含まれるSetを指定することもできます.次の例は,上の記述と同じ意味です.

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

 添字は複数導入することも可能です.次の例では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);
Variable x(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;

 

 

上に戻る