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

5.6 範囲演算関数sum, prod

 数式における$\displaystyle\sum$$\displaystyle\prod$に類する機能として,C++SIMPLEでは範囲演算関数として,sum関数とprod関数が提供されています.次の例では,制約式$\displaystyle\sum_{i=1}^3 x_i = 10$を記述しています.

Set S;
S = "1 2 3";
Element i(set = S);
Variable x(index = i);
sum(x[i], i) == 10;

 上の記述をsum関数を使わずに書くと次のようになります.

Set S;
S = "1 2 3";
Element i(set = S);
Variable x(index = i);
x[1] + x[2] + x[3] == 10;

 次の例では,制約式$\displaystyle\prod_{i=1}^3 x_i = 20$を記述しています.

Set S;
S = "1 2 3";
Element i(set = S);
Variable x(index = i);
prod(x[i], i) == 20;

 上の記述をprod関数を使わずに書くと次のようになります.

Set S;
S = "1 2 3";
Element i(set = S);
Variable x(index = i);
x[1] * x[2] * x[3] == 20;

 sum関数は複数の添字に対して適用する事もできます.次の例では,制約式$\displaystyle\sum_{i=1}^3 \sum_{j=1}^2 a_i b_j y_{ij} = 10$を記述しています.

Set S = "1 2 3";
Set T = "1 2";
Element i(set = S);
Element j(set = T);
Variable y(index = (i, j));
Parameter a(index = i);
Parameter b(index = j);
sum(a[i] * b[j] * y[i, j], (i, j)) == 10;

 次のように記述することも可能です.

Set S = "1 2 3";
Set T = "1 2";
Element i(set = S);
Element j(set = T);
Variable y(index = (i, j));
Parameter a(index = i);
Parameter b(index = j);
sum(sum(a[i] * b[j] * y[i, j], j), i) == 10;

 条件式を用いて,和や積を取る範囲を制限する事もできます.次の例では,制約式$\displaystyle\sum_{i=3}^5 x_i = 10$を記述しています.

Set S;
S = "1 2 3 4 5";
Element i(set = S);
Variable x(index = i);
sum(x[i], (i, i >= 3)) == 10;

 次の例では,制約式$\displaystyle\sum_{i\in T} x_{i} =10$$\displaystyle\sum_{i\notin T} x_{i} = 20$を記述しています.

Set S = "p q r s";
Set T(superSet = S);
T = "p r";
Element i(set = S);
Variable x(index = i);
sum(x[i], (i, i < T)) == 10;
sum(x[i], (i, i > T)) == 20;

 

 

上に戻る