新しく発言する EXIT インデックスへ
スーパーのレジの行列シュミレーション

  スーパーのレジの行列シュミレーション 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


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。