4. Big M#

4.1. 説明#

十分大きな正定数値 \(M\) を Big M という. 自由変数 を想定した上下限値を仮定したい場合に考えることが多い.

4.1.1. Big M を短絡的に設定しないこと#

危険

Big M の \(M\) は十分に大きいということで, じゃあ大きくとってやろうと言って,\(M = 100000000000000000\) と いうような値を設定することは,数値計算においてはまず避けるべき危険な設定である.

Big M それ自体はモデルの中に簡単に複数導入できるが, 問題の数値スケールと複数入れた Big M のスケールとがバラバラになる場合には, 定式化の スケーリング が悪く,数値計算時に大変な負荷がかかるおそれがあるためである.

4.1.2. tolerance との関連#

数値計算という性質上ある程度の違反を許容して求解する (この許容範囲を tolerance (トレランス) と呼ぶ) ことは暗黙の前提となっている. もし問題に非常に大きな数が定義されている場合, tolerance の範囲内では正常に解けていても,計算結果が不可解になるケースが発現しやすくなる. 以下にその一例を与える.

4.1.2.1. #

1Minimize f = 1e+10 * x;
2x >= 0;

この問題は数学的には \(f(x)\geq 0\) で常に非負であり,最小値は \(0\) である. しかし数値計算として扱う場合には,次に述べるように tolerance に注意しなければならない.

今,tolerance が 1.0e-8 で,変数 x の値が -1.0e-10 と得られたとしよう. すると tolerance の範囲では x >= 0 という制約を満たしていることになるので, x = -1.0e-10 は数値的に許容されて,実行可能解となる.

しかし目的関数 fx の値を代入すると, f = -1 となり,直感的にはあり得ない解が得られていることになる.

1e+10 という非常に大きな数が,数値的に \(0\) に非常に近い値を拾い上げてしまうのである. このような大きな数は定式化を行う上では Big M の設定で混入しやすいため, 不必要に大きな数を設定しないように注意する必要がある.

4.2. 関連#