Junpei Qawasaki

博報堂アイ・スタジオという会社でテクノロジーをベースに新規事業とかインタラクティブなものとかを色々とやっております

人工生命(Boid)群衆制御による接触感染シミュレート(Boids infection simulator prototype -powerd by unity-)

f:id:jkawasaki:20200412154144j:plain
img

4月から空いた時間で可能な限り作れるものを作ろうというのを一人でやってまして。
unityによる接触感染シミュレーターなるものを作りました。2020年4月、緊急事態宣言による外出自粛がなされて人との接触を7-8割減らしましょうという事ですが、人の集団が全く動かないというのは難しく、果たして集団が動き続けて接触するとどうなるのかをビジュアルで試してみたかったからです。

こちらの動画が一旦の完成形(プロトタイプ)です。

youtu.be

仕様について

・日本の人口は1.268億なので40万分の1の327人として群衆を生成
・時間は1日あたり6.48秒(40万分の1)でカウント。
・感染者の潜伏期間は(5.6day) 36.288秒(40万分の1)でカウント。
・最初に感染体(赤色)が1つ存在する。他は全員健康体(青色)として生成
・感染オブジェクトと接触すると10%の確率で感染する
・感染した場合、20%の確率で病院送りとなり、隔離(黄色)される
・隔離ステータスの場合は接触しても感染しない
・隔離されたオブジェクトは一定期間経過で回復する(白色)
・隔離オブジェクトは3%の確率で死んでしまう(消滅)
・回復オブジェクトは接触しても感染しない


処理について

ちょっと作るのに思ったより時間を使ってしまいリファクタしたりする気力が無いので特にコード公開せず、やった事だけ記載しますと以下の通りです。

Boidを生成(クローン)する ※1
Boid同士はあまり群衆にならない程度にパラメータを設定
③collider、Rigidbodyを設定
④ステータス判定用、変更用のclassを作成
⑤OnCollisionEnter()の中で自分と接触相手のステータスを取得
⑥感染体と接触した場合は20%の確率で感染ステータスに変更
⑦感染した場合、さらに20%の確率で隔離ステータスに変更
⑧隔離ステータスからさらに3%の確率で死亡フラグON(オブジェクトをOnDestroy())<その他>
・感染、隔離ステータスの場合、状態経過用のtimerを用意
・ステータスの変更毎にText表示を変更

思ったこと

バーっと作ったので、ステータス判定の処理が煩雑になってしまい、そのせいで数字が合わないなどのバグが出てしまったのと、粗すぎて一般に公開できるコードじゃなくなってしまったので次からはもうちょいスマートに書けるようになろうかなと思います。判定処理多すぎてBoids数も500超えるとMacだとFPS落ちまくる。

作成当初は「Boidでなんかやりたいな」くらいのノリだったので意味が若干後付けのコンテンツなのも良く無いなぁと。シミュレーションについてはある意味ビジュアルで分かり易くはなってるのだけど、結果の数字を見るとやはりパラメータ足りなすぎてあんまり現実的なシミュレーションとはいえないかなーと思っております。
いちお、経過についてもyoutubeに動画としては存在するので参考まで。

https://youtu.be/snWVyk8Im9A
https://youtu.be/lQYlcMP2rUY

※補足
個人制作のプロトタイプで、データや条件、確率などに根拠はなく、COVID-19のシミュレーション等ではありません。
処理上の数値は暫定の為、結果は正確なものではありません。<参考>
Unity で Boids シミュレーションを作成して Entity Component System(ECS)を学んでみた - 凹みTips