🎓 レベル:標準 | 重要度:A(必須)
📎 前提:モデリングの作法・整数計画とは・LP緩和 | 関連:スケジューリング・配送のモデル化
要点(BLUF)
- 現実の 論理条件(「もし〜なら」「どちらか一方」「固定費用」)は、0/1 変数とビッグMで線形制約に翻訳できる。
- ビッグM法:大きな定数 で、バイナリ変数が0/1のとき制約を有効化/無効化する。
- は 必要十分に大きく、しかし大きすぎない値に取る(緩和が緩み、数値不安定になるため)。
概念 ── 論理を線形に翻訳する
整数計画(整数計画と組合せ最適化 章目次)の強みは、連続変数では書けない 論理条件を 0/1 変数で表せること。鍵は「条件が成立するときだけ効く制約」を、バイナリ変数 と大きな定数 で作る ビッグM法。
代表的な定式化パターン
固定費用(fixed charge)
「生産するなら固定費 がかかる」。 なら生産可、 なら を強制:
なら で生産ゼロ、 なら (実質上限なし)で固定費 を払う。
either-or(どちらか一方)制約
「制約A または 制約B の少なくとも一方を満たす」。バイナリ で切り替える:
なら制約Aが有効(Bは で緩和され無効)、 なら逆。
含意(if-then)
「 ならば 」のような含意は、 と を組み合わせて表す。論理の「ならば」を2本の線形制約に分解する。
graph TD A["現実の論理条件"] --> B["0/1変数 y を導入"] B --> C["固定費用: x <= M*y"] B --> D["either-or: 片方をM*yで緩和"] B --> E["if-then: 含意をM*(1-y)で表現"] C --> F["線形な整数計画(MILP)"] D --> F E --> F
Pythonで固定費用モデルを解く
製品A・Bの利益は /個。だが生産するには固定費 がかかる。機械時間 、材料 。固定費を引いた 純利益を最大化する。
import pulp
p = [40, 30] # 単位利益
f = [150, 100] # 固定費(生産する場合のみ)
M = 100 # ビッグM (生産量の上限の目安)
prob = pulp.LpProblem("fixed_charge", pulp.LpMaximize)
x = [pulp.LpVariable(f"x{i}", lowBound=0) for i in range(2)] # 生産量
y = [pulp.LpVariable(f"y{i}", cat="Binary") for i in range(2)] # 生産するか
prob += pulp.lpSum(p[i]*x[i] for i in range(2)) - pulp.lpSum(f[i]*y[i] for i in range(2))
prob += 2*x[0] + x[1] <= 120 # 機械時間
prob += x[0] + x[1] <= 100 # 材料
for i in range(2):
prob += x[i] <= M * y[i] # ビッグM: x>0 なら y=1(固定費発生)
prob.solve(pulp.PULP_CBC_CMD(msg=0))
print(f"純利益 = {pulp.value(prob.objective):.0f}")
print(f"生産量 x = {[x[i].value() for i in range(2)]}")
print(f"生産フラグ y = {[y[i].value() for i in range(2)]}")
実行結果:
純利益 = 2950
生産量 x = [20.0, 80.0]
生産フラグ y = [1.0, 1.0]
両製品を生産()し、。粗利益 から固定費 を引いて純利益 2950。ビッグM制約 が「生産量が正なら が強制され固定費を払う」という論理を正しく表現している。もし固定費が高すぎれば、片方を (生産せず固定費回避)にする解が選ばれる。
数式の直観的意味
ビッグM法の本質は「バイナリ変数で制約を オン/オフするスイッチ」を作ること。 は「制約を無効化するのに十分大きい」値で、 のとき が事実上無限大になり制約が消える。注意点は、 が 大きすぎると LP 緩和(整数計画とは・LP緩和)が緩むこと:緩和の上界が甘くなり、分枝限定(分枝限定法)の枝刈りが効かず遅くなる。さらに数値計算上も、巨大な は丸め誤差で「ほぼ0の 」を許してしまう。だから は 問題から導かれる最小の妥当な上界(ここでは生産量の物理的上限)に取るのが鉄則。可能なら、ビッグMを使わない強い定式化(凸包に近い定式化・指示制約)が望ましい。良い定式化は、同じ問題でも解く速さを桁で変える ── モデリングは「解けるか」だけでなく「速く解けるか」を決める。
⚠️ よくある誤解・落とし穴
- を無闇に大きくしない:緩和が緩み、分枝限定が遅くなり、数値不安定になる。問題固有の上界を使う。
- 「 ならば 」は片側のみ強制: は を保証するが、 でも はあり得る(固定費だけ払う無駄解は目的が排除する)。
- 厳密な不等式 は書けない:MILP は閉じた不等式のみ。 など微小量で近似する場合がある。
- 論理制約が増えると非凸性(組合せ)が増し、解くのが難しくなる。必要最小限に。
関連ノート
- 前提:モデリングの作法・整数計画とは・LP緩和
- 適用(スケジューリング):スケジューリング・配送のモデル化
- 解法:分枝限定法
- ツール:実装ツールの使い分け
- 章のハブ:応用とモデリング 章目次