- ベストアンサー
待ち行列のプログラム(Fortran)
Fortranで待ち行列(レジ待ち)のプログラムを作りたいのですが、途中で行き詰まってしまい、うまくできません! 待ち行列についてまだよく理解できてないのだと思います。指数乱数を発生させるプログラムだけだったらできるのですが、それをヒストグラムで示して、待ち行列がどのように変化するのか観察するプログラムができないのです。 待ち行列のプログラムについて詳しく載っているHPなどがあれば教えてください!!(本でもOKです)
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
http://www.matsusaka-u.ac.jp/~aihara/pukiwiki2/index.php?%A5%E2%A5%F3%A5%C6%A5%AB%A5%EB%A5%ED%CB%A1%A1%CA%C2%D4%A4%C1%B9%D4%CE%F3%A1%CB http://www.ed.kuki.tus.ac.jp/~tamura/2002/ipe2/queue.htm 考え方は、こう。 銀行窓口のある1日を考える。 1日に客は10人来るものとする。 客が訪れる時刻はランダムである。 客が到着した時、まだ「窓口が空いていない(前客の処理が終わっていない)」場合は待たされる。 窓口が空いている場合は、客は待たず、すぐに窓口業務をしてもらう。 これを簡易的に表現したものが以下のプログラム。 このプログラムは「客が実際に待った時間」のデータを取るのが目的。 (注: 厳密にフォートランの文法に従ってない) integer kNumOfPerson=10//客の人数 real availableTime//窓口利用可能時刻 real arrival(kNumOfPerson)//各客の到着時刻 real need(kNumOfPerson)//各客の窓口処理に要する時間 real wait(kNumOfPerson)//各客が実際に「待たされた」時間を格納する real t, s, i //「各客の到着時刻」の配列作成 t = 0 do i= 1, kNumOfPerson s=getRand(4.0)//平均4.0の乱数を取得(4.0は適当) //※↑客同士の「到着間隔」が平均4(秒)だという考え //sは「到着間隔」なので、これを時刻に直す arrival(i)=t+s enddo //「各客の窓口処理に要する時間」の配列作成 do i= 1, kNumOfPerson need(i)=getRand(3.0)//平均3.0の乱数を取得(3.0は適当) enddo //銀行窓口オープン! availableTime = 0 do i= 1, kNumOfPerson //客の銀行到着時刻 s=arrival(i) //客到着時にまだサービス利用可能でないなら if (availableTime.gt.s) then //「待ち」発生 wait(i)=availableTime-s //客到着時にすでにサービス利用可能なら else //「待ち」なし wait(i)=0 //サービス開始は客の到着を待ってから availableTime=s endif //次のサービス利用可能時刻は //現客の処理を終えてから。 availableTime=availableTime + need(i) enddo で、この時点で上記の配列wait (各客が実際に「待たされた」時間を格納した配列) が得られる。 これを使って、あとはヒストグラム(分布表)なり グラフなり好きに表示すればよい。
お礼
とてもよくわかりました!!ありがとうございます! 教えていただいたHPも参考になりました!! 無事、ヒストグラムで出力でき、感動しました~*(^_^)* Fortran、まだまだ全く使いこなせてませんが、頑張ります!!