W O J S K O W A A K A D E M I A
T E C H N I C Z N A
SPRAWOZDANIE
Z PROGRAMU LABORATORYJNEGO
Z PRZEDMIOTU
PODSTAWY SYMULACJI
Wydział: Cybernetyka
Kierunek: Informatyka
Specjalność: Informatyczne Systemy Zarządzania
Wykonał: Sebastian Matyjek
Grupa: I6E1S1
Nr albumu: 35112
Nr w dzienniku (nrDz): 10
Data wykonania sprawozdania: 24.01.09
Prowadzący laboratoria: dr inż. Jarosław Rulka
Zadanie laboratoryjne nr 1:
Napisać program symulujący działanie sieci SMO jak na rysunku poniżej:
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);
Zgodnie z numerem dziennika (nr: 10) wyliczyłem poszczególne parametry:
Rozkłady zmiennych:
- T1 - Weibulla
- T2 - Wykładniczy
Rozkłady zmiennych:
- O1 - Wykładniczy
- O2 - Erlanga
- O3 - Normalny
Długości kolejek:
- L1 - nieograniczona
- L2 - ograniczona
- L3 - nieograniczona
Algorytmy kolejek:
- Al1 - LIFO
- Al2 - priorytetowy
- Al3 -FIFO
Wielkości paczki zgłoszeń strumieni:
- R1 - 2
- R2 - 3
Ilości kanałów w gniazdach:
- M1 - 1
- M2 - 2
- M3 - 3
Prawdopodobieństwa przemieszczenia się zgłoszenia po danym łuku:
P1=0.6
P2=0.5
Program powinien umożliwić oszacowanie następujących charakterystyk granicznych systemu oraz poszczególnych SMO:
czas przebywania zgłoszenia (średnia, odchylenie standardowe),
liczbę zgłoszeń (średnia, odchylenie standardowe),
liczbę zajętych kanałów (średnia, odchylenie standardowe),
liczbę zgłoszeń w kolejce (średnia, odchylenie standardowe).
prawdopodobieństwo obsłużenia zgłoszenia.
W sprawozdaniu należy zawrzeć:
kod źródłowy programu (z komentarzem);
opis metody wyznaczania charakterystyk (sposób realizacji, wzory estymatorów);
Zadanie zrealizować w języku MODSIM II.
ROZWIĄZANIE ZADANIA LABOLATORYJNEGO
Aby rowiązać wymienione wyżej zadanie o numerze 1 w języku MODSIM II stworzyłem następujące obiekty:
KlientObj - obiekt bedący klientem który jest obsługi w zaprojektowanym SMO.
Generator_x - obiekt ten generuje klientów do SMO o numerach 1 i 2 , co określony czas będący zmienną losową o określonym rozkładzie.
Kolejka_x - jest to obiekt przechowujący w sobie klientów oczekujących na obsłużenie. Rodzaj kolejki oraz ich pojemność zostały podane wyżej i zależą od numeru dziennika.
Gniazdo_x - jest obiekt obsługujący pojedynczego klienta. W danym SMO może być kilka gniazd obsługi. Ich ilość (w tym zadaniu) zależy od numeru z dziennika i została ona podana wcześniej.
Kolejki 1 i 3 są nieograniczone wiec nie mają limitu klientów oczekujących przez co w momencie gdy z SMO 1 lub 2 wyjdzie klient może bez oczekiwania wejść do kolejki 3 i dalej oczekiwać na obsługę. Z kolejki 1 klient może przejść do kolejki 3 lub wrócić do kolejki 1 i oczekiwać na obsługę, jeżeli przejdzie do SMO 3 , to po zakończeniu jego obsługi może wyjść z systemu lub przejść do kolejki 2 gdzie będzie oczekiwał na obsługę.
Rozkład Weibulla
Jest to ciągły rozkład prawdopodobieństwa często stosowany w analizie przeżycia do modelowania sytuacji, gdy prawdopodobieństwo śmierci/awarii zmienia się w czasie. Może on w zależności od parametrów przypominać zarówno rozkład normalny (dla k=3.4) , jak i rozkład wykładniczy (sprowadza się do niego dla k=1). Parametr k rozkładu określa zachowanie prawdopodobieństwa awarii (śmierci) w czasie:
dla k<1 prawdopodobieństwo awarii (śmierci) maleje z czasem. W przypadku modelowania awarii urządzenia sugeruje to, że egzemplarze mogą posiadać wady fabryczne i powoli wypadają z populacji.
dla k=1 (rozkład wykładniczy) prawdopodobieństwo jest stałe. Sugeruje to, że awarie mają charakter zewnętrznych zdarzeń losowych.
dla k>1 prawdopodobieństwo rośnie z czasem. Sugeruje to zużycie części z upływem czasu jako główną przyczynę awaryjności.
Parametr λ można zinterpretować jako czas po którym zginie
1-1/e≈63,2% osobników.
Gęstość prawdopodobieństwa:
Dystrybuanta:
Rozkład Erlanga
Jest to ciągły rozkład prawdopodobieństwa, związany z rozkładem wykładniczym i rozkładem gamma. Rozkład Erlanga został opracowany przez A. K. Erlanga do szacowania liczby rozmów telefonicznych, łączonych jednocześnie przez operatora w ręcznej centrali telefonicznej. Później uwzględniono również czas oczekiwania w kolejce. Obecnie rozkład ten znalazł też zastosowanie w teorii procesów stochastycznych.
Gęstość prawdopodobieństwa
Dystrybuanta
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.
Dystrybuanta tego rozkładu to prawdopodobieństwo, że obiekt jest w stanie Y.
Innymi słowy, jeżeli w jednostce czasu ma zajść 1/λ niezależnych zdarzeń, to rozkład wykładniczy opisuje odstępy czasu pomiędzy kolejnymi zdarzeniami.
Funkcja charakterystyczna:
Dystrybuanta:
Gęstość Prawdopodobieństwa :
Rozkład Normalny
Rozkład normalny, zwany też rozkładem Gaussa, lub krzywą dzwonową, jest jednym z najważniejszych rozkładów prawdopodobieństwa. Odgrywa ważną rolę w statystycznym opisie zagadnień przyrodniczych, przemysłowych, medycznych, socjalnych itp.
Przyczyną jest jego popularność w naturze. Jeśli jakaś wielkość jest sumą lub średnią bardzo wielu drobnych losowych czynników, to niezależnie od rozkładu każdego z tych czynników, jej rozkład będzie zbliżony do normalnego, stąd można go bardzo często zaobserwować w danych. Ponadto rozkład normalny ma interesujące właściwości matematyczne, dzięki którym oparte na nim metody statystyczne są dość proste obliczeniowo.
Funkcja gęstości:
Dystrybuanta:
KOD PROGRAMU:
MAIN MODULE main;
FROM GrpMod IMPORT RankedObj,QueueObj,StackObj;
FROM RandMod IMPORT RandomObj;
FROM SimMod IMPORT StartSimulation,SimTime,TriggerObj;
FROM IOMod IMPORT ReadKey;
FROM StatMod IMPORT TSINTEGER,SINTEGER,SREAL,RStatObj,IStatObj,ITimedStatObj;
TYPE
--> KlientObj=OBJECT[Author:S]
--> czasStworzenia:REAL;[Author:S]
--> czasWejsciaK:REAL;[Author:S]
--> priorytet:REAL;[Author:S]
--> ASK METHOD ustawCzasK(IN cz:REAL);[Author:S]
--> ASK METHOD getCzas():REAL; [Author:S]
--> ASK METHOD ObjInit(); [Author:S]
--> ASK METHOD zwrocCzasS():REAL;[Author:S]
--> ASK METHOD UstawPriorytet(IN p:REAL);[Author:S]
END OBJECT;
--> Kolejka3Obj[Author:S] =OBJECT(QueueObj[ANYOBJ:KlientObj])
--> liczbaZgloszen:SINTEGER[Author:S] ;
--> liczbaZadan:TSINTEGER;[Author:S]
--> ASK METHOD Ustaw();
ASK METHOD Dodaj(IN Zgl: KlientObj);
ASK METHOD Pobierz():KlientObj; [Author:S]
END OBJECT;
--> Kolejka1Obj=OBJECT(StackObj[ANYOBJ:KlientObj])[Author:S]
liczbaZgloszen:SINTEGER;
liczbaZadan:TSINTEGER;
ASK METHOD ObjInit();
ASK METHOD Dodaj(IN Zgl: KlientObj);
ASK METHOD Pobierz():KlientObj;
END OBJECT;
--> Kolejka2Obj=OBJECT(RankedObj[ANYOBJ:KlientObj])[Author:S]
liczbaMiejsc:INTEGER; {liczba miejsc w kolejce}
wolneMiejsca:INTEGER; {liczba wolnych miejsc w kolejce}
liczbaZgloszen:SINTEGER; {liczba zgolszen, zarowno przyjetych jak i odrzuconych}
semafor:TriggerObj;
liczbaZadan:TSINTEGER; {ilosc zadan w kolejce}
ASK METHOD Ustaw(IN lm:INTEGER);
ASK METHOD CzyPelna():BOOLEAN;
ASK METHOD Dodaj(IN Zgl: KlientObj):BOOLEAN;
ASK METHOD Pobierz():KlientObj;
OVERRIDE ASK METHOD Rank (IN a, b : KlientObj) : INTEGER;
END OBJECT;
--> Gniazdo3Obj=OBJECT[Author:S]
--> mean:REAL;
k:REAL;[Author:S]
zablokowane:BOOLEAN;
--> smo1:Kolejka1Obj;
smo2:Kolejka2Obj;
smo3:Kolejka3Obj;[Author:S]
--> czasPrzebywania:SREAL;
czasPrzebywaniaWsys:SREAL;
iloscObsluzonych:INTEGER;[Author:S]
--> generator:RandomObj;[Author:S]
--> p2:REAL; [Author:S]
czasZakonczenia:REAL;
--> gniaz21:ANYOBJ;
gniaz22:ANYOBJ; [Author:S]
czyZajeta:BOOLEAN;
czasPracy:REAL;
--> ASK METHOD Ustaw(IN k1:Kolejka1Obj;IN k2:Kolejka2Obj;IN k3:Kolejka3Obj;IN m:REAL;IN kk:REAL;IN p:REAL;IN gn21:ANYOBJ;IN gn22:ANYOBJ); [Author:S]
ASK METHOD Odblokuj();
--> ASK METHOD ObjInit(); [Author:S]
--> TELL METHOD Obsluga();[Author:S]
END OBJECT;
--> Gniazdo1Obj=OBJECT[Author:S]
--> mean:REAL[Author:S] ; {Wykladniczy}
zablokowane:BOOLEAN;
--> smo1:Kolejka1Obj;
smo3:Kolejka3Obj;[Author:S]
--> tab : ARRAY INTEGER OF REAL;
ilosc:INTEGER;
il:REAL;[Author:S]
czasPrzebywania:SREAL; {do statystyk nie wiem czy bedzie potrzebne}
iloscObsluzonych:INTEGER;
generator:RandomObj;
p1:REAL; {prawdopodobienstwo gdzie ma pojsc zrobione zgloszenie}
czasZakonczenia:REAL;
--> gniaz31:Gniazdo3Obj;
gniaz32:Gniazdo3Obj;
gniaz33:Gniazdo3Obj;[Author:S]
czyZajeta:BOOLEAN;
czasPracy:REAL;
ASK METHOD Ustaw(IN k1:Kolejka1Obj;IN k3:Kolejka3Obj;IN me: REAL;IN czas:REAL;IN gn31:Gniazdo3Obj;IN gn32:Gniazdo3Obj;IN gn33:Gniazdo3Obj);
ASK METHOD Odblokuj();
ASK METHOD ObjInit();
TELL METHOD Obsluga();
END OBJECT;
--> Gniazdo2Obj[Author:S] =OBJECT
--> mean:REAL;[Author:S] {Erlanga}
k:INTEGER;
--> smo2:Kolejka2Obj;
smo3:Kolejka3Obj;[Author:S]
czasPrzebywania:SREAL; {do statystyk w gnieżdzie}
iloscObsluzonych:INTEGER;
generator:RandomObj;
--> gniaz31:Gniazdo3Obj;
gniaz32:Gniazdo3Obj;
gniaz33:Gniazdo3Obj;[Author:S]
czasZakonczenia:REAL;
czyZajeta:BOOLEAN;
czasPracy:REAL;
ASK METHOD Ustaw(IN k2:Kolejka2Obj;IN k3:Kolejka3Obj;IN m:REAL;IN kk:INTEGER;IN gn31:Gniazdo3Obj;IN gn32:Gniazdo3Obj;IN gn33:Gniazdo3Obj);
ASK METHOD ObjInit();
TELL METHOD Obsluga();
END OBJECT;
--> Generator1Obj=OBJECT[Author:S]
--> shape:REAL;
scale:REAL;[Author:S]
generator:RandomObj;
--> smo1:Kolejka1Obj;[Author:S]
czasZakonczenia:REAL;
--> gniaz11:Gniazdo1Obj;[Author:S]
ASK METHOD Ustaw(IN k:Kolejka1Obj;IN sh:REAL;IN sc:REAL;IN czas:REAL;IN gn11:Gniazdo1Obj);
ASK METHOD ObjInit(); {konstruktor}
--> TELL METHOD Generuj();[Author:S]
END OBJECT;
--> Generator2Obj=OBJECT[Author:S]
--> mean:REAL;[Author:S]
generator:RandomObj;
smo2:Kolejka2Obj;
czasZakonczenia:REAL;
--> gniaz21:Gniazdo2Obj;
gniaz22:Gniazdo2Obj;[Author:S]
ASK METHOD Ustaw(IN k:Kolejka2Obj;IN me:REAL; IN czas:REAL;IN gn21:Gniazdo2Obj;IN gn22:Gniazdo2Obj);
ASK METHOD ObjInit(); {konstruktor}
TELL METHOD Generuj();
END OBJECT;
{==============================================================================}
OBJECT KlientObj;
ASK METHOD ObjInit();
BEGIN
czasStworzenia:=SimTime();
czasWejsciaK:=0.0;
END METHOD;
ASK METHOD zwrocCzasS():REAL;
BEGIN
RETURN czasStworzenia;
END METHOD;
ASK METHOD ustawCzasK(IN cz:REAL); {czas wejscia do kolejki}
BEGIN
czasWejsciaK:=cz;
END METHOD;
ASK METHOD getCzas():REAL;
BEGIN
RETURN czasWejsciaK;
END METHOD;
ASK METHOD UstawPriorytet(IN p:REAL);
BEGIN
priorytet:=p;
END METHOD;
END OBJECT;
OBJECT Kolejka3Obj;
--> ASK METHOD Dodaj(IN Zgl: KlientObj);[Author:S]
BEGIN
--> Add(Zgl);[Author:S]
--> liczbaZgloszen:=liczbaZgloszen+1;
liczbaZadan:=liczbaZadan+1;[Author:S]
--> ASK Zgl TO ustawCzasK(SimTime());[Author:S]
END METHOD;
--> ASK METHOD Pobierz():KlientObj;[Author:S]
BEGIN
IF --> numberIn>0[Author:S]
liczbaZadan:=liczbaZadan-1;
--> RETURN Remove(); [Author:S]
ELSE
--> RETURN NILOBJ;[Author:S]
END IF;
END METHOD;
--> ASK METHOD Ustaw();
BEGIN
liczbaZgloszen:=0;
{licznikCzasu:=0.0;}
{NEW(semafor);}
liczbaZadan:=0;
END METHOD;[Author:S]
END OBJECT;
--> OBJECT Kolejka1Obj;
ASK METHOD ObjInit();
BEGIN
liczbaZgloszen:=0;
liczbaZadan:=0;
END METHOD;
ASK METHOD Dodaj(IN zgl: KlientObj);
BEGIN
Add(zgl);
ASK zgl TO ustawCzasK(SimTime());
liczbaZgloszen:=liczbaZgloszen+1;
liczbaZadan:=liczbaZadan+1;
END METHOD;
ASK METHOD Pobierz():KlientObj;
BEGIN
IF numberIn>0
RETURN Remove();
liczbaZadan:=liczbaZadan-1;
ELSE
RETURN NILOBJ;
END IF;
END METHOD;
END OBJECT;[Author:S]
--> OBJECT Kolejka2Obj;[Author:S]
--> ASK METHOD Rank (IN a, b : KlientObj) : INTEGER;
VAR
zgA,zgB:KlientObj;
BEGIN
zgA:=a;
zgB:=b;
IF a.priorytet>b.priorytet
RETURN 1;
END IF;
IF a.priorytet<b.priorytet
RETURN -1;
END IF;
RETURN 0;
END METHOD;[Author:S]
ASK METHOD CzyPelna():BOOLEAN;
BEGIN
IF wolneMiejsca=0
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END METHOD;[Author:S]
--> ASK METHOD Dodaj(IN Zgl: KlientObj):BOOLEAN;
BEGIN
IF wolneMiejsca>0
Add(Zgl);
wolneMiejsca:=wolneMiejsca-1;
liczbaZgloszen:=liczbaZgloszen+1;
liczbaZadan:=liczbaZadan+1;
ASK Zgl TO ustawCzasK (SimTime());
RETURN TRUE;
ELSE
liczbaZgloszen:=liczbaZgloszen+1;
RETURN FALSE;
END IF;
END METHOD;[Author:S]
--> ASK METHOD Pobierz():KlientObj; {wysyla zgloszenie z kolejki}
BEGIN
IF wolneMiejsca<liczbaMiejsc
wolneMiejsca:=wolneMiejsca+1;
liczbaZadan:=liczbaZadan-1;
ASK semafor TO Release;
RETURN Remove();
ELSE
RETURN NILOBJ;
END IF;
END METHOD;[Author:S]
ASK METHOD Ustaw(IN lm:INTEGER);
BEGIN
liczbaMiejsc:=lm;
wolneMiejsca:=lm;
liczbaZgloszen:=0;
{licznikCzasu:=0.0;}
NEW(semafor);
liczbaZadan:=0;
END METHOD;
END OBJECT;
--> OBJECT Generator1Obj;[Author:S]
ASK METHOD ObjInit();
BEGIN
shape:=0.0;
scale:=0.0;
NEW(generator);
END METHOD;
ASK METHOD Ustaw(IN k:Kolejka1Obj;IN sh:REAL;IN sc:REAL;IN czas:REAL;IN gn11:Gniazdo1Obj);
BEGIN
smo1:=k;
shape:=sh;
scale:=sc;
czasZakonczenia:=czas;
gniaz11:=gn11;
END METHOD;
TELL METHOD Generuj();
VAR
tmp:KlientObj;
fk:BOOLEAN;
i:INTEGER;
ileNaraz:INTEGER;
BEGIN
WHILE SimTime()<czasZakonczenia
--> ileNaraz:=ASK generator TO UniformInt (1,2);[Author:S]
i:=0;
WHILE((i<ileNaraz))
NEW(tmp);
ASK smo1 TO Dodaj(tmp);
i:=i+1;
END WHILE;
TELL gniaz11 TO Obsluga();
--> WAIT DURATION (ASK generator TO Weibull(shape,scale)); END WAIT;[Author:S]
END WHILE;
END METHOD;
END OBJECT;
--> OBJECT Generator2Obj;[Author:S]
ASK METHOD ObjInit();
BEGIN
mean:=0.0;
NEW(generator);
END METHOD;
ASK METHOD Ustaw(IN k:Kolejka2Obj;IN me:REAL; IN czas:REAL;IN gn21:Gniazdo2Obj;IN gn22:Gniazdo2Obj);
BEGIN
smo2:=k;
mean:=me;
gniaz21:=gn21;
gniaz22:=gn22;
czasZakonczenia:=czas;
END METHOD;
--> TELL METHOD Generuj();[Author:S]
VAR
tmp:KlientObj;
ileNaraz:INTEGER;
i:INTEGER;
fk:BOOLEAN;
BEGIN
WHILE SimTime()<czasZakonczenia
--> ileNaraz:=ASK generator TO UniformInt (1,3);[Author:S]
i:=0;
WHILE((i<ileNaraz))
--> NEW(tmp);[Author:S]
ASK tmp TO UstawPriorytet(ASK generator TO UniformReal(1.0,10.0));
--> fk:=ASK smo2 TO Dodaj(tmp);[Author:S]
i:=i+1;
END WHILE;
--> TELL gniaz21 TO Obsluga();
TELL gniaz22 TO Obsluga();[Author:S]
--> WAIT DURATION (ASK generator TO Exponential(mean) ); END WAIT;[Author:S]
END WHILE;
END METHOD;
END OBJECT;
--> OBJECT Gniazdo3Obj;[Author:S]
ASK METHOD ObjInit();
BEGIN
NEW(generator);
mean:=0.0;
k:=0.0;
zablokowane:=FALSE;
iloscObsluzonych:=0;
czasPrzebywania:=0.0;
czasPrzebywaniaWsys:=0.0;
p2:=0.0;
czyZajeta:=FALSE;
czasPracy:=0.0;
END METHOD;
ASK METHOD Ustaw(IN k1:Kolejka1Obj;IN k2:Kolejka2Obj;IN k3:Kolejka3Obj;IN m:REAL;IN kk:REAL;IN p:REAL;IN gn21:ANYOBJ;IN gn22:ANYOBJ);
BEGIN
mean:=m;
k:=kk;
smo1:=k1;
smo2:=k2;
smo3:=k3;
p2:=p;
gniaz21:=gn21;
gniaz22:=gn22;
END METHOD;
ASK METHOD Odblokuj();
BEGIN
zablokowane:=FALSE;
END METHOD;
--> TELL METHOD Obsluga();[Author:S]
VAR
tmp:KlientObj;
time:REAL;
pdb:REAL;
delta:REAL;
fk:BOOLEAN;
BEGIN
IF czyZajeta=FALSE;
czyZajeta:=TRUE;
--> pdb:=ASK generator TO Sample(); [Author:S] {wygenerowanie p-stwa p2}
tmp:=ASK smo3 TO Pobierz();
WHILE(tmp<>NILOBJ)
IF tmp<>NILOBJ
--> delta:=ASK generator TO Normal(mean,k) ;[Author:S]
WAIT DURATION (delta); END WAIT;
czasPracy:=czasPracy+delta;
IF pdb<p2
fk:=ASK smo2 TO Dodaj(tmp);
--> TELL Gniazdo2Obj(gniaz21) TO Obsluga();
TELL Gniazdo2Obj(gniaz22) TO Obsluga();[Author:S]
ELSE
czasPrzebywaniaWsys:=SimTime()-tmp.zwrocCzasS();
OUTPUT("W chwili t = ", SimTime()," gniazdo numer 3 zakończylo zadanie rozpoczete chwili ",REALTOSTR(ASK tmp TO getCzas()));
END IF;
iloscObsluzonych:=iloscObsluzonych+1;
czasPrzebywania:=SimTime()-(ASK tmp TO getCzas());
END IF;
pdb:=ASK generator TO Sample();
tmp:=ASK smo3 TO Pobierz();
END WHILE;
czyZajeta:=FALSE;
END IF;
END METHOD;
END OBJECT;
--> OBJECT Gniazdo1Obj;[Author:S]
ASK METHOD ObjInit();
BEGIN
NEW(generator);
NEW(tab,0..100);
ilosc:=0;
il:=0.0;
mean:=0.0;
zablokowane:=FALSE;
iloscObsluzonych:=0;
czasPrzebywania:=0.0;
czyZajeta:=FALSE;
czasPracy:=0.0;
END METHOD;
ASK METHOD Ustaw(IN k1:Kolejka1Obj;IN k3:Kolejka3Obj;IN me:REAL;IN p:REAL;IN gn31:Gniazdo3Obj;IN gn32:Gniazdo3Obj;IN gn33:Gniazdo3Obj);
BEGIN
mean:=me;
smo1:=k1;
smo3:=k3;
p1:=p;
gniaz31:=gn31;
gniaz32:=gn32;
gniaz33:=gn33;
END METHOD;
ASK METHOD Odblokuj();
BEGIN
zablokowane:=FALSE;
END METHOD;
--> TELL METHOD Obsluga();[Author:S]
VAR
tmp:KlientObj; {do pobrania zgloszenia}
pdb:REAL; {losowane prawdopodobienstwo}
czyDodano:BOOLEAN;
czasWejscia:REAL; {czas wejscia zadania do kolejki}
delta:REAL; {czas wykonania zadania/zgloszenia}
BEGIN
IF czyZajeta=FALSE
czyZajeta:=TRUE;
--> pdb:=ASK generator TO Sample(); [Author:S]
WHILE(tmp<>NILOBJ)
IF tmp<>NILOBJ
--> delta:=ASK generator TO Exponential(mean);[Author:S]
czasPracy:=czasPracy+delta;
WAIT DURATION (delta); END WAIT;
czasWejscia:=ASK tmp TO getCzas();
IF pdb<p1
ASK smo1 TO Dodaj(tmp);
ELSE
ASK smo3 TO Dodaj(tmp);
iloscObsluzonych:=iloscObsluzonych+1;
IF(smo3.numberIn>1)
--> TELL gniaz31 TO Obsluga();
TELL gniaz32 TO Obsluga();
TELL gniaz33 TO Obsluga();[Author:S]
END IF;
END IF;
OUTPUT("W chwili t = ", SimTime()," gniazdo numer 1 zakończylo zadanie rozpoczete chwili ",REALTOSTR(czasWejscia));
czasPrzebywania:=(SimTime()-czasWejscia);
IF ilosc<100
tab[ilosc]:= czasPrzebywania;
ilosc:=ilosc+1;
il:=il+1.0;
END IF;
END IF;
END WHILE;
czyZajeta:=FALSE;
END IF;
END METHOD;
END OBJECT;
OBJECT --> Gniazdo2Obj;[Author:S]
ASK METHOD ObjInit();
BEGIN
NEW(generator);
mean:=0.0;
k:=0;
iloscObsluzonych:=0;
czasPrzebywania:=0.0;
czasPracy:=0.0;
END METHOD;
ASK METHOD Ustaw(IN k2:Kolejka2Obj;IN k3:Kolejka3Obj;IN m:REAL;IN kk:INTEGER;IN gn31:Gniazdo3Obj;IN gn32:Gniazdo3Obj;IN gn33:Gniazdo3Obj);
BEGIN
mean:=m;
k:=kk;
smo2:=k2;
smo3:=k3;
gniaz31:=gn31; {3 dla mariana}
gniaz32:=gn32;
gniaz33:=gn33;
czyZajeta:=FALSE;
END METHOD;
--> TELL METHOD Obsluga();[Author:S]
VAR
tmp:KlientObj;
czyDodano:BOOLEAN;
delta:REAL;
BEGIN
IF czyZajeta=FALSE
czyZajeta:=TRUE;
tmp:=ASK smo2 TO Pobierz();
WHILE(tmp<>NILOBJ)
--> delta:= ASK generator TO Erlang(mean,k) [Author:S] ; --> WAIT DURATION (delta); END WAIT;[Author:S]
czasPracy:=czasPracy+delta;
IF (tmp<>NILOBJ)
OUTPUT("W chwili t = ", SimTime()," gniazdo numer 1 zakończylo zadanie rozpoczete chwili ",REALTOSTR(ASK tmp TO getCzas()));
iloscObsluzonych:=iloscObsluzonych+1;
czasPrzebywania:=SimTime()-(ASK tmp TO getCzas());
ASK smo3 TO Dodaj(tmp);
IF (smo3.numberIn>1)
--> TELL gniaz31 TO Obsluga();
TELL gniaz32 TO Obsluga();
TELL gniaz33 TO Obsluga();[Author:S]
END IF;
END IF;
tmp:=ASK smo2 TO Pobierz();
END WHILE;
czyZajeta:=FALSE;
END IF;
END METHOD;
END OBJECT;
VAR
--> smo1:Kolejka1Obj;
smo2:Kolejka2Obj;
smo3:Kolejka3Obj;
gniaz11:Gniazdo1Obj;
gniaz21:Gniazdo2Obj;
gniaz22:Gniazdo2Obj;
gniaz31:Gniazdo3Obj;
gniaz32:Gniazdo3Obj;
gniaz33:Gniazdo3Obj;
gen1:Generator1Obj;
gen2:Generator2Obj;
p1:REAL;
gshape1:REAL;
gscale1:REAL;
p2:REAL;
gmean2:REAL;
liczbaMiejsc2:INTEGER; {L1: (nrDz + i) mod 2 + 1 }
mean1:REAL; {do kolejki 1}
mean2:REAL; {do kolejki 2}
k2:INTEGER;
mean3:REAL; {parametr dla kolejki 3}
k3:REAL;
czasProby:REAL;
stop:CHAR;
tmp:REAL;
i:INTEGER;[Author:S]
BEGIN
--> p1:=0.5;
gshape1:=1.0;
gscale1:=8.0;[Author:S]
--> p2:=0.5;
gmean2:=5.0; [Author:S]
--> liczbaMiejsc2:=2; [Author:S] {
--> mean1:=7.0;[Author:S]
--> mean2:=5.0;
k2:= 2;[Author:S]
--> mean3:=10.0;
k3:=2.0;[Author:S]
czasProby:=100.0;
tmp:=0.0;
stop:='0';
--> NEW(smo1);
NEW(smo2);
NEW(smo3);
ASK smo2 TO Ustaw(liczbaMiejsc2);
NEW(gniaz11);
NEW(gniaz21);
NEW(gniaz22);
NEW(gniaz31);
NEW(gniaz32);
NEW(gniaz33);
NEW(gen1);
NEW(gen2);[Author:S]
--> ASK gniaz11 TO Ustaw(smo1, smo3, mean1, p1, gniaz31,gniaz32,gniaz33);
ASK gniaz21 TO Ustaw(smo2, smo3, mean2,k2, gniaz31,gniaz32,gniaz33);
ASK gniaz22 TO Ustaw(smo2, smo3, mean2,k2, gniaz31,gniaz32,gniaz33);
ASK gniaz31 TO Ustaw(smo1,smo2, smo3, mean3 ,k3, p2, gniaz21, gniaz22);
ASK gniaz32 TO Ustaw(smo1,smo2, smo3, mean3 ,k3, p2, gniaz21, gniaz22);
ASK gniaz33 TO Ustaw(smo1,smo2, smo3, mean3 ,k3, p2, gniaz21, gniaz22);
ASK gen1 TO Ustaw(smo1, gshape1,gscale1, czasProby, gniaz11);
ASK gen2 TO Ustaw(smo2, gmean2, czasProby, gniaz21, gniaz22);[Author:S]
--> TELL gen1 TO Generuj();
TELL gen2 TO Generuj();[Author:S]
--> StartSimulation(); [Author:S]
OUTPUT( );
OUTPUT("*OSZACOWANIE ZADANYCH CHARAKTERYSTYK GRANICZNYCH SYSTEMU ORAZ POSZCZEGOLNYCH SMO*");
FOR i:=0 TO gniaz11.ilosc BY 1
tmp:=tmp+gniaz11.tab[i];
END FOR;
tmp:=tmp/gniaz11.il;
{tmp:=ASK(GETMONITOR(gniaz11.czasPrzebywania,RStatObj))Mean();}
{tmp:=tmp/1.0;}
OUTPUT(" ** Sredni czas przebywania zgloszenia w SMO numer jeden: ",tmp);
tmp:=ASK(GETMONITOR(gniaz21.czasPrzebywania,RStatObj))Mean()+ASK(GETMONITOR(gniaz22.czasPrzebywania,RStatObj))Mean();
tmp:=tmp/2.0;
OUTPUT(" ** Sredni czas przebywania zgloszenia w SMO numer dwa: ",tmp);
tmp:=ASK(GETMONITOR(gniaz31.czasPrzebywania,RStatObj))Mean()+ASK(GETMONITOR(gniaz32.czasPrzebywania,RStatObj))Mean()+ASK(GETMONITOR(gniaz33.czasPrzebywania,RStatObj))Mean();
tmp:=tmp/3.0;
{tmp:=ASK(GETMONITOR(gniaz31.czasPrzebywania,RStatObj))Variance();}
OUTPUT(" ** Sredni czas przebywania zgloszenia w SMO numer trzy: ",tmp);
tmp:=ASK(GETMONITOR(gniaz31.czasPrzebywaniaWsys, RStatObj)) Mean();
OUTPUT(" ** Sredni czas przebywania zgloszenia w Systemie: ",tmp);
OUTPUT(" ** Srednia liczba zadan w kolejce numer jeden: ",ASK (GETMONITOR(smo1.liczbaZadan, ITimedStatObj)) Mean());
OUTPUT(" ** Srednia liczba zadan w kolejce numer dwa: ", (ASK (GETMONITOR(smo2.liczbaZadan, ITimedStatObj))Mean()));
OUTPUT(" ** Srednia liczba zadan w kolejce numer trzy: ",(ASK (GETMONITOR(smo3.liczbaZadan, ITimedStatObj)) Mean()));
tmp:=(gniaz11.czasPracy)/(SimTime());
OUTPUT(" ** Srednia liczba zajetych kanalow w kolejce numer jeden :",tmp*3.0);
tmp:=(gniaz21.czasPracy+gniaz22.czasPracy)/(SimTime());
OUTPUT(" ** Srednia liczba zajetych kanalow w kolejce numer dwa :",tmp*4.0);
tmp:=(gniaz31.czasPracy/SimTime())+(gniaz32.czasPracy/SimTime())+(gniaz33.czasPracy/SimTime());
OUTPUT(" ** Srednia liczba zajetych kanalow w kolejce numer trzy :",tmp*1.0);
INPUT(stop);
END MODULE.
Deklaracja obiektu Kienta
Czas w którym klient pojawił się (został wygenerowany)
Czas pojawienia się Klienta w kolejnych SMO
Priorytet klienta - używany w kolejkach priorytetowych
Metoda ustawiająca czas wejscia
Metoda zwracająca Czas Wejścia Klienta
Inicjalizacja obiektu
Metoda zwraca czas stworzenia klienta
Metoda ustawia priorytet klientowi.
Deklaracja Kolejki przy SMO 3 : FIFO nieograniczona
Zmienna potrzebna później w statystykach
Zmienna podająca ilość zadań w kolejce
Metody do Dodawania oraz Pobierania Klientów z kolejki, oraz ustawiające parametry w stan początkowy.
Kolejka do SMO 1 : LIFO nieograniczona
Kolejka do SMO 2 : Priorytetowa ograniczona.
Deklaracja Obiektu Gniazdo do SMO 3
Parametry do Rozkładu zmiennych losowych.
Referencje do Kolejek 1,2,3
Zmienne potrzebne do statystyk
Zmienna generatorowa. Dzięki niej generują się zmienne w danych rozkładach.
Prawdopodobieństwo gdzie ma pójść zrobione zgłoszenie
Referencje do gniazd obsługi z SMO 2
Metoda ustawiające parametry gniazda.
Inicjalizacja obiektu
Funkcja obsługująca klienta w gnieździe obsługi.
Deklaracja obiektu Gniazdo dla SMO 1
Parametr dla rozkładu wykładniczego
Referencje do kolejek 1 i 3
Zmienne potrzebne do wyliczenia statystyk.
Referencje do gniazd Obsługi z SMO 3.
Deklaracja obiektu gniazda dla SMO 2
Parametr dla rozkładu Erlanga.
Referencja dla kolejek 2 i 3
Referencje dla gniazd z SMO 3 które mogą później obsługiwać danego klienta.
Deklaracja obiektu Generator dla SMO 1
Parametry dla rozkładu Weibulla według którego będą generowane czasy między kolejnymi przyjściami klientów.
Referencja na kolejkę z SMO 1 do której będą dodawani nowi klienci.
Referencja na gniazdo obsługi w SMO 1 które będzie obsługiwać później klienta
Metoda generująca klientów.
Obiekt Generator dla SMO 2
Parametr dla rozkładu Wykładniczego
Referencja do gniazd obsługi z SMO 2 które mogą później obsługiwać klienta.
Metoda dodająca klienta do kolejki
Dodawanie klienta do kolejki
Zwiększanie odpowiednich zmiennych
Ustawianie Czasu Wejścia w obiekcie Klient.
Pobieranie Klienta z kolejki
Jeżeli kolejka nie pusta to
Usuwa obiekt i zwraca do niego referencje.
Jeżeli kolejka pusta to zwraca NILOBJ
Ustawienie wartości początkowych parametrów
Podobnie jak w wyżej opisanej kolejce.
Kolejka z priotytetami
Metoda porównująca priorytety dwóch klientów.
Metoda informująca czy kolejka jest pełna czy nie.
Dodanie Klienta do kolejki. Jeżeli w kolejce jest miejsce to zmniejsza Ilość wolnych miejsc, zwiększa liczbę zgłoszeń ustawia czas Wejscia dla Klienta i zwraca TRUE . Jeżeli w kolejce nie ma miejsca do zwraca FALSE
Metoda pobierająca klienta z kolejki.
Generator dla SMO 1
Generowanie ilości klientów jaka może na raz wejście do SMO
Generowanie czasu pomiędzy kolejnymi wejściami klientów.
Generator dla SMO2
Metoda generująca klientów
Generowanie ilości klientów jaka może na raz wejść do kolejki.
Wygenerowanie nowego klienta
Dodanie klienta
Powiadomienie Gniazd z SMO2 o możliwości obsługi.
Generowanie czasu między kolejnymi wejściami klientów zgodnie z rozkładem Wykładniczym
Gniazdo dla SMO3
Metoda obsługi klienta w SMO 3
Wygenerowanie Prawdopodobieństwa
Generowanie czasu obsługi klienta według rozkładu Normalnego
Powiadomienie o możliwości obsługi
Gniazdo Obslugi w SMO 1
Metoda obsługująca klientów w SMO1
Generowanie prawdopodobieństwa zgodnie z którym obsłużony klient przejdzie albo do SMO 1 albo do SMO3
Generowanie czasu obsługi klienta w gnieździe, zgodnie z rozkładem Wykładniczym
Powiadomienie gniazd w SMO 3 o możliwości obsługi.
Gniazdo obsługi w SMO 2
Metoda obslugująca Klientów w SMO2
Generowanie czasu obsługi Klienta w danym gnieździe z SMO2
Obsluga Klienta.
Powiadomienie gniazd obsługi w SMO 3 o możliwości obsługi.
Wszelkie parametry i zmienne potrzebne przy wykonywaniu się programu.
parametry do generatora 1
parametr do generatora 2
Liczba miejsc w kolejce 2
Parametr do kolejki - gniazda w SMO1
Parametr do kolejki - gniazda w SMO2
Parametr do kolejki - gniazda w SMO3
Inicjalizacja obiektów.
Ustawianie początkowych wartości parametrów każdego obiektu.
Rozpoczęcie generacji klientów.
Rozpoczęcie symulacji.
SMO
SMO
SMO
p1
p2
T1
T2
O1
O2
O3