生活の中のシミュレーション
大型店舗:レジ 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