Mímisbrunnr知恵の泉

← 数理最適化 一覧

🎓 レベル:標準 | 重要度:B(標準)

📎 前提:不等式制約とKKT条件 | 関連:内点法入門

要点(BLUF)

概念 ── 制約を「罰」に変える

制約付き問題は KKT(不等式制約とKKT条件)で解けるが、無制約最適化(無制約最適化ニュートン法・準ニュートン法)の道具がそのまま使えると便利。そこで制約を 目的に足し込んで無制約化する。足し方が「外から」か「内から」かで2系統に分かれる。

ペナルティ法(外点法)

制約 gi(x)0g_i(x)\le0違反量に罰金を課す。二次ペナルティの例:

Pμ(x)=f(x)+μimax(0, gi(x))2P_\mu(x) = f(x) + \mu \sum_i \max\bigl(0,\ g_i(x)\bigr)^2

実行可能(gi0g_i\le0)なら罰金ゼロ、違反すると罰金が増える。μ\mu を大きくするほど違反が割に合わなくなり、最小化解は 実行可能領域の外側から境界へ近づく。μ\mu \to \infty で元問題の解に収束。

障壁法(内点法)

逆に、境界に近づくと急増する 障壁(バリア) を内部に張る。対数障壁:

Bμ(x)=f(x)μiln(gi(x))B_\mu(x) = f(x) - \mu \sum_i \ln\bigl(-g_i(x)\bigr)

gi(x)>0-g_i(x)>0(領域内部)でのみ定義され、境界 gi0g_i\to0+\to+\infty。だから解は 内部に留まりμ0\mu\to0 で境界の最適へ。これが内点法(内点法入門)そのもの。ペナルティが外から、障壁が内から境界に迫る対の関係。

graph LR
  A["制約付き min f s.t. g<=0"] --> B["ペナルティ: f + mu*違反^2 (外から)"]
  A --> C["障壁: f - mu*ln(-g) (内から)"]
  B --> D["mu -> 無限大 で境界へ収束"]
  C --> E["mu -> 0 で境界へ収束"]

Pythonでペナルティ法を見る

minx2\min x^2 s.t. x1x \ge 1(最適は境界 x=1x=1、最適値1)。二次ペナルティ x2+μ(1x)+2x^2 + \mu(1-x)_+^2 の停留点は、違反領域 x<1x<12x2μ(1x)=02x - 2\mu(1-x)=0 すなわち x=μ/(1+μ)x^\star = \mu/(1+\mu)μ\mu を強めると x1x^\star \to 1

print("min x^2 s.t. x>=1  (最適 x=1)")
print("ペナルティ f(x)=x^2 + mu*max(0,1-x)^2 の停留点 x*=mu/(1+mu)")
for mu in [1, 10, 100, 1000]:
    x_star = mu / (1 + mu)           # 違反側の停留点
    print(f"  mu={mu:>4}: x*={x_star:.4f}  (制約境界1へ外側=1未満から接近)")

実行結果:

min x^2 s.t. x>=1  (最適 x=1)
ペナルティ f(x)=x^2 + mu*max(0,1-x)^2 の停留点 x*=mu/(1+mu)
  mu=   1: x*=0.5000  (制約境界1へ外側=1未満から接近)
  mu=  10: x*=0.9091  (制約境界1へ外側=1未満から接近)
  mu= 100: x*=0.9901  (制約境界1へ外側=1未満から接近)
  mu=1000: x*=0.9990  (制約境界1へ外側=1未満から接近)

罰則 μ\mu110001\to1000 と強めると、解は 0.50.9090.9900.9990.5 \to 0.909 \to 0.990 \to 0.999実行不能側(x<1x<1)から境界 x=1x=1収束。有限の μ\mu では厳密には実行可能にならない(少し違反が残る)のがペナルティ法(外点法)の性質。これを嫌う場面では障壁法(常に実行可能)や 拡張ラグランジュ法を使う。

拡張ラグランジュ法(補足)

単純ペナルティは μ\mu\to\infty が必要で、大きな μ\mu数値的に不安定(ヘッセの条件数が悪化)。**拡張ラグランジュ法(ALM)**はペナルティにラグランジュ乗数項を加え、μ\mu を有限に保ったまま乗数を更新して厳密な実行可能解へ収束させる。実務の制約付きソルバーの主力の一つ。

数式の直観的意味

ペナルティ法と障壁法は、KKT 条件(不等式制約とKKT条件)を「連続変形」で近似していると見ると本質が見える。障壁問題の停留条件を書くと、相補性 λigi=0\lambda_i g_i=0λi(gi)=μ\lambda_i(-g_i)=\mu に緩み、μ0\mu\to0 で本来の相補性に戻る ── つまり μ\mu は「相補性をどれだけ緩めるか」のパラメータで、その解の軌跡が 中心パス内点法入門)。ペナルティ法も同様に、μ\mu\to\infty の極限で乗数 λi=2μmax(0,gi)\lambda_i = 2\mu \max(0,g_i) が KKT 乗数に収束する。だから両手法は「難しい制約を、解きやすい無制約問題の列で挟み込み、極限で真の最適へ」という緩和の思想(整数計画とは・LP緩和 とも通じる)の連続版。

⚠️ よくある誤解・落とし穴

関連ノート