「シミュレーション」とは
シミュレーション(simulation)とは、現実の対象や現象をそのまま実験する代わりに、対象の特徴を表したモデルを作り、そのモデルに条件を与えて動かすことで、どのような結果になるかを調べる方法です。
例えば、
- レジに客がどのくらい並ぶか
- 道路でどのように渋滞が発生するか
- 地震が起きたとき建物がどのように揺れるか
- 将来の気温や降水量がどのように変化するか
- 集金するときおつりをどれだけ用意すればよいか
といった問題を考えるとき、現実に何度も実験することが難しい場合があります。このような場合に、現実の特徴をモデルとして表し、条件を変えながら結果を調べます。
モデル化とシミュレーション
シミュレーションを行うためには、まず現実の対象をモデル化する必要があります。
モデル化とは、現実の対象や現象から、目的に必要な特徴や関係を取り出し、扱いやすい形で表すことです。
例えば、レジの混雑を調べたい場合、
- 客が来店する間隔
- レジの台数
- 1人の会計にかかる時間
などは重要です。一方、客の服装や名前などは、通常は待ち時間の計算には必要ありません。このように、目的に応じて必要な要素を選び、現実を単純化して表します。
そして、作成したモデルに具体的な条件を与え、結果や時間による変化を調べるのがシミュレーションです。
したがって、
現実の対象 → モデル化 → モデル → シミュレーション → 結果の分析
という流れになります。
モデル化とシミュレーションは同じものではありません。
- モデル化:現実を表すモデルを作る
- シミュレーション:作ったモデルを使って結果を調べる
という違いがあります。
モデルにはさまざまな表し方がある
モデルは、必ずしもコンピュータ上のプログラムとは限りません。目的に応じてさまざまな表現方法が使われます。
物理モデル
実物や縮尺模型など、実際の物体を使って対象を表したものを物理モデルといいます。
例えば、建物の縮尺模型を振動台に載せて地震の揺れを与え、変形や損傷を調べる実験があります。また、自動車や航空機の模型を風洞に置いて空気の流れを調べる方法もあります。
このように、物理的な模型を使って現象を再現する方法を物理シミュレーションといいます。
図的なモデル
対象の位置や関係を図で表すこともできます。
例えば、
などです。
現実をそのまま描くのではなく、目的に必要な関係を分かりやすく表しています。
数理モデル
対象の関係や変化を数式によって表したものを数理モデルといいます。
例えば、最初の水量をV₀ Lとし、毎分3 Lずつ水を加える場合、t分後の水量V(t)は
V(t)=V₀+3t
と表すことができます。
人口の変化を出生率、死亡率、移動率などを使った数式で表すことも数理モデルの例です。
数式で表すことで、条件を変更した場合の結果を計算したり予測したりできます。
コンピュータシミュレーション
モデルをコンピュータ上で計算し、現象を再現する方法をコンピュータシミュレーションといいます。
現代のシミュレーションでは、非常に多くの計算を短時間で繰り返せるため、コンピュータが広く利用されています。
例えば、
- 気象予報
- 交通渋滞の予測
- 避難行動の分析
- 感染症の拡大予測
- レジの待ち時間の分析
などがあります。
特に、現象を数式で表し、その方程式をコンピュータで数値的に計算する方法を数値シミュレーションといいます。
気象予報では、気温、気圧、風速などの大気の状態を数理モデルで表し、現在の観測値を初期条件として、時間を進めながら将来の状態を計算しています。
モンテカルロ法
乱数を利用する代表的な方法がモンテカルロ法です。
モンテカルロ法とは、
乱数を使った試行を多数回繰り返し、その結果の割合や平均などから、求めたい値を近似する方法
です。
確率、面積、期待値など、数式だけでは求めにくい値を推定するときに利用されます。
円周率を求める例
一辺の長さが1の正方形の中に、半径1の4分の1円を描きます。
正方形の面積は
1
であり、4分の1円の面積は
π/4
です。
正方形の中に乱数を使って点をランダムに多数発生させます。
正方形内の点の総数をN、そのうち4分の1円の内部に入った点の数をMとすると、
M/N ≒ π/4
と考えられます。
したがって、
π ≒ 4M/N
として円周率を近似できます。
例えば、10000個の点を発生させ、そのうち7850個が円内に入ったなら、
4×7850/10000=3.14
となります。
この方法では、円周率を数式だけから厳密に計算しているのではありません。乱数による多数の試行結果から近似しているところが重要です。
静的モデルと動的モデル
モデルは、時間による変化を扱うかどうかによって分類できます。
静的モデル
ある時点での状態や関係を表すモデルを静的モデルといいます。
例えば、
などです。
これらは主に位置、構造、関係などを表しており、時間による変化そのものを表すことが目的ではありません。
動的モデル
時間の経過とともに状態がどのように変化するかを表すモデルを動的モデルといいます。
例えば、交通シミュレーションでは、
などを時間とともに変化させます。
時間を進めるたびに状態を更新することで、渋滞が発生したり解消したりする様子を調べられます。
確定的モデルと確率的モデル
モデルは、偶然性を含むかどうかによっても分類できます。
確定的モデル
同じ初期条件と同じ入力を与えれば、毎回同じ結果になるモデルを確定的モデルといいます。
例えば、最初に10 Lの水が入った水槽に毎分3 Lずつ水を入れ、漏れや蒸発がないとすれば、
V(t)=10+3t
となります。
10分後なら必ず40 Lになります。
このように、条件が決まれば結果も一意に決まります。
確率的モデル
現象に含まれる偶然性やばらつきを、確率として取り入れたモデルを確率的モデルといいます。
例えば、
- 客が次に来るまでの時間
- 製品が故障する時期
- 自動車が交差点に到着する時刻
などは毎回同じとは限りません。
そこで、確率や確率分布、乱数などを利用して現象を表します。
確率的モデルでは、同じ条件でシミュレーションを実行しても、毎回同じ結果になるとは限らないことが重要です。
連続型シミュレーション
状態を連続的な量として扱うものを連続型シミュレーションといいます。
例えば、
などは連続的に変化する量として扱うことができます。
室温の時間変化を微分方程式で表し、その変化を計算するシミュレーションなどが代表例です。
実際のコンピュータでは、時間を0.01秒ごとなどの細かな間隔に区切って計算することもあります。しかし、モデルとして温度や時間などを連続量として考えているのであれば、連続型シミュレーションに分類されます。
離散事象シミュレーション
特定の出来事(事象)が発生したときに状態を更新する方法を離散事象シミュレーションといいます。
例えば、レジのシミュレーションでは、
などを事象として考えます。
「客が到着した」という事象が発生すれば待ち人数が増え、「会計が終了した」という事象が発生すれば待ち人数が減ります。
この方法では、何も起きていない時間について細かく状態を計算する必要はなく、状態が変化する重要な出来事に着目して計算することができます。
そのため、
などの分析によく利用されます。
エージェントベースシミュレーション
人や自動車など、個々の主体に行動規則を与えて動かす方法をエージェントベースシミュレーションといいます。
ここで、個々の主体をエージェントといいます。
例えば、歩行者のシミュレーションなら、それぞれの歩行者に
- 移動速度
- 目的地
- 周囲の人を避ける方法
- 混雑したときの行動
などの規則を設定します。
多数の歩行者を同時に動かすことで、個々の行動が積み重なって、
などがどのように発生するかを調べます。
同様に、
などをエージェントとして扱うこともできます。
エージェントベースシミュレーションでは、
一人一人の行動 → 相互作用 → 全体の現象
という関係を調べられることが特徴です。
シミュレーションの分類は一つとは限らない
「確率的」「動的」「離散事象」などの分類は、互いに完全に別々のものではありません。
例えば、レジのシミュレーションは、
- 時間とともに待ち人数が変わるので動的
- 客の到着時刻を乱数で決めれば確率的
- 客の到着や会計終了のたびに状態を更新すれば離散事象
というように、複数の性質を同時にもつことがあります。
したがって、分類するときは「どれか一つにしか属さない」と考えるのではなく、
- 時間変化を扱うか
- 偶然性を扱うか
- どのような方法で状態を更新するか
- 何をモデルとして表しているか
という異なる観点から判断することが大切です。
シミュレーション結果の確かめ方
シミュレーションを実行して結果が得られても、その結果が現実を適切に表しているとは限りません。
モデルは現実を単純化したものだからです。
そこで、実際の観測データとシミュレーション結果を比較します。
例えば、実際のデータについて
などを求め、シミュレーション結果と比較することができます。
例えば、
実データ:
シミュレーション結果:
であれば、シミュレーションでは実際より平均値が小さく、ばらつきも小さくなっていることが分かります。
そこで、モデルの条件やパラメータを調整し、
などが実データに近づくかを確認します。
このように、シミュレーション結果と実際のデータを比較しながらモデルを修正することが重要です。
モデルは複雑であればよいわけではない
現実を完全に再現しようとすると、モデルは非常に複雑になります。
しかし、モデルは複雑であるほど優れているとは限りません。
例えば、レジの待ち時間を調べたいだけなら、客の身長、服装、名前などまでモデルに入れる必要はありません。
必要以上に複雑なモデルを作ると、
- 作成に時間がかかる
- 計算量が増える
- 必要なデータが増える
- 結果の理由が分かりにくくなる
などの問題が生じます。
そのため、
目的に必要な特徴を残し、それ以外を適切に単純化する
ことがモデル化では重要です。
シミュレーションを行う基本的な流れ
シミュレーションは、次のような流れで行います。
① 目的を明確にする
何を知りたいのかを決めます。
例えば、「レジを何台にすれば待ち時間を短くできるか」を調べます。
② 現実の対象をモデル化する
目的に関係する要素を取り出します。
例えば、客の到着間隔、会計時間、レジ台数などをモデルに含めます。
③ 条件やパラメータを設定する
初期値、確率、速度など、モデルを動かすための値を設定します。
④ シミュレーションを実行する
時間を進めたり、乱数を発生させたりしてモデルを動かします。
⑤ 結果を整理・分析する
平均値、最大値、最小値、グラフ、度数分布などを使って結果を調べます。
⑥ 現実のデータと比較する
実測値などと比較し、モデルが現実を適切に表しているかを確認します。
⑦ 必要に応じてモデルを修正する
結果が実際と大きく異なる場合は、モデルの前提、構造、パラメータなどを見直します。
シミュレーションの利点と注意点
シミュレーションを利用すると、現実では実施しにくい条件でも実験できます。
例えば、
- 大地震を実際の都市で発生させる
- 何万人もの人を実際に避難させる
- 同じ集金を1万回繰り返す
- 数十年後の気候を実際に待って確認する
といったことは困難です。
シミュレーションなら、モデル上で条件を変えながら何度も試すことができます。
一方で、シミュレーションの結果はモデルの前提や設定した条件に依存します。
モデルに重要な要素が含まれていなかったり、設定した確率や数値が現実と異なったりすれば、計算そのものが正しくても、現実とは異なる結果になる可能性があります。
そのため、
シミュレーション結果は「必ず現実でその通りになる未来」ではなく、「設定したモデルと条件のもとで得られた結果」である
と理解する必要があります。
シミュレーションでは、モデルを作って計算するだけでなく、
モデルの前提を確認し、実際のデータと比較し、どこまで現実に適用できるかを考えること
までが重要です。