<一覧に戻る

確率アルゴリズムの基礎(例: モンテカルロ法)

確率アルゴリズムは、確率的な手法を用いて問題を解くアルゴリズムです。その中でもモンテカルロ法は、特に数値計算や統計において広く利用されています。モンテカルロ法は、ランダムなサンプルを生成し、それを使って数値的な結果を近似する手法です。

モンテカルロ法の基本概念

モンテカルロ法の基本的なアイデアは、ランダムな試行を行い、その結果から全体の特性を推測することです。この手法は、特に次のような問題に役立ちます。

  • 確率的な問題を解く
  • 複雑な積分を近似する
  • 最適化問題を解決する

モンテカルロ法の実装例

ここでは、モンテカルロ法を用いて円の面積を近似する例を示します。この例では、1辺の長さが2の正方形の中に円を描き、その円にランダムな点を打ちます。円の中に点が落ちる確率から円の面積を近似します。

円の面積は ( \pi r^2 ) であり、ここでは半径 ( r = 1 ) の円を考えます。したがって、円の面積は ( \pi ) です。

サンプルコード

以下に、円の面積をモンテカルロ法で近似するPythonのコードを示します。

import random
import matplotlib.pyplot as plt

def monte_carlo_pi(num_samples):
    inside_circle = 0
    x_inside = []
    y_inside = []
    x_outside = []
    y_outside = []

    for _ in range(num_samples):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)

        if x**2 + y**2 <= 1:
            inside_circle += 1
            x_inside.append(x)
            y_inside.append(y)
        else:
            x_outside.append(x)
            y_outside.append(y)

    pi_estimate = (inside_circle / num_samples) * 4
    return pi_estimate, x_inside, y_inside, x_outside, y_outside

# サンプル数を設定
num_samples = 10000

# モンテカルロ法により円の面積を近似
pi_estimate, x_inside, y_inside, x_outside, y_outside = monte_carlo_pi(num_samples)

# 結果の表示
print(f"Estimated value of Pi: {pi_estimate}")

# プロット
plt.figure(figsize=(8, 8))
plt.scatter(x_inside, y_inside, color='blue', s=1)
plt.scatter(x_outside, y_outside, color='red', s=1)
plt.title(f'Monte Carlo Simulation of Pi (Samples: {num_samples})')
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(-1, 1)
plt.ylim(-1, 1)
plt.gca().set_aspect('equal', adjustable='box')
plt.show()

コード解説

  1. ライブラリのインポート:
  2. random: ランダムな数値を生成するために使用します。
  3. matplotlib.pyplot: 結果を可視化するためのライブラリです。

  4. 関数の定義:

  5. monte_carlo_pi(num_samples): モンテカルロ法を使って円の面積を近似する関数です。
  6. inside_circle: 円の中に落ちた点の数をカウントします。
  7. x_insidey_inside: 円の中に落ちた点の座標を格納するリストです。
  8. x_outsidey_outside: 円の外に落ちた点の座標を格納します。

  9. ランダムな点の生成:

  10. 指定した数のサンプルを生成し、各点が円の中にあるかどうかを判定します。

  11. 円の面積の近似:

  12. 円の中に落ちた点の割合を用いて、円の面積を近似します。

  13. 結果の表示:

  14. 推定された円周率の値を表示します。
  15. matplotlibを使用して、円の中に落ちた点と外に落ちた点をプロットします。

まとめ

モンテカルロ法は、確率的手法を用いて数値的な問題を解く強力なツールです。この手法を使うことで、複雑な計算を簡略化し、近似的な解を得ることができます。上記の例を通じて、基本的なモンテカルロ法の実装を理解できたかと思います。この手法は、他の多くの分野にも応用可能ですので、ぜひ試してみてください。

出力結果: