このブログ内を検索可能

2017年12月29日金曜日

遊園地 待ち時間シミュレート

英語の発表の一環として、待ち時間を数学的にシミュレートしてみたら面白いのではないかと思い。プログラムを作成してみた。
これこそmathematicaの能力。しっかりと数学的な処理を行ってくれる。
プログラムの内容としては意外に短いが、For文などが入り乱れている部分は少し解釈が難しいかもしれない。

内容を言うと、まず何秒後に流入か排出か、をdoというリストに格納して、
それをfor文以下で呼び出して、最後に経過時間を横軸、待ち人数を縦軸としてグラフに表示させたというものになる。

上記のプログラムで、FとJという関数があるが、これはそれぞれflow inとjudgeという意味で、
流入人数(時間による、なぜなら基本は昼多く夜は人が少ないから、つまり増加の後減少に転じる関数)、並ぶかどうか(一般に待ち人数が多くなるとならびたくなくなる。よって単調減少関数)を表している。

さて、とりあえず流入の関数であるFを、なんとかして初等関数で表記したいと思っている。
基本的に、遊園地開始時刻より徐々に昼に向けて流入人数は増え、夜になるにしたがって減少するとする。これをどのような関数で表すか。とりあえず最後の時間であるtimeMaxと時刻0においては0であるのは条件より明らか。そしてだいたい時刻0を9時開園とし、時刻timeMaxを21時閉園とする。するとまあ、だいたい15時辺りが人が多いと仮定してみると、これは考えやすいグラフになる。2次関数あたりで考えると、k*time(timeMax-time)の形で表せる。なぜならこの式=0の解と、上に凸であることと、あとはその値の大きさを定めるために(スケール?)kをかけておく、というもの。
最大で100人にしたいならば、timeMax=100ならばk=0.04とすればよい。

何気にこのFとJに関してよい関数を持ち出してくるのが大変。