ウイルス拡散シミュレーション
コロナウイルスの収束時期を予測するために、感染が拡大していく様子をシミュレーションするプログラムをMATLABで作ってみました。ソースコードを公開しています。下に示すアニメーションgifは実行例で、それぞれの図の意味は次のとおりです。
・左の図:青が未感染で、黄色が回復(抗体獲得済み)
・真ん中の図:黄色が保菌者、青がそれ以外
・右側の図:保菌者の数(保菌者が増え過ぎると、医療現場がパンクのおそれあり)
シミュレーションの概要
まず、このシミュレーションの時間単位は日です。つまり、1ステップで1日が経過します。次に、300×300の格子を考え、各格子点で人を表します。各人は、上下左右と斜めの人(合計8人)と接触しています。保菌者と接触している人は、一定の確率で接触した保菌者からウイルスが移り感染します。保菌者は、規定の日数が経過すると、回復します。回復した人は抗体を獲得し、二度と感染しません。各パラメータは、次のように設定しました。
・感染確率:3%(1日あたり3%の確率で、接触した保菌者から感染)
・回復までの経過日数:10日
実装方法
このシミュレーションの実装方法を説明します。まず、各格子点(人)の状態を表すために、300×300の配列(9万人分)を用います。配列は整数を格納し、値が0の場合、その人は未感染であることを示します。感染すると、この値を1とします。感染後は、1日経過するごとに、この値を1ずつ増やします。ただし、10(回復までの経過日数)になったら、それ以上は増やしません。そして、値が10の場合、その人は回復して抗体を獲得した人であることを示します。一方で、値が1以上9以下の場合は保菌者であり、接触する未感染者に感染確率に従いウイルスを移します。この配列は、一度にすべての値を更新します。
補足(境界条件)
全員が未感染ですと誰も感染しません。そこで、中央に一人感染者を配置します。この人は回復しないことにします。また、格子の最外周の人は感染しないことにします。そうすると、プログラムが簡単になります(番兵というテクニックですね)。
所感
このシミュレーションは、すべての人は8人と接触することを仮定しており、また、感染確率と経過日数もいい加減な値です。このため、どの程度、現実的かは不明です。しかし、このシミュレーションが示すことの一つは、感染が拡大していく条件下では、ウイルス拡散の収束には年単位の時間が必要な可能性です。ということで、この騒動が収束するには、もう少し時間を要するのかもしれません。あるいは、ある気象条件下で、ウイルスが一気に不活性化するといったことも考えられますが。
移植
MATLABで実装したため、動かせる人が限られます。接触者数等のパラメータを変えた挙動の分析をして欲しいと考えており、このためにPythonやJuliaに移植してもらえると嬉しいです。GPUを使うことで高速に計算できるので、GPUプログラミングの練習にもなると思います。