• ベストアンサー

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

現在待ち行列のシミュレーションを勉強しています。 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

  • 待ち行列シュミレーションのプログラム

    今現在待ち行列シュミレーションを勉強しているのですが、M/M/2モデルのプログラムをそれぞれ窓口数1(M/M/1)、窓口数3(M/M/3)のプログラムにしたいのですが上手くできません。 窓口数2のプログラムを記載します(窓口数の増減に関係ないと思われる後半のプログラムは記載してません)ので、どなたかわかる方がいましたらご教授のほうお願いします。 M/M/2 待ち行列のモデル -- ポアソン到着 => 到着時間間隔は指数分布 -- 指数サービス => サービス時間は指数分布 */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define N_SERVICE 2 /* 窓口数 */ #define N_USER 10000 /* 総到着人数 */ #define ARRIVAL_INTERVAL 30.0 /* 平均到着間隔*/ #define SERVICE_TIME 70.0 /* 平均サービス時間 */ double uni_random(void); /* 区間[0,1]の一様乱数 */ double exp_random(double); /* 平均値を引数にとる指数乱数*/ int main(void){ int i; /* 客番号 */ int j; /*窓口番号*/ double arrival[N_USER]={0.0} /*N人の到着時刻 */ int counter[N_USER]={0}; /*N人の利用窓口*/ int current_user[N_SERVICE]={0};/*最近の窓口利用者 */ double srv_start[N_USER]={0.0}/* N人のサービス開始時刻 */ double wait[N_USER]={0.0}; /*N人の待ち時間 */ double srv_time[N_USER]={0.0}/* N人のサービス時間 */ double srv_finish[N_USER]={0.0}; /* N人のサービス終了時刻*/ double avr_wait; /* 平均待ち時間*/ double avr_srvtime; /* 平均サービス時間  */ double avr_srvrate[N_SERVICE]={0.0}; /* 窓口の稼働率 */ /* 乱数の「種」を初期化 */ srand((unsigned)time(NULL)); /* 最初の客が到着した時刻から開始. 窓口0に入ってすぐサービス開始 */ arrival[0]=0.0; counter[0]=0; current_user[0]=0; srv_start[0]=0.0; wait[0]=0.0; srv_time[0]=exp_random(SERVICE_TIME); srv_finish[0]=srv_start[0] + srv_time[0]; /* 2人目の客が到着. 窓口0が空いていれば窓口0に、塞がっていれば窓口1に入ってすぐサービス開始 */ arrival[1]=arrival[0]+exp_random(ARRIVAL_INTERVAL); if(srv_finish[0]>arrival[1]){ counter[1]=1; current_user[1]=1; } else{ counter[1]=0; current_user[0]=1; } srv_start[1]=arrival[1]; wait[1]=0.0; srv_time[1]=exp_random(SERVICE_TIME); srv_finish[1]=srv_start[1]+srv_time[1]; for(i=2; i<N_USER; i++){ /* 客の到着時刻 = 前の客の到着時刻 + 到着間隔 */ arrival[i]=arrival[i-1]+exp_random(ARRIVAL_INTERVAL); /* 利用窓口 = 2つに窓口で早く空くほう */ if(srv_finish[current_user[1]]<srv_finish[current_user[0]]){ counter[i]=1; } else{ counter[i]=0; }

  • 待ち行列

    待ち行列について質問です。 タクシーと客の待ち行列についてなのですが、 ・タクシーの到着率:μ、ランダム到着 ・客の到着率:λ、ランダム到着 ・客は1台のタクシーに乗る ・タクシーに乗り込む時間は無視できる このとき、この待ち行列は M/M/1型なのでしょうか?あるいは M/M/c型なのでしょうか? 分かる方いらっしゃいましたら、解説お願いします。

  • 待ち行列モデル

    入る側の客の到着率:μ 出る側の客の到着率:λ 改札の処理時間は:μ 改札の数15個 入る専用改札:X 出る専用改札:Y という待ち行列の問題を考えてみたのですが この問題はM/M/1で解くことができるのでしょうか?

  • 待ち行列に関して質問です。解る方お願いします。

    今、M/M/1(1)の待ち行列で、もし行列が二人以上並んだ場合、そのお客はシステムから排除されるとします。この場合、そのシステムから排除されたお客の平均の数の公式がちょっとわからないので質問しました。 行列の型 M/M/1(1) 客の到着率=λ サービス率=μ 窓口の数=1 利用率=λ/μ とします。できれば解説がついていれば在りがたいのですが、答だけでもかまわないので宜しくお願いします。

  • 待ち行列の問題です

    情報検定24年度前期の問題に待ち行列が出題されましたが、まったくわかりませんでした。 http://jken.sgec.or.jp/docs/past_test/120909_mondaijs03.pdf <設問>次の代表的な待ち行列モデルM/M/1に関する記述中の()に入れる べき適切な字句を解答群の中から選べ。 まず,窓口利用率を考える。単位時間にサービス窓口がサービス(処理)を行って いた割合であるから,表中の記号を使って窓口利用率を表すと,ρ=ts×λで求められる。 次に,平均待ち時間Wqを考える。トランザクションが到着したとき,窓口でサービス中のト ランザクションも含めて(Lq+ρ)個のトランザクションが,待ち行列系内に存在している。 この系内に存在するトランザクションが,サービスを受けて待ち行列から抜け出すまでの時間で あるから,表中の記号を使って,Wq=ρ/(1-ρ)×tsで求められる。 最後に,到着してから窓口でサービスを受けて抜け出すまでの平均時間tqを考える。 これは,平均待ち時間とサービス時間の合計であるから,tq=(1)で求められる。 今,1分間に平均9件のトランザクションが到着し,1件当たりの平均サービス時間を5秒とする。この場合,単位時間を窓口で1分とするとλ=9(件/分),μ=(2)(件/分),ta=(3)(分/件),ts=(4)(分/件)となり,ρは(5)となる。この窓口利用率の値が(6)を超えると,処理能力を超えるこ とになる。また,Wqは(7)秒,tqは(8)秒となる。 答えは、 (1) 1/1-ρ×Ts  (2) 12  (3) 1/9  (4) 1/12 (5) 0.75  (6)1.0  (7) 15  (8) 20 です。 解説をお願いします。

  • 行列の積の計算プログラムを教えてください。

    現在、BASICの勉強を独学でしていますが、なかなか理解ができないでいて困っています。 4行4列の2つの行列A、Bの積を計算するプログラムを書きたいのですが、どのように書けばよいのか教えていただけないでしょうか? DIM文を使うことはわかるのですが、使い方がよくわからないでいます。 よろしくお願いします。

  • 待ち行列について教えてください(バス停での乗客挙動)

    路線バス(ダイヤに従い運行)において、あるバスにおける、あるバス停での乗客の到着の仕方(各乗客の待ち時間)について考えています。 ここで、そのバス停での乗客数は仮定するとします。 M/M/1待ち行列モデルを用いることになるのでしょうか? それとも乗客はランダムに到着すると考えるべきでしょうか? ダイヤの運行密度にも関係してくるとは思いますが、 例えば一時間に3,4便運行しているとすると、どのように考えるべきでしょうか。 アドバイスの方、よろしくお願いします。

  • CPU使用率に関して困ってます

    ネットなどで調べてみると、CPU使用率は70~80%以上になるとM/M/1待ち行列では、CPU待ち時間が急激に伸びるのがわかったのですが、M/M/N待ち行列の場合では違いはあるのでしょうか。 CPU使用率80%以上でのCPU待ち時間の伸び率の違いなどご回答お願い致します。

  • 待ち行列のMMSモデルについて

    ある銀行の出張所に2台のATMが設置している.ある時間帯に おいて,利用者は2人/分の割合で到着する.平均利用時間 は3分である.この時間帯におけるATM利用者の平均待ち行列長 と平均待ち時間をM/M/Sモデルを用いて求めよ.答えは小数点 第2位まで示せ. 自分なりに調べて解いてみたのですが答えにマイナスが出てしまいました。 何が間違っているのか分からないので解いて下さると助かります。

  • 待ち行列の問題

    あるターミナルに5つのドッグがある。配送用のトラックからの荷下ろし時間を調査したところ、いずれも平均35分の負の指数分布であることがわかった。これらのドッグに1時間6台の割合で到着するものとすると、 (1) 到着してから出て行くまでの平均時間 (2) トラックが到着した時すべてのドッグがふさがっている確率 (3) ドッグが空くまで待っている平均トラック数 はそれぞれいくらか。 という問題で、(1)は平均滞在時間。(3)は平均待ち時間として考えてもよいですよね?しかし(2)の考え方がよくわかりません。あと、負の指数分布となっているので計算式は変わってくるのでしょうか?M/M/1の場合しか習っておらず、今公式を見つけたところです。

専門家に質問してみよう