電子書籍の厳選無料作品が豊富!

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

A 回答 (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/ …

参考URL:http://www.sist.ac.jp/~suganuma/cpp/3-bu/18-sho/ …
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/09/07 19:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!