4. トラブルシューティング#

4.1. 説明#

数理最適化モデルの定式化の中でしばしば生じえる,代表的なトラブルシューティングについて以下に述べる.

4.1.1. 等式制約条件式と代入式#

数ある伝統的なプログラミング言語においては, 等号を一つ使った式は代入式として解釈される. 例えば次の疑似コードは,「x3 を代入する処理」を表している.

x = 3;

数理最適化モデルの文脈でも代入処理は定式化の中で用いるため, 上記のコードもまた頻繁に表れる.

一方,モデリング言語 SIMPLE で等式制約としての制約条件式を記述する場合では,等号を二つ使った式として次のように表現する. 例えば次は,「x3 に等しいという等式制約」を表している.

x == 3;

以上のことはモデリング言語を扱う上で基本的な事柄の一つであるが, 代入式と等式制約式とを誤って書き分けてしまった場合に何が起こるかを考えてみる.

等式制約式として書くべきところを代入式で書いてしまった場合, その変数は何も制約が課されていない自由変数になってしまう.

すると,目的関数を最適化するために際限なく大きくなるか小さくなりやすい. つまり目的関数値が最大化ならば非常に大きい値,最小化ならば小さい値が得られることになる. 場合によっては計算時間が極端に増大してしまったりする.

単純ではあるが見落としがちなトラブルといえよう. 目的関数値の挙動が振り切れるようならば,代入式になってしまっていないか確認するとよい.

4.1.2. 等号を含まない不等式制約条件式#

数理最適化モデルでは等号を含まない不等式制約条件式を書くことは滅多にない. 特にモデリング言語 SIMPLE では書くことを許容していない. このことから,等号を含まない不等式制約を誤って書いた場合には,そもそも最適化計算が開始される前にエラー判定される.

Tip

理由としては等号を含まないために,\(L < x < U\) などという制約条件式があったら,\(x\) に上限・下限はあるものの幾らでもそれらに近づけるため,最大・最小がないからである. これは非常に単純化した説明であり,もう少し詳しい解説は small ε に委ねる.

4.1.2.1. C++SIMPLE#

例えば次のコードを書いたとしよう.

1Variable x;
2Objective(type=minimize) f;
3f = x;
4x > 0;

このモデルをビルドすると,コンパイラからの次のエラーメッセージが返される.

二項演算子 '>':  'Variable' の左オペランドを扱う演算子が見つかりません (または変換できません)

これは言語レベルで「等号を含まない不等式制約条件式」が扱えないことを述べている.

4.1.2.2. PySIMPLE#

例えば次のコードを書いたとしよう.

1from pysimple import Problem, Variable
2
3p = Problem(type=min)
4x = Variable()
5p += x > 0

このモデルを実行すると,次のエラーメッセージが返される.

TypeError: unsupported operand type(s) for >: 'Variable' and 'int'

これもまた言語レベルで「等号を含まない不等式制約条件式」が扱えないことを述べている.

4.2. 関連#