LoginSignup
30
25

More than 3 years have passed since last update.

ウイルス感染の簡易シミュレーション

Last updated at Posted at 2020-04-10

はじめに

March 14, 2020 のワシントンポスト紙に、以下のような記事が掲載されました。

日本語版は、下記にあります。

ボール同士の接触という簡単な原理を使って、
ウイルスの感染者数がどのように増えて、そして減少していくのかを紹介した記事で、
とても理解しやすかったかと思います。

ちなみに、Python(JupyterLab)で再現されている方もいらっしゃいます。

自分でも作ってみた

ちなみに、私の方ですが、、、、

いろいろとパラメータを操作して自分でもシミュレーションしてみたかったので、
処理が軽く済むように、ボールが衝突した際の跳ね返りは無視してボールの重なり合いを感染とみなすようにして、

Python版(モジュールpygameを使用)HTML&JavaScript版を作ってみました。

どちらも基本的には同じ処理ですが、描画の仕組みの違いもあり、
Python版よりも、Webブラウザ上で動作するJavaScript版の方がかなり高速になっています。

乱数を使ってボールの初期位置や移動量を決めていますので、実行結果は毎回変わります。
最初に感染しているボールは、すべてのボールの中で一番左側に配置されているボールが1つだけ選ばれます。

デフォルトのパラメータ(ボール数300)であれば、
Python版は10~15秒程度、JavaScript版が5~10秒程度で収束します。

すべてのボールの1回の移動と描画をターンと呼ぶことにし、

  • 画面の大きさ(幅、高さ)
  • ボール数
  • ボールの半径
  • 表示ウェイト
  • 回復までに必要なターン数
  • 回復までのターン数
  • 部屋を遮る壁(bar)の有無と大きさ(幅、高さ)
  • 動かないで停止しているボールの比率

などを自由に指定できるようにしています。

実行中は、

  • 未感染のボール・・・青色
  • 感染中のボール・・・赤色
  • 回復したボール・・・緑色

で表示しており、画面下部には、
感染中のボールの数と、回復したボールの数の推移を表すグラフが、
リアルタイムで表示されます。

ゆっくりと動きを見たいときは、表示ウェイトを増やしてみると良いでしょう。

同じ条件でも毎回異なる結果になりますので、
何度も実行を繰り返し、描かれるチャートの出現比率などを調べても面白いかもしれません。

Demo

HTML&JavaScript版は、下記のURLにも配置しており、どなたでも実行できます。
いろいろとパラメータを変えて、遊んでみると良いでしょう。
(スマホからでも実行できます。)

ScreenShot.png

2020/04/25追記

IHASHI28 教育系ch. さんの動画でも、シミュレーション結果例が紹介されました。

30
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
25