最適化セミナーのご案内

5.6 範囲演算関数sum, prod

 数式における$\displaystyle\sum$$\displaystyle\prod$に類する機能として,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;

 

 

上に戻る