スーパーのレジの行列シュミレーション TDC 2006/10/01 10:54:09 ├<続き> TDC 2006/10/01 10:55:33 └お客が来たときのみ表示に変更。 TDC 2006/10/09 14:52:12 ├<続き> TDC 2006/10/09 14:53:09 └グラフィックスで表示してみました。 荒田浩二 2006/10/09 22:49:27 ├<続き> 荒田浩二 2006/10/09 22:55:28 ├<続き> 荒田浩二 2006/10/09 22:57:36 ├<続き> 荒田浩二 2006/10/09 22:58:49 ├訂正: 荒田浩二 2006/10/09 23:14:20 └ありがとうございました。 TDC 2006/10/10 22:08:44 ├レジの仕切りを入れました。 TDC 2006/10/14 19:05:55 ├<続き> TDC 2006/10/14 19:06:49 ├<続き> TDC 2006/10/14 19:07:41 └<続き> TDC 2006/10/14 19:08:25
スーパーのレジの行列シュミレーション TDC 2006/10/01 10:54:09 ツリーへ
スーパーのレジの行列シュミレーション |
返事を書く |
TDC 2006/10/01 10:54:09 | |
大型店舗のレジの行列のシュミレーションをしていました。 できたので、発表します。 ! 店のレジの台数は何台が良いか? ! 1時間に平均50〜200人が来客しているとする。 ! 1人あたりの処理時間は、120秒とする。 ! 平均の列の長さを1人以下にしたい。 ! 実験は、16時00分〜19時00分までの計3時間(=3600秒×3)とし ! 16時以前に並んでいた客は無視することとした。 PRINT "レジの台数は何台が良いか?" !------初期条件1-------------------------------- OPTION ARITHMETIC DECIMAL RANDOMIZE OPTION BASE 0 LET Reg=7 !レジの台数 1〜20台 LET AVG_NIN=200 ! 平均人数 50〜200人/時 LET JOB_time=120 ! 1人あたり処理時間 10秒〜120秒 LET AVG_NIN3=AVG_NIN*3 LET hour3=3600*3 !------初期設定2-------------------------------- DIM CSTM(AVG_NIN3) ! DIM Regipool(1 TO Reg) ,RegiLEN(1 TO Reg) DIM RegiRANK(1 TO Reg) DIM JIKAN_DATA(0 TO hour3-1) !■■■■メインルーチン■■■■ PRINT "来客のデータを生成する しばらくおまちください" CALL imitate_data ! 来客のデータを生成する 誰が何時に来たか CALL JIKAN ! 並びかえる 何時何分何秒に何人きたか? PRINT "データの準備ができました!!" PRINT "-----------------------------------------" PRINT "レジの台数=";Reg PRINT "1時間あたりの平均人数=";AVG_NIN PRINT "レジ1台あたりの処理時間";JOB_time PRINT "-----------------------------------------" WAIT DELAY 2 FOR TIM=0 TO hour3-1 !●●●定期処理●●● ! ■@残り処理時間の減算 ! ■A新たな客が来た場合は、一番並んでいないレジに客を入れる ! ■Bレジの列の長さの計算 ! ■Cレジの列の長さの平均値を計算 !■@残り処理時間の減算 CALL degree !■A新たな客が来た場合は、一番並んでいないレジに客を入れる LET pool=JOB_time*JIKAN_DATA(TIM) CALL RANKing IF pool>0 THEN DO FOR I=1 TO Reg IF RegiRANK(I)=1 THEN LET KYAKUSU=KYAKUSU+1 PRINT KYAKUSU;"番目のお客が来ました" LET SUM_WTIME=SUM_WTIME+Regipool(I) !待ち時間の加算 LET Regipool(I)=Regipool(I)+JOB_time LET pool=pool-JOB_time END IF NEXT I CALL RANKing LOOP UNTIL pool<JOB_time END IF <続く> |
├<続き> TDC 2006/10/01 10:55:33 ツリーへ
Re: スーパーのレジの行列シュミレーション |
返事を書く |
TDC 2006/10/01 10:55:33 | |
<続き>
!■Bレジの列の長さの計算 PRINT TIM;"秒後" FOR I=1 TO Reg LET RegiLEN(I)=CEIL(Regipool(I)/JOB_time) PRINT I;"番レジ:";REPEAT$("●",RegiLEN(I)) ,RegiLEN(I);"人並んでいる" NEXT I !■C列の長さの平均を求める LET SUMLEN=0 FOR I=1 TO Reg !列の長さの平均 LET SUMLEN=SUMLEN+RegiLEN(I) NEXT I LET AVGLEN=SUMLEN/Reg PRINT "現在の列の長さ=";ROUND(AVGLEN,2);"人" ! WAIT DELAY 0.2 ! IF TIM>=3600 AND TIM<3600*2-1 LET SUM_AVGLEN=SUM_AVGLEN+AVGLEN LET CNT=CNT+1 PRINT "これまでの列の長さの平均値=";ROUND(SUM_AVGLEN/CNT,2);"人" ! END IF PRINT "これまでの客数=";KYAKUSU;"人" IF KYAKUSU>0 THEN PRINT "待ち時間の平均値=";ROUND(SUM_WTIME/KYAKUSU,2);"秒" NEXT TIM !■終了 PRINT "終了!" !-------------サブルーチン--------------------- SUB RANKing ! 一番小さいものから順に番号をふる FOR I=1 TO Reg LET RegiRANK(I)=0 NEXT I LET RK=1 DO LET SML=100000000 FOR I=1 TO Reg !ランキングされていない中での最小値を探す IF RegiRANK(I)=0 AND SML>Regipool(I) THEN LET SML=Regipool(I) NEXT I FOR I=1 TO Reg !最小値と一致するものにランキングを与える IF SML=Regipool(I) THEN LET RegiRANK(I)=RK LET RK=RK+1 END IF NEXT I LOOP UNTIL RK=Reg+1 END SUB SUB ini_RANKing FOR I=1 TO Reg LET RegiRANK(I)=I NEXT I END SUB SUB degree FOR I=1 TO Reg IF Regipool(I)>0 THEN LET Regipool(I)=Regipool(I)-1 NEXT I END SUB SUB JIKAN ! 何時に何人きたか? FOR I=1 TO AVG_NIN3 LET JIKAN_DATA(CSTM(I))=JIKAN_DATA(CSTM(I))+1 NEXT I END SUB SUB imitate_data FOR J=1 TO AVG_NIN3 ! LET CSTM(J)=MOD(INT(RND*10000000),hour3) !0〜10799秒=3時間で、乱数を発生させる。 NEXT J ! 順番にソートする CALL sort0 END SUB SUB sort0 DO LET CHK=0 FOR I=1 TO AVG_NIN3-1 IF CSTM(I)>CSTM(I+1) THEN swap CSTM(I),CSTM(I+1) LET CHK=1 END IF NEXT I LOOP UNTIL CHK=0 PRINT "■■■バブルソート終わり■■■" END SUB END |
└お客が来たときのみ表示に変更。 TDC 2006/10/09 14:52:12 ツリーへ
Re: スーパーのレジの行列シュミレーション |
返事を書く |
TDC 2006/10/09 14:52:12 | |
お客が来たときのみ表示に変更。
PRINT "レジの台数は何台が良いか?" !------初期条件1-------------------------------- OPTION ARITHMETIC DECIMAL RANDOMIZE OPTION BASE 0 LET Reg=9 !レジの台数 1〜20台 LET AVG_NIN=200 ! 平均人数 50〜200人/時 LET JOB_time=120 ! 1人あたり処理時間 10秒〜120秒 LET AVG_NIN3=AVG_NIN*3 LET hour3=3600*3 !------初期設定2-------------------------------- DIM RAI_JI(AVG_NIN3) ! 来客人数 DIM Regipool(1 TO Reg) ,RegiLEN(1 TO Reg) DIM RegiRANK(1 TO Reg) DIM JIKAN_DATA(0 TO hour3-1) !■■■■メインルーチン■■■■ PRINT "来客のデータを生成する しばらくおまちください" CALL imitate_data ! 来客のデータを生成する 誰が何時に来たか CALL JIKAN ! 並びかえる 何時何分何秒に何人きたか? PRINT "データの準備ができました!!" PRINT "-----------------------------------------" PRINT "レジの台数=";Reg;"台" PRINT "1時間あたりの平均人数=";AVG_NIN;"人" PRINT "レジ1台あたりの処理時間=";JOB_time;"秒" PRINT "-----------------------------------------" WAIT DELAY 2 FOR TIM=0 TO hour3-1 !●●●定期処理●●● !■@残り処理時間の減算 CALL degree !■A新たな客が来た場合は、一番並んでいないレジに客を入れる LET pool=JOB_time*JIKAN_DATA(TIM) IF pool>0 THEN LET QA9_FLG=1 ELSEIF pool=0 THEN LET QA9_FLG=0 END IF CALL RANKing IF pool>0 THEN DO FOR I=1 TO Reg IF RegiRANK(I)=1 THEN LET KYAKUSU=KYAKUSU+1 IF QA9_FLG=1 THEN PRINT "■■■■";KYAKUSU;"番目のお客が来ました■■■■" LET SUM_WTIME=SUM_WTIME+Regipool(I) !待ち時間の加算 LET Regipool(I)=Regipool(I)+JOB_time LET pool=pool-JOB_time END IF NEXT I CALL RANKing LOOP UNTIL pool<JOB_time END IF !■Bレジの列の長さの計算 IF QA9_FLG=1 THEN PRINT TIM;"秒後-----" FOR I=1 TO Reg LET RegiLEN(I)=CEIL(Regipool(I)/JOB_time) IF QA9_FLG=1 THEN PRINT I;"番レジ:";REPEAT$("●",RegiLEN(I)) ,RegiLEN(I);"人並んでいる" NEXT I !■C列の長さの平均を求める LET SUMLEN=0 FOR I=1 TO Reg !列の長さの平均 LET SUMLEN=SUMLEN+RegiLEN(I) NEXT I LET AVGLEN=SUMLEN/Reg IF QA9_FLG=1 THEN PRINT "現在の列の長さ=";ROUND(AVGLEN,2);"人" LET SUM_AVGLEN=SUM_AVGLEN+AVGLEN LET CNT=CNT+1 IF QA9_FLG=1 THEN PRINT "これまでの列の長さの平均値=";ROUND(SUM_AVGLEN/CNT,2);"人" ! END IF IF QA9_FLG=1 THEN PRINT "これまでの客数=";KYAKUSU;"人" IF KYAKUSU>0 THEN PRINT "待ち時間の平均値=";ROUND(SUM_WTIME/KYAKUSU,2);"秒" END IF NEXT TIM PRINT "終了!" <続く> |
├<続き> TDC 2006/10/09 14:53:09 ツリーへ
Re: お客が来たときのみ表示に変更。 |
返事を書く |
TDC 2006/10/09 14:53:09 | |
<続き>
!-------------サブルーチン--------------------- SUB RANKing ! 一番小さいものから順に番号をふる FOR I=1 TO Reg LET RegiRANK(I)=0 NEXT I LET RK=1 DO LET SML=100000000 FOR I=1 TO Reg !ランキングされていない中での最小値を探す IF RegiRANK(I)=0 AND SML>Regipool(I) THEN LET SML=Regipool(I) NEXT I FOR I=1 TO Reg !最小値と一致するものにランキングを与える IF SML=Regipool(I) THEN LET RegiRANK(I)=RK LET RK=RK+1 END IF NEXT I LOOP UNTIL RK=Reg+1 END SUB SUB ini_RANKing FOR I=1 TO Reg LET RegiRANK(I)=I NEXT I END SUB SUB degree FOR I=1 TO Reg IF Regipool(I)>0 THEN LET Regipool(I)=Regipool(I)-1 NEXT I END SUB SUB JIKAN ! 何時に何人きたか? FOR I=1 TO AVG_NIN3 LET JIKAN_DATA(RAI_JI(I))=JIKAN_DATA(RAI_JI(I))+1 NEXT I END SUB SUB imitate_data FOR J=1 TO AVG_NIN3 ! LET RAI_JI(J)=MOD(INT(RND*10000000),hour3) !0〜10799秒=3時間で、乱数を発生させる。 NEXT J ! 順番にソートする CALL sort0 END SUB SUB sort0 DO LET CHK=0 FOR I=1 TO AVG_NIN3-1 IF RAI_JI(I)>RAI_JI(I+1) THEN swap RAI_JI(I),RAI_JI(I+1) LET CHK=1 END IF NEXT I LOOP UNTIL CHK=0 PRINT "■■■バブルソート終わり■■■" END SUB END |
└グラフィックスで表示してみました。 荒田浩二 2006/10/09 22:49:27 ツリーへ
Re: お客が来たときのみ表示に変更。 |
返事を書く |
荒田浩二 2006/10/09 22:49:27 | |
グラフィックスで表示してみました。
PRINT文は出力した行数が多くなるとどうしても実行時間が遅くなるので、グラフィックス画面に表示させてみました。 レジの並び具合がひと目でわかります。 描画ごとに、WAIT DELAYで0.05秒の遅延をかけて、実行時間は40秒ほどです。 WAIT DELAYをはずせば、実行時間は10秒以下になるでしょう。 新規に使用した変数や配列は、 th,tw,x0,TIM2,RL1$(),RL2(),SAC,SAC2,AVGLEN2,KYAKUSU2,SWK,SWK2 また、グラフィックス画面で印字行を示す関数LL(r)を定義しました。 !------初期条件1-------------------------------- OPTION ARITHMETIC DECIMAL RANDOMIZE OPTION BASE 0 SET WINDOW 0,1,0,1 LET th=0.024 ! 文字の高さ LET tw=0.031 ! 1行の高さ,1文字の幅 SET TEXT HEIGHT th DEF LL(r)=1-r*tw ! r行目 LET x0=0.05 ! 行の書きはじめの位置 LET Reg=9 !レジの台数 1〜20台 LET AVG_NIN=200 ! 平均人数 50〜200人/時 LET JOB_time=120 ! 1人あたり処理時間 10秒〜120秒 LET AVG_NIN3=AVG_NIN*3 LET hour3=3600*3 !------初期設定2-------------------------------- DIM RAI_JI(AVG_NIN3) ! 来客人数 DIM Regipool(1 TO Reg) ,RegiLEN(1 TO Reg) DIM RL1$(1 TO Reg),RL2(1 TO Reg) DIM RegiRANK(1 TO Reg) DIM JIKAN_DATA(0 TO hour3-1) !■■■■メインルーチン■■■■ PLOT TEXT ,AT 0.2,LL(10) : "来客のデータを生成する しばらくおまちください" CALL imitate_data ! 来客のデータを生成する 誰が何時に来たか CALL JIKAN ! 並びかえる 何時何分何秒に何人きたか? PLOT TEXT ,AT 0.3,LL(16) :"データの準備ができました!!" WAIT DELAY 2 CLEAR PLOT TEXT ,AT 0.3,LL(1) :"レジの台数は何台が良いか?" PLOT TEXT ,AT 0.2,LL(2) :"-----------------------------------------" PLOT TEXT ,AT 0.2,LL(3) ,USING "レジの台数=###台":Reg PLOT TEXT ,AT 0.2,LL(4) ,USING "1時間あたりの平均人数=####人":AVG_NIN PLOT TEXT ,AT 0.2,LL(5) ,USING "レジ1台あたりの処理時間=####秒":JOB_time PLOT TEXT ,AT 0.2,LL(6) :"-----------------------------------------" PLOT TEXT ,AT x0,LL(8) :"■■■■ 番目のお客が来ました■■■■" FOR i=1 TO Reg PLOT TEXT ,AT x0,LL(10+I) ,USING "###番レジ:":I NEXT I PLOT TEXT ,AT x0,LL(25) :"現在の列の長さ=" PLOT TEXT ,AT x0,LL(26) :"これまでの列の長さの平均値=" PLOT TEXT ,AT x0,LL(27) :"これまでの客数=" PLOT TEXT ,AT x0,LL(28) :"待ち時間の平均値=" <続く> |
├<続き> 荒田浩二 2006/10/09 22:55:28 ツリーへ
Re: グラフィックスで表示してみました。 |
返事を書く |
荒田浩二 2006/10/09 22:55:28 | |
<続き>
FOR TIM=0 TO hour3-1 !●●●定期処理●●● !■@残り処理時間の減算 CALL degree !■A新たな客が来た場合は、一番並んでいないレジに客を入れる LET pool=JOB_time*JIKAN_DATA(TIM) IF pool>0 THEN LET QA9_FLG=1 ELSEIF pool=0 THEN LET QA9_FLG=0 END IF CALL RANKing IF pool>0 THEN DO FOR I=1 TO Reg IF RegiRANK(I)=1 THEN LET KYAKUSU=KYAKUSU+1 IF QA9_FLG=1 THEN SET TEXT COLOR 0 PLOT TEXT ,AT x0+4.1*tw,LL(8) ,USING "####":KYAKUSU-1 SET TEXT COLOR 1 PLOT TEXT ,AT x0+4.1*tw,LL(8) ,USING "####":KYAKUSU END IF LET SUM_WTIME=SUM_WTIME+Regipool(I) !待ち時間の加算 LET Regipool(I)=Regipool(I)+JOB_time LET pool=pool-JOB_time END IF NEXT I CALL RANKing LOOP UNTIL pool<JOB_time END IF !■Bレジの列の長さの計算 FOR I=1 TO Reg LET RegiLEN(I)=CEIL(Regipool(I)/JOB_time) NEXT I !■C列の長さの平均を求める LET SUMLEN=0 FOR I=1 TO Reg !列の長さの平均 LET SUMLEN=SUMLEN+RegiLEN(I) NEXT I LET AVGLEN=SUMLEN/Reg LET SUM_AVGLEN=SUM_AVGLEN+AVGLEN LET CNT=CNT+1 LET SAC=SUM_AVGLEN/CNT <続く> |
├<続き> 荒田浩二 2006/10/09 22:57:36 ツリーへ
Re: グラフィックスで表示してみました。 |
返事を書く |
荒田浩二 2006/10/09 22:57:36 | |
<続き>
! 印字をまとめる IF QA9_FLG=1 THEN WAIT DELAY 0.05 ! 強制遅延 SET COLOR 0 PLOT TEXT ,AT x0,LL(10) ,USING "#####":TIM2 SET COLOR 1 PLOT TEXT ,AT x0,LL(10) ,USING "#####秒後#####":TIM,"-----" LET TIM2=TIM FOR I=1 TO Reg SET TEXT COLOR 0 PLOT TEXT ,AT x0+6*tw,LL(10+I) :RL1$(I) PLOT TEXT ,AT 0.7,LL(10+I) ,USING "##":RL2(I) LET RL1$(I)=REPEAT$("●",RegiLEN(I)) LET RL2(I)=RegiLEN(I) SET TEXT COLOR 1 PLOT TEXT ,AT x0+6*tw,LL(10+I) :RL1$(I) PLOT TEXT ,AT 0.7,LL(10+I) ,USING "##人並んでいる":RegiLEN(I) NEXT I LET SWK=SUM_WTIME/KYAKUSU SET TEXT COLOR 0 PLOT TEXT ,AT x0+8*tw,LL(25) ,USING "##.##":ROUND(AVGLEN2,2) PLOT TEXT ,AT x0+14.5*tw,LL(26) ,USING "##.##":ROUND(SAC2,2) PLOT TEXT ,AT x0+8*tw,LL(27) ,USING "####":KYAKUSU2 PLOT TEXT ,AT x0+8.5*tw,LL(28) ,USING "####.##":ROUND(SWK2,2) SET TEXT COLOR 1 PLOT TEXT ,AT x0+8*tw,LL(25) ,USING "##.##人":ROUND(AVGLEN,2) ! 現在の列の長さ PLOT TEXT ,AT x0+14.5*tw,LL(26) ,USING "##.##人":ROUND(SAC,2) ! これまでの列の長さの平均値 PLOT TEXT ,AT x0+8*tw,LL(27) ,USING "####人":KYAKUSU ! これまでの客数 PLOT TEXT ,AT x0+8.5*tw,LL(28) ,USING "####.##秒":ROUND(SWK,2) ! 待ち時間の平均値 LET AVGLEN2=AVGLEN LET SAC2=SAC LET KYAKUSU2=KYAKUSU LET SWK2=SWK END IF NEXT TIM PLOT TEXT ,AT x0,0.02 :"終了!" <続く> |
├<続き> 荒田浩二 2006/10/09 22:58:49 ツリーへ
Re: グラフィックスで表示してみました。 |
返事を書く |
荒田浩二 2006/10/09 22:58:49 | |
<続き>
!-------------サブルーチン--------------------- SUB RANKing ! 一番小さいものから順に番号をふる FOR I=1 TO Reg LET RegiRANK(I)=0 NEXT I LET RK=1 DO LET SML=100000000 FOR I=1 TO Reg !ランキングされていない中での最小値を探す IF RegiRANK(I)=0 AND SML>Regipool(I) THEN LET SML=Regipool(I) NEXT I FOR I=1 TO Reg !最小値と一致するものにランキングを与える IF SML=Regipool(I) THEN LET RegiRANK(I)=RK LET RK=RK+1 END IF NEXT I LOOP UNTIL RK=Reg+1 END SUB SUB ini_RANKing FOR I=1 TO Reg LET RegiRANK(I)=I NEXT I END SUB SUB degree FOR I=1 TO Reg IF Regipool(I)>0 THEN LET Regipool(I)=Regipool(I)-1 NEXT I END SUB SUB JIKAN ! 何時に何人きたか? FOR I=1 TO AVG_NIN3 LET JIKAN_DATA(RAI_JI(I))=JIKAN_DATA(RAI_JI(I))+1 NEXT I END SUB SUB imitate_data FOR J=1 TO AVG_NIN3 ! LET RAI_JI(J)=MOD(INT(RND*10000000),hour3) !0〜10799秒=3時間で、乱数を発生させる。 NEXT J ! 順番にソートする CALL sort0 END SUB SUB sort0 DO LET CHK=0 FOR I=1 TO AVG_NIN3-1 IF RAI_JI(I)>RAI_JI(I+1) THEN swap RAI_JI(I),RAI_JI(I+1) LET CHK=1 END IF NEXT I LOOP UNTIL CHK=0 PLOT TEXT ,AT 0.3,LL(13) :"■■■バブルソート終わり■■■" END SUB END |
├訂正: 荒田浩二 2006/10/09 23:14:20 ツリーへ
Re: グラフィックスで表示してみました。 |
返事を書く |
荒田浩二 2006/10/09 23:14:20 | |
訂正:
ブラウザで2個以上の空白が表示されないため、次の行を訂正します。 PLOT TEXT ,AT x0,LL(8) :"■■■■ 番目のお客が来ました■■■■" PLOT TEXT ,AT x0,LL(8) :"■■■■"&REPEAT$(" ",4)&"番目のお客が来ました■■■■" |
└ありがとうございました。 TDC 2006/10/10 22:08:44 ツリーへ
Re: グラフィックスで表示してみました。 |
返事を書く |
TDC 2006/10/10 22:08:44 | |
ありがとうございました。
とても速くなり、スクロールしない分、 わかりやすくなりました。 |
├レジの仕切りを入れました。 TDC 2006/10/14 19:05:55 ツリーへ
Re: ありがとうございました。 |
返事を書く |
TDC 2006/10/14 19:05:55 | |
レジの仕切りを入れました。
!------初期設定1-------------------------------- OPTION ARITHMETIC DECIMAL RANDOMIZE OPTION BASE 0 LET Reg=1 !レジの台数 1〜20台 LET AVG_NIN=20 ! 平均人数 50〜200人/時 LET JOB_time=120 ! 1人あたり処理時間 10秒〜120秒 LET AVG_NIN3=AVG_NIN*3 LET hour3=3600*3 !------初期条件2-------------------------------- SET WINDOW 0,1,0,1 LET th=0.024*(1-Reg/150) ! 文字の高さ LET tw=0.031*(1-Reg/150) ! 1行の高さ,1文字の幅 SET TEXT HEIGHT th DEF LL(r)=1-r*tw ! r行目 LET x0=0.05 ! 行の書きはじめの位置 !------初期設定3-------------------------------- DIM RAI_JI(AVG_NIN3) ! 来客人数 DIM Regipool(1 TO Reg) ,RegiLEN(1 TO Reg) DIM RL1$(1 TO Reg),RL2(1 TO Reg) DIM RegiRANK(1 TO Reg) DIM JIKAN_DATA(0 TO hour3-1) <続く> |
├<続き> TDC 2006/10/14 19:06:49 ツリーへ
Re: ありがとうございました。 |
返事を書く |
TDC 2006/10/14 19:06:49 | |
<続き>
!■■■■メインルーチン■■■■ PLOT TEXT ,AT 0.2,LL(10) : "来客のデータを生成中 しばらくおまちください" CALL imitate_data ! 来客のデータを生成する 誰が何時に来たか CALL JIKAN ! 並びかえる 何時何分何秒に何人きたか? PLOT TEXT ,AT 0.3,LL(16) :"データの準備ができました!!" WAIT DELAY 2 CLEAR PLOT TEXT ,AT 0.3,LL(1) :"レジの台数は何台が良いか?" PLOT TEXT ,AT 0.2,LL(2) :"-----------------------------------------" PLOT TEXT ,AT 0.2,LL(3) ,USING "レジの台数=###台":Reg PLOT TEXT ,AT 0.2,LL(4) ,USING "1時間あたりの平均人数=####人":AVG_NIN PLOT TEXT ,AT 0.2,LL(5) ,USING "レジ1台あたりの処理時間=####秒":JOB_time PLOT TEXT ,AT 0.2,LL(6) :"-----------------------------------------" ! PLOT TEXT ,AT x0,LL(8) :"■■■■ 番目のお客が来ました■■■■" PLOT TEXT ,AT x0,LL(8) :"■■■■ 番目のお客が来ました■■■■" FOR i=1 TO Reg PLOT TEXT ,AT x0,LL(10+I) ,USING "###番レジ:":I NEXT I PLOT TEXT ,AT x0,LL(12+Reg) :"現在の列の長さ=" PLOT TEXT ,AT x0,LL(13+Reg) :"これまでの列の長さの平均値=" PLOT TEXT ,AT x0,LL(14+Reg) :"これまでの客数=" PLOT TEXT ,AT x0,LL(15+Reg) :"待ち時間の平均値=" PLOT TEXT ,AT x0,LL(16+Reg) :"レジの稼働率=" FOR TIM=0 TO hour3-1 !●●●定期処理●●● !■@残り処理時間の減算 CALL degree !■A新たな客が来た場合は、一番並んでいないレジに客を入れる LET pool=JOB_time*JIKAN_DATA(TIM) IF pool>0 THEN LET QA9_FLG=1 ELSEIF pool=0 THEN LET QA9_FLG=0 END IF CALL RANKing IF pool>0 THEN DO FOR I=1 TO Reg IF RegiRANK(I)=1 THEN LET KYAKUSU=KYAKUSU+1 IF QA9_FLG=1 THEN SET TEXT COLOR 0 PLOT TEXT ,AT x0+4.1*tw,LL(8) ,USING "####":KYAKUSU-1 SET TEXT COLOR 1 PLOT TEXT ,AT x0+4.1*tw,LL(8) ,USING "####":KYAKUSU END IF LET SUM_WTIME=SUM_WTIME+Regipool(I) !待ち時間の加算 LET Regipool(I)=Regipool(I)+JOB_time LET pool=pool-JOB_time END IF NEXT I CALL RANKing LOOP UNTIL pool<JOB_time END IF !■B-1レジの列の長さの計算 FOR I=1 TO Reg LET RegiLEN(I)=CEIL(Regipool(I)/JOB_time) NEXT I !■B-2 稼働率の計算 FOR I=1 TO Reg IF RegiLEN(I)>=1 THEN LET SUM_RegRT=SUM_RegRT+1 NEXT I LET KADO_AVG=SUM_RegRT/Reg/(TIM+1) !■C列の長さの平均を求める LET SUMLEN=0 FOR I=1 TO Reg !列の長さの平均 LET SUMLEN=SUMLEN+RegiLEN(I) NEXT I LET AVGLEN=SUMLEN/Reg LET SUM_AVGLEN=SUM_AVGLEN+AVGLEN LET CNT=CNT+1 LET SAC=SUM_AVGLEN/CNT IF QA9_FLG=1 THEN WAIT DELAY 0.05 ! 強制遅延 CALL PRT_JIKAN ! 経過時間の表示 CALL RETU ! ●の表示 LET SWK=SUM_WTIME/KYAKUSU CALL PRT_STATE ! 状態のデータ表示 LET AVGLEN2=AVGLEN LET SAC2=SAC LET KYAKUSU2=KYAKUSU LET SWK2=SWK LET KADO_AVG2=KADO_AVG END IF NEXT TIM PLOT TEXT ,AT x0,LL(17+Reg) :"終了!" |
├<続き> TDC 2006/10/14 19:07:41 ツリーへ
Re: ありがとうございました。 |
返事を書く |
TDC 2006/10/14 19:07:41 | |
<続き>
!-------------サブルーチン--------------------- SUB PRT_STATE SET TEXT COLOR 0 PLOT TEXT ,AT x0+8*tw,LL(12+Reg) ,USING "##.##":ROUND(AVGLEN2,2) PLOT TEXT ,AT x0+14.5*tw,LL(13+Reg) ,USING "##.##":ROUND(SAC2,2) PLOT TEXT ,AT x0+8*tw,LL(14+Reg) ,USING "####":KYAKUSU2 PLOT TEXT ,AT x0+8.5*tw,LL(15+Reg) ,USING "####.##":ROUND(SWK2,2) PLOT TEXT ,AT x0+8.5*tw,LL(16+Reg) ,USING "####.##%":ROUND(KADO_AVG2*100,2) ! 稼動率 SET TEXT COLOR 1 PLOT TEXT ,AT x0+8*tw,LL(12+Reg) ,USING "##.##人":ROUND(AVGLEN,2) ! 現在の列の長さ PLOT TEXT ,AT x0+14.5*tw,LL(13+Reg) ,USING "##.##人":ROUND(SAC,2) ! これまでの列の長さの平均値 PLOT TEXT ,AT x0+8*tw,LL(14+Reg) ,USING "####人":KYAKUSU ! これまでの客数 PLOT TEXT ,AT x0+8.5*tw,LL(15+Reg) ,USING "####.##秒":ROUND(SWK,2) ! 待ち時間の平均値 PLOT TEXT ,AT x0+8.5*tw,LL(16+Reg) ,USING "####.##%":ROUND(KADO_AVG*100,2) ! 稼動率 END SUB SUB PRT_JIKAN SET COLOR 0 ! PLOT TEXT ,AT x0,LL(10) ,USING "#####":TIM2 PLOT TEXT ,AT x0,LL(10) ,USING "##時間##分##秒後######":TIM_Hour2,TIM_Min2,TIM_Sec2,"-----" SET COLOR 1 LET TIM_Hour=INT(TIM/3600) LET TIM_Min=INT(MOD(TIM,3600)/60) LET TIM_Sec=MOD(TIM,60) PLOT TEXT ,AT x0,LL(10) ,USING "##時間##分##秒経過######":TIM_Hour,TIM_Min,TIM_Sec,"-----" ! LET TIM2=TIM LET TIM_Hour2=TIM_Hour LET TIM_Min2=TIM_Min LET TIM_Sec2=TIM_Sec END SUB SUB RANKing ! 一番小さいものから順に番号をふる FOR I=1 TO Reg LET RegiRANK(I)=0 NEXT I LET RK=1 DO LET SML=100000000 FOR I=1 TO Reg !ランキングされていない中での最小値を探す IF RegiRANK(I)=0 AND SML>Regipool(I) THEN LET SML=Regipool(I) NEXT I FOR I=1 TO Reg !最小値と一致するものにランキングを与える IF SML=Regipool(I) THEN LET RegiRANK(I)=RK LET RK=RK+1 END IF NEXT I LOOP UNTIL RK=Reg+1 END SUB SUB ini_RANKing FOR I=1 TO Reg LET RegiRANK(I)=I NEXT I END SUB SUB degree ! 待ち時間の減算 FOR I=1 TO Reg IF Regipool(I)>0 THEN LET Regipool(I)=Regipool(I)-1 NEXT I END SUB |
└<続き> TDC 2006/10/14 19:08:25 ツリーへ
Re: ありがとうございました。 |
返事を書く |
TDC 2006/10/14 19:08:25 | |
<続き>
SUB JIKAN ! 何時に何人きたか? FOR I=1 TO AVG_NIN3 LET JIKAN_DATA(RAI_JI(I))=JIKAN_DATA(RAI_JI(I))+1 NEXT I END SUB SUB imitate_data FOR J=1 TO AVG_NIN3 ! LET RAI_JI(J)=MOD(INT(RND*10000000),hour3) !0〜10799秒=3時間で、乱数を発生させる。 NEXT J ! 順番にソートする CALL sort0 END SUB SUB sort0 DO LET CHK=0 FOR I=1 TO AVG_NIN3-1 IF RAI_JI(I)>RAI_JI(I+1) THEN swap RAI_JI(I),RAI_JI(I+1) LET CHK=1 END IF NEXT I LOOP UNTIL CHK=0 PLOT TEXT ,AT 0.3,LL(13) :"■■■バブルソート終わり■■■" END SUB SUB RETU FOR I=1 TO Reg SET TEXT COLOR 0 ! 消す PLOT TEXT ,AT x0+6*tw,LL(10+I) :RL1$(I) PLOT TEXT ,AT 0.7,LL(10+I) ,USING "##":RL2(I) IF RegiLEN(I)=0 THEN LET RL1$(I)=" ┃" SET TEXT COLOR 1 ! 書く PLOT TEXT ,AT x0+6*tw,LL(10+I) :RL1$(I) PLOT TEXT ,AT 0.7,LL(10+I) ,USING "##人並んでいる":RegiLEN(I) ELSEIF RegiLEN(I)=>0 THEN SET TEXT COLOR 1 ! 書く LET RL1$(I)="○"&"┃"&REPEAT$("●",RegiLEN(I)-1) PLOT TEXT ,AT x0+6*tw,LL(10+I) :RL1$(I) PLOT TEXT ,AT 0.7,LL(10+I) ,USING "##人並んでいる":RegiLEN(I) ! SET TEXT COLOR 4 ! 書く ! PLOT TEXT ,AT x0+6*tw,LL(10+I) :"○" END IF LET RL2(I)=RegiLEN(I) ! SET TEXT COLOR 1 ! 書く ! PLOT TEXT ,AT x0+6*tw,LL(10+I) :RL1$(I) ! PLOT TEXT ,AT 0.7,LL(10+I) ,USING "##人並んでいる":RegiLEN(I) NEXT I END SUB END |