韓国でハロウィーンの夜に群衆が密集して死亡者が出る痛ましい事故がありました。人流のシミュレーションでこれを作れないか試しましたが、今の僕の力では同一の画面の中で、道路の両端に集団を作ることができなくてあえなく挫折。
避難などのときに群衆が避難経路に殺到する程度ならできそうなので作ってみました。
パターン1
人数:100人。繰り返し:300回
横方向あるいは縦方向で人にぶつかりそうになったら、その横あるいは縦には進まない。
壁とぶつかりそうになったら、壁と反対方向へ1歩。
進むスピードはランダム。
最終的には300回までに全員避難が完了しました。前方へ進めなくなるような密集も発生しなかったようです。アニメーションを見ていると、出口を出てすぐのところでもたつく人がいることで、通路内出口付近の人が出ることができない状況がありますので、避難通路の出口から出た人をすぐそこから遠ざける作業というのが意外と大事なのかもしれません。
パターン2 ボトルネック
パターン1と同じ条件で、出口付近に障害物を置いてみました。
300回終了しても、避難できなかった人が少しいます。また150回を過ぎたあたりから出口付近の密集状態が常態化します。先に出口を出た人が出口付近でもたつくと、出ようとしている人の障害になるのはパターン1と同じ。
避難経路にはものを置かないようにしよう!
この作業は
もし壁にぶつかったらこうするという命令を壁の数×2(x座標とy座標)だけ書く必要があるなど、とにかく大量のif文を書きました(入れ子になったifも沢山あります)。書き忘れると人が壁を通り抜けたりしますので、何度も見直して、それでやっとこの程度のアニメーションにしかならなくて結構うんざりさせられました。出来上がった後の達成感はありますが、出来上がったものを見ると苦労のわりにこの程度かと少し寂しいです。
まるで夕食のお惣菜にポテトコロッケを作った(1から作ると結構手がかかります)のに、家族から「えーっ、コロッケかぁ」と言われた時の心境です。