randomdistribution.py 技術ドキュメント

プログラムの動作

randomdistribution.py は、仮想的な多数の「人物」(エージェント)が持つ資産がランダムな再分配プロセスを経てどのような統計的分布を示すかをシミュレーションし、可視化するPythonプログラムです。主に経済学や統計力学における富の分布モデルを単純化した形でデモンストレーションすることを目的としています。

プログラムの主な機能:

  1. 初期化: 指定された人数 (npersons) の各エージェントに、それぞれ平均資産 (value) と同額の初期資金を割り当てます。

  2. ランダムな再分配: 各シミュレーションステップ(イテレーション)において、各エージェントの資産を 0 から value 未満の範囲でランダムに再設定します。その後、システム全体の総資産が初期値と等しくなるように、各エージェントの資産をスケーリングして正規化します。

  3. リアルタイム可視化: シミュレーションの進行に応じて、matplotlib を用いて以下の3種類のグラフをリアルタイムで更新・表示します。

    • 各エージェントが持つ現在の資産の棒グラフ。

    • 資産の少ない順にソートされた各エージェントの資産の棒グラフ。

    • 現在の資産分布を示すヒストグラムと、比較のための理論的な指数分布関数。

  4. パラメータ設定: コマンドライン引数を通じて、人数、平均資産、最大イテレーション数、グラフ更新間隔、分布関数のメッシュ数などの主要なシミュレーションパラメータを設定できます。

解決する課題:

このプログラムは、ランダムな相互作用(ここでは資産の再割り当て)が繰り返されるシステムにおいて、最終的にどのような統計的平衡状態(分布)が形成されるかを視覚的に理解するのに役立ちます。特に、単純なランダムプロセスが指数分布という特徴的な分布を生み出す現象を、直感的に観察できる形で提示します。

原理

このシミュレーションは、多数のエージェントがランダムなプロセスを通じて資産を再分配するモデルに基づいています。

アルゴリズムの概要:

  1. 初期状態: npersons 人の各エージェント i は、初期資産 v_i = value を持ちます。システム全体の総資産は \(V_{total} = \text{npersons} \times \text{value}\) です。

  2. イテレーションごとの資産再設定: 各イテレーションにおいて、各エージェント ip の資産 v[ip] は、random.random() * value によって 0 から value 未満の範囲でランダムに再設定されます。

  3. 総資産の維持: 新しいランダムな資産割り当ての後、一時的な総資産 sum が計算されます。この sum は初期の総資産 \(V_{total}\) とは異なる可能性があります。 そのため、すべてのエージェントの資産を、元の総資産 \(V_{total}\) に一致するようにスケーリングします。スケーリング係数 k は次のように計算されます。 $\(k = \frac{\text{value} \times \text{npersons}}{\text{sum}}\)\( そして、各エージェントの新しい資産 `v[ip]` は \)v[ip] \leftarrow v[ip] \times k$ によって更新されます。これにより、各イテレーションでシステムの総資産が一定に保たれます。

  4. 分布関数の計算: 一定の間隔で、現在のエージェントの資産分布がヒストグラムとして計算されます。資産の最大値 vmax に基づいて nfx 個の区間に分割され、各区間に入るエージェントの数から頻度が計算されます。

理論的な指数分布:

このシミュレーションで最終的に近づくことが期待される理論的な分布は、指数分布です。これは、多数のランダムな交換が行われるエージェントベースのモデル(例えば、コル=チャタジーモデルのような富の再分配モデル)において、平衡状態として現れる確率分布として知られています。

プログラム内では、この理論分布は以下の式で表されます。

\[f(x) = A \cdot \exp(-b \cdot x)\]

ここで、\(x\) は資産の量を表し、定数 \(A\)\(b\) はシミュレーションのパラメータによって決定されます。 プログラムのコードでは、以下の関係が用いられています。

\[b = \frac{1}{\text{value}}\]
\[A = \text{npersons} \times b = \frac{\text{npersons}}{\text{value}}\]

この形式は、平均 \(\mu = \text{value}\) の指数分布の確率密度関数 \(P(x) = \frac{1}{\mu} e^{-x/\mu}\) に、総人数 npersons を掛けた形に対応します。これは、総人数に対する期待される頻度分布を示しています。

必要な非標準ライブラリとインストール方法

このプログラムは、グラフ描画のために matplotlib ライブラリを使用しています。これはPythonの標準ライブラリではないため、別途インストールが必要です。

pip コマンドを使用してインストールできます。

pip install matplotlib

必要な入力ファイル

randomdistribution.py プログラムは、実行に際して特別な入力ファイルを必要としません。すべての設定はコマンドライン引数またはプログラム内のデフォルト値によって行われます。

生成される出力ファイル

randomdistribution.py プログラムは、シミュレーション結果をファイルとして保存しません。結果はすべてmatplotlib を使用してGUIウィンドウにリアルタイムでグラフとして表示されます。

コマンドラインでの使用例 (Usage)

プログラムは、以下の形式でコマンドライン引数を取ります。引数を指定しない場合、デフォルト値が使用され、同時に使用方法が表示されます。

python randomdistribution.py npersons value(average) n(maxiteration) n(plotinterval) n(distribution func)

引数の説明:

  • npersons: シミュレーションに参加する人物の数(エージェントの数)。整数。

  • value(average): 各人物が初期に持つ平均資産額。また、ランダム割り当ての範囲の上限としても使われます。整数。

  • n(maxiteration): シミュレーションの最大イテレーション数。整数。

  • n(plotinterval): グラフを更新するイテレーションの間隔。この値ごとにグラフが再描画されます。整数。

  • n(distribution func): 分布関数(ヒストグラム)を計算する際の、資産値のメッシュ数(区間数)。整数。

コマンドラインでの具体的な使用例

以下のコマンドは、200 人のエージェント、平均資産 50、最大 10000 イテレーション、100 イテレーションごとにグラフ更新、分布関数のメッシュ数 21 でシミュレーションを実行します。

python randomdistribution.py 200 50 10000 100 21

実行結果の説明:

このコマンドを実行すると、matplotlib によって生成されたグラフィックウィンドウが表示されます。このウィンドウは3つのサブプロットから構成されます。

  1. 上段のグラフ: 各エージェント(X軸のインデックス)が持つ現在の資産(Y軸)を棒グラフで示します。赤色の点線は平均資産 value を表します。

  2. 中段のグラフ: 資産の少ない順にソートされた各エージェントの資産を棒グラフで示します。こちらも赤色の点線は平均資産 value を表します。時間が経つにつれて、資産の不均衡が大きくなる傾向が見られます。

  3. 下段のグラフ: エージェントの資産の分布関数(ヒストグラム)を青い線で表示します。赤色の点線は、シミュレーションパラメータから導かれる理論的な指数分布関数を示します。シミュレーションが進むにつれて、青い線が赤い点線に近づいていく様子が観察できます。

グラフは 100 イテレーションごとに更新され、シミュレーションの進行状況と分布の変化をリアルタイムで確認できます。最終イテレーションに達した後、またはウィンドウを閉じると、プログラムは「Press ENTER to exit>>」と表示してユーザーの入力を待ち、エンターキーが押されると終了します。