生活の中のシミュレーション


   大型店舗:レジ 20台の場合のコンピュータシミュレーション状況




------------------------------------------------------------------------------------------

!■■■初期設定1■■■■■■■■■■■■■■■■  十進BASIC
LET Reg=4 ! レジの台数 1〜20台
LET AVG_NIN=80 ! 平均人数 50〜500人/時
LET JOB_time=120 ! 1人あたり処理時間 10秒〜120秒
LET SMT_hour=5 ! シミュレーション実行時間

!------初期条件2--------------------------------
LET AVG_NIN_N=AVG_NIN*SMT_hour
LET hour_N=3600*SMT_hour

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 ! 行の書きはじめの位置

FOR JJJ=1 TO 10000
CLEAR
!------初期設定3--------------------------------
RANDOMIZE
OPTION BASE 0
DIM RAI_JI(AVG_NIN_N) ! 来客人数
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 hour_N-1)

!■■■■メインルーチン■■■■
SET TEXT COLOR 1
PLOT TEXT ,AT 0.2,LL(10) : "来客のデータを生成中 しばらくおまちください"
WAIT DELAY 2
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 hour_N-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

SET TEXT COLOR 4
PLOT TEXT ,AT x0,LL(17+Reg) :"終了!"
WAIT DELAY 10

LET KYAKUSU=0
LET SUMLEN=0
LET SUM_AVGLEN=0
LET SUM_RegRT=0
LET SUM_WTIME=0
LET SUM_AVGLEN=0
LET CNT=0
FOR I=0 TO hour_N-1
LET JIKAN_DATA(I)=0
NEXT I
FOR I=1 TO AVG_NIN_N !
LET RAI_JI(I)=0
NEXT I
FOR I=1 TO Regi !
LET RegiLEN(I)=0
NEXT I
NEXT JJJ

!-------------サブルーチン---------------------
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


SUB JIKAN ! 何時に何人きたか?
FOR I=1 TO AVG_NIN_N
LET JIKAN_DATA(RAI_JI(I))=JIKAN_DATA(RAI_JI(I))+1
NEXT I
END SUB


SUB imitate_data
FOR J=1 TO AVG_NIN_N !
LET RAI_JI(J)=MOD(INT(RND*10000000),hour_N) !0〜10799秒=3時間で、乱数を発生させる。
NEXT J
! 順番にソートする
CALL sort0
END SUB


SUB sort0
DO
LET CHK=0
FOR I=1 TO AVG_NIN_N-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



Math TOP