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
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
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
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
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
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
{+++++ 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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