- ベストアンサー
待ち行列のシミュレーションのプログラムが書けないです。
現在待ち行列のシミュレーションを勉強しています。 M/M/1のプログラムは書けて、シミュレーションもしっかりとできました。 そこで、次はサーバーは1つのままで、複数の到着流をもつ待ち行列をシミュレーションしてみようと思ったのですが、 思うようにプログラムが書けなくて困っています。 どなたか要点だけでも良いので教えていただき、プログラムの手助けをしていただけるとうれしいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
アイデアだけ。(自信なし) やりかたはイロイロあると思うけど・・・。 --- 「到着流」というのを「客発生器」と呼ぶとして… 結果としては、たとえ2個の「客発生器」を作ったとしても、 「サービス処理側」からしてみれば、 「客発生器」が複数あるなんてことはつゆ知らず、 単に、 「ああ、『到着間隔が1/2になった客発生器』を使ったのね・・・、ああ忙しい」 としか思わないハズ。 つまり、ソースコード的には、 客発生器に変更が生ずる以外、 他に変更はないはず、ということ。 つまり、いわば 『到着間隔が1/2(くらい)になった客発生器』を1つ 作ってしまえばいいのだ。 --- たとえば、いままで、「次の客到着時間」を、 唯一の「客発生器」を使って time = nextTime(); などと取得いていたとする。 この「元の」発生器を使って、 新しい発生器を作ってみる。 #define kINVAL = 0;//無効 long time1, time2;//待避用 /**--------------- *新たな「客生成器」 -----------------*/ long newNextTime() { long res=0; if (time1 == kINVAL) { time1 = nextTime();//1個目の客生成器 } if (time2 == kINVAL) { time2 = nextTime2();//2個目の客生成器 //(※一個目の発生器と同じであってはならない) } //この時点で、「返すべき時間の候補」が2つ存在する //2つの候補のうち、小さいほう(時刻の早いほう)を返す if(time1<time2) { res = time1; time1 = kINVAL;//使用したので無効 return time1; } else { res = time2; time2 = kINVAL;//使用したので無効 return time2; } } --- で、今までnextTime()を使っていた場所で 代わりにこのnewNextTime()を使う。 結果的に到着間隔が1/2になると思うが…。 実験してみてね。 (ちょっと頭の中だけで考えてソースコード書いたので、 間違ってたらごめん) --- ↓ネット上にあるソースコード。 (※僕が書いたアイデアとは直接の関係はない) http://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/18-sho.htm#e-18-6
お礼
ありがとうございます。 早速試してみたいと思います。 何だかできるかもって思えました。