【TIC-80】新型コロナウイルスのシミュレーションを作ってみた。 COVID-19 infection simulation

新型コロナウイルス対策として日本でも一部の地域に非常事態宣言が出されて外出自粛や経済活動の制限がされています。

対策が長期化するなかで終息のめどが立たず、あちこちから苛立ちも聞こえてきます。
コロナで死ぬか?経済で死ぬか?まさに瀬戸際の選択が困難になりつつあります。

心配するのは「このまま自粛して大人しくしていたらコロナは自然に消滅するのか?」という疑問です。

気になるのは武漢のモデルです。
一時はあれほど爆発的に感染が広がっていたのに、今では収束宣言して街の閉鎖も解除されています。実態はどうなのかわかりませんが、少なくても以前のような状態ではなさそうです。現時点では新型コロナウイルスに対する有効なワクチンや薬もないのにどうやって収束したのか?興味深いですよね。

このカラクリには「ウイルス」の性質があるんじゃないか思っています。
 地球上の生物であれば、生きている純粋な目的は子孫繁栄になります。
人の生活も、付き詰めると繁殖活動が基本になります。
命のないところに経済も文明もありませんからね。

ウイルスは自己増殖ができないので生物ではないと言われています。
しかし遺伝子は持っているので、繁殖する野望は持ってるんじゃないか?と思います。

今回の新型コロナウイルスは、宿主である人がいないと繁殖はできません。
ある宿主で爆発的に増殖すると、やがてその宿主は死んでしまいます。
結果的に自分達も死んでしまうので本来はそれを望まないはずです。

だからその前に宿主から離れて別の宿主を探すのですが、それが飛沫感染です。
感染者の呼吸や咳などの唾液に紛れ込んで空中に飛び出してしばらく浮遊します。

飛沫感染は空気感染とは違いますが、空気ダストなどに付着して長時間空中を漂うので、狭い空間でウイルス濃度が高ければ短時間で感染してしまいます。

三密「密閉、密集、密接」の中で、特に感染者と空間を共有しないことが大切です。
常に空気が流れている屋外なら、余程のことがない限り感染する確率が低いと考えられます。


今回の新型コロナウイルスは、感染しても8割は重症化せず、風邪程度の症状で自然治癒すると言われています。問題は2割の長期化・重症化する感染者で、この感染者からは他人への感染率も高くなります。つまりウイルスが十分繁殖することで肺から放出されるウイルス量も多くなり、他人に感染する確立も高くなります。

感染しても無症状や軽症者は、他人に対して2割程度しか感染させないとも言われています。感染して治癒した者はウイルスに対する抗体も持つので再感染はしづらくなります。(完全ではない)


ここがポイントで、抗体を持った人が増えることでウイルスの感染を防ぐ見えない防護壁が社会の中に出来上がるんじゃないか?と考えられます。(仮説1)

もしこれが収束するためのメカニズムだとすると、ある程度薄く感染が広がる必要があるんじゃないかとも思っています。(仮説2)

そこでこれらの仮説を確かめるために簡単な数学的なシミュレーションを考えてみました。といっても難しいものでなく、ゲーム感覚で子供でも理解しやすく味付けしています。

まず新型コロナウイルスの簡単なモデルです。

【新型コロナウイルスのモデル】
・軽症8割、回復時間 7日、感染力2割
・重症2割、回復時間14日、感染力8割
・死亡率3%程度

【人のモデル】
・性別 性別によって重症化しやすい 男性7割(未装備)
・年齢 高齢者は重症化しやすい (未装備)
・住居 住まいのホーム座標を持つ
・運動量 年齢によって運動ベクトル値を参照(未装備)
・感染レベル 感染した場合、軽度から重度まで割合により設定
・回復時間 感染した場合の回復時間(感染レベルによって設定)
・抗体 感染し治癒すると抗体を持つ、再感染しない
・生死フラグ 死亡すると停止し感染力はゼロになる
※(未装備) 検体が少なく意味がないためランダムに設定する

このモデルを一定の空間に置いて、パーティクル計算でシミュレーションしてみようという試みです。
・一定の人を乱数で作る。年齢、性別、ホーム座標、運動ベクトル、感染の有無・・・
・ホーム座標を起点に運動ベクトルを加算し現在座標を計算する(人は移動する)
・現在座標から隣人との接触を判断し、感染者であれば感染率によって感染する
・感染した場合、治癒するまで運動ベクトルは低下する
・感染レベルによって回復までの時間がかかる
・場合によっては死亡し停止する
・回復すれば抗体を持って運動ベクトルが復活する

人はやみくもに行動はしません。
日々一定の導線に沿って特定のパターンで生活をする生活圏を持っています。
その点を考慮してシミュレーションしています。


シミュレーションの結果として
・人口密度によってどれくらいの速度で感染が広がるのか?
・どれくらいのシミュレーションタイムで収束するか?
・その時の死亡者は何人か?
・生還して抗体を持った人は何人か?
といったところを見てみたいと思います。

この時に、外出自粛のように人の運動ベクトルを抑えるとどうなるのか?
パラメータを変更するとシミュレーションできます。(プログラムの定数変更が必要)
・無制限に比べて早く収束するのか?
・死亡者数は減るのか?
・抗体を持った人数は何人か?

抗体を持った人数は次のステップでの防波堤となります。(ニュータイプ)
コロナウイルスは永久になくなりませんので、今だけではなく未来的な対策も重要です。
医療的なワクチンや薬だけなく、遺伝的な進化が重要です。


武漢は収束したという事実があるので発散はしないのは確かです。
もし発散すれば計算式がおかしいということになります。

都会をモデルにした場合、ビルや高層マンションなどを考慮して3次元モデルで整理すべきで、時間軸を持ったシミュレーションなので4次元で考えるのが適当かと思いますが、3次元モデルは面倒なので今回は2次元モデルで計算しています。(田舎バージョン)


シミュレーションの結果は実際に動かして体感してみてください。
言葉や理論図ではなく、実際に感染が広がるアニメーションを見て体験してもらうのが一番直感的に理解できると思います。下記のリンクから実行できます。


COVID-19 infection simulation
https://tic.computer/play?cart=1175


※WEB上で実行すると遅いのでダウンロードして実行することをオススメします。


上下の矢印キーでシミュレーションする人数を変更できます。(1-500)
300人程度を標準に整理しています。

マウスでクリックすると感染者を送り込めます。
密集地帯に感染者が現れるとどのようなクラスター感染が起こるのか体験できます。
ちょっとしたゲーム要素です。w

「Z」キーでシミュレーションをリセットします。


白色 = 健常者
水色 = レベル1軽症
柿色 = レベル2軽症
緑色 = レベル3重症
赤色 = レベル4重体
黒色 = 死亡
黄色 = 抗体を持った治癒者

ゲーム感覚なので子供でも直感的に感染の広がりを理解してもらえると思います。
感染率や重症化の要因等はまだまだ未解明な部分も多いため、あくまでも感染イメージを理解する程度のゲーム的なものとして理解してください。



今回はTIC-80の環境でLua言語でプログラムを書いています。
TIC-80は本来はレトロゲームを作るためのプラットフォームですが、今回のような簡単な実験プログラムを実行する環境としても活用できます。

TIC-80 tiny computer
https://tic.computer/


プログラムやグラフィック、効果音などのアプリを作るための環境と、それを実行する環境が一体になっているので簡単に扱うことができます。(スマホでもOK!)

しかも無料です!

お約束ですが、このプログラムは短時間で適当に作ったものなので間違っているかもしれません。コーディング方法も含めて信用しないでください。
プログラムはダウンロードもできまるので、自分でプログラムに手を加えて実行することもできます。是非チャレンジしてみてください。

お子様の在宅学習の教材にもピッタリかと思います。


コンピュータプログラムは複雑系の数学的な計算式ですが、物語を書いた小説でもあります。何かを伝えるのに文書や絵を描く代わりに、プログラムすればより直感的に相手に伝えることができる場合もあります。

コンピュータ言語は様々なマルチメディアを表現できるため、人が扱う言語の中で最強の言語とも言えます。しかも世界共通語なので活用性は高いです。是非マスターしましょう!

TIC-80/wiki
https://github.com/nesbox/TIC-80/wiki

Lua 5.3 リファレンスマニュアル
http://milkpot.sakura.ne.jp/lua/lua53_manual_ja.html


いかにすれば、人類はこの難曲を乗り越えられるのか?
一緒に考えていきましょう!


このブログの人気の投稿

空き缶スターリングエンジンの作り方

謎のエミュレータを入手「X6 Game Player」

USENの曲名を探す方法。この曲は何?

ウクレレ入門♪ 簡単コード表

プラダンでカヤックを自作する。【総集編】

ファミコンゲームの作り方「X6 Game Player」

スケートボード用ウィングの作り方

今すぐ無料でドローンが飛ばせる「Quadcopter FX Simulator」

ついに買っちゃいました。 YAMAHA RM1x

木工ボンドは何がよい? タイトボンド3の耐水性テスト