WOJSKOWA AKADEMIA TECHNICZNA
Podstawy Symulacji
Sprawozdanie
Autor: Jarosław Sochocki
Grupa: I8B1S1
Prowadzący: dr inż. Jarosław Rulka
Data: 25-01-2011
I. Treść zadania
Przy realizacji zadania należy przyjąć następujące dane z listy przedstawionej poniżej:
rozkład zmiennych Tj: (nrDz + i) mod 6 + 1;
rozkład zmiennych Oi: (nrDz + i + 1) mod 6 + 1;
Li: (nrDz + i) mod 2 + 1;
ALi: (nrDz + i + 2) mod 3 + 1;
Rj = (nrDz + i + 5) mod 3 + 1;
Mi = (nrDz + i + 2) mod 4 + 1;
Blokowanie zgłoszeń 1. SMO;
Klienci niecierpliwi w SMOi : Ni = (nrDz + i) mod 4 (ograniczony czas oczekiwania na rozpoczęcie obsługi);
gdzie:
i - numer SMO;
j - numer strumienia;
Tj - zmienna losowa oznaczająca czas pomiędzy kolejnymi napływami zgłoszeń do systemu;
Oi - zmienna losowa oznaczająca czas obsługi pojedynczego zgłoszenia w gnieździe;
Ni - zmienna losowa oznaczająca czas niecierpliwości zgłoszenia (gdy i = 0 => zgłoszenia cierpliwe);
Rj - zmienna losowa oznaczająca wielkość paczki zgłoszeń (wchodzących w tej samej chwili) j-tego strumienia;
pk - prawdopodobieństwa przemieszczenia się zgłoszenia po danym łuku;
Li - długość kolejki i-tego SMO;
AL.i - algorytmy kolejek (w przypadku istnienia kolejki z priorytetami należy przyjąć, że zgłoszenia posiadają priorytety);
Rozkłady zmiennych losowych:
Wykładniczy
Erlanga
Normalny
Jednostajny
Trójkątny
Weibulla
Długości kolejek pojedynczych SMO
ograniczone (możliwe straty)
nieograniczone
Algorytm kolejek:
FIFO
LIFO
Z priorytetami
Liczba stanowisk obsługi w gniazdach (1-M)
Ilość zgłoszeń jednocześnie napływających do systemu (1-R)
Pozostałe dane należy określać na początku symulacji. Dane wejściowe i wyniki odczytywane/zapisywane z/do pliku. Program powinien działać w trybie z i bez komunikatów ekranowych.
II. Dane dla numeru z dziennika równego 18
Generator 1:
Generuje paczki (klientów), po czym wysyła je do SMO 1.
T1 - Czas pomiędzy emisjami ma rozkład Erlanga.
R1 - Ilość zgłoszeń napływających do systemu ma rozkład wykładniczy.
Generator 2:
Generuje paczki (klientów), po czym wysyła je do SMO 3.
T2 - Czas pomiędzy emisjami ma rozkład normalny.
R1 - Ilość zgłoszeń napływających do systemu ma rozkład Erlanga.
SMO 1:
AL1 - Nieograniczona kolejka FIFO.
N1 - Klienci się niecierpliwią zgodnie z rozkładem wykładniczym.
L1 - 2 kanałowe gniazdo.
O1 - Czas obsługi ma rozkład jednostajny.
SMO 2:
AL2 - Ograniczona kolejka LIFO.
N2 - Klienci się niecierpliwią zgodnie z rozkładem Erlanga.
L2 - Gniazdo jest 1 kanałowe.
O2 - Czas obsługi określony rozkładem jednostajnym.
SMO 3:
AL3 - Nieograniczona, priorytetowa kolejka.
N3 - klienci niecierpliwią się w czasie zgodnym z rozkładem normalnym.
L3 - 2 kanałowe gniazdo.
O3 - Czas obsługi określa rozkład trójkątny.
III. Rozkłady
Normalny
Gęstość prawdopodobieństwa:
gdzie:
μ - wartość oczekiwana
σ - odchylenie standardowe
Wykładniczy
Gęstość prawdopodobieństwa:
Dystrybuanta:
gdzie:
λ - wartość oczekiwana
Erlanga
Gęstość prawdopodobieństwa:
gdzie:
k > 0
λ >0
Trójkątny
Gęstość prawdopodobieństwa:
gdzie:
a - min
b - mean
c - max
Jednostajny
Gęstość prawdopodobieństwa:
IV. Kod programu
Moduł definicji
DEFINITION MODULE Smo;
FROM RandMod IMPORT RandomObj;
FROM IOMod IMPORT StreamObj,ALL FileUseType;
FROM SimMod IMPORT StartSimulation, SimTime,TriggerObj;
FROM GrpMod IMPORT QueueObj,RankedObj,StackObj,BasicGroupObj;
FROM StatMod IMPORT IStatObj,ITimedStatObj,RStatObj,RTimedStatObj,
TSINTEGER,TSREAL,SREAL,SINTEGER;
TYPE
Kolejka1Obj=OBJECT;FORWARD;
Gniazdo1Obj=OBJECT;FORWARD;
Koleka2Obj=OBJECT;FORWARD;
Gniazdo2Obj=OBJECT;FORWARD;
Kolejka3Obj=OBJECT;FORWARD;
Gniazdo3Obj=OBJECT;FORWARD;
KlientObj=OBJECT;
priorytet:INTEGER;
czaswe:REAL;
czaswesmo:REAL;
zapetlenie:BOOLEAN;
ASK METHOD Zapetlenie(IN flaga:BOOLEAN);
ASK METHOD CzWej(IN tczaswe:REAL);
ASK METHOD CzWejSmo(IN tczaswesmo:REAL);
ASK METHOD UstawPriorytet(IN prio: INTEGER);
TELL METHOD StartNiecierpliwosc(IN czas:REAL;IN pojemnik:BasicGroupObj);
END OBJECT;
MonitObj=OBJECT;
start:INTEGER;
prawdobslzgl:REAL;
czasprzebywania:SREAL;
lizajkan:TSINTEGER;
lizglowkol:TSINTEGER;
liczbazgloszen:TSINTEGER;
liczbaogolem:INTEGER;
liczbaobsluzonych:INTEGER;
system:MonitObj;
ASK METHOD UstawCzasPrzebywania(IN czas:REAL);
ASK METHOD UstLiZgl(IN l:INTEGER);
ASK METHOD UstLiZglWKol(IN l:INTEGER);
ASK METHOD UstLiZajKan(IN l:INTEGER);
ASK METHOD ZwiekszLiczbaOgolem();
ASK METHOD ZwiekszLiczbaObsluzonych();
ASK METHOD Reset();
ASK METHOD Init(IN st:INTEGER;IN tsys:MonitObj);
END OBJECT;
WyjZSysObj=OBJECT;
monitor:MonitObj;
ASK METHOD Wstaw(IN Klient:KliObj);
ASK METHOD Init(IN mon:MonitObj);
END OBJECT;
Gen1Obj=OBJECT;
ASK METHOD Init(IN Mean1:REAL; IN k1:INTEGER; IN lk:INTEGER; IN Kolejka1:Kolejka1Obj;
IN mon:MonitObj;IN trmax:REAL;IN trand:RandomObj);
Mean:REAL;
k:INTEGER;
Kolejka1:Kolejka1Obj;
LiczbaKlientow:INTEGER;
monitor:MonitObj;
Lambda:REAL;
rand:RandomObj;
TELL METHOD Generowanie();
END OBJECT;
Gen2Obj=OBJECT;
Mean, Sigma:REAL;
Mmean:REAL;
Kolejka3:Kolejka3Obj;
LiczbaKlientow:INTEGER;
monitor:MonitObj;
k:INTEGER;
rand:RandomObj;
TELL METHOD Generowanie();
ASK METHOD Init(IN Mean2,Sigma2,Mean3:REAL;
IN lk:INTEGER; IN Kolejka3:Kolejka3Obj;IN mon:MonitObj;
IN trmax:INTEGER;IN trand:RandomObj);
END OBJECT;
Kolejka1Obj=OBJECT(QueueObj);
Lambda:REAL;
Gniazdo1:Gniazdo1Obj;
monitor:MonitObj;
rand:RandomObj;
ASK METHOD Wstaw(INOUT elem:KliObj);
ASK METHOD Init(IN tLambda:REAL;IN g1:Gniazdo1Obj;IN mon:MonitObj;IN trand:RandomObj);
OVERRIDE;
ASK METHOD Remove():ANYOBJ;
ASK METHOD RemoveThis(IN co:ANYOBJ);
ASK METHOD ObjTerminate;
END OBJECT;
Gniazdo1Obj=OBJECT;
Mean:REAL;
Sigma:REAL;
Kanaly:INTEGER;
Aktywne:INTEGER;
Kolejka1:Kolejka1Obj;;
Kolejka2:Kolejka2Obj;
monitor:MonitObj;
trigger2:TriggerObj;
rand:RandomObj;
TELL METHOD Obsluga();
ASK METHOD UstawAktywne(IN ak:INTEGER);
ASK METHOD Init(IN means1,sigmas1:REAL;
IN k:INTEGER; IN Kolejka1:Kolejka1Obj;
IN mon:MonitObj;IN ttrigger2:TriggerObj;
IN trand:RandomObj;IN tKolejka2:Kolejka2Obj);
END OBJECT;
Kolejka2Obj=OBJECT(StackObj);
Pojemnosc:INTEGER;
Mean:REAL;
k:INTEGER;
Gniazdo2:Gniazdo2Obj;
monitor:MonitObj;
trigger2:TriggerObj;
rand:RandomObj;
ASK METHOD Wstaw(INOUT elem:KliObj);
ASK METHOD Init(IN p:INTEGER;IN means2k:REAL;
IN k2k:INTEGER; IN g2:Gniazdo2Obj;IN mon:MonitObj;
IN ttrigger2:TriggerObj;IN trand:RandomObj);
OVERRIDE;
ASK METHOD Remove():ANYOBJ;
ASK METHOD RemoveThis(IN co:ANYOBJ);
ASK METHOD ObjTerminate;
END OBJECT;
Gniazdo2Obj=OBJECT;
lo:REAL;
hi:REAL;
Kanaly:INTEGER;
Aktywne:INTEGER;
Kolejka2:Kolejka2Obj;
monitor:MonitObj;
p2:REAL;
rand:RandomObj;
outsystemsmo:WyjZSysObj;
ASK METHOD UstawAktywne(IN ak:INTEGER);
TELL METHOD Obsluga();
ASK METHOD Init(IN tlo, thi:REAL; IN kan:INTEGER;
IN Kolejka2:Kolejka2Obj;IN mon:MonitObj;IN tp2:REAL;
IN toutsystemsmo:WyjZSysObj;IN trand:RandomObj);
END OBJECT;
Kolejka3Obj=OBJECT(RankedObj[ANYOBJ:KliObj]);
Lambda:REAL;
Mean:REAL;
Sigma:REAL;
trigger3:TriggerObj;
Gniazdo3:Gniazdo3Obj;
monitor:MonitObj;
rand:RandomObj;
ASK METHOD Wstaw(INOUT elem:KliObj);
ASK METHOD Init(IN means3,sigmas3:REAL;IN g3:Gniazdo3Obj;
IN mon:MonitObj;IN trand:RandomObj;IN ttrigger3:TriggerObj);
OVERRIDE;
ASK METHOD Remove():KliObj;
ASK METHOD RemoveThis(IN co:KliObj);
ASK METHOD Rank(IN l,r:KliObj):INTEGER;
ASK METHOD ObjTerminate;
END OBJECT;
Gniazdo3Obj=OBJECT;
min,m,max:REAL;
Kanaly:INTEGER;
Aktywne:INTEGER;
Kolejka3:Kolejka3Obj;
monitor:MonitObj;
p3:REAL;
rand:RandomObj;
outsystemsmo:WyjZSysObj;
ASK METHOD UstawAktywne(IN ak:INTEGER);
TELL METHOD Obsluga();
ASK METHOD Init(IN tmin,tm,tmax:REAL; IN kan:INTEGER;
IN Kolejka3:Kolejka3Obj;IN mon:MonitObj;IN tp3:REAL;
IN toutsystemsmo:WyjZSysObj;IN trand:RandomObj);
END OBJECT;
PROCEDURE IfResetMonitors(IN lr:INTEGER);
VAR
naekran: INTEGER;
gen1:Gen1Obj;
gen2:Gen2Obj;
Gniazdo1:Gniazdo1Obj;
Gniazdo2:Gniazdo2Obj;
Gniazdo3:Gniazdo3Obj;
Kolejka1:Kolejka1Obj;
Kolejka2:Kolejka2Obj;
Kolejka3:Kolejka3Obj;
mon0:MonitObj;
mon1:MonitObj;
mon2:MonitObj;
mon3:MonitObj;
out0:WyjZSysObj;
ran0:RandomObj;
trg0:TriggerObj;
trg1:TriggerObj;
END MODULE.
Moduł implementacji
IMPLEMENTATION MODULE Smo;
FROM MathMod IMPORT CEIL,SQRT;
FROM GrpMod IMPORT BasicGroupObj;
FROM RandMod IMPORT RandomObj,FetchSeed;
FROM IOMod IMPORT StreamObj,ALL FileUseType;
FROM SimMod IMPORT SimTime,TriggerObj,Interrupt;
FROM StatMod IMPORT IStatObj,ITimedStatObj,RStatObj,
RTimedStatObj,TSINTEGER,TSREAL,SREAL,SINTEGER;
OBJECT KliObj;
ASK METHOD CzWejSmo(IN tczaswesmo:REAL);
BEGIN
czaswesmo:=tczaswesmo;
END METHOD;
ASK METHOD Zapetlenie(IN flaga:BOOLEAN);
BEGIN
zapetlenie:=flaga;
END METHOD;
ASK METHOD CzWej(IN tczaswe:REAL);
BEGIN
czaswe:=tczaswe;
END METHOD;
ASK METHOD UstawPriorytet(IN prio: INTEGER);
BEGIN
priorytet:=prio;
END METHOD;
TELL METHOD StartNiecierpliwosc(IN czas:REAL;IN pojemnik:BasicGroupObj);
BEGIN
WAIT DURATION czas;
ASK pojemnik TO RemoveThis(SELF);
DISPOSE(SELF);
IF (naekran == 1)
OUTPUT("Klient sie zniecierpliwil i ucieka - ",SimTime);
END IF;
ON INTERRUPT;
END WAIT;
END METHOD;
END OBJECT;
PROCEDURE IfResetMonitors(IN lr:INTEGER);
BEGIN
IF(lr=(ASK mon0 TO start))
ASK mon0 TO Reset();
END IF;
IF(lr=(ASK mon1 TO start))
ASK mon1 TO Reset();
END IF;
IF(lr=(ASK mon2 TO start))
ASK mon2 TO Reset();
END IF;
IF(lr=(ASK mon3 TO start))
ASK mon3 TO Reset();
END IF;
END PROCEDURE;
OBJECT MonitObj;
ASK METHOD UstLiZgl(IN l:INTEGER);
BEGIN
liczbazgloszen:=l;
END METHOD;
ASK METHOD UstLiZglWKol(IN l:INTEGER);
BEGIN
lizglowkol:=l;
END METHOD;
ASK METHOD UstawCzasPrzebywania(IN czas:REAL);
BEGIN
czasprzebywania:=czas;
END METHOD;
ASK METHOD UstLiZajKan(IN l:INTEGER);
BEGIN
lizajkan:=l;
END METHOD;
ASK METHOD ZwiekszLiczbaObsluzonych();
BEGIN
liczbaobsluzonych:=liczbaobsluzonych+1;
prawdobslzgl:=FLOAT(liczbaobsluzonych)/FLOAT(liczbaogolem);
END METHOD;
ASK METHOD ZwiekszLiczbaOgolem();
BEGIN
liczbaogolem:=liczbaogolem+1;
prawdobslzgl:=FLOAT(liczbaobsluzonych)/FLOAT(liczbaogolem);
END METHOD;
ASK METHOD Reset();
BEGIN
liczbaogolem:=liczbazgloszen;
liczbaobsluzonych:=0;
prawdobslzgl:=0.0;
ASK GETMONITOR(czasprzebywania,RStatObj) TO Reset();
ASK GETMONITOR(liczbazgloszen,ITimedStatObj) TO Reset();
ASK GETMONITOR(lizajkan,ITimedStatObj) TO Reset();
ASK GETMONITOR(lizglowkol,ITimedStatObj) TO Reset();
END METHOD;
ASK METHOD Init(IN st:INTEGER;IN tsys:MonitObj);
BEGIN
czasprzebywania:=0.0;
liczbazgloszen:=0;
lizajkan:=0;
lizglowkol:=0;
prawdobslzgl:=0.0;
liczbaogolem:=0;
liczbaobsluzonych:=0;
start:=st;
system:=tsys;
END METHOD;
END OBJECT;
OBJECT WyjZSysObj;
ASK METHOD Wstaw(IN Klient:KliObj);
BEGIN
ASK monitor TO ZwiekszLiczbaObsluzonych();
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen -1);
ASK monitor TO UstawCzasPrzebywania(SimTime - ASK Klient TO czaswe);
END METHOD;
ASK METHOD Init(IN mon:MonitObj);
BEGIN
monitor:=mon;
END METHOD;
END OBJECT;
OBJECT Gen1Obj;
TELL METHOD Generowanie();
VAR
Klient:KliObj;
i:INTEGER;
j:INTEGER;
lr:INTEGER;
czas:REAL;
BEGIN
FOR i:=1 TO LiczbaKlientow
IfResetMonitors(i);
czas:=ASK rand TO Erlang(Mean,k);
WAIT DURATION czas
ON INTERRUPT;
END WAIT;
lr:=CEIL(ASK rand TO Exponential(1.0/Lambda)); {sufit z liczby}
FOR j:=1 TO lr
NEW(Klient);
ASK Klient TO UstawPriorytet(ASK rand TO UniformInt(0,100));
ASK Klient TO CzWej(SimTime);
IF (naekran == 1)
OUTPUT("Generator 1 wygenerowal klienta - ",SimTime);
END IF;
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen +1);
ASK monitor TO ZwiekszLiczbaOgolem();
ASK Kolejka1 TO Wstaw(Klient);
END FOR;
END FOR;
END METHOD;
ASK METHOD Init(IN Mean1:REAL; IN k1:INTEGER; IN lk:INTEGER; IN Kolejka1:Kolejka1Obj;IN mon:MonitObj;IN trmax:REAL;IN trand:RandomObj);
BEGIN
Mean:=Mean1;
k:=k1;
Kolejka1:=Kolejka1;
LiczbaKlientow:=lk;
monitor:=mon;
Lambda:=trmax;
rand:=trand;
END METHOD;
END OBJECT;
OBJECT Gen2Obj;
TELL METHOD Generowanie();
VAR
Klient:KliObj;
i:INTEGER;
j:INTEGER;
lr:INTEGER;
czas:REAL;
BEGIN
FOR i:=1 TO LiczbaKlientow
IfResetMonitors(i);
czas:=ASK rand TO Normal(Mean,Sigma);
WAIT DURATION czas
ON INTERRUPT;
END WAIT;
lr:=CEIL(ASK rand TO Erlang(Mmean,k));
FOR j:=1 TO lr
NEW(Klient);
ASK Klient TO UstawPriorytet(ASK rand TO UniformInt(0,100));
ASK Klient TO CzWej(SimTime);
IF (naekran == 1)
OUTPUT("Generator 2 wygenerowal klienta - ",SimTime);
END IF;
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen +1);
ASK monitor TO ZwiekszLiczbaOgolem();
ASK Kolejka3 TO Wstaw(Klient);
END FOR;
END FOR;
END METHOD;
ASK METHOD Init(IN Mean2,Sigma2,Mean3:REAL;IN lk:INTEGER; IN Kolejka3:Kolejka3Obj;IN mon:MonitObj;IN trmax:INTEGER;IN trand:RandomObj);
BEGIN
Mean:=Mean2;
Sigma:=Sigma2;
Kolejka3:=Kolejka3;
LiczbaKlientow:=lk;
monitor:=mon;
k:=trmax;
Mmean:=Mean3;
rand:=trand;
END METHOD;
END OBJECT;
OBJECT Kolejka1Obj;
ASK METHOD ObjTerminate();
VAR
el: ANYOBJ;
BEGIN
FOREACH el IN SELF
RemoveThis(el);
DISPOSE(el);
END FOREACH;
INHERITED ObjTerminate();
END METHOD;
ASK METHOD Wstaw(INOUT elem:KliObj);
BEGIN
Add(elem);
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen +1);
ASK monitor TO UstLiZglWKol(ASK monitor TO lizglowkol +1);
ASK (ASK monitor TO system) TO UstLiZglWKol(ASK (ASK monitor TO system) TO lizglowkol +1);
ASK elem TO CzWej(SimTime);
ASK monitor TO ZwiekszLiczbaOgolem();
TELL elem TO StartNiecierpliwosc(ASK rand TO Exponential(1.0/Lambda),SELF);
IF(ASK Gniazdo1 TO Aktywne < ASK Gniazdo1 TO Kanaly)
TELL Gniazdo1 TO Obsluga();
ASK Gniazdo1 TO UstawAktywne(ASK Gniazdo1 TO Aktywne+1);
END IF;
END METHOD;
ASK METHOD Remove():ANYOBJ;
BEGIN
ASK monitor TO UstLiZglWKol(ASK monitor TO lizglowkol -1);
ASK (ASK monitor TO system) TO UstLiZglWKol(ASK (ASK monitor TO system) TO lizglowkol -1);
RETURN INHERITED Remove();
END METHOD;
ASK METHOD RemoveThis(IN co:ANYOBJ);
BEGIN
ASK monitor TO UstLiZglWKol(ASK monitor TO lizglowkol -1);
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen -1);
ASK (ASK monitor TO system) TO UstLiZglWKol(ASK (ASK monitor TO system) TO lizglowkol -1);
ASK (ASK monitor TO system) TO UstLiZgl(ASK (ASK monitor TO system) TO liczbazgloszen -1);
INHERITED RemoveThis(co);
END METHOD;
ASK METHOD Init(IN tLambda:REAL;IN g1:Gniazdo1Obj;IN mon:MonitObj;IN trand:RandomObj);
BEGIN
Lambda:=tLambda;
Gniazdo1:=g1;
monitor:=mon;
rand:=trand;
END METHOD;
END OBJECT;
OBJECT Gniazdo1Obj;
TELL METHOD Obsluga();
VAR
Klient: KliObj;
BEGIN
ASK (ASK monitor TO system) TO UstLiZajKan(ASK (ASK monitor TO system) TO lizajkan +1);
ASK monitor TO UstLiZajKan(ASK monitor TO lizajkan +1);
WHILE(ASK Kolejka1 TO numberIn>0)
Klient:=ASK Kolejka1 TO Remove();
IF (naekran == 1)
OUTPUT("Gniazdo 1 obsluguje klienta; czas - ",SimTime);
END IF;
Interrupt(Klient,"StartNiecierpliwosc");
WAIT DURATION ASK rand TO Normal(Mean,Sigma);
ON INTERRUPT;
END WAIT;
WHILE(ASK Kolejka2 TO Pojemnosc=ASK Kolejka2 TO numberIn)
IF(naekran == 1)
OUTPUT("W 2 kolejce nie ma miejsca na klienta; czas - ",SimTime);
END IF;
WAIT FOR trigger2 TO Fire();
ON INTERRUPT;
END WAIT;
END WHILE;
IF (naekran == 1)
OUTPUT("Gniazdo 1 wypuszcza klienta do kolejki 2 po czasie - ",SimTime);
END IF;
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen -1);
ASK monitor TO UstawCzasPrzebywania(SimTime - ASK Klient TO czaswesmo);
ASK monitor TO ZwiekszLiczbaObsluzonych();
ASK Kolejka2 TO Wstaw(Klient);
END WHILE;
Aktywne:=Aktywne-1;
ASK monitor TO UstLiZajKan(ASK monitor TO lizajkan -1);
ASK (ASK monitor TO system) TO UstLiZajKan(ASK (ASK monitor TO system) TO lizajkan -1);
END METHOD;
ASK METHOD Init(IN means1,sigmas1:REAL; IN k:INTEGER; IN Kolejka1:Kolejka1Obj;IN mon:MonitObj;IN ttrigger2:TriggerObj;IN trand:RandomObj;IN tKolejka2:Kolejka2Obj);
BEGIN
Sigma:=sigmas1;
Mean:=means1;
Kanaly:=k;
Kolejka1:=Kolejka1;
Aktywne:=0;
monitor:=mon;
trigger2:=ttrigger2;
rand:=trand;
Kolejka2:=tKolejka2;
END METHOD;
ASK METHOD UstawAktywne(IN ak:INTEGER);
BEGIN
Aktywne:=ak;
END METHOD;
END OBJECT;
OBJECT Kolejka2Obj;
ASK METHOD ObjTerminate();
VAR
el: ANYOBJ;
BEGIN
FOREACH el IN SELF
RemoveThis(el);
DISPOSE(el);
END FOREACH;
INHERITED ObjTerminate();
END METHOD;
ASK METHOD Wstaw(INOUT elem:KliObj);
BEGIN
IF(Pojemnosc>numberIn)
Add(elem);
ASK monitor TO UstLiZglWKol(ASK monitor TO lizglowkol +1);
ASK (ASK monitor TO system) TO UstLiZglWKol(ASK
(ASK monitor TO system) TO lizglowkol +1);
IF(ASK elem TO zapetlenie=FALSE)
ASK monitor TO ZwiekszLiczbaOgolem();
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen +1);
ASK elem TO CzWejSmo(SimTime);
END IF;
ASK elem TO Zapetlenie(FALSE);
TELL elem TO StartNiecierpliwosc(ASK rand TO Erlang(Mean,k),SELF);
IF(ASK Gniazdo2 TO Aktywne < ASK Gniazdo2 TO Kanaly)
TELL Gniazdo2 TO Obsluga();
ASK Gniazdo2 TO UstawAktywne(ASK Gniazdo2 TO Aktywne+1);
END IF;
ELSE
DISPOSE(elem);
IF (naekran == 1)
OUTPUT("W 2 kolejce nie ma miejsca; czas - ",SimTime);
END IF;
ASK (ASK monitor TO system) TO UstLiZgl(ASK
(ASK monitor TO system) TO liczbazgloszen -1);
END IF;
END METHOD;
ASK METHOD Remove():ANYOBJ;
BEGIN
ASK monitor TO UstLiZglWKol(ASK monitor TO lizglowkol -1);
ASK (ASK monitor TO system) TO UstLiZglWKol(ASK
(ASK monitor TO system) TO lizglowkol -1);
RETURN INHERITED Remove();
END METHOD;
ASK METHOD RemoveThis(IN co:ANYOBJ);
BEGIN
ASK monitor TO UstLiZglWKol(ASK monitor TO lizglowkol -1);
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen -1);
ASK (ASK monitor TO system) TO UstLiZglWKol
(ASK (ASK monitor TO system) TO lizglowkol -1);
ASK (ASK monitor TO system) TO UstLiZgl(ASK
(ASK monitor TO system) TO liczbazgloszen -1);
INHERITED RemoveThis(co);
END METHOD;
ASK METHOD Init(IN p:INTEGER;IN means2k:REAL; IN k2k:INTEGER;
IN g2:Gniazdo2Obj;IN mon:MonitObj;IN ttrigger2:TriggerObj;IN trand:RandomObj);
BEGIN
Pojemnosc:=p;
Mean:=means2k;
k:=k2k;
Gniazdo2:=g2;
monitor:=mon;
trigger2:=ttrigger2;
rand:=trand;
END METHOD;
END OBJECT;
OBJECT Gniazdo2Obj;
TELL METHOD Obsluga();
VAR
Klient: KliObj;
BEGIN
ASK (ASK monitor TO system) TO UstLiZajKan(ASK
(ASK monitor TO system) TO lizajkan +1);
ASK monitor TO UstLiZajKan(ASK monitor TO lizajkan +1);
WHILE(ASK Kolejka2 TO numberIn>0)
Klient:=ASK Kolejka2 TO Remove();
IF (naekran == 1)
OUTPUT("Klient wchodzi do gniazda SMO 2 po czasie - ",SimTime);
END IF;
Interrupt(Klient,"StartNiecierpliwosc");
WAIT DURATION ASK rand TO UniformReal(lo,hi);
ON INTERRUPT;
END WAIT;
IF (ASK rand TO Sample < p2)
IF (naekran == 1)
OUTPUT("Klient zawraca do SMO 2; czas - ",SimTime);
END IF;
ASK Klient TO Zapetlenie(TRUE);
ASK Kolejka2 TO Wstaw(Klient);
ELSE
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen -1);
ASK monitor TO ZwiekszLiczbaObsluzonych();
ASK monitor TO UstawCzasPrzebywania(SimTime - ASK Klient TO czaswesmo);
ASK outsystemsmo TO Wstaw(Klient);
IF (naekran == 1)
OUTPUT("klient idzie do wyjscia, czas=",SimTime);
END IF;
END IF;
END WHILE;
Aktywne:=Aktywne-1;
ASK monitor TO UstLiZajKan(ASK monitor TO lizajkan -1);
ASK (ASK monitor TO system) TO UstLiZajKan(ASK
(ASK monitor TO system) TO lizajkan -1);
END METHOD;
ASK METHOD Init(IN tlo, thi:REAL; IN kan:INTEGER;
IN Kolejka2:Kolejka2Obj;IN mon:MonitObj;IN tp2:REAL;
IN toutsystemsmo:WyjZSysObj;IN trand:RandomObj);
BEGIN
lo:=tlo;
hi:=thi;
Kanaly:=kan;
Kolejka2:=Kolejka2;
Aktywne:=0;
monitor:=mon;
p2:=tp2;
outsystemsmo:=toutsystemsmo;
rand:=trand;
END METHOD;
ASK METHOD UstawAktywne(IN ak:INTEGER);
BEGIN
Aktywne:=ak;
END METHOD;
END OBJECT;
OBJECT Kolejka3Obj;
ASK METHOD ObjTerminate();
VAR
el: ANYOBJ;
BEGIN
FOREACH el IN SELF
RemoveThis(el);
DISPOSE(el);
END FOREACH;
INHERITED ObjTerminate();
END METHOD;
ASK METHOD Wstaw(INOUT elem:KliObj);
BEGIN
Add(elem);
ASK monitor TO UstLiZglWKol(ASK monitor TO lizglowkol +1);
ASK (ASK monitor TO system) TO UstLiZglWKol(ASK
(ASK monitor TO system) TO lizglowkol +1);
IF(ASK elem TO zapetlenie=FALSE)
ASK monitor TO ZwiekszLiczbaOgolem();
ASK elem TO CzWejSmo(SimTime);
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen +1);
END IF;
ASK elem TO Zapetlenie(FALSE);
TELL elem TO StartNiecierpliwosc(ASK rand TO Normal(Mean,Sigma),SELF);
IF(ASK Gniazdo3 TO Aktywne < ASK Gniazdo3 TO Kanaly)
TELL Gniazdo3 TO Obsluga();
ASK Gniazdo3 TO UstawAktywne(ASK Gniazdo3 TO Aktywne+1);
END IF;
END METHOD;
ASK METHOD Rank(IN l,r:KliObj):INTEGER;
BEGIN
IF(l.priorytet < r.priorytet)
RETURN 1;
ELSIF(l.priorytet > r.priorytet)
RETURN -1;
ELSE
RETURN 0;
END IF;
END METHOD;
ASK METHOD RemoveThis(IN co:KliObj);
BEGIN
ASK trigger3 TO Release;
ASK monitor TO UstLiZglWKol(ASK monitor TO lizglowkol -1);
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen -1);
ASK (ASK monitor TO system) TO UstLiZgl(ASK
(ASK monitor TO system) TO liczbazgloszen -1);
ASK (ASK monitor TO system) TO UstLiZglWKol(ASK
(ASK monitor TO system) TO lizglowkol -1);
INHERITED RemoveThis(co);
END METHOD;
ASK METHOD Remove():KliObj;
BEGIN
ASK trigger3 TO Release;
ASK monitor TO UstLiZglWKol(ASK monitor TO lizglowkol -1);
ASK (ASK monitor TO system) TO UstLiZglWKol(ASK
(ASK monitor TO system) TO lizglowkol -1);
RETURN INHERITED Remove();
END METHOD;
ASK METHOD Init(IN means3,sigmas3:REAL;IN g3:Gniazdo3Obj;
IN mon:MonitObj;IN trand:RandomObj;IN ttrigger3:TriggerObj);
BEGIN
Mean:=means3;
Sigma:=sigmas3;
Gniazdo3:=g3;
monitor:=mon;
rand:=trand;
trigger3:=ttrigger3;
END METHOD;
END OBJECT;
OBJECT Gniazdo3Obj;
TELL METHOD Obsluga();
VAR
Klient: KliObj;
BEGIN
ASK (ASK monitor TO system) TO UstLiZajKan(ASK
(ASK monitor TO system) TO lizajkan +1);
ASK monitor TO UstLiZajKan(ASK monitor TO lizajkan +1);
WHILE(ASK Kolejka3 TO numberIn>0)
Klient:=ASK Kolejka3 TO Remove();
IF (naekran == 1)
OUTPUT("Klient wchodzi do gniazda SMO 3 po czasie - ",SimTime);
END IF;
Interrupt(Klient,"StartNiecierpliwosc");
WAIT DURATION ASK rand TO Triangular(min,m,max);
ON INTERRUPT;
END WAIT;
IF (ASK rand TO Sample < p3)
IF (naekran == 1)
OUTPUT("Klient zawraca i znow wchodzi do SMO 3 po czasie - ",SimTime);
END IF;
ASK Klient TO Zapetlenie(TRUE);
ASK Kolejka3 TO Wstaw(Klient);
ELSE
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen -1);
ASK monitor TO ZwiekszLiczbaObsluzonych();
ASK monitor TO UstawCzasPrzebywania(SimTime - ASK Klient TO czaswesmo);
ASK outsystemsmo TO Wstaw(Klient);
IF (naekran == 1)
OUTPUT("Klient idzie do wyjscia po czasie - ",SimTime);
END IF;
END IF;
END WHILE;
Aktywne:=Aktywne-1;
ASK monitor TO UstLiZajKan(ASK monitor TO lizajkan -1);
ASK (ASK monitor TO system) TO UstLiZajKan(ASK
(ASK monitor TO system) TO lizajkan -1);
END METHOD;
ASK METHOD Init(IN tmin,tm,tmax:REAL; IN kan:INTEGER;
IN Kolejka3:Kolejka3Obj;IN mon:MonitObj;IN tp3:REAL;
IN toutsystemsmo:WyjZSysObj;IN trand:RandomObj);
BEGIN
min:=tmin;
m:=tm;
max:=tmax;
Kanaly:=kan;
Kolejka3:=Kolejka3;
Aktywne:=0;
monitor:=mon;
p3:=tp3;
outsystemsmo:=toutsystemsmo;
rand:=trand;
END METHOD;
ASK METHOD UstawAktywne(IN ak:INTEGER);
BEGIN
Aktywne:=ak;
END METHOD;
END OBJECT;
END MODULE.
Moduł główny
MAIN MODULE make;
FROM MathMod IMPORT FLOOR;
FROM RandMod IMPORT RandomObj,FetchSeed;
FROM IOMod IMPORT StreamObj,ALL FileUseType;
FROM SimMod IMPORT StartSimulation,SimTime,ResetSimTime;
FROM StatMod IMPORT IStatObj,ITimedStatObj,RStatObj,
RTimedStatObj,TSINTEGER,TSREAL,SREAL,SINTEGER;
FROM SmoMod IMPORT Kolejka1,Kolejka2,Kolejka3,
Gniazdo1,Gniazdo2,Gniazdo3,gen1,gen2,
mon0,mon1,mon2,mon3,out0,ran0,trg0,naekran;
FROM SmoMod IMPORT Gniazdo1Obj,Gniazdo2Obj,Gniazdo3Obj,Gen1Obj,Gen2Obj,
Kolejka1Obj,Kolejka2Obj,Kolejka3Obj,KliObj,MonitObj,WyjZSysObj;
TYPE
Rekdanych=RECORD;
LExp:INTEGER;
LstartMon:INTEGER;
Gen1Mean,Gen1Lambda:REAL;
Gen1kPaczka,Gen1LKlientow:INTEGER;
Gen2Mean,Gen2Sigma,Gen2Meanil:REAL;
Gen2kil,Gen2LKlientow:INTEGER;
Kolejka1Lambda:REAL;
Gniazdo1Mean,Gniazdo1Sigma:REAL;
Gniazdo1Kanaly:INTEGER;
Kolejka2pojem:INTEGER;
Kolejka2Mean:REAL;
Kolejka2k:INTEGER;
Gniazdo2lo,Gniazdo2hi,Gniazdo2prawd2:REAL;
Gniazdo2Kanaly:INTEGER;
Kolejka3Mean:REAL;
Kolejka3Sigma:REAL;
Gniazdo3min,Gniazdo3max,Gniazdo3m,Gniazdo3prawd3:REAL;
Gniazdo3Kanaly:INTEGER;
Wypis:INTEGER;
END RECORD;
WynikiSMO=ARRAY [0..35] OF SREAL;
PROCEDURE ReadInt(INOUT file:StreamObj;OUT B:INTEGER);
VAR
chr:CHAR;
str:STRING;
BEGIN
ASK file TO ReadChar(chr);
ASK file TO ReadLine(str);
ASK file TO ReadInt(B);
END PROCEDURE;
PROCEDURE ReadReal(INOUT file:StreamObj;OUT A:REAL);
VAR
str:STRING;
chr:CHAR;
BEGIN
ASK file TO ReadChar(chr);
ASK file TO ReadLine(str);
ASK file TO ReadReal(A);
END PROCEDURE;
PROCEDURE ReadFromFile(OUT config:Rekdanych);
VAR
file:StreamObj;
BEGIN
NEW(file);
ASK file TO Open("dane.txt",Input);
config.LstartMon:=1;
ReadInt(file,config.LExp);
ReadReal(file,config.Gen1Mean);
ReadReal(file,config.Gen1Lambda);
ReadInt(file,config.Gen1kPaczka);
ReadInt(file,config.Gen1LKlientow);
ReadReal(file,config.Gen2Mean);
ReadReal(file,config.Gen2Sigma);
ReadReal(file,config.Gen2Meanil);
ReadInt(file,config.Gen2kil);
ReadInt(file,config.Gen2LKlientow);
ReadReal(file,config.Kolejka1Lambda);
ReadReal(file,config.Gniazdo1Mean);
ReadReal(file,config.Gniazdo1Sigma);
ReadInt(file,config.Gniazdo1Kanaly);
ReadInt(file,config.Kolejka2pojem);
ReadReal(file,config.Kolejka2Mean);
ReadInt(file,config.Kolejka2k);
ReadReal(file,config.Gniazdo2lo);
ReadReal(file,config.Gniazdo2hi);
ReadReal(file,config.Gniazdo2prawd2);
ReadInt(file,config.Gniazdo2Kanaly);
ReadReal(file,config.Kolejka3Mean);
ReadReal(file,config.Kolejka3Sigma);
ReadReal(file,config.Gniazdo3min);
ReadReal(file,config.Gniazdo3max);
ReadReal(file,config.Gniazdo3m);
ReadReal(file,config.Gniazdo3prawd3);
ReadInt(file,config.Gniazdo3Kanaly);
ReadInt(file,config.Wypis);
DISPOSE(file);
END PROCEDURE;
PROCEDURE SaveFile(IN wyniki:WynikiSMO);
VAR
file: StreamObj;
BEGIN
New(file);
ASK file TO Open("wyniki.txt", Output);
ASK file TO WriteString("**********************");
ASK file TO WriteString("********WYNIKI********");
ASK file TO WriteString("**********************");
ASK file TO WriteLn;
ASK file TO WriteString("Sredni czas przebywania zgloszenia w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[0],RStatObj).Mean(),12,2);
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe czasu przebywania zgloszenia w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[4],RStatObj).Mean(),12,2);
ASK file TO WriteLn;
ASK file TO WriteString("Sredni czas przebywania zgloszenia w SMO 1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[1],RStatObj).Mean(),12,2);
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe czasu przebywania zgloszenia w SMO 1:");
ASK file TO WriteReal(GETMONITOR(wyniki[5],RStatObj).Mean(),12,2);
ASK file TO WriteLn;
ASK file TO WriteString("Sredni czas przebywania zgloszenia w SMO 2:");
ASK file TO WriteReal(GETMONITOR(wyniki[2],RStatObj).Mean(),12,2);
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe czasu przebywania zgloszenia w SMO 2:");
ASK file TO WriteReal(GETMONITOR(wyniki[6],RStatObj).Mean(),12,2);
ASK file TO WriteLn;
ASK file TO WriteString("Sredni czas przebywania zgloszenia w SMO 3:");
ASK file TO WriteReal(GETMONITOR(wyniki[3],RStatObj).Mean(),12,2);
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe czasu przebywania zgloszenia w SMO 3:");
ASK file TO WriteReal(GETMONITOR(wyniki[7],RStatObj).Mean(),12,2);
ASK file TO WriteLn;
ASK file TO WriteString("**********************");
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w systemie:");
ASK file TO WriteReal(GETMONITOR(wyniki[8],RStatObj).Mean(),12,2);
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zgloszen w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[12],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w SMO 1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[9],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zgloszen w SMO 1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[13],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w SMO 2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[10],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zgloszen w SMO 2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[14],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w SMO 3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[11],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odychlenie standardowe liczby zgloszen w SMO 3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[15],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("**********************");
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zajetych kanalow w Systemie:");
ASK file TO WriteReal(GETMONITOR(wyniki[16],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zajetych kanalow w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[20],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zajetych kanalow w SMO1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[17],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zajetych kanalow w SMO 1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[21],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zajetych kanalow w SMO2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[18],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zajetych kanalow w SMO 2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[22],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zajetych kanalow w SMO3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[19],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zajetych kanalow w SMO 3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[23],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("**********************");
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w kolejce w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[24],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zgloszen w kolejce w systemie:");
ASK file TO WriteReal(GETMONITOR(wyniki[28],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w kolejce w SMO 1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[25],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zgloszen w kolejce w SMO1:");
ASK file TO WriteReal(GETMONITOR(wyniki[29],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w kolejce w SMO 2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[26],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zgloszen w kolejce w SMO 2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[30],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w kolejce w SMO 3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[27],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zgloszen w kolejce w SMO 3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[31],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("**********************");
ASK file TO WriteLn;
ASK file TO WriteString("Prawdopodobienstwo obsluzenia zgloszenia w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[32],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Prawdopodobienstwo obsluzenia zgloszenia w SMO 1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[33],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Prawdopodobienstwo obsluzenia zgloszenia w SMO 2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[34],RStatObj).Mean());
ASK file TO WriteLn;
ASK file TO WriteString("Prawdopodobienstwo obsluzenia zgloszenia w SMO 3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[35],RStatObj).Mean());
ASK file TO Close;
DISPOSE(file);
END PROCEDURE;
PROCEDURE Symuluj(INOUT wyniki:WynikiSMO;INOUT config:Rekdanych);
BEGIN
NEW(gen1);
NEW(gen2);
NEW(Gniazdo1);
NEW(Gniazdo2);
NEW(Gniazdo3);
NEW(Kolejka1);
NEW(Kolejka2);
NEW(Kolejka3);
NEW(mon0);
NEW(mon1);
NEW(mon2);
NEW(mon3);
NEW(out0);
NEW(trg0);
ASK mon0 TO Init(config.LstartMon,mon0);
ASK mon1 TO Init(config.LstartMon,mon0);
ASK mon2 TO Init(config.LstartMon,mon0);
ASK mon3 TO Init(config.LstartMon,mon0);
ASK Gniazdo3 TO Init(config.Gniazdo3min,config.Gniazdo3m,
config.Gniazdo3max,config.Gniazdo3Kanaly,Kolejka3,
mon3,config.Gniazdo3prawd3,out0,ran0);
ASK Kolejka3 TO Init(config.Kolejka3Mean,config.Kolejka3Sigma,
Gniazdo3,mon3,ran0,trg0);
ASK Gniazdo2 TO Init(config.Gniazdo2lo,config.Gniazdo2hi,
config.Gniazdo2Kanaly,Kolejka2,mon2,config.Gniazdo2prawd2,out0,ran0);
ASK Kolejka2 TO Init(config.Kolejka2pojem,config.Kolejka2Mean,
config.Kolejka2k,Gniazdo2,mon2,trg0,ran0);
ASK Gniazdo1 TO Init(config.Gniazdo1Mean,config.Gniazdo1Sigma,
config.Gniazdo1Kanaly,Kolejka1,mon1,trg0,ran0,Kolejka2);
ASK Kolejka1 TO Init(config.Kolejka1Lambda,Gniazdo1,mon1,ran0);
ASK gen1 TO Init(config.Gen1Mean,config.Gen1kPaczka,
config.Gen1LKlientow,Kolejka1,mon0,config.Gen1Lambda,ran0);
ASK gen2 TO Init(config.Gen2Mean,config.Gen2Sigma,
config.Gen2Meanil,config.Gen2LKlientow,Kolejka3,
mon0,config.Gen2kil,ran0);
ASK out0 TO Init(mon0);
naekran := config.Wypisz;
TELL gen1 TO Generowanie;
TELL gen2 TO Generowanie;
StartSimulation;
wyniki[0]:=GETMONITOR(mon0.czasprzebywania,RStatObj).Mean();
wyniki[1]:=GETMONITOR(mon1.czasprzebywania,RStatObj).Mean();
wyniki[2]:=GETMONITOR(mon2.czasprzebywania,RStatObj).Mean();
wyniki[3]:=GETMONITOR(mon3.czasprzebywania,RStatObj).Mean();
wyniki[4]:=GETMONITOR(mon0.czasprzebywania,RStatObj).StdDev();
wyniki[5]:=GETMONITOR(mon1.czasprzebywania,RStatObj).StdDev();
wyniki[6]:=GETMONITOR(mon2.czasprzebywania,RStatObj).StdDev();
wyniki[7]:=GETMONITOR(mon3.czasprzebywania,RStatObj).StdDev();
wyniki[8]:=GETMONITOR(mon0.liczbazgloszen,ITimedStatObj).Mean();
wyniki[9]:=GETMONITOR(mon1.liczbazgloszen,ITimedStatObj).Mean();
wyniki[10]:=GETMONITOR(mon2.liczbazgloszen,ITimedStatObj).Mean();
wyniki[11]:=GETMONITOR(mon3.liczbazgloszen,ITimedStatObj).Mean();
wyniki[12]:=GETMONITOR(mon0.liczbazgloszen,ITimedStatObj).StdDev();
wyniki[13]:=GETMONITOR(mon1.liczbazgloszen,ITimedStatObj).StdDev();
wyniki[14]:=GETMONITOR(mon2.liczbazgloszen,ITimedStatObj).StdDev();
wyniki[15]:=GETMONITOR(mon3.liczbazgloszen,ITimedStatObj).StdDev();
wyniki[16]:=GETMONITOR(mon0.lizajkan,ITimedStatObj).Mean();
wyniki[17]:=GETMONITOR(mon1.lizajkan,ITimedStatObj).Mean();
wyniki[18]:=GETMONITOR(mon2.lizajkan,ITimedStatObj).Mean();
wyniki[19]:=GETMONITOR(mon3.lizajkan,ITimedStatObj).Mean();
wyniki[20]:=GETMONITOR(mon0.lizajkan,ITimedStatObj).StdDev();
wyniki[21]:=GETMONITOR(mon1.lizajkan,ITimedStatObj).StdDev();
wyniki[22]:=GETMONITOR(mon2.lizajkan,ITimedStatObj).StdDev();
wyniki[23]:=GETMONITOR(mon3.lizajkan,ITimedStatObj).StdDev();
wyniki[24]:=GETMONITOR(mon0.lizglowkol,ITimedStatObj).Mean();
wyniki[25]:=GETMONITOR(mon1.lizglowkol,ITimedStatObj).Mean();
wyniki[26]:=GETMONITOR(mon2.lizglowkol,ITimedStatObj).Mean();
wyniki[27]:=GETMONITOR(mon3.lizglowkol,ITimedStatObj).Mean();
wyniki[28]:=GETMONITOR(mon0.lizglowkol,ITimedStatObj).StdDev();
wyniki[29]:=GETMONITOR(mon1.lizglowkol,ITimedStatObj).StdDev();
wyniki[30]:=GETMONITOR(mon2.lizglowkol,ITimedStatObj).StdDev();
wyniki[31]:=GETMONITOR(mon3.lizglowkol,ITimedStatObj).StdDev();
wyniki[32]:=mon0.prawdobslzgl;
wyniki[33]:=mon1.prawdobslzgl;
wyniki[34]:=mon2.prawdobslzgl;
wyniki[35]:=mon3.prawdobslzgl;
ResetSimTime(0.0);
DISPOSE(gen1);
DISPOSE(gen2);
DISPOSE(Gniazdo1);
DISPOSE(Gniazdo2);
DISPOSE(Gniazdo3);
DISPOSE(Kolejka1);
DISPOSE(Kolejka2);
DISPOSE(Kolejka3);
DISPOSE(mon0);
DISPOSE(mon1);
DISPOSE(mon2);
DISPOSE(mon3);
DISPOSE(out0);
DISPOSE(trg0);
END PROCEDURE;
PROCEDURE WynikiNaEkran(INOUT wyniki:WynikiSMO);
VAR
p:INTEGER;
BEGIN
OUTPUT("");
OUTPUT("**********************");
OUTPUT(" Wyniki: ");
OUTPUT("**********************");
OUTPUT("");
OUTPUT("Sredni czas przebywania zgloszenia w systemie: ",
GETMONITOR(wyniki[0],RStatObj).Mean());
OUTPUT("Odchylenie standardowe czasu przebywania zgloszenia w systemie: ",
GETMONITOR(wyniki[4],RStatObj).Mean());
OUTPUT("Sredni czas przebywania zgloszenia w SMO 1: ",
GETMONITOR(wyniki[1],RStatObj).Mean());
OUTPUT("Odchylenie standardowe czasu przebywania zgloszenia w SMO 1:",
GETMONITOR(wyniki[5],RStatObj).Mean());
OUTPUT("Sredni czas przebywania zgloszenia w SMO 2:",
GETMONITOR(wyniki[2],RStatObj).Mean());
OUTPUT("Odchylenie standardowe czasu przebywania zgloszenia w SMO 2:",
GETMONITOR(wyniki[6],RStatObj).Mean());
OUTPUT("Sredni czas przebywania zgloszenia w SMO 3:",
GETMONITOR(wyniki[3],RStatObj).Mean());
OUTPUT("Odchylenie standardowe czasu przebywania zgloszenia w SMO 3:",
GETMONITOR(wyniki[7],RStatObj).Mean());
OUTPUT("");
OUTPUT("**********************");
OUTPUT("");
OUTPUT("Srednia liczba zgloszen w systemie:",
GETMONITOR(wyniki[8],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zgloszen w systemie: ",
GETMONITOR(wyniki[12],RStatObj).Mean());
OUTPUT("Srednia liczba zgloszen w SMO 1: ",
GETMONITOR(wyniki[9],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zgloszen w SMO 1: ",
GETMONITOR(wyniki[13],RStatObj).Mean());
OUTPUT("Srednia liczba zgloszen w SMO 2: ",
GETMONITOR(wyniki[10],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zgloszen w SMO 2: ",
GETMONITOR(wyniki[14],RStatObj).Mean());
OUTPUT("Srednia liczba zgloszen w SMO 3: ",
GETMONITOR(wyniki[11],RStatObj).Mean());
OUTPUT("Odychlenie standardowe liczby zgloszen w SMO 3: ",
GETMONITOR(wyniki[15],RStatObj).Mean());
OUTPUT("");
OUTPUT("**********************");
OUTPUT("");
OUTPUT("Srednia liczba zajetych kanalow w Systemie:",
GETMONITOR(wyniki[16],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zajetych kanalow w systemie: ",
GETMONITOR(wyniki[20],RStatObj).Mean());
OUTPUT("Srednia liczba zajetych kanalow w SMO1: ",
GETMONITOR(wyniki[17],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zajetych kanalow w SMO 1: ",
GETMONITOR(wyniki[21],RStatObj).Mean());
OUTPUT("Srednia liczba zajetych kanalow w SMO2: ",
GETMONITOR(wyniki[18],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zajetych kanalow w SMO 2: ",
GETMONITOR(wyniki[22],RStatObj).Mean());
OUTPUT("Srednia liczba zajetych kanalow w SMO3: ",
GETMONITOR(wyniki[19],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zajetych kanalow w SMO 3: ",
GETMONITOR(wyniki[23],RStatObj).Mean());
OUTPUT("");
OUTPUT("**********************");
OUTPUT("");
OUTPUT("Srednia liczba zgloszen w kolejce w systemie: ",
GETMONITOR(wyniki[24],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zgloszen w kolejce w systemie:",
GETMONITOR(wyniki[28],RStatObj).Mean());
OUTPUT("Srednia liczba zgloszen w kolejce w SMO 1: ",
GETMONITOR(wyniki[25],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zgloszen w kolejce w SMO1:",
GETMONITOR(wyniki[29],RStatObj).Mean());
OUTPUT("Srednia liczba zgloszen w kolejce w SMO 2: ",
GETMONITOR(wyniki[26],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zgloszen w kolejce w SMO 2: ",
GETMONITOR(wyniki[30],RStatObj).Mean());
OUTPUT("Srednia liczba zgloszen w kolejce w SMO 3: ",
GETMONITOR(wyniki[27],RStatObj).Mean());
OUTPUT("Odchylenie standardowe liczby zgloszen w kolejce w SMO 3: ",
GETMONITOR(wyniki[31],RStatObj).Mean());
OUTPUT("");
OUTPUT("**********************");
OUTPUT("");
OUTPUT("Prawdopodobienstwo obsluzenia zgloszenia w systemie: ",
GETMONITOR(wyniki[32],RStatObj).Mean());
OUTPUT("Prawdopodobienstwo obsluzenia zgloszenia w SMO 1: ",
GETMONITOR(wyniki[33],RStatObj).Mean());
OUTPUT("Prawdopodobienstwo obsluzenia zgloszenia w SMO 2: ",
GETMONITOR(wyniki[34],RStatObj).Mean());
OUTPUT("Prawdopodobienstwo obsluzenia zgloszenia w SMO 3: ",
GETMONITOR(wyniki[35],RStatObj).Mean());
INPUT(p);
END PROCEDURE;
VAR
config:Rekdanych;
wyniki:WynikiSMO;
i:INTEGER;
l:INTEGER;
j:INTEGER;
z:INTEGER;
BEGIN
NEW(ran0);
NEW(config);
NEW(wyniki,0..35);
ReadFromFile(config);
FOR i:=0 TO 35 wyniki[i]:=0.0;
END FOR;
z:=1;
FOR i:=1 TO config.LExp
ASK ran0 TO SetSeed(FetchSeed(z));
Symuluj(wyniki,config);
END FOR;
IF (naekran) WynikiNaEkran(wyniki);
ELSE SaveFile(wyniki);
END IF;
DISPOSE(ran0);
DISPOSE(wyniki);
DISPOSE(config);
END MODULE.