• ベストアンサー

待ち行列のシミュレーションのプログラムが書けないです。

現在待ち行列のシミュレーションを勉強しています。 M/M/1のプログラムは書けて、シミュレーションもしっかりとできました。 そこで、次はサーバーは1つのままで、複数の到着流をもつ待ち行列をシミュレーションしてみようと思ったのですが、 思うようにプログラムが書けなくて困っています。 どなたか要点だけでも良いので教えていただき、プログラムの手助けをしていただけるとうれしいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.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

参考URL:
http://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/18-sho.htm#e-18-6
f01030
質問者

お礼

ありがとうございます。 早速試してみたいと思います。 何だかできるかもって思えました。

関連するQ&A