Scratch(ウィルス感染モデル)

Scratch-corona-bearプログラム

新型コロナウィルス(COVID-19)が猛威をふるっていますね。実は4月頭にScratch基礎の体験教室[好評により告知前に口コミで満員御礼]を準備していたのですが、もしかするとコロナウィルスの拡大状況によっては開催を断念しなければいけないかも・・・。

というわけで、そんなコロナウィルスが連日NEWSとなっている状況において、今回は最初は1個だったウィルス感染がいかに急速に拡大していくかということをScratchを使ってシミュレーションするプログラムを書いてみました。

ウィルス感染(自由行動)

中身の確認はこちら

https://scratch.mit.edu/projects/347759803

 

プログラムの説明

プログラムがスタートすると250個の青い点が生成されます。250個の点の作成が終わると、1つだけ赤い点が生まれます。これがウィルスに最初に感染した人です。この1人が自由に漂っていると、そのうち青い点が赤い点に代わりウィルス感染します。これが3人、4人と増えていき、最初は緩やかだった感染スピードが30人を超えたあたりから加速度的に増えていき、だいたい100日ぐらいで全員がウィルス感染してしまうということが見て取れます。

プログラムの説明

ではプログラムの中身を解説していきます

基本的な考え

このプログラムなのですが、スタートを押すとクローンを作成するという処理とある色(赤色)に触れたら感染するという条件が発動するという部分が考え方となります。これは迷路ゲーム(みつばち出現版)で、この考えについて説明していますのでそちらも参照してくださいね。

 

変数・配列の説明

今回、変数として4つ用意しています。

Scratch-Virus-variable001

正常と感染の変数は、ウィルス感染していない人の数、ウィルス感染した人の数をカウントするための変数です。また日数はウィルスが発生してから全員が感染してしまうまでの日数をカウントするための変数です。

この日数カウントについては、Scratchに標準で用意されているタイマーという変数を使います。ただ、このタイマーという変数はストップウオッチのように0.001秒まで表示されるため、とてもせわしない感じがします。そのため、以下のように切り下げという処理を行っています。

 

さて今回、”り患”という変数を作っています。り患とはウィルスに感染した状態を意味するのですが、今回、この変数を用意したのは、プログラムの中で赤い点に触れたら感染とみなして感染を+1、正常を-1するという処理としているため、このままだと、2回目に赤い点に接触した場合にまた感染と正常の数を変化させてしまい、合計250という数字がおかしくなってしまいます。そのため、このり患という変数を用意して、一度、感染してしまったら、り患フラグをたて、2回目に赤い点に触れた場合に正常と感染の数を変更させないようにしています。

さて、このり患変数は、他の変数とことなり「このスプライトのみ」を選択して作っています。

Scratch-Virus-variable002

これは、一般的にはローカル変数といい、反対に全てのスプライト用を選択する場合はグローバル変数といいます。この違いは、このスプライトでのみ(=ローカル変数)の場合は、カウントした数字は1つの点であるスプライトでのみ有効な変数となるということで、もし、これを全てのスプライト用(=グローバル変数)としてしまった場合は、全てのスプライトで共通して使われるため、り患変数の値は1から始まって、最後は249まで変化していくことになります。

今回はあくまで1つの点の中で感染したか、していないかを判断するだけに0か1の値が必要なだけであり、その値を他の点も使ってしまうと、り患したの?してないの?というのが判断つかなくなるので、逆に全てのスプライトで使うとしてしまってはいけないことになります。

ちょっと難しいですよね?またグローバル変数・ローカル変数については別記事かきますね。

 

スプライトの説明

さてスプライトの中身の説明です。今回は1つのスプライトのみで構成しています。

青い点・赤い点

Scratch-Virus-variable003

このスプライトの処理についてはこちらです。

Scratch-Virus-sprite001

さて、このプログラムを実行すると、青い点が赤い点に触れたら、すぐに感染して赤い点になるはずですが、なかなかそうはなりません。これは、ちょっと僕もわかってないのですがScratchの当たり判定がそこまで正確じゃないのか、片方の処理が動いている間にぶつかった場合はうまく判定しないのか、迷路プログラムの例をみると、止まっているところに、当たりに行った側の判定の場合、うまく当たり処理が発動するような気がしています。今回、各自の点は自由に動いているので、たまたま赤い点が止まったタイミングで、青い点がぶつかった時に感染処理がうまく発動するのでは?と思っています。

ということで何度か赤い点が青い点にあたっているうちに感染が発動して、ある意味これは、すぐに感染しないというところを表していてリアルであるかなとも思います。

 

ウィルス感染(行動自粛)

さて、こんなブログ記事とプログラムを書いていたら、不謹慎なと思われる方がいて炎上してしまうかもしれないので(という程のアクセス数もないですが)、ここでは自由に行動するのではなく、自宅待機して行動はなるべく控えた場合、また感染リスクが高い場所に立ち寄ることがいかに危険かを示したシミュレーションプログラムを以下に書いてみました。

中身についてはこちら

https://scratch.mit.edu/projects/372907331

 

プログラムの説明
このプログラムは、まず始めは先にしめしたウィルス感染(自由行動)と同じく、各点は自由に右往左往の行動をします。感染した場合、赤い点は、一定期間はフラフラと行動しますが、最後は感染リスクが高い環境(病院や密集地帯を想定)に移動して定着します。 そして感染数が20を超えたときに一気に行動が変わり、感染していない青い点は一旦、自宅エリアに戻り、外出を控えるようになります。それでも、外出する用事があるので、でかけることになるのですが、その時も感染リスクが高いエリアに行った場合は、高い確率で感染してしまいます。

 

まとめ

さて、今回はまさに今起きているコロナウィルス感染にからむ記事でした。

自由行動をしたプログラムに比べると自宅待機版は感染スピードは遅く、現在、行われている各種の臨時休園や一斉休校は、社会的なインパクトはあるものの、感染拡大には効果があることが見て取れますね。という意義ある記事なんですよ、これは!

このプログラムは研究者がつくるような完全に正確なシミュレーションプログラムではないですが、頭の中でイメージするだけではつかみにくい現象、特に今回のように多数の点が自由に動き回るようなケースでは、プログラムを使って表現させることで、かなりイメージがつかみやすくなります。

皆さんも実際にプログラムを作って実行させることで、世の中や自然界で起きていることってどういうことなのかをシミュレーションして正しい理解をしていきましょう!といった記事でした。

コメント

タイトルとURLをコピーしました