WOJSKOWA AKADEMIA TECHNICZNA
Podstawy Symulacji
Sprawozdanie
Autor: Wojciech Węgrecki
Grupa: I9G2S1
Prowadzący: dr inż. Jarosław Rulka
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.
Otrzymane dane dla nrDz=18:
T1 => rozkład Erlanga.
T2 => rozkład normalny
R1 => rozkład wykładniczy
R2 => rozkład Erlanga
O1 => rozkład normalny
O2 => rozkład jednostajny
O3 => rozkład trójkątny
L1 => długość kolejki - nieograniczona.
L2 => długość kolejki - ograniczona (możliwe straty).
L3 => długość kolejki - nieograniczona.
AL1 => kolejka FIFO
AL2 => kolejka LIFO
AL3 => kolejka z priorytetami
N1 => rozkład wykładniczy.
N2 => rozkład Erlanga.
N3 => rozkład normalny.
ROZKŁADY UŻYTE W ZADANIU
Rozkład jednostajny:
Rozkład jednostajny to ciągły rozkład prawdopodobieństwa, dla którego gęstość prawdopodobieństwa w przedziale od a do b jest stała i różna od zera, a poza nim równa zeru. Istnieje też wersja dyskretna tego rozkładu oraz uogólnienie na dowolne nośniki.
Parametry rozkładu:
a=>lo, b=>hi
Gęstość prawdopodobieństwa:
Dystrybuanta:
Średnia wartość oczekiwana:
Wariancja:
Rozkład trójkątny.
Rozkład trójkątny to ciągły rozkład prawdopodobieństwa zmiennej losowej .
Parametry rozkładu:
- min
- mean
-max
Gęstość prawdopodobieństwa:
Dystrybuanta:
Średnia wartość oczekiwana:
Wariancja:
Rozkład wykładniczy.
Rozkład wykładniczy to rozkład zmiennej losowej opisujący sytuację, w której obiekt może przyjmować stany X i Y, przy czym obiekt w stanie X może ze stałym prawdopodobieństwem przejść w stan Y w jednostce czasu. Prawdopodobieństwo wyznaczane przez ten rozkład to prawdopodobieństwo przejścia ze stanu X w stan Y w czasie δt.
Parametr rozkładu:
odwrotność parametru skali (liczba rzeczywista)
Gęstość prawdopodobieństwa:
Dystrybuanta:
Średnia wartość oczekiwana:
Wariancja:
Funkcja charakterystyczna
Rozkład Erlanga
Ciągły rozkład prawdopodobieństwa, związany z rozkładem wykładniczym i rozkładem gamma.
Związek z rozkładem wykładniczym jest następujący. Dla ciągu niezależnych zmiennych losowych , z których każda ma rozkład wykładniczy z jednakowym parametrem λ zmienna losowa ma rozkład Erlanga z parametrami k = n, θ = 1 / λ. Wynika to bezpośrednio z postaci funkcji charakterystycznej rozkładu wykładniczego:
Gęstość prawdopodobieństwa:
gdzie:
k > 0
λ >0
Rozkład normalny
Zwany także rozkładem Gaussa - jeden z najważniejszych rozkładów prawdopodobieństwa. Odgrywa ważną rolę w statystycznym opisie zagadnień przyrodniczych, przemysłowych, medycznych, socjalnych itp. Wykres funkcji prawdopodobieństwa tego rozkładu jest krzywą dzwonową.
Gęstość prawdopodobieństwa:
Dystrybuanta:
Wartość oczekiwana:
µ => mean
Wariancja:
σ2
Opis programu:
Klasy:
Gen1Obj, Gen2Obj - klasy definiujące generatory;
KliObj - klasa obrazująca klienta - paczkę, oraz jego priorytet;
MonitObj - klasa odpowiedzialna za monitorowanie SMO, oraz całego systemu;
Kol1Obj, Kol2Obj, Kol3Obj - definicje kolejek w SMO;
Gnz1Obj, Gnz2Obj, Gnz3Obj - definicje gniazd w SMO;
WyjZSysObj - wyjście dla klienta z systemu.
Charakterystyki:
Wyznaczam je przy wykorzystaniu monitorów zaimplementowanych w języku MODSIM II. Dla estymacji odchylenia standardowego wykorzystuję funkcję StdDev(), a Mean() dla estymacji wartości oczekiwanej.
Liczba zgłoszeń - jest to element zwiększany na wejściu klienta, zmniejszany po jego obsłużeniu, usunięciu lub odpadnięciu z pełnej kolejki w systemie.
Liczba zgłoszeń w kolejce - zwiększana przy wejściu do kolejki, a zmniejszany przy usunięciu z kolejki.
Liczba zajętych kanałów - zwiększana przy aktywacji kanału, a zmniejszana po jego dezaktywacji.
Czas przebywania - dla każdego klienta istnieje znacznik wejścia do systemu i SMO. Czas przebywania jest wyliczony z wzoru czas obsługi - czas wejścia. Powrót do kolejki oznacza dalsze sumowanie czasu, bez jego zerowania.
Prawdopodobieństwo obsługi zgłoszenia - liczony jako iloraz liczby klientów obsłużonych przez liczbę klientów ogółem. Do statystyki SMO są również wliczani klienci, którzy zostali odrzuceni z powodu zapełnienia kolejki.
Wzory estymatorów:
a. Średnia z próby n-elementowej:
b. Odchylenie standardowe z próby n-elementowej:
KOD PROGRAMU
Moduł definicyjny
DEFINITION MODULE SmoMod;
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
Kol1Obj=OBJECT;FORWARD;
Gnz1Obj=OBJECT;FORWARD;
Kol2Obj=OBJECT;FORWARD;
Gnz2Obj=OBJECT;FORWARD;
Kol3Obj=OBJECT;FORWARD;
Gnz3Obj=OBJECT;FORWARD;
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;
KliObj=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;
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 kol1:Kol1Obj;
IN mon:MonitObj;IN trmax:REAL;IN trand:RandomObj);
Mean:REAL;
k:INTEGER;
Kol1:Kol1Obj;
LiczbaKlientow:INTEGER;
monitor:MonitObj;
Lambda:REAL;
rand:RandomObj;
TELL METHOD Generowanie();
END OBJECT;
Gen2Obj=OBJECT;
Mean, Sigma:REAL;
Mmean:REAL;
Kol3:Kol3Obj;
LiczbaKlientow:INTEGER;
monitor:MonitObj;
k:INTEGER;
rand:RandomObj;
TELL METHOD Generowanie();
ASK METHOD Init(IN Mean2,Sigma2,Mean3:REAL;
IN lk:INTEGER; IN kol3:Kol3Obj;IN mon:MonitObj;
IN trmax:INTEGER;IN trand:RandomObj);
END OBJECT;
Kol1Obj=OBJECT(QueueObj);
Lambda:REAL;
Gnz1:Gnz1Obj;
monitor:MonitObj;
rand:RandomObj;
ASK METHOD Wstaw(INOUT elem:KliObj);
ASK METHOD Init(IN tLambda:REAL;IN g1:Gnz1Obj;IN mon:MonitObj;IN trand:RandomObj);
OVERRIDE;
ASK METHOD Remove():ANYOBJ;
ASK METHOD RemoveThis(IN co:ANYOBJ);
ASK METHOD ObjTerminate;
END OBJECT;
Gnz1Obj=OBJECT;
Mean:REAL;
Sigma:REAL;
Kanaly:INTEGER;
Aktywne:INTEGER;
Kol1:Kol1Obj;;
Kol2:Kol2Obj;
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 kol1:Kol1Obj;
IN mon:MonitObj;IN ttrigger2:TriggerObj;
IN trand:RandomObj;IN tKol2:Kol2Obj);
END OBJECT;
Kol2Obj=OBJECT(StackObj);
Pojemnosc:INTEGER;
Mean:REAL;
k:INTEGER;
Gnz2:Gnz2Obj;
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:Gnz2Obj;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;
Gnz2Obj=OBJECT;
lo:REAL;
hi:REAL;
Kanaly:INTEGER;
Aktywne:INTEGER;
Kol2:Kol2Obj;
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 kol2:Kol2Obj;IN mon:MonitObj;IN tp2:REAL;
IN toutsystemsmo:WyjZSysObj;IN trand:RandomObj);
END OBJECT;
Kol3Obj=OBJECT(RankedObj[ANYOBJ:KliObj]);
Lambda:REAL;
Mean:REAL;
Sigma:REAL;
trigger3:TriggerObj;
Gnz3:Gnz3Obj;
monitor:MonitObj;
rand:RandomObj;
ASK METHOD Wstaw(INOUT elem:KliObj);
ASK METHOD Init(IN means3,sigmas3:REAL;IN g3:Gnz3Obj;
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;
Gnz3Obj=OBJECT;
min,m,max:REAL;
Kanaly:INTEGER;
Aktywne:INTEGER;
Kol3:Kol3Obj;
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 kol3:Kol3Obj;IN mon:MonitObj;IN tp3:REAL;
IN toutsystemsmo:WyjZSysObj;IN trand:RandomObj);
END OBJECT;
PROCEDURE IfResetMonitors(IN lr:INTEGER);
VAR
gen1:Gen1Obj;
gen2:Gen2Obj;
gnz1:Gnz1Obj;
gnz2:Gnz2Obj;
gnz3:Gnz3Obj;
kol1:Kol1Obj;
kol2:Kol2Obj;
kol3:Kol3Obj;
mon0:MonitObj;
mon1:MonitObj;
mon2:MonitObj;
mon3:MonitObj;
out0:WyjZSysObj;
ran0:RandomObj;
trg0:TriggerObj;
trg1:TriggerObj;
END MODULE.
Moduł implementacyjny
IMPLEMENTATION MODULE SmoMod;
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);
OUTPUT("Klient sie zniecierpliwil i ucieka - ",SimTime);
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);
OUTPUT("Generator 1 wygenerowal klienta - ",SimTime);
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen +1);
ASK monitor TO ZwiekszLiczbaOgolem();
ASK Kol1 TO Wstaw(Klient);
END FOR;
END FOR;
END METHOD;
ASK METHOD Init(IN Mean1:REAL; IN k1:INTEGER; IN lk:INTEGER; IN kol1:Kol1Obj;IN mon:MonitObj;IN trmax:REAL;IN trand:RandomObj);
BEGIN
Mean:=Mean1;
k:=k1;
Kol1:=kol1;
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);
OUTPUT("Generator 2 wygenerowal klienta - ",SimTime);
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen +1);
ASK monitor TO ZwiekszLiczbaOgolem();
ASK Kol3 TO Wstaw(Klient);
END FOR;
END FOR;
END METHOD;
ASK METHOD Init(IN Mean2,Sigma2,Mean3:REAL;IN lk:INTEGER; IN kol3:Kol3Obj;IN mon:MonitObj;IN trmax:INTEGER;IN trand:RandomObj);
BEGIN
Mean:=Mean2;
Sigma:=Sigma2;
Kol3:=kol3;
LiczbaKlientow:=lk;
monitor:=mon;
k:=trmax;
Mmean:=Mean3;
rand:=trand;
END METHOD;
END OBJECT;
OBJECT Kol1Obj;
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 Gnz1 TO Aktywne < ASK Gnz1 TO Kanaly)
TELL Gnz1 TO Obsluga();
ASK Gnz1 TO UstawAktywne(ASK Gnz1 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:Gnz1Obj;IN mon:MonitObj;IN trand:RandomObj);
BEGIN
Lambda:=tLambda;
Gnz1:=g1;
monitor:=mon;
rand:=trand;
END METHOD;
END OBJECT;
OBJECT Gnz1Obj;
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 Kol1 TO numberIn>0)
Klient:=ASK Kol1 TO Remove();
OUTPUT("Gniazdo 1 obsluguje klienta; czas - ",SimTime);
Interrupt(Klient,"StartNiecierpliwosc");
WAIT DURATION ASK rand TO Normal(Mean,Sigma);
ON INTERRUPT;
END WAIT;
WHILE(ASK Kol2 TO Pojemnosc=ASK Kol2 TO numberIn)
OUTPUT("W 2 kolejce nie ma miejsca na klienta; czas - ",SimTime);
WAIT FOR trigger2 TO Fire();
ON INTERRUPT;
END WAIT;
END WHILE;
OUTPUT("Gniazdo 1 wypuszcza klienta do kolejki 2 po czasie - ",SimTime);
ASK monitor TO UstLiZgl(ASK monitor TO liczbazgloszen -1);
ASK monitor TO UstawCzasPrzebywania(SimTime - ASK Klient TO czaswesmo);
ASK monitor TO ZwiekszLiczbaObsluzonych();
ASK Kol2 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 kol1:Kol1Obj;IN mon:MonitObj;IN ttrigger2:TriggerObj;IN trand:RandomObj;IN tKol2:Kol2Obj);
BEGIN
Sigma:=sigmas1;
Mean:=means1;
Kanaly:=k;
Kol1:=kol1;
Aktywne:=0;
monitor:=mon;
trigger2:=ttrigger2;
rand:=trand;
Kol2:=tKol2;
END METHOD;
ASK METHOD UstawAktywne(IN ak:INTEGER);
BEGIN
Aktywne:=ak;
END METHOD;
END OBJECT;
OBJECT Kol2Obj;
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 Gnz2 TO Aktywne < ASK Gnz2 TO Kanaly)
TELL Gnz2 TO Obsluga();
ASK Gnz2 TO UstawAktywne(ASK Gnz2 TO Aktywne+1);
END IF;
ELSE
DISPOSE(elem);
OUTPUT("W 2 kolejce nie ma miejsca; czas - ",SimTime);
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:Gnz2Obj;IN mon:MonitObj;IN ttrigger2:TriggerObj;IN trand:RandomObj);
BEGIN
Pojemnosc:=p;
Mean:=means2k;
k:=k2k;
Gnz2:=g2;
monitor:=mon;
trigger2:=ttrigger2;
rand:=trand;
END METHOD;
END OBJECT;
OBJECT Gnz2Obj;
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 Kol2 TO numberIn>0)
Klient:=ASK Kol2 TO Remove();
OUTPUT("Klient wchodzi do gniazda SMO 2 po czasie - ",SimTime);
Interrupt(Klient,"StartNiecierpliwosc");
WAIT DURATION ASK rand TO UniformReal(lo,hi);
ON INTERRUPT;
END WAIT;
IF (ASK rand TO Sample < p2)
OUTPUT("Klient zawraca do SMO 2; czas - ",SimTime);
ASK Klient TO Zapetlenie(TRUE);
ASK Kol2 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);
OUTPUT("klient idzie do wyjscia, czas=",SimTime);
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 kol2:Kol2Obj;IN mon:MonitObj;IN tp2:REAL;
IN toutsystemsmo:WyjZSysObj;IN trand:RandomObj);
BEGIN
lo:=tlo;
hi:=thi;
Kanaly:=kan;
Kol2:=kol2;
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 Kol3Obj;
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 Gnz3 TO Aktywne < ASK Gnz3 TO Kanaly)
TELL Gnz3 TO Obsluga();
ASK Gnz3 TO UstawAktywne(ASK Gnz3 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:Gnz3Obj;
IN mon:MonitObj;IN trand:RandomObj;IN ttrigger3:TriggerObj);
BEGIN
Mean:=means3;
Sigma:=sigmas3;
Gnz3:=g3;
monitor:=mon;
rand:=trand;
trigger3:=ttrigger3;
END METHOD;
END OBJECT;
OBJECT Gnz3Obj;
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 Kol3 TO numberIn>0)
Klient:=ASK Kol3 TO Remove();
OUTPUT("Klient wchodzi do gniazda SMO 3 po czasie - ",SimTime);
Interrupt(Klient,"StartNiecierpliwosc");
WAIT DURATION ASK rand TO Triangular(min,m,max);
ON INTERRUPT;
END WAIT;
IF (ASK rand TO Sample < p3)
OUTPUT("Klient zawraca i znow wchodzi do SMO 3 po czasie - ",SimTime);
ASK Klient TO Zapetlenie(TRUE);
ASK Kol3 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);
OUTPUT("Klient idzie do wyjscia po czasie - ",SimTime);
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 kol3:Kol3Obj;IN mon:MonitObj;IN tp3:REAL;
IN toutsystemsmo:WyjZSysObj;IN trand:RandomObj);
BEGIN
min:=tmin;
m:=tm;
max:=tmax;
Kanaly:=kan;
Kol3:=kol3;
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 Projekt;
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 kol1,kol2,kol3,
gnz1,gnz2,gnz3,gen1,gen2,
mon0,mon1,mon2,mon3,out0,ran0,trg0;
FROM SmoMod IMPORT Gnz1Obj,Gnz2Obj,Gnz3Obj,Gen1Obj,Gen2Obj,
Kol1Obj,Kol2Obj,Kol3Obj,KliObj,MonitObj,WyjZSysObj;
TYPE
Rekdanych=RECORD;
LExp:INTEGER;
LstartMon:INTEGER;
Gen1Mean,Gen1Lambda:REAL;
Gen1kPaczka,Gen1LKlientow:INTEGER;
Gen2Mean,Gen2Sigma,Gen2Meanil:REAL;
Gen2kil,Gen2LKlientow:INTEGER;
Kol1Lambda:REAL;
Gnz1Mean,Gnz1Sigma:REAL;
Gnz1Kanaly:INTEGER;
Kol2pojem:INTEGER;
Kol2Mean:REAL;
Kol2k:INTEGER;
Gnz2lo,Gnz2hi,Gnz2prawd2:REAL;
Gnz2Kanaly:INTEGER;
Kol3Mean:REAL;
Kol3Sigma:REAL;
Gnz3min,Gnz3max,Gnz3m,Gnz3prawd3:REAL;
Gnz3Kanaly: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.Kol1Lambda);
ReadReal(file,config.Gnz1Mean);
ReadReal(file,config.Gnz1Sigma);
ReadInt(file,config.Gnz1Kanaly);
ReadInt(file,config.Kol2pojem);
ReadReal(file,config.Kol2Mean);
ReadInt(file,config.Kol2k);
ReadReal(file,config.Gnz2lo);
ReadReal(file,config.Gnz2hi);
ReadReal(file,config.Gnz2prawd2);
ReadInt(file,config.Gnz2Kanaly);
ReadReal(file,config.Kol3Mean);
ReadReal(file,config.Kol3Sigma);
ReadReal(file,config.Gnz3min);
ReadReal(file,config.Gnz3max);
ReadReal(file,config.Gnz3m);
ReadReal(file,config.Gnz3prawd3);
ReadInt(file,config.Gnz3Kanaly);
DISPOSE(file);
END PROCEDURE;
PROCEDURE Symuluj(INOUT wyniki:WynikiSMO;INOUT config:Rekdanych);
BEGIN
NEW(gen1);
NEW(gen2);
NEW(gnz1);
NEW(gnz2);
NEW(gnz3);
NEW(kol1);
NEW(kol2);
NEW(kol3);
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 gnz3 TO Init(config.Gnz3min,config.Gnz3m,
config.Gnz3max,config.Gnz3Kanaly,kol3,
mon3,config.Gnz3prawd3,out0,ran0);
ASK kol3 TO Init(config.Kol3Mean,config.Kol3Sigma,
gnz3,mon3,ran0,trg0);
ASK gnz2 TO Init(config.Gnz2lo,config.Gnz2hi,
config.Gnz2Kanaly,kol2,mon2,config.Gnz2prawd2,out0,ran0);
ASK kol2 TO Init(config.Kol2pojem,config.Kol2Mean,
config.Kol2k,gnz2,mon2,trg0,ran0);
ASK gnz1 TO Init(config.Gnz1Mean,config.Gnz1Sigma,
config.Gnz1Kanaly,kol1,mon1,trg0,ran0,kol2);
ASK kol1 TO Init(config.Kol1Lambda,gnz1,mon1,ran0);
ASK gen1 TO Init(config.Gen1Mean,config.Gen1kPaczka,
config.Gen1LKlientow,kol1,mon0,config.Gen1Lambda,ran0);
ASK gen2 TO Init(config.Gen2Mean,config.Gen2Sigma,
config.Gen2Meanil,config.Gen2LKlientow,kol3,
mon0,config.Gen2kil,ran0);
ASK out0 TO Init(mon0);
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(gnz1);
DISPOSE(gnz2);
DISPOSE(gnz3);
DISPOSE(kol1);
DISPOSE(kol2);
DISPOSE(kol3);
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("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;
PROCEDURE zapis(INOUT wyniki:WynikiSMO);
VAR
file:StreamObj;
BEGIN
NEW(file);
ASK file TO Open("Wyniki.txt",Output);
OUTPUT("Wyniki");
OUTPUT("");
OUTPUT("");
ASK file TO WriteString("Sredni czas przebywania zgloszenia w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[0],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe czasu przebywania zgloszenia w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[4],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Sredni czas przebywania zgloszenia w SMO 1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[1],RStatObj).Mean(),10,4);
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(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Sredni czas przebywania zgloszenia w SMO 2:");
ASK file TO WriteReal(GETMONITOR(wyniki[2],RStatObj).Mean(),10,4);
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(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Sredni czas przebywania zgloszenia w SMO 3:");
ASK file TO WriteReal(GETMONITOR(wyniki[3],RStatObj).Mean(),10,4);
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(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w systemie:");
ASK file TO WriteReal(GETMONITOR(wyniki[8],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zgloszen w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[12],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w SMO 1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[9],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zgloszen w SMO 1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[13],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w SMO 2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[10],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zgloszen w SMO 2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[14],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w SMO 3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[11],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Odychlenie standardowe liczby zgloszen w SMO 3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[15],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteLn;
ASK file TO WriteLn;
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zajetych kanalow w Systemie:");
ASK file TO WriteReal(GETMONITOR(wyniki[16],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Odchylenie standardowe liczby zajetych kanalow w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[20],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zajetych kanalow w SMO1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[17],RStatObj).Mean(),10,4);
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(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zajetych kanalow w SMO2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[18],RStatObj).Mean(),10,4);
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(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zajetych kanalow w SMO3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[19],RStatObj).Mean(),10,4);
ASK file TO WriteString("Odchylenie standardowe liczby zajetych kanalow w SMO 3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[23],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteLn;
ASK file TO WriteLn;
ASK file TO WriteString("Srednia liczba zgloszen w kolejce w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[24],RStatObj).Mean(),10,4);
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(),10,4);
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(),10,4);
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(),10,4);
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(),10,4);
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(),10,4);
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(),10,4);
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(),10,4);
ASK file TO WriteLn;
ASK file TO WriteLn;
ASK file TO WriteLn;
ASK file TO WriteString("Prawdopodobienstwo obsluzenia zgloszenia w systemie: ");
ASK file TO WriteReal(GETMONITOR(wyniki[32],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Prawdopodobienstwo obsluzenia zgloszenia w SMO 1: ");
ASK file TO WriteReal(GETMONITOR(wyniki[33],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Prawdopodobienstwo obsluzenia zgloszenia w SMO 2: ");
ASK file TO WriteReal(GETMONITOR(wyniki[34],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO WriteString("Prawdopodobienstwo obsluzenia zgloszenia w SMO 3: ");
ASK file TO WriteReal(GETMONITOR(wyniki[35],RStatObj).Mean(),10,4);
ASK file TO WriteLn;
ASK file TO Close;
DISPOSE(file);
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;
zapis(wyniki);
WynikiNaEkran(wyniki);
DISPOSE(ran0);
DISPOSE(wyniki);
DISPOSE(config);
END MODULE.