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,
•
μ – intensywność kanału obsługi (rozkład czasu obsługi
wykładniczy).
λ
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
Kolejka =
OBJECT
(QueueList);
FORWARD
;
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();
END OBJECT
;
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);
END OBJECT
;
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
;
TELL METHOD
GenerujKlientow();
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;
BEGIN
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
INC(dlugosc);
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
NEW(gen);
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);
ASK plik TO WriteReal(ASK monRS TO Mean, 10, 4);
ASK plik TO WriteLn;
ASK plik TO Close;
DISPOSE(plik);
DIPOSE(gen);
DIPOSE(gzd);
DIPOSE(kol);
END MODULE
.