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

5.3 制約式クラスConstraint

 制約式はConstraintというクラスで表現されます.C++SIMPLEで表現可能な制約式は,等式制約(==を使用)及び等号付不等式制約(<=, >=を使用)の二種類です.等式制約に用いる演算子は=ではなく,==であることに注意してください.具体的に$x + y = 1$という制約式を定義するには次のように記述します.

x + y == 1;

 $x - 2y \le 0$という制約式を定義するには次のように記述します.

x - 2 * y <= 0;

 制約式自身の定義は必ずしも必要ではありませんが,以下の記述は上記と同じ意味です.解ファイルにおいて,制約式に対する双対変数等を取得したい場合には,制約式自身の定義を行うと,検索が容易です.

Constraint co;
co = x - 2 * y <= 0;

 等号の付かない不等式を取り扱う事はできません.次の記述は誤りです.

x - 2 * y < 0;

 複数の制約式を一度に定義するには,集合クラスSetと添字クラスElementを用います.以下の例では,3個の制約式$x_1 - 2y_1 \le 0$, $x_2 - 2y_2 \le 0$, $x_3 - 2y_3 \le 0$を一度に定義しています.

Set S;
S = "1 2 3";
Element i(set = S);
x[i] - 2 * y[i] <= 0;

 制約式自身の定義を行う場合には,以下のようになります.

Set S;
S = "1 2 3";
Element i(set = S);
Constraint co(index = i);
co[i] = x[i] - 2 * y[i] <= 0;

 不一致制約を表す演算子!=を用いることはできません.以下の記述は誤りです.

x + y != -1;

 ただし,アルゴリズムwcspを使用する際には不一致制約を用いることができます.

 バージョン10より導入されたSDPソルバ(lsdp, trsdp)では,対称行列の半正定値制約を取り扱う事ができます.次の例では対称行列Xの半正定値制約を記述しています.

SymmetricMatrix X((i, j));
X >= 0;

 対称行列>= 0を記述する事で,半正定値制約を表現できます.右辺には0以外のスカラー値を用いることもできます.この場合,右辺値は左辺行列の最小固有値を意味します.例えば,次の例は行列Xの最小固有値が2つまり,$X - 2E \succeq 0$であることを意味します.

X >= 2;

 不等号>=を逆向きに書く事はできません.例えば,次の記述は誤りです.

X <= 0;

 右辺値に行列を記述することはできません.例えば次の記述は誤りです.

SymmetricMatrix X((i, j));
SymmetricMatrix Y((i, j));
X >= Y;

 複数の半正定値制約を,一括して設定する事は可能です.

SymmetricMatrix X(index = n, (i, j));
X[n] >= 0;

 半正定値制約からは,solve()後に双対行列の値を取得することができます.下記の通り制約が定められているとします.

SymmetricMatrix X((i, j));
Constraint c;
c = X >= 0;

 このとき,solve()後に下記の通りsetDualMatrix関数を呼ぶことで,双対行列の値を得ることができます.

Parameter dM(index = (i, j));
dM.setDualMatrix(c);            //dMに双対行列の値が格納される

 ただし,Parameterの添字が属する集合とSymmetricMatrixの添字が属する集合が一致していない場合や,添字付きの半正定値制約を用いている場合,双対行列の取得機能は利用できません.例えば,下記の用法はいずれも誤りです.

Parameter dM(index = (i, k)); // 添字kの属する集合が異なる
dM.setDualMatrix(c); // 添字の集合が一致しないので不可
SymmetricMatrix X(index = k, (i, j));
Constraint c(index = k);
c[k] = X[k] >= 0;

Parameter dM(index = (i, j));
dM.setDualMatrix(c[0]);// 添字付きの半正定値制約は不可
Parameter dMs(index = (k, i, j));
dMs.setDualMatrix(c); // 添字の次元が一致しないので不可

 

 

上に戻る