Mímisbrunnr知恵の泉

← シミュレーション 一覧

🎓 レベル:発展 | 重要度:B(推奨)

📎 前提:最適化との連携(サンプル平均近似) | 関連:在庫・窓口のモデル化

要点(BLUF)

1. SAA との違い:ノイズ付き目的を逐次評価する

SAAは標本を固定して目的関数を決定的にしてから最適化しました。しかし、目的が離散事象シミュレーション第5章 離散事象シミュレーション 目次)のように「実行するたびに違う値を返す」場合、標本固定が難しい・各評価が高コストなことがあります。

シミュレーション最適化は、目的 f(x)=E[シミュ(x)]f(x) = E[\text{シミュ}(x)]ノイズ付きで逐次評価しながら、よい xx を探します。1回の評価が確率的なので、

2. 実装:ノイズ付き関数の最小化

真の目的 f(x)=(x3)2f(x)=(x-3)^2 が、観測時に標準正規ノイズで汚れているとします。各候補を30回評価して平均し、ランダム探索で最小点を探します。

import numpy as np

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

def noisy_f(x, r):
    return (x - 3)**2 + r.normal(0, 1)         # 真の値 + 観測ノイズ

best_x = None; best_val = np.inf
for it in range(2000):
    x = rng.uniform(-2, 8)                       # ランダムに候補を提案
    val = np.mean([noisy_f(x, rng) for _ in range(30)])   # 30回平均でノイズ低減
    if val < best_val:
        best_val = val; best_x = x

print(f"ランダム探索の最良 x = {best_x:.3f}  (真の最小 3.0)")
print(f"その推定目的値 = {best_val:.3f}")

出力:

ランダム探索の最良 x = 3.001  (真の最小 3.0)
その推定目的値 = -0.425

出力の意味:ノイズで汚れた評価しかできないのに、各点30回の平均化と探索で、最小点 x=3.001x=3.001(真の最小3.0)をほぼ正確に当てました。注目すべきは推定目的値が 0.425-0.425になっている点——真の最小値は0なのに。これは「2000候補×各30回平均の中で、たまたまノイズが下振れした点が選ばれる」選択バイアス(最適化の楽観バイアス)で、最良点の推定値は真値より低く出がち。最良 xx は正確でも、その目的値の推定は別の独立評価でやり直すべき、という実務的教訓です。

3. 実用的な手法

ランダム探索は素朴ですが、実用では評価予算を賢く使う手法が要ります。

応用例の典型が在庫の (s,S) 方策最適化(在庫・窓口のモデル化)——コスト関数がシミュレーションでしか測れないので、まさにシミュレーション最適化の対象です。

数式の直観的意味

シミュレーション最適化は「かすみがかった地形を、霧の中で歩いて最低地点を探す」操作です。各地点の標高(目的値)が霧(ノイズ)でぼやけるので、その場で何度も測って平均し(霧を薄め)、地形の傾きを推定して進む。難しさは評価予算の配分——霧を薄めるのに同じ点で測りまくれば探索が進まず、探索を急げば各点の標高が当てにならない。最良点の目的値が楽観的に出る(0.425-0.425)のは、「多数のぼやけた測定値の最小を選ぶと、ノイズの下振れを拾う」という統計的必然(順序統計量の偏り)。だから「最良の設定を選ぶ」ことと「その性能を正しく見積もる」ことは別の評価に分ける——これは交差検証で最良モデルの性能を別データで測るのと同じ発想です。

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

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

本文のノイズ付き関数の平均化ランダム探索(default_rng(63)、最小点 x=3.001 を復元)。対象系は在庫・窓口のモデル化

関連ノート