最適化セミナーのご案内

5.9 ベクトルクラスVector

 ベクトルはVectorというクラスで表現されます.ベクトルは行列の特殊なかたち,すなわち,$n\times 1$の行列と同等なものとして扱います.$n\times 1$の行列に対して合法な行列演算は$n$次元ベクトルに対しても有効です.対称行列や一般行列と同様に,ベクトル自体の定義と,ベクトルの構造の定義は別々に行う必要があります.例えば,次のような三次元のベクトルを定義したいとします.

\[v = \left( \begin{array}{c} x \\ 2 + y \\ z \end{array} \right)\]

 この場合,以下のように記述します.

Set S="1 2 3";
Element i(set=S);
Vector v(i);
Variable x,y,z;
v["1"] = x;
v["2"] = 2+y;
v["3"] = z;

 iはベクトルの添字です.Matrixとは異なり,二重括弧は不要でVector v(i)のように記述します.

 複数のベクトルを一括して定義することもできます.例えば,次の例ではベクトル$v_{1}, \ldots, v_{10}$を一括して定義しています.

Set S="1 2 3";
Element i(set=S);
Set N="1 .. 10";
Element n(set=N);
Vector v(index=n,i);

 ベクトル自体の添字nにはindex=を付ける必要があります.個別のベクトル内部の添字iにはindex=を付与してはいけません.

 ここでは添字付けられたベクトルをベクトル族とよぶことにします.Matrixクラスと同様に,ベクトル族の添字を指定してベクトルを参照する場合には丸括弧().at()関数を使い,ベクトルの成分を参照する場合には角括弧[]を使います.

 

 SIMPLEでは$n$次元ベクトルと$n\times 1$の行列を同等に扱います.また,1次元ベクトルと$1 \times 1$の行列とスカラーを同等に扱います.行列やベクトルの型が整合すれば,行列同士の演算,ベクトル同士の演算,行列とベクトルの演算が可能です.

 

 零ベクトルや全ての要素が1のベクトルを表現したい場合には,zeros()関数やones()関数を使います.

Set S="1 2 3";
Element j(set=S);
Vector v(j);
v <= ones(S);        // 全ての要素が1のベクトル
v >= zeros(S);       // 零ベクトル

 

 diag(const Vector&)関数を使えばVectorを行列の対角に並べた正方行列(対角行列)を作ることができます.

Set S="1 2 3";
Element i(set=S);
Element j(set=S);
Vector v(j);
Matrix X((i,j));
X = diag(v);

 1次元のVector$1\times 1$Matrixをスカラーに変換したい場合には,scalar(const Matrix&)関数を使います.

Set S="1";
Element i(set=S);
Element j(set=S);
Vector v(j);
Matrix X((i,j));
Expression e,d;
e = scalar(v);  // ベクトルをスカラーに変換
d = scalar(X);  // 行列をスカラーに変換

 

 次はMatrixクラスとVectorクラスを用いて二次計画問題を記述した例です.

Set S;
Set T;
Element i(set=S);
Element j(set=T);
Element k(set=T);
Vector x(j);            // 変数
Variable v(index=j);
x[j] = v[j];
Matrix V((j,k));        // 定数
Matrix A((i,j));        // 定数
Vector b(i);            // 定数
Vector c(j);            // 定数

Objective f(type=minimize);
f = 0.5* inprod(x,V*x) + inprod(c, x);
A*x == b;
x >= 0;

 

 次は上のモデルに対するデータファイルの具体例です.

S = 1 .. 2;
T = 1 .. 4;
V =
[1,1] 1.0 [1,2] 0.5 [1,3] 0.0 [1,4] 0.0
[2,1] 0.5 [2,2] 1.0 [2,3] 0.0 [2,4] 0.0
[3,1] 0.0 [3,2] 0.0 [3,3] 0.0 [3,4] 0.0;
A =
[1,1]  1 [1,2]  2 [1,3]  1 [1,4]  0
[2,1]  1 [2,2]  1 [2,3]  0 [2,3]  1;
b = [1] 7 [2] 5;
c = [1] -10 [2] -11 [3]  0 [4]  0;

 

 行列クラスやベクトルクラスを用いて記述したモデルに対してshowSystem()関数を呼ぶと行列の成分ごとに展開された制約式が表示されますので,記述したモデルが正しく記述できているか確認することができます.


 

 

上に戻る