以下の内容はhttps://pydocument.hatenablog.com/entry/2023/04/13/000204より取得しました。


Pythonでモンテカルロシミュレーション: SimPyの基本と活用

モンテカルロ法は、乱数を用いて数値計算やシミュレーションを行う手法の総称です。確率的な現象の解析や、解析的に解くことが難しい問題の近似解を求める際に用いられます。

[PR]

click.linksynergy.com

SimPyとは

SimPyは、Pythonで離散事象シミュレーションを行うためのライブラリです。プロセス間の相互作用やリソースの共有など、複雑なシステムの振る舞いをモデル化し、シミュレーションすることができます。モンテカルロ法のような、乱数を用いたシミュレーションにも利用できます。

SimPyのインストール

SimPyはpipコマンドで簡単にインストールできます。

pip install simpy

モンテカルロシミュレーションの実装

以下のようなルールのサイコロゲームのシミュレーションをPythonで実装していきます。

ルール

  1. サイコロを1回振る
  2. 出目に応じて得点を計算する
    • 1が出たら-1点
    • 2か3が出たら+1点
    • 4, 5, 6が出たら+2点
  3. 上記を多数回繰り返し、最終的な得点の分布を確認する
出目 得点
1 -1
2 +1
3 +1
4 +2
5 +2
6 +2

基本的な実装

まず、SimPyを使わずに、基本的なロジックを実装します。

import random

def roll_dice():
    return random.randint(1, 6)

def calculate_score(number):
    if number == 1:
        return -1
    elif number <= 3:
        return 1
    else:
        return 2

def simulate_game(num_trials):
    total_score = 0
    for _ in range(num_trials):
        total_score += calculate_score(roll_dice())
    return total_score

final_score = simulate_game(1000)
print(f"Final score after 1000 trials: {final_score}")
  • random.randint(1, 6) で1から6のサイコロの目をシミュレートします。
  • calculate_score関数で出目に応じた得点を計算します。
  • simulate_game関数で指定回数シミュレーションを繰り返し、総得点を計算します。

SimPyを使った実装

次に、SimPyを用いて、時間経過の概念を取り入れ、より現実に近いシミュレーションを行います。

import simpy
import random

def dice_game(env, num_trials):
    total_score = 0
    for i in range(num_trials):
        yield env.timeout(1)  # 1単位時間経過
        number = random.randint(1, 6)
        total_score += calculate_score(number)
    print(f"Final score after {num_trials} trials: {total_score}")

env = simpy.Environment()
env.process(dice_game(env, 1000))
env.run()
  • simpy.Environment() でシミュレーション環境を作成します。
  • env.timeout(1) で1単位時間の経過を表現します (この時間は仮想的なものです)。
  • env.process() でシミュレーションのプロセス (ここでは dice_game) を登録します。
  • env.run() でシミュレーションを実行します。

試行回数を増やすほど、得点の分布は特定の範囲に収束します(大数の法則)。複雑な確率的システム(待ち行列、在庫管理など)のシミュレーションに応用可能です。

まとめ

モンテカルロ法は、乱数を用いて様々な問題を解決するための強力な手法です。SimPyを組み合わせることで、Pythonで効率的にシミュレーションを実装できます。今回のサイコロゲームの例は基本的なものですが、より複雑な問題にも応用可能です。

最後にPythonの学習に利用できるUdemy iconのサイトを紹介します。ぜひ活用ください。

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

モンテカルロ法によるリアル・オプション分析 事業計画の戦略的評価 [ 大野薫 ]




以上の内容はhttps://pydocument.hatenablog.com/entry/2023/04/13/000204より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14