Mímisbrunnr知恵の泉

← シミュレーション 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:モンテカルロ積分の原理 | 最適化:サンプル平均近似(SAA)

要点(BLUF)

1. 確率最適化と SAA

不確実性 ξ\xi の下で期待コストを最小化したい問題

minx f(x)=Eξ[g(x,ξ)]\min_x\ f(x) = E_\xi[g(x, \xi)]

を考えます。期待値 f(x)f(x) が閉形式で書ければ普通の最適化ですが、gg が複雑だと積分が解けません。SAA は、ξ\xi の標本 ξ1,,ξN\xi_1,\dots,\xi_N を一度引いて固定し、経験的な目的関数

f^N(x)=1Ni=1Ng(x,ξi)\hat{f}_N(x) = \frac{1}{N}\sum_{i=1}^N g(x, \xi_i)

を最小化します。f^N\hat{f}_Nモンテカルロ推定なので ff の不偏推定。NN \to \infty で最適解・最適値が真の問題に収束します(SAA の一致性)。

2. 実装:新聞売り子問題

新聞売り子問題:需要 DD が不確実なとき、何部仕入れるか。1部の利益 pcp-c(売れた場合)、売れ残りは仕入原価 cc の損。最適発注量は臨界比 (pc)/p(p-c)/p の需要分位点、という解析解があります(最適化の本拠)。SAA がこれを標本から復元するか見ます。

import numpy as np
from scipy import stats

# 乱数シードを固定
rng = np.random.default_rng(62)

p, c = 10, 6                                   # 売価・原価
crit = (p - c) / p                            # 臨界比 = 0.4
true_opt = stats.poisson.ppf(crit, 50)         # 真の最適(需要~Poisson(50)の分位点)
print(f"臨界比 = {crit},  真の最適発注量 = {true_opt}")

N = 5000
demand = rng.poisson(50, N)                    # 需要標本を一度引いて固定
def empirical_profit(q):                       # 経験的期待利益
    return (p*np.minimum(q, demand) - c*q).mean()

qs = np.arange(30, 70)
profits = np.array([empirical_profit(q) for q in qs])
saa_opt = qs[profits.argmax()]
print(f"SAA 最適発注量 = {saa_opt},  SAA 期待利益 = {profits.max():.2f}")

出力:

臨界比 = 0.4,  真の最適発注量 = 48.0
SAA 最適発注量 = 48,  SAA 期待利益 = 172.34

出力の意味:解析解(臨界比0.4に対応する需要分位点)の最適発注量48を、SAA が需要標本だけから正確に復元しました。SAA は「需要の分布を知らなくても、需要の標本さえあれば最適化できる」点が実務的に強力。新聞売り子は解析解があるので検証に使えましたが、多段階・多制約で解析解が無い問題でこそ SAA の真価が出ます。

3. SAA の使い方と注意

境界:SAA の収束論・最適性ギャップの理論・確率計画法は数理最適化の本拠(サンプル平均近似(SAA)確率計画法)。ここは「モンテカルロで目的関数を評価して最適化に渡す」というシミュレーション側の手続きに集中します。

数式の直観的意味

SAA は「期待値の最小化を、サンプルの平均の最小化にすり替える」操作です。本来の目的 E[g(x,ξ)]E[g(x,\xi)] は無限個のシナリオの平均ですが、それを有限 NN 個の代表シナリオの平均で近似し、その上で最適化する。モンテカルロ積分(モンテカルロ積分の原理)が「固定した xx での期待値」を標本平均で推定したのに対し、SAA は「xx を動かしながら、各 xx での期待値を同じ標本で推定し続ける」。標本を固定するのが鍵で、こうすると f^N(x)\hat{f}_N(x)xx決定的な関数になり、通常の最適化アルゴリズム(凸なら勾配法・線形計画)がそのまま使える。新聞売り子で最適量が分位点になるのは、利益関数の「売り切れる確率」と「余る確率」が臨界比で釣り合う点だから——SAA はこの釣り合いを、需要標本の経験分位点として再発見しています。

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

対応シミュレーション参照

本文の新聞売り子 SAA(default_rng(62)、真の最適48を復元)。理論はサンプル平均近似(SAA)へ。

関連ノート