PSy Piesiak Piotr I7G2S1 spr

background image

WOJSKOWA AKADEMIA TECHNICZNA

Wydział Cybernetyki

Podstawy Symulacji

Sprawozdanie z projektu

Temat: „ Program symulujący działanie sieci SMO”

Prowadzący:

dr inż. Jarosław Rulka

Wykonał:

Piotr Piesiak

Grupa:

I7G2S1

background image

Data wykonania ćwiczenia: 20.01.2010

1. Treść zadania:

Napisać program symulujący działanie sieci SMO jak na rysunku:

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

poniżej:

a) rozkład zmiennych T

j

: (nrDz + i) mod 6 + 1;

b) rozkład zmiennych O

i

: (nrDz + i + 1) mod 6 + 1;

c) L

i

: (nrDz + i) mod 2 + 1;

d) AL

i

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

e) R

j

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

f) M

i

= (nrDz + i + 2) mod 4 + 1;

g) Blokowanie zgłoszeń 1. SMO;

h) Klienci niecierpliwi w SMO

i

: N

i

= (nrDz + i) mod 4 (ograniczony czas

oczekiwania na rozpoczęcie obsługi);

gdzie:

i – numer SMO;

j – numer strumienia;

T

j

– zmienna losowa oznaczająca czas pomiędzy kolejnymi napływami zgłoszeń

do systemu;

O

i

– zmienna losowa oznaczająca czas obsługi pojedynczego zgłoszenia w

gnieździe;

N

i

– zmienna losowa oznaczająca czas niecierpliwości zgłoszenia (gdy i = 0 =>

zgłoszenia cierpliwe);

R

j

– zmienna losowa oznaczająca wielkość paczki zgłoszeń (wchodzących w tej

samej chwili) j-tego strumienia;

p

k

– prawdopodobieństwa przemieszczenia się zgłoszenia po danym łuku;

L

i

– długość kolejki i-tego SMO;

AL.

i

– algorytmy kolejek (w przypadku istnienia kolejki z priorytetami należy

przyjąć, że zgłoszenia posiadają priorytety);

SMO

SMO

O

2

O

3

SMO

O

1

T

1

p

1

1-p

1

p

2

p

3

2

background image

1. Rozkłady zmiennych losowych:

1. Wykładniczy

2. Erlanga

3. Normalny

4. Jednostajny

5. Trójkątny

6. Weibulla

2. Długości kolejek pojedynczych SMO

2.1.ograniczone (możliwe straty)

2.2.nieograniczone

3. Algorytm kolejek:

3.1.FIFO

3.2.LIFO

3.3.Z priorytetami

4. Liczba stanowisk obsługi w gniazdach (1-M)

5. Ilość zgłoszeń jednocześnie napływających do systemu (1-R)

Pozostałe dane należy określać na początku symulacji.

Mój nr na liście to 7

Dane przyjęte do zadania:

T

1

– rozkład Normalny

O

1

- rozkład Jednostajny (3 kanały)

O

2

- rozkład Weibulla (4 kanały)

O

3

- rozkład Wykładniczy (1 kanał)

AL.

1

- LIFO, ograniczona (możliwe straty)

AL.

2

- Priorytetowana, nieograniczona

AL.

3

- FIFO, ograniczona (możliwe straty)

2. Sposób rozwiązania zadania.

Generator generuje klientów w odstępie czasu określonym

rozkładem normalnym do kolejki LIFO (ograniczonej). Dla każdego
klienta zostaje przypisany priorytet, ID i czas wejścia klienta do
systemu. Z pierwszej kolejki klient wchodzi do pierwszego gniazda
obsługi, które obsługuje klientów z rozkładem jednostajnym i posiada 3
kanały obsługi. Jest on w tym gnieździe obsługiwany, a potem wychodzi
z niego i ma do wyboru 2 drogi: wejść do kolejki priorytetowanej lub
w e j ś ć d o k o l e j k i F I F O ( o g r a n i c z o n e j ) . P o w y b o r z e k o l e j k i
priorytetowanej, klient zostaje obsłużony w gnieździe obsługi nr 2 o
rozkładzie Weibulla i 4 kanałach obsługi. Klient zostaje obsłużony i
znowu ma do wyboru 2 drogi: wrócić do kolejki priorytetowanej albo

3

background image

wyjść z systemu. Po wyborze kolejki FIFO, klient zostaje obsłużony w
gnieździe obsługi nr 3 o rozkładzie wykładniczym i 1 kanale obsługi.
Klient zostaje obsłużony i znowu ma do wyboru 2 drogi: wrócić do
kolejki LIFO albo wyjść z systemu.

System przeprowadza symulacje dla określonych przez

u ż y t k o w n i k a d a n y c h t a k i c h j a k : p a r a m e t r y r o z k ł a d ó w ,
prawdopodobieństwa przejścia do odpowiednich kolejek, długość kolejki
i liczba klientów.

Wszystkie charakterystyki graniczne wyznaczane są za pomocą

zmiennych monitorowanych odpowiedniego typu np.:

MonCzasSMO1:=GETMONITOR(ASK Gniazdo1 TO CzasWSMO,RStatObj);

MonLiczbaZgloszenSys:=GETMONITOR(ASK System TO LiczbaZgloszen,ITimedStatObj);

Średni czas przebywania klientów w systemie obliczamy za

pomocą zmiennych które monitorują dla każdego klienta czas wejścia i
czas wyjścia z systemu.

Liczba zgłoszeń oznacza liczbę klientów aktualnie znajdujących się

w systemie. Liczba zgłoszeń modyfikowana jest przy wejściu klienta do
systemu jak również przy wyjściu klienta z systemu. Klienci mogą być
niecierpliwi i również wyjść z systemu.

Liczba zgłoszeń w kolejce jest zwiększana gdy klient wchodzi do

kolejki, a zmniejszana gdy klient wychodzi z kolejki. Jest ona
monitorowana oddzielnie dla danej kolejki.

Prawdopodobieństwo obsłużenia zgłoszenia jest stosunkiem liczby

obsłużonych klientów do wszystkich klientów wchodzących do SMO.

Do gromadzenia charakterystyk z symulacji wykorzystane zostały

monitory. Umożliwia to wykorzystanie metod: Mean i StdDev do
estymacji odpowiedniej wartości średniej i odchylenia standardowego.
W momencie wejścia klienta do SMO wywoływana jest metoda

4

background image

CzasWejscia(IN WKlient : KlientObj); która przypisuje na zmienną
czasową aktualny czas (za pomocą SimTime).

4. Kod realizujący zadanie:

MAIN MODULE piotrek;

FROM IOMod IMPORT ReadKey, StreamObj, ALL FileUseType; {Output, Input, InOut, Append}
FROM RandMod IMPORT RandomObj, FetchSeed;
FROM SimMod IMPORT StartSimulation, StopSimulation, SimTime, TriggerObj, Interrupt;
FROM StatMod IMPORT SINTEGER, RStatObj, SREAL, TSINTEGER, ITimedStatObj;
FROM GrpMod IMPORT StatQueueObj, StatStackObj, StatRankedObj, BStatGroupObj;

{+++++ Definicje typow (obiektow) +++++}

TYPE
SystemObj = OBJECT; FORWARD;
KlientObj = OBJECT; FORWARD;
GeneratorObj = OBJECT; FORWARD;
KolejkaObj = OBJECT; FORWARD;
GniazdoObj = OBJECT; FORWARD;

{+++++ Deklaracje typow (obiektow) +++++}

{+++++ Deklaracja obiektu systemu +++++++++++++++++++++++++++++++++++++++++++++++++++++++}
SystemObj = OBJECT

CzasPrzebywaniaZgloszenia : SREAL;

LiczbaZgloszen : TSINTEGER;

LiczbaObsluzonych : INTEGER;

LiczbaWygenerowanych : INTEGER;

KomunikatyWlaczone : BOOLEAN;

ASK METHOD Init(IN Komunikaty : BOOLEAN);

ASK METHOD Zwieksz();

ASK METHOD CzasWejscia(IN WKli:KlientObj);

ASK METHOD Wyjscie(IN WKli:KlientObj;IN Obsluzony:BOOLEAN);

END OBJECT;

{+++++ Deklaracja obiektu klienta +++++++++++++++++++++++++++++++++++++++++++++++++++++++}
KlientObj = OBJECT

CzasWejsciaSys : REAL; {czas wejscia klienta do systemu}

CzasWejsciaKol : REAL;

{czas wejscia do kolejki - ustawiany przy kazdym kolejnym wejsciu do kolejki}

IDKlienta : INTEGER;

{Numer ID identyfikujacy klienta}

5

background image

Priorytet : INTEGER;

{priotytet klienta w kolejce priorytetowej}

KomunikatyWlaczone : BOOLEAN;

ASK METHOD Init(IN WPrior:INTEGER;IN WIDKlienta:INTEGER; IN Komunikaty : BOOLEAN); { i n i c j a l i z a c j a

klienta}

ASK METHOD CzasWejscia(IN WSys:INTEGER; IN WKol:INTEGER); {ustawia czas wejscia klienta do systemu

lub kolejki}

TELL METHOD Niecierpliwosc(IN WSys: SystemObj; IN WKol:KolejkaObj;IN WCzasCierpliwosci:REAL);

END OBJECT;

{+++++ Deklaracja obiektu generatora ++++++++++++++++++++++++++++++++++++++++++++++++++}
GeneratorObj=OBJECT(RandomObj)

System : SystemObj;

NrRozkladu : INTEGER;

GParametr1 : REAL;

{parametry rozkladu z jakim generator ma generowaÊ klientÛw}

GParametr2 : REAL;

GParametr3 : REAL;

Kolejka : KolejkaObj;

{kolejka, do ktÛrej udajπ siÍ wygenerowani klienci}

LiczbaWygen, MaxLiczbaWygen : INTEGER;

Paczka : INTEGER;

{wielkosc paczki zgloszen naplywajacych do systemu}

KomunikatyWlaczone : BOOLEAN;

TriggerGeneratora : TriggerObj;

ASK METHOD Init(IN WSys:SystemObj; IN WNrRoz:INTEGER; IN WGParametr1:REAL; IN WGParametr2:REAL;

IN WGParameter3:REAL; IN WKol:KolejkaObj; IN WMaxWyg:INTEGER; IN

WPaczka:INTEGER;

IN Komunikaty : BOOLEAN; IN WtriggerGen : TriggerObj);

TELL METHOD Generuj();

END OBJECT;

{+++++ Deklaracja obiektu kolejki +++++++++++++++++++++++++++++++++++++++++++++++++++++++}
KolejkaObj = OBJECT

System : SystemObj;

Gniazdo : GniazdoObj;

Typ : INTEGER;

Dlugosc : INTEGER;

LiczbaKlientow : TSINTEGER;

Kolejka : BStatGroupObj;

{typ kolejkowy}

KomunikatyWlaczone : BOOLEAN;

TriggerGniazda, TriggerGeneratora : TriggerObj;

ASK METHOD Init(IN WSys:SystemObj; IN WGniazdo:GniazdoObj; IN WTyp:INTEGER; IN WDlugosc:INTEGER;

IN Komunikaty : BOOLEAN; IN WTrigger : TriggerObj; IN WtriggerGen : TriggerObj);

ASK METHOD Dodaj(IN WSys:SystemObj;IN WKl:KlientObj);

ASK METHOD Usun(IN WKl:KlientObj):KlientObj;

END OBJECT;

6

background image

{+++++ Deklaracja obiektu gniazdq ++++++++++++++++++++++++++++++++++++++++++++++++++++++}
GniazdoObj = OBJECT

RandomGen : RandomObj; {generator rozkladow dla gniazda}

System : SystemObj;

TypRozkladu : INTEGER;

Obslugiwany : KlientObj;

CzasWSMO : SREAL;

IloscStanowisk, IloscZajetych : TSINTEGER;

KolejkaWY, KolejkaWE : KolejkaObj;

Pstwo : REAL;

{prawdopodobienstwo powrotu do gniazda}

Parametr1, Parametr2, Parametr3 : REAL;

KomunikatyWlaczone : BOOLEAN;

TriggerGniazda : TriggerObj;

TriggerGeneratora : TriggerObj;

Pracuj : BOOLEAN;

ASK METHOD Init(IN WSeed:INTEGER;IN WSys:SystemObj; IN WTypRozkl:INTEGER; IN

WIloscStanowisk:INTEGER;

IN WKolejkaWY:KolejkaObj; IN WKolejkaWE:KolejkaObj; IN WParametr1:REAL; IN

WParametr2:REAL;

IN WParametr3:REAL; IN WPrawdopodPowr:REAL; IN Komunikaty : BOOLEAN; IN WTrigger :

TriggerObj;

IN WTrigger2 : TriggerObj);

TELL METHOD Obsluguj();

TELL METHOD Koniec();

END OBJECT;

{+++++ Deklaracja obiektu kolejki priorytetowej +++++++++++++++++++++++++++++++++++}
KolPriorObj = OBJECT(StatRankedObj)

OVERRIDE

ASK METHOD Rank(IN WKl1 : ANYOBJ; IN WKl2 : ANYOBJ) : INTEGER;

END OBJECT;

{+++++ Obiekt Kolejki ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
OBJECT KolejkaObj;

ASK METHOD Init(IN WSys:SystemObj;IN WGniazdo:GniazdoObj;IN WTyp:INTEGER; IN WDlugosc:INTEGER;

IN Komunikaty : BOOLEAN; IN WTrigger : TriggerObj; IN WTriggerGen : TriggerObj);

VAR

KolejkaLIFO : StatStackObj;

KolejkaPrior : KolPriorObj;

KolejkaFIFO : StatQueueObj;

BEGIN

System := WSys;

Gniazdo := WGniazdo;

Typ := WTyp;

7

background image

LiczbaKlientow := 0;

Dlugosc := WDlugosc;

KomunikatyWlaczone := Komunikaty;

TriggerGniazda := WTrigger;

TriggerGeneratora := WTriggerGen;

CASE WTyp

WHEN 1:

NEW(KolejkaPrior); Kolejka := KolejkaPrior;

WHEN 2:

NEW(KolejkaFIFO); Kolejka := KolejkaFIFO;

WHEN 3:

NEW(KolejkaLIFO); Kolejka := KolejkaLIFO;

END CASE;

END METHOD;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

ASK METHOD Dodaj(IN WSys:SystemObj;IN WKlient:KlientObj);

VAR

CzasCierpliwosci : REAL;

BEGIN

CASE ASK SELF TO Typ

WHEN 1:

CzasCierpliwosci := 3.0;

WHEN 2:

CzasCierpliwosci := 0.0;

WHEN 3:

CzasCierpliwosci := 1.0;

END CASE;

IF Dlugosc > 0

{dlugosc kolejki, 0- nieograniczona}

IF LiczbaKlientow < Dlugosc

ASK WKlient TO CzasWejscia(0,1);

ASK Kolejka TO Add(WKlient);

{wejscie klienta do kolejki}

TELL WKlient TO Niecierpliwosc (WSys,SELF, CzasCierpliwosci); {wlaczenie

niecierpliwosci klienta}

IF (KomunikatyWlaczone)

OUTPUT("Klient",ASK WKlient TO IDKlienta," wchodzi do Gniazda ",ASK

SELF TO Typ);

END IF;

INC(LiczbaKlientow);

{zwiekszenie liczby klientÛw w kolejce}

ASK TriggerGniazda TO Release;

ELSE

IF (KomunikatyWlaczone)

8

background image

OUTPUT("Klient",ASK WKlient TO IDKlienta," nie mogl wejsc do

przepelnionej kolejki Gniazda ",ASK SELF TO Typ);

END IF;

ASK System TO Wyjscie(WKlient,FALSE);

END IF;

ELSE

ASK WKlient TO CzasWejscia(0,1);

ASK Kolejka TO Add(WKlient);

IF (KomunikatyWlaczone)

OUTPUT("Klient",ASK WKlient TO IDKlienta," wchodzi do kolejki ");

END IF;

INC(LiczbaKlientow);

ASK TriggerGniazda TO Release;

END IF;

END METHOD;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
ASK METHOD Usun(IN WKlient:KlientObj):KlientObj; {usuwanie klienta z kolejki}
VAR

PomKlient : KlientObj;

BEGIN

IF LiczbaKlientow > 0

IF WKlient = NILOBJ

PomKlient:=ASK Kolejka TO Remove();

IF (KomunikatyWlaczone)

OUTPUT("Gniazdo",ASK SELF TO Typ," wychodzi Klient",ASK PomKlient

TO IDKlienta);

END IF;

ELSE

ASK Kolejka TO RemoveThis(WKlient);

PomKlient:=WKlient;

END IF;

DEC(LiczbaKlientow);

IF (TriggerGeneratora <> NILOBJ)

ASK TriggerGeneratora TO Release();

END IF;

RETURN PomKlient;

ELSE

RETURN NILOBJ;

END IF;

END METHOD;

9

background image

END OBJECT;

{+++++ Obiekt Klienta ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
OBJECT KlientObj;

ASK METHOD Init(IN WPrior:INTEGER; IN WIDKlienta:INTEGER; IN Komunikaty : BOOLEAN);
BEGIN

CzasWejsciaSys := 0.0;

CzasWejsciaKol := 0.0;

Priorytet := WPrior;

IDKlienta := WIDKlienta;

KomunikatyWlaczone := Komunikaty;

IF (KomunikatyWlaczone)

OUTPUT("Generator wygenerowal Klienta",ASK SELF TO IDKlienta);

END IF;

END METHOD;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

ASK METHOD CzasWejscia(IN WSys:INTEGER;IN WKol:INTEGER); {ustawienie czasu wejúcia do systemu lub

kolejki}

BEGIN

IF WSys = 1

CzasWejsciaSys := SimTime;

END IF;

IF WKol = 1

CzasWejsciaKol := SimTime;

END IF;

END METHOD;

TELL METHOD Niecierpliwosc(IN WSys: SystemObj; IN WKol:KolejkaObj; IN WCzasCierpliwosci:REAL);

VAR

pom:KlientObj;

BEGIN

IF WCzasCierpliwosci > 0.0;

WAIT DURATION WCzasCierpliwosci;

pom := ASK WKol TO Usun(SELF);

IF (KomunikatyWlaczone)

OUTPUT("Klient",ASK SELF TO IDKlienta," stracil cierpliwosc.");

END IF;

ASK WSys TO Wyjscie(SELF, FALSE);

ON INTERRUPT;

END WAIT;

END IF;

10

background image

END METHOD;

END OBJECT;

{+++++ Obiekt Generatora Klientow +++++++++++++++++++++++++++++++++++++++++++++++++++++++}
OBJECT GeneratorObj;

ASK METHOD Init(IN WSys : SystemObj; IN WNrRoz:INTEGER; IN WG1:REAL; IN WG2:REAL; IN WG3:REAL;

IN WKol:KolejkaObj; IN WMaxWyg:INTEGER; IN WPaczka:INTEGER; IN Komunikaty :

BOOLEAN;

IN WTriggerGen : TriggerObj);

BEGIN

GParametr1 := WG1;

GParametr2 := WG2;

GParametr3 := WG3;

Kolejka := WKol;

LiczbaWygen := 1;

NrRozkladu := WNrRoz;

MaxLiczbaWygen := WMaxWyg;

Paczka:= WPaczka;

System := WSys;

KomunikatyWlaczone := Komunikaty;

TriggerGeneratora := WTriggerGen;

END METHOD;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

TELL METHOD Generuj();

VAR

Czas : REAL;

Prior, PaczkaZgloszen, i : INTEGER;

Klient : KlientObj;

BEGIN

WHILE LiczbaWygen < MaxLiczbaWygen

Prior := ASK SELF TO UniformInt(1,10);

{losowanie priorytetu klienta}

PaczkaZgloszen:= ASK SELF TO UniformInt (1,Paczka);

Czas := ASK SELF TO Normal(GParametr1, GParametr2);

IF Czas<0.0

Czas:=ABS(Czas);

END IF;

WAIT DURATION Czas

END WAIT;

FOR i:=1 TO Paczka

NEW(Klient);

11

background image

IF (KomunikatyWlaczone)

OUTPUT ("Generator generuje Klienta ");

END IF;

ASK System TO Zwieksz();

ASK Klient TO Init(Prior, ASK System TO LiczbaWygenerowanych,

KomunikatyWlaczone);

ASK System TO CzasWejscia(Klient);

ASK Kolejka TO Dodaj(System, Klient);

INC(LiczbaWygen);

END FOR;

END WHILE;

END METHOD;

END OBJECT;

{+++++ Obiekt Modelowanego Systemu +++++++++++++++++++++++++++++++++++++++++++++++++++++++}
OBJECT SystemObj;

ASK METHOD Init(IN Komunikaty : BOOLEAN);

BEGIN

CzasPrzebywaniaZgloszenia := 0.0;

LiczbaZgloszen := 0;

LiczbaObsluzonych := 0;

LiczbaWygenerowanych := 0;

KomunikatyWlaczone := Komunikaty;

END METHOD;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

ASK METHOD CzasWejscia(IN WKlient : KlientObj);

BEGIN

ASK WKlient TO CzasWejscia(1,0); {ustawienie czasu wejscia klienta do systemu na SimTime}

INC(LiczbaZgloszen);

END METHOD;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

ASK METHOD Wyjscie(IN WKlient:KlientObj; IN Obsluzony:BOOLEAN);

BEGIN

CzasPrzebywaniaZgloszenia := (SimTime - (ASK WKlient TO CzasWejsciaSys));

IF Obsluzony

INC(LiczbaObsluzonych);

IF (KomunikatyWlaczone)

OUTPUT("Klient", ASK WKlient TO IDKlienta," opuscil system");

OUTPUT("Liczba obsluzonych: ",ASK SELF TO LiczbaObsluzonych);

END IF;

12

background image

ELSE

IF (KomunikatyWlaczone)

OUTPUT("Klient", ASK WKlient TO IDKlienta," nie opuscil systemu");

END IF;

END IF;

DEC(LiczbaZgloszen);

END METHOD;

ASK METHOD Zwieksz();

BEGIN

INC(LiczbaWygenerowanych);

END METHOD;

END OBJECT;

{+++++ Obiekt Gniazda ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
OBJECT GniazdoObj;

ASK METHOD Init(IN WSeed : INTEGER; IN WSystem : SystemObj;

IN WTypRozkl : INTEGER; IN WIloscStanowisk : INTEGER;

IN WKolejkaWY : KolejkaObj; IN WKolejkaWE : KolejkaObj;

IN WParametr1 : REAL; IN WParametr2 : REAL; IN WParametr3 : REAL;

IN WPrawdopodPowr : REAL; IN Komunikaty : BOOLEAN; IN WTrigger : TriggerObj;

IN WTrigger2 : TriggerObj);

VAR

Tmp : INTEGER;

BEGIN

System := WSystem;

TypRozkladu := WTypRozkl;

IloscStanowisk := WIloscStanowisk;

KolejkaWY := WKolejkaWY;

KolejkaWE := WKolejkaWE;

Pstwo := WPrawdopodPowr;

Parametr1 := WParametr1;

Parametr2 := WParametr2;

Parametr3 := WParametr3;

IloscZajetych := 0;

CzasWSMO := 0.0;

NEW(RandomGen);

ASK RandomGen TO SetSeed(WSeed);

KomunikatyWlaczone := Komunikaty;

TriggerGniazda := WTrigger;

TriggerGeneratora := WTrigger2;

13

background image

FOR Tmp:=0 TO IloscStanowisk-1

TELL SELF TO Obsluguj();

END FOR;

END METHOD;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

TELL METHOD Obsluguj();

VAR

Czas : REAL;

BEGIN

Pracuj := TRUE;

WHILE (Pracuj)

WAIT FOR TriggerGniazda TO Fire;

ON INTERRUPT

END WAIT;

WHILE (((ASK KolejkaWE TO LiczbaKlientow) > 0) AND (IloscStanowisk > IloscZajetych))

INC(IloscZajetych);

CASE TypRozkladu

WHEN 4:

Czas := ASK RandomGen TO UniformReal(Parametr1, Parametr2);

WHEN 5:

Czas := ASK RandomGen TO Triangular(Parametr1, Parametr2, Parametr3);

WHEN 6:

Czas := ASK RandomGen TO Weibull(Parametr1,Parametr2);

END CASE;

Obslugiwany := ASK KolejkaWE TO Usun(NILOBJ);

Interrupt(Obslugiwany, "Niecierpliwosc");

WAIT DURATION ABS(Czas);

END WAIT;

CzasWSMO := SimTime - (ASK Obslugiwany TO CzasWejsciaKol);

IF ASK SELF TO TypRozkladu=5;

IF ASK RandomGen TO Sample() > Pstwo;

IF (KomunikatyWlaczone)

OUTPUT("Gniazdo ",ASK SELF TO TypRozkladu-3," opuszcza Klient",

ASK Obslugiwany TO IDKlienta);

END IF;

ASK System TO Wyjscie(Obslugiwany, TRUE);

DEC(IloscZajetych);

ELSE

IF (KomunikatyWlaczone)

14

background image

OUTPUT("Klient", ASK Obslugiwany TO IDKlienta," wraca do Gniazda",

ASK SELF TO TypRozkladu-3,".");

END IF;

ASK KolejkaWE TO Dodaj(System, Obslugiwany);

END IF;

END IF;

IF ASK SELF TO TypRozkladu=6;

IF ASK RandomGen TO Sample() > Pstwo;

IF (KomunikatyWlaczone)

OUTPUT("Gniazdo ",ASK SELF TO TypRozkladu-3," opuszcza Klient",

ASK Obslugiwany TO IDKlienta);

END IF;

ASK System TO Wyjscie(Obslugiwany, TRUE);

DEC(IloscZajetych);

ELSE

IF (KomunikatyWlaczone)

OUTPUT("Klient", ASK Obslugiwany TO IDKlienta," wraca do Gniazda",

ASK SELF TO TypRozkladu-3,".");

END IF;

ASK KolejkaWE TO Dodaj(System, Obslugiwany);

END IF;

END IF;

IF ASK SELF TO TypRozkladu=4;

IF ASK RandomGen TO Sample() > Pstwo;

IF (KomunikatyWlaczone)

OUTPUT("Gniazdo 1 opuszcza Klient",ASK Obslugiwany TO

IDKlienta);

END IF;

IF (TriggerGeneratora <> NILOBJ)

IF (ASK KolejkaWY TO LiczbaKlientow = ASK KolejkaWY TO

Dlugosc)

IF (KomunikatyWlaczone)

OUTPUT ("Gniazdo zablokowane.");

END IF;

WAIT FOR TriggerGeneratora TO Fire();

END WAIT;

END IF;

END IF;

ASK KolejkaWY TO Dodaj(System, Obslugiwany);

{DEC(IloscZajetych);}

ELSE

IF (KomunikatyWlaczone)

15

background image

OUTPUT("Klient", ASK Obslugiwany TO IDKlienta," idzie do Gniazda",

ASK SELF TO TypRozkladu-3,".");

END IF;

ASK KolejkaWE TO Dodaj(System, Obslugiwany);

END IF;

END IF;

END WHILE;

END WHILE;

END METHOD;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

TELL METHOD Koniec();

VAR

Tmp : INTEGER;

BEGIN

Pracuj := FALSE;

WAIT DURATION 0.0

ASK TriggerGniazda TO InterruptTrigger;

END WAIT;

END METHOD;

END OBJECT;

{+++++ Obiekt Kolejki ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
OBJECT KolPriorObj;

ASK METHOD Rank(IN a,b : ANYOBJ) : INTEGER; {Porownywanie priorytetow dwoch klientow}

VAR

Klient1 : KlientObj;

Klient2 : KlientObj;

BEGIN

Klient1 := a;

Klient2 := b;

IF ASK Klient1 TO Priorytet < ASK Klient2 TO Priorytet

RETURN -1;

END IF;

IF ASK Klient1 TO Priorytet > ASK Klient2 TO Priorytet

RETURN 1;

END IF;

RETURN 0;

END METHOD;

16

background image

END OBJECT;

{+++++ Czesc glowna symulatora +++++}

VAR

System : SystemObj;

Generator1 : GeneratorObj;

Gniazdo1, Gniazdo2, Gniazdo3 : GniazdoObj;

KolejkaLIFO, KolejkaPrior, KolejkaFIFO : KolejkaObj;

{+++++ Deklaracje zmiennych ++++++++++}

P1, P2, P3, Gen1Lo, Gen1Hi, Gniazdo1Min,

Gniazdo1Mean, Gniazdo1Max, Gniazdo2Shape, Gniazdo2Scale,

Gniazdo3Mean,Gniazdo3Mean2, PrawdopodObsluzenia : REAL;


DlugoscKol2, MaxWygen, Gen1Seed : INTEGER;

Klient : KlientObj;

MonCzas, MonCzasSMO1, MonCzasSMO2, MonCzasSMO3 : RStatObj;


MonLiczbaZgloszenSys, MonLiczbaZajetychGn1, MonLiczbaZajetychGn2,

MonLiczbaZajetychGn3, MonZgloszenWKolejce1, MonZgloszenWKolejce2,

MonZgloszenWKolejce3 : ITimedStatObj;

TriggerG1, TriggerG2, TriggerG3, TriggerBlokujacy : TriggerObj;

Key : CHAR;

Plik : StreamObj;

Tekst : STRING;

Komunikaty : BOOLEAN;

BEGIN

{+++++ Pobranie parametrow symulacji ++++++++++++++++++++++++++++++++++++++++++++++++++}

OUTPUT("Czy pokazywac komunikaty? [T/N]: ");

Key := ReadKey();

OUTPUT("");

17

background image


Komunikaty := TRUE;

IF ((Key = 'n') OR (Key = 'N'))

Komunikaty := FALSE;

END IF;

IF ((Key = 't') OR (Key = 'T'))

Komunikaty := TRUE;

END IF;

NEW(Plik);

ASK Plik TO Open("dane.txt",Input);

{Parametry generatora pierwszego T1}

ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(Gen1Lo); ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(Gen1Hi); ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadInt(Gen1Seed); ASK Plik TO ReadLine(Tekst);

{Parametry gniazda pierwszego O1}

ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(Gniazdo3Mean); ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(Gniazdo3Mean2); ASK Plik TO ReadLine(Tekst);

{Parametry gniazda pierwszego O2}

ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(Gniazdo1Min); ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(Gniazdo1Mean); ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(Gniazdo1Max); ASK Plik TO ReadLine(Tekst);

{Parametry gniazda pierwszego O3}

ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(Gniazdo2Shape); ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(Gniazdo2Scale); ASK Plik TO ReadLine(Tekst);

{Dlugosc kolejki Priorytetowej}

ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadInt(DlugoscKol2); ASK Plik TO ReadLine(Tekst);

{Ilosc klientow, ktora ma wygenerowac kazdy z generatorow}

ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadInt(MaxWygen); ASK Plik TO ReadLine(Tekst);

{Prawdopodobienstwo powrotu klienta do gniazda O1}

18

background image

ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(P1); ASK Plik TO ReadLine(Tekst);

{Prawdopodobienstwo powrotu klienta do gniazda O2}

ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(P2); ASK Plik TO ReadLine(Tekst);

{Prawdopodobienstwo powrotu klienta do gniazda O3}

ASK Plik TO ReadLine(Tekst);

ASK Plik TO ReadReal(P3); ASK Plik TO ReadLine(Tekst);

ASK Plik TO Close();

DISPOSE(Plik);

OUTPUT(" ");

OUTPUT("SYMULACJA:");

OUTPUT(" ");

{+++++ Tworzenie obiektow +++++++++++++++}


NEW(System);

NEW(Gniazdo1);

NEW(Gniazdo2);

NEW(Gniazdo3);


NEW(KolejkaLIFO);

NEW(KolejkaPrior);

NEW(KolejkaFIFO);


NEW(Generator1);

NEW(TriggerG1);

NEW(TriggerG2);

NEW(TriggerG3);

NEW(TriggerBlokujacy);

{+++++ Inicjalizacja obiektow ++++++++++}

ASK System TO Init(Komunikaty);

19

background image

ASK KolejkaLIFO TO Init (System, Gniazdo1, 3, DlugoscKol2, Komunikaty, TriggerG1, TriggerBlokujacy);

ASK KolejkaPrior TO Init (System, Gniazdo2, 1, 0, Komunikaty, TriggerG2, NILOBJ);

ASK KolejkaFIFO TO Init (System, Gniazdo3, 2, DlugoscKol2, Komunikaty, TriggerG3, NILOBJ);

ASK Generator1 TO SetSeed(Gen1Seed);

ASK Generator1 TO Init(System, 3, Gen1Lo, Gen1Hi, 0.0, KolejkaPrior, MaxWygen, 3, Komunikaty, NILOBJ);

ASK Gniazdo1 TO Init(1, System, 4, 3, KolejkaPrior, KolejkaFIFO,Gniazdo3Mean,Gniazdo3Mean2,0.0, P1,

Komunikaty, TriggerG1, TriggerBlokujacy);

ASK Gniazdo2 TO Init(1, System, 5, 4, NILOBJ, KolejkaPrior, Gniazdo1Min, Gniazdo1Mean, Gniazdo1Max, P2,

Komunikaty, TriggerG2, NILOBJ);

ASK Gniazdo3 TO Init(1, System, 6, 1, NILOBJ, KolejkaLIFO, Gniazdo2Shape, Gniazdo2Scale, 0.0, P3,

Komunikaty, TriggerG3, NILOBJ);

{+++++ Symulacja +++++++++++++++++++++++++}

TELL Generator1 TO Generuj();

StartSimulation();

TELL Gniazdo1 TO Koniec();

TELL Gniazdo2 TO Koniec();

TELL Gniazdo3 TO Koniec();

StartSimulation;

{+++++ Pobieranie monitorow zmiennych ++++++++++++++++++++++++++++++++++++++++++++++++++}

MonCzas := GETMONITOR(ASK System TO CzasPrzebywaniaZgloszenia,RStatObj);

MonCzasSMO1 := GETMONITOR(ASK Gniazdo1 TO CzasWSMO,RStatObj);

MonCzasSMO2 := GETMONITOR(ASK Gniazdo2 TO CzasWSMO,RStatObj);

MonCzasSMO3 := GETMONITOR(ASK Gniazdo3 TO CzasWSMO,RStatObj);

MonLiczbaZgloszenSys := GETMONITOR(ASK System TO LiczbaZgloszen,ITimedStatObj);

MonLiczbaZajetychGn1 := GETMONITOR(ASK Gniazdo1 TO IloscZajetych,ITimedStatObj);

MonLiczbaZajetychGn2 := GETMONITOR(ASK Gniazdo2 TO IloscZajetych,ITimedStatObj);

MonLiczbaZajetychGn3 := GETMONITOR(ASK Gniazdo3 TO IloscZajetych,ITimedStatObj);

MonZgloszenWKolejce1 := GETMONITOR(ASK KolejkaPrior TO LiczbaKlientow,ITimedStatObj);

MonZgloszenWKolejce2 := GETMONITOR(ASK KolejkaFIFO TO LiczbaKlientow,ITimedStatObj);

MonZgloszenWKolejce3 := GETMONITOR(ASK KolejkaLIFO TO LiczbaKlientow,ITimedStatObj);

20

background image

PrawdopodObsluzenia := FLOAT(ASK System TO LiczbaObsluzonych)/FLOAT(ASK System TO

LiczbaWygenerowanych);

{+++++ Zapis wynikow symulacji do pliku +++++++++++++++++++++++++++++++++++++++++++++}

NEW(Plik);

ASK Plik TO Open("wyniki.txt",Output);


ASK Plik TO WriteString("WYNIKI DZIALANIA SYMULACJI: ");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString("Czas przebywania zgloszenia w systemie:");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonCzas TO Mean) WITH " Wartosc srednia: ***.*** ");ASK Plik TO

WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonCzas TO StdDev) WITH " Odchylenie standardowe: ***.***");ASK Plik

TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString("Czas przebywania zgloszenia w SMO1:");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO1 TO Mean) WITH " Wartosc srednia: ***.***");ASK Plik TO

WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO1 TO StdDev) WITH " Odchylenie standardowe:

***.***");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString("Czas przebywania zgloszenia w SMO2:");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO2 TO Mean) WITH " Wartosc srednia: ***.*** ");ASK Plik TO

WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO2 TO StdDev) WITH " Odchylenie standardowe:

***.***");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString("Czas przebywania zgloszenia w SMO3:");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO3 TO Mean) WITH " Wartosc srednia: ***.***");ASK Plik TO

WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO3 TO StdDev) WITH " Odchylenie standardowe:

***.***");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString("Liczba klientow w systemie: ");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZgloszenSys TO Mean) WITH " Wartosc srednia: ****.***");ASK

Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZgloszenSys TO StdDev) WITH " Odchylenie standardowe:

***.***");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

21

background image

ASK Plik TO WriteString("Liczba kanalow zajetych w gniezdzie O1:");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZajetychGn1 TO Mean) WITH " Wartosc srednia: ***.*** ");ASK

Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZajetychGn1 TO StdDev) WITH " Odchylenie standardowe:

***.***");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString("Liczba kanalow zajetych w gniezdzie O2:");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZajetychGn2 TO Mean) WITH " Wartosc srednia: ***.***");ASK

Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZajetychGn2 TO StdDev) WITH " Odchylenie standardowe:

***.***");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString("Liczba kanalow zajetych w gniezdzie O3:");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZajetychGn3 TO Mean) WITH " Wartosc srednia: ***.***");ASK

Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZajetychGn3 TO StdDev) WITH " Odchylenie standardowe:

***.***");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString("Liczba klientow w SMO1 (Priorytetowa):");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonZgloszenWKolejce1 TO Mean) WITH " Wartosc srednia: ***.***");ASK

Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonZgloszenWKolejce1 TO StdDev) WITH " Odchylenie standardowe:

***.***");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString("Liczba klientow w SMO2 (FIFO):");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonZgloszenWKolejce2 TO Mean) WITH " Wartosc srednia: ***.***");ASK

Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonZgloszenWKolejce2 TO StdDev) WITH " Odchylenie standardowe:

***.***");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString("Liczba klientow w SMO3 (LIFO):");ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonZgloszenWKolejce3 TO Mean) WITH "Wartosc srednia: ***.***");ASK

Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(ASK MonZgloszenWKolejce3 TO StdDev) WITH " Odchylenie standardowe:

***.***");ASK Plik TO WriteLn();

ASK Plik TO WriteLn();

ASK Plik TO WriteString( SPRINT(PrawdopodObsluzenia) WITH "Prawdopodobienstwo obsluzenia klienta w

systemie: ***.***");

DISPOSE(Plik);

{+++++ Zwalnianie obiektow ++++++++++}

22

background image

DISPOSE(KolejkaLIFO);

DISPOSE(KolejkaPrior);

DISPOSE(KolejkaFIFO);

DISPOSE(Generator1);

DISPOSE(Gniazdo1);

DISPOSE(Gniazdo2);

DISPOSE(Gniazdo3);

DISPOSE(System);

DISPOSE(TriggerG1);

DISPOSE(TriggerG2);

DISPOSE(TriggerG3);

DISPOSE(TriggerBlokujacy);

OUTPUT("");

OUTPUT("Aby zakonczyc dzialanie programu wcisnij dowolny klawisz");

Key := ReadKey();


END MODULE.

23


Wyszukiwarka

Podobne podstrony:
I7G2S1 Zachwieja Cezary PSy projekt (1)
El¾bieta Okniäska I7G2S1 PSY
Michniewicz Kamil I7G2S1 PSy sprawozdanie
I7G2S1 PSy Socha Marcin
I7G2S1 Kolodziejski Lukasz psy
I7G2S1 Kamil Piersa PSY
Ukladanie dawki bytowej psy
Spr[1] adm i uznanie adm
08 03 KPGO Spr z realizacji
17 Rozp Min Zdr w spr szk czyn Nieznany
przetworka spr ostatnie
as spr 5 id 69978 Nieznany (2)
metr spr 5
belka spr podl
078c rozp zm rozp min gosp w spr szkolenia w dziedzinie bhp
99 SPOSOBÓW OKAZYWANIA DZIECIOM MIŁOŚCI, Różne Spr(1)(4)
Spr. 4-Techniki wytw, ZiIP, sem 1
klucz do age, Różne Spr(1)(4)
Wnioski do spr z elektry 3, PW SiMR, Inżynierskie, Semestr V, syf, laborki, Lab. Ukł. Napędowych

więcej podobnych podstron