lab, I6E1S1 Sebastian Matyjek


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

0x01 graphic

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:

0x08 graphic

Przy realizacji zadania należy przyjąć następujące dane z listy przedstawionej poniżej:

  1. rozkład zmiennych Tj: (nrDz + i) mod 6 + 1;

  2. rozkład zmiennych Oi: (nrDz + i + 1) mod 6 + 1;

  3. Li: (nrDz + i) mod 2 + 1;

  4. ALi: (nrDz + i + 2) mod 3 + 1;

  5. Rj = (nrDz + i + 5) mod 3 + 1;

  6. Mi = (nrDz + i + 2) mod 4 + 1;

  7. Blokowanie zgłoszeń 1. SMO;

  8. 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:

- T1 - Weibulla

- T2 - Wykładniczy

- O1 - Wykładniczy

- O2 - Erlanga

- O3 - Normalny

- L1 - nieograniczona

- L2 - ograniczona

- L3 - nieograniczona

- Al1 - LIFO

- Al2 - priorytetowy

- Al3 -FIFO

- R1 - 2

- R2 - 3

- M1 - 1

- M2 - 2

- M3 - 3

P1=0.6

P2=0.5

Program powinien umożliwić oszacowanie następujących charakterystyk granicznych systemu oraz poszczególnych SMO:

W sprawozdaniu należy zawrzeć:

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:

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:

Parametr λ można zinterpretować jako czas po którym zginie

1-1/e≈63,2% osobników.

0x01 graphic

0x01 graphic

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.

0x01 graphic

0x01 graphic

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: 0x01 graphic

Dystrybuanta: 0x01 graphic

Gęstość Prawdopodobieństwa : 0x01 graphic

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: 0x01 graphic

Dystrybuanta: 0x01 graphic

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



Wyszukiwarka

Podobne podstrony:
Sprawko Sebastiana i Stacha, Informatyka WEEIA 2010-2015, Semestr IV, Metody numeryczne, Lab 1 spraw
spis lab I sem 2010
III WWL DIAGN LAB CHORÓB NEREK i DRÓG MOCZ
Diagnostyka lab wod elektrolit
ZW LAB USTAWY, OCHRONA
LAB PROCEDURY I FUNKCJE
sprzet lab profilografy
sprzet lab mikromanometry
Mechanika Plynow Lab, Sitka Pro Nieznany
Lab 02 2011 2012
PO lab 5 id 364195 Nieznany
lab pkm 4
MSIB Instrukcja do Cw Lab krystalizacja
lab [5] id 258102 Nieznany
lab 8 9 1
lab 3 2 9
IE RS lab 11 solutions

więcej podobnych podstron