5.3 制約式クラスConstraint
制約式はConstraint
というクラスで表現されます.C++SIMPLEで表現可能な制約式は,等式制約(==
を使用)及び等号付不等式制約(<=
, >=
を使用)の二種類です.等式制約に用いる演算子は=ではなく,==であることに注意してください.具体的にという制約式を定義するには次のように記述します.
x + y == 1;
という制約式を定義するには次のように記述します.
x - 2 * y <= 0;
制約式自身の定義は必ずしも必要ではありませんが,以下の記述は上記と同じ意味です.解ファイルにおいて,制約式に対する双対変数等を取得したい場合には,制約式自身の定義を行うと,検索が容易です.
Constraint co; co = x - 2 * y <= 0;
等号の付かない不等式を取り扱う事はできません.次の記述は誤りです.
x - 2 * y < 0;
複数の制約式を一度に定義するには,集合クラスSet
と添字クラスElement
を用います.以下の例では,3個の制約式,
,
を一度に定義しています.
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 >= 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); // 添字の次元が一致しないので不可
上に戻る