Metody symulacyjne
Przykład symulacji funkcjonowania SMO
Przykład symulacji oddziału bankowego Zasymulować funkcjonowanie systemu obsługi klientów pewnego oddziału bankowego (okienka kasowego), którego schemat przedstawia poniższy rysunek (SMO). Przy czym:
•
λ – intensywność napływu klientów do oddziału (strumień Poissona),
•
L – długość kolejki w oddziale,
•
M – liczba kanałów równoległej obsługi,
•
μ – in
i ten
e sy
s wn
w oś
o ć
ś k
anału
ł ob
o sł
s u
ł gi
i (
ro
r z
o kła
ł d c
zasu
s ob
o sł
s u
ł gi
i w
y
w kła
ł dnic
i zy).
M=1
L
λ
µ
Symulator SMO (1/8)
MAIN MODULE Smo;
FROM SimMod IMPORT StartSimulation, SimTime, StopSimulation; FROM RandMod IMPORT RandomObj; FROM StatMod IMPORT IStatObj, ITimedStatObj, TSINTEGER, SREAL, RStatObj;
FROM IOMod IMPORT StreamObj, ALL FileUseType; FROM ListMod IMPORT QueueList; TYPE
Ko
K l
o e
l j
e k
j a
a =
= O
B
O J
B E
J C
E T
C (
T Qu
Q eue
u Lis
i t)
t ;
; FO
F R
O W
R A
W R
A D
R ;
OtoczenieObj = OBJECT(RandomObj) lambda: REAL;
kolejka: KolejkaObj;
liczbaKlientow: INTEGER; ASK METHOD Init(IN lbd: REAL; IN kol: KolejkaObj; IN lk: INTEGER);
TELL METHOD GenerujKlientow(); END OBJECT;
Symulator SMO (2/8)
GniazdoObj = OBJECT(RandomObj) mi: REAL;
kolejka: KolejkaObj;
zajete: BOOLEAN;
czasObslugi: SREAL;
ASK METHOD Init(IN m: REAL; IN kol: KolejkaObj); TELL METHOD Obsluguj(); EN
E D
N
D OB
O J
B E
J C
E T
C ;
T
KlientRec = RECORD
czasWej: REAL;
END RECORD;
Symulator SMO (3/8)
KolejkaObj = OBJECT(QueueList) maxDlugosc: INTEGER;
gniazdo: GniazdoObj;
dlugosc: TSINTEGER;
ASK METHOD Init(IN maxdl: INTEGER; IN gnd: GniazdoObj);
ASK METHOD Wstaw(klient: KlientRec); EN
E D
N
D OB
O J
B E
J C
E T
C ;
T
Symulator SMO (4/8)
OBJECT OtoczenieObj
ASK METHOD Init(IN lbd: REAL; IN kol: KolejkaObj; IN lk: INTEGER);
BEGIN
lambda := lbd;
liczbaKlientow := lk;
kolejka := kol;
END METHOD;
TE
T L
E L
L
L ME
M T
E H
T O
H D
O
Ge
G n
e e
n r
e u
r j
u K
j l
K i
l e
i n
e t
n o
t w
o (
w )
( ;
)
VAR i: INTEGER;
kl: KlientRec;
BEGIN
FOR i := 1 TO liczbaKilentow WAIT DURATION Exponential(1.0 / lambda) ON INTERRUPT
END WAIT;
NEW(kl);
ASK kolejka TO Wstaw(kl); END FOR;
END METHOD;
END OBJECT;
Symulator SMO (5/8)
OBJECT GniazdoObj
ASK METHOD Init(IN m: REAL; IN kol: KolejkaObj); BEGIN
mi := m;
kolejka := kol;
END METHOD;
TELL METHOD Obsluguj(); VAR kl: KlientRec;
BE
B G
E I
G N
I
zajete := TRUE;
WHILE ASK kolejka TO numberIn > 0
kl := ASK kolejka TO Remove(); WAIT DURATION Exponential(1.0 / mi) ON INTERRUPT
END WAIT;
czasObslugi := SimTime – kl.czasWej; DISPOSE(kl);
END WHILE;
zajete := FALSE;
END METHOD;
END OBJECT;
Symulator SMO (6/8)
OBJECT KolejkaObj
ASK METHOD Init(IN maxdl: INTEGER; IN gnd: GniazdoObj); BEGIN
maxDlugosc := maxdl;
gniazdo := gnd;
END METHOD;
ASK METHOD Wstaw(klient: KlientRec); BEGIN
IF maxDlugosc > numberIn IN
I C
N (
C d
( l
d u
l g
u o
g s
o c
s )
c ;
)
klient.czasWej := SimTime; Add(klient);
IF NOT ASK gniazdo TO zajete TELL gniazdo TO Obsluguj; END IF;
ELSE
DISPOSE(klient);
END IF;
END METHOD;
END OBJECT;
Symulator SMO (7/8)
VAR
gen: GeneratorObj;
gzd: GniazdoObj;
kol: KolejkaObj;
plik: StreamObj;
monITS: ITimedStatObj;
monRS: RStatObj;
BEGIN
NE
N W
E (
W g
( e
g n);
)
NEW(gzd);
NEW(kol);
ASK gen TO Init(1.5, kol, 1000); ASK gzd TO Init(2.0, kol); ASK kol TO Init(10, gzd); TELL gen TO GenerujKlientow(); StartSimulation;
Symulator SMO (8/8)
NEW(plik);
ASK plik TO Open(„wyniki.txt”, Output); ASK plik TO WriteString(„srednia dlugosc kolejki: ”); monITS := GETMONITOR(ASK kol TO dlugosc, ITimedStatObj); ASK plik TO WriteReal(ASK monITS TO Mean, 10, 4); ASK plik TO WriteLn;
ASK plik TO WriteString(„sredni czas obslugi klienta: ”); monRS := GETMONITOR(ASK gzd TO czasObslugi, RStatObj); AS
A K
S
K pl
p i
l k
i
k TO
T
O Wr
W i
r t
i e
t R
e e
R al(
l ASK
S
K mo
m n
o R
n S
R
S TO
T
O Me
M a
e n
a ,
n
, 10
1 ,
0
, 4)
4 ;
)
ASK plik TO WriteLn;
ASK plik TO Close;
DISPOSE(plik);
DIPOSE(gen);
DIPOSE(gzd);
DIPOSE(kol);
END MODULE.