Michniewicz Kamil I7G2S1 PSy sprawozdanie


Wojskowa Akademia Techniczna
im. Jarosława Dąbrowskiego w Warszawie
Podstawy Symulacji
Sprawozdanie
Prowadzący: dr inż. Jarosław Rulka
Wykonał: Kamil Michniewicz
Grupa: I7G2S1
Zadanie laboratoryjne 3
Napisać program symulujący działanie sieci SMO jak na rysunku:
T1
p2
O1
O2
SMO
SMO
T2
O3
SMO
p3
Przy realizacji zadania należy przyjąć następujące dane z listy przedstawionej poniżej:
a) rozkład zmiennych T : (nrDz + i) mod 6 + 1;
j
b) rozkład zmiennych O : (nrDz + i + 1) mod 6 + 1;
i
c) L : (nrDz + i) mod 2 + 1;
i
d) AL : (nrDz + i + 2) mod 3 + 1;
i
e) R = (nrDz + i + 5) mod 3 + 1;
j
f) M = (nrDz + i + 2) mod 4 + 1;
i
g) Blokowanie zgłoszeń 1. SMO;
h) Klienci niecierpliwi w SMO : N = (nrDz + i) mod 4 (ograniczony czas oczekiwania na rozpoczęcie obsługi);
i i
gdzie:
i  numer SMO;
j  numer strumienia;
T  zmienna losowa oznaczająca czas pomiędzy kolejnymi napływami zgłoszeń do systemu;
j
O  zmienna losowa oznaczająca czas obsługi pojedynczego zgłoszenia w gniezdzie;
i
N  zmienna losowa oznaczająca czas niecierpliwości zgłoszenia (gdy i = 0 => zgłoszenia cierpliwe);
i
R  zmienna losowa oznaczająca wielkość paczki zgłoszeń (wchodzących w tej samej chwili) j-tego strumienia;
j
p  prawdopodobieństwa przemieszczenia się zgłoszenia po danym łuku;
k
L  długość kolejki i-tego SMO;
i
AL.  algorytmy kolejek (w przypadku istnienia kolejki z priorytetami należy przyjąć, że zgłoszenia posiadają
i
priorytety);
1. Rozkłady zmiennych losowych:
1.1. Wykładniczy
1.2. Erlanga
1.3. Normalny
1.4. Jednostajny
1.5. Trójkątny
1.6. Weibulla
2. Długości kolejek pojedynczych SMO
2.1. ograniczone (możliwe straty)
2.2. nieograniczone
1.1.
3. Algorytm kolejek:
1.1. FIFO
1.2. LIFO
1.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.
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 zródłowy programu (z komentarzem);
- opis metody wyznaczania charakterystyk (sposób realizacji, wzory estymatorów);
Zadanie zrealizować w języku MODSIM II.
Termin rozliczenia się z realizacji zadania na ostatnich zajęciach laboratoryjnych.
Zgodnie z moim numerem w grupie (3) wyliczyłem parametry zadania:
Generator:
T  rozkład trójkątny
1
T  rozkład Weibulla
2
Gniazdo:
O - rozkład Weibulla
1
O - rozkład Wykładniczy
2
O - rozkład Erlanga
3
Wielkość paczki:
R - 1
1
R - 2
2
R -
3
3
Algorytmy kolejek:
AL 1 - z priorytetami
AL 2 - FIFO
AL 3  LIFO
Długość kolejek:
L1 - 1
L2 - 2
L3 - 1
Liczba stanowisk obsługi:
M1 - 3
M2 - 4
M3 - 1
Przykładowe wyświetlane kominikaty:
Wyswietlac komunikaty T / N
t
Dane pobrane z pliku wejsciowego
ROZPOCZECIE SYMULACJI
Generator 1 wygenerowal klienta 1
Klient numer 1 wszedl do kolejki gniazda 1
Klient numer 1 wchodzi do gniazda 1 0
Generator 2 wygenerowal klienta 2
Klient numer 2 wszedl do kolejki gniazda 3
Generator 2 wygenerowal klienta 3
Klient numer 3 wszedl do kolejki gniazda 3
Klient numer 3 wchodzi do gniazda 3 1
Klient numer 1 zostal obsluzony przez gniazdo 1
Klient numer 1 wchodzi do kolejki gniazda 2
Klient numer 1 wchodzi do gniazda 2 0
Generator 1 wygenerowal klienta 4
Klient numer 4 wszedl do kolejki gniazda 1
Klient numer 4 wchodzi do gniazda 1 0
Klient numer 2 zrezygnowal w kolejce 3
Klient numer 2 zostal nieobsluzony i opuszcza system
-Klient numer 3 zostal obsluzony przez gniazdo 3
Klient numer 3 zostal obsluzony i opuscil system
Liczba obsluzonych klientow : 1
-Klient numer 1 zostal obsluzony przez gniazdo 2
Klient numer 1 zostal obsluzony i opuscil system
Liczba obsluzonych klientow : 2
Generator 2 wygenerowal klienta 5
Klient numer 5 wszedl do kolejki gniazda 3
Generator 2 wygenerowal klienta 6
Klient numer 6 wszedl do kolejki gniazda 3
Klient numer 6 wchodzi do gniazda 3 1
Generator 1 wygenerowal klienta 7
Klient numer 7 wszedl do kolejki gniazda 1
Klient numer 7 wchodzi do gniazda 1 0
Klient numer 4 zostal obsluzony przez gniazdo 1
Klient numer 4 wchodzi do kolejki gniazda 2
Klient numer 4 wchodzi do gniazda 2 0
Klient numer 5 zrezygnowal w kolejce 3
Klient numer 5 zostal nieobsluzony i opuszcza system
Klient numer 7 zostal obsluzony przez gniazdo 1
Klient numer 7 wchodzi do kolejki gniazda 2
Klient numer 7 wchodzi do gniazda 2 0
-Klient numer 6 zostal obsluzony przez gniazdo 3
Klient numer 6 zostal obsluzony i opuscil system
Liczba obsluzonych klientow : 3
Generator 1 wygenerowal klienta 8
Klient numer 8 wszedl do kolejki gniazda 1
Klient numer 8 wchodzi do gniazda 1 0
-Klient numer 4 zostal obsluzony przez gniazdo 2
Klient numer 4 zostal obsluzony i opuscil system
Liczba obsluzonych klientow : 4
Klient numer 8 zostal obsluzony przez gniazdo 1
Klient numer 8 wchodzi do kolejki gniazda 2
Klient numer 8 wchodzi do gniazda 2 0
-Klient numer 8 zostal obsluzony przez gniazdo 2
Klient numer 8 zostal obsluzony i opuscil system
Liczba obsluzonych klientow : 5
-Klient numer 7 zostal obsluzony przez gniazdo 2
Klient numer 7 zostal obsluzony i opuscil system
Liczba obsluzonych klientow : 6
Plik wynikowy:
WYNIKI:
Czas przebywania zgloszenia w systemie:
srednia: 4.306
odchylenie: 2.965
Czas przebywania zgloszenia w SMO-1:
srednia: 2.981
odchylenie: 1.563
Czas przebywania zgloszenia w SMO-2:
srednia: 2.462
odchylenie: 2.133
Czas przebywania zgloszenia w SMO-3:
srednia: 2.513
odchylenie: 1.792
Liczba klientow w systemie:
srednia: 2.187
odchylenie: 1.349
Liczba kanalow zajetych w gniezdzie O1:
srednia: 0.841
odchylenie: 0.590
Liczba kanalow zajetych w gniezdzie O2:
srednia: 0.695
odchylenie: 0.772
Liczba kanalow zajetych w gniezdzie O3:
srednia: 0.426
odchylenie: 0.494
Liczba klientow w SMO1 (Priorytetowa):
srednia: 0.000
odchylenie: 0.000
Liczba klientow w SMO2 (FIFO):
srednia: 0.000
odchylenie: 0.000
Liczba klientow w SMO3 (LIFO):
srednia: 0.226
odchylenie: 0.418
Prawdopodobienstwo obsluzenia klienta w systemie: 0.750
Dane wejściowe:
Param gen1
1.2
3.0
5.6
3
Param gen2
3.5
7.8
5
Param gniazda1
7.5
3.8
Prama gniazda2
2.6
Param gniazda3
4.6
1.4
Dlugosc kolejki1
20
Dlugosc kolejki3
20
ilosc klientow
5
pstwo1
0.0
pstwo2
0.0
Kod programu:
MAIN MODULE KM;
FROM GrpMod IMPORT StatQueueObj, StatStackObj, StatRankedObj, BStatGroupObj;
FROM IOMod IMPORT ReadKey, StreamObj, ALL FileUseType; {Output, Input, InOut, Append}
FROM RandMod IMPORT RandomObj, FetchSeed;
FROM StatMod IMPORT SINTEGER, RStatObj, SREAL, TSINTEGER, ITimedStatObj;
FROM SimMod IMPORT StartSimulation, StopSimulation, SimTime, TriggerObj, Interrupt;
TYPE
SystemObj = OBJECT; FORWARD;
KlientObj = OBJECT; FORWARD;
KolejkaObj = OBJECT; FORWARD;
GniazdoObj = OBJECT; FORWARD;
GeneratorObj = OBJECT; FORWARD;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
SystemObj = OBJECT
IloscZgloszen : TSINTEGER;
CzasPrzebywaniaWSystemie : SREAL;
LiczbaWygenerowanych : INTEGER;
ZgloszeniaObsluzone : INTEGER;
KE : BOOLEAN;
ASK METHOD Start(IN WKE : BOOLEAN);
ASK METHOD Inc();
ASK METHOD CzasWejscia(IN WKlient:KlientObj);
ASK METHOD CzasWyjscia(IN WKli:KlientObj;IN Obsluzony:BOOLEAN);
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
KlientObj = OBJECT
CzasWejS : REAL;
CzasWejK : REAL;
Nr : INTEGER;
Priorytet : INTEGER;
KE : BOOLEAN;
ASK METHOD Start(IN WVIP:INTEGER;IN WID:INTEGER; IN WKE : BOOLEAN);
ASK METHOD CzasWejscia(IN WSys:INTEGER; IN WKol:INTEGER);
TELL METHOD Czeka(IN WSys: SystemObj; IN WKol:KolejkaObj;IN WCzasCzekania:REAL);
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
GeneratorObj=OBJECT(RandomObj)
System : SystemObj;
NrRozkladu : INTEGER;
PR1 : REAL;
PR2 : REAL;
PR3 : REAL;
Kolejka : KolejkaObj;
Wygen, MaWygen : INTEGER;
Paczka : INTEGER;
KE : BOOLEAN;
TriggerGeneratora : TriggerObj;
ASK METHOD Start(IN WSys:SystemObj; IN WNrRoz:INTEGER; IN WGP1:REAL; IN WGP2:REAL;
IN WGP3:REAL; IN WKol:KolejkaObj; IN WMaxWyg:INTEGER; IN
WPaczka:INTEGER;
IN WKE: BOOLEAN; IN WTriggerGen : TriggerObj);
TELL METHOD Generuj();
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
KolejkaObj = OBJECT
System : SystemObj;
Gniazdo : GniazdoObj;
Typ : INTEGER;
Rozmiar : INTEGER;
LK : TSINTEGER;
Kolejka : BStatGroupObj;
KE : BOOLEAN;
TriggerGniazda, TriggerGeneratora : TriggerObj;
ASK METHOD Start(IN WSys:SystemObj; IN WGniazdo:GniazdoObj; IN WTyp:INTEGER; IN
WRozmiar:INTEGER;
IN KE : BOOLEAN; IN WTriggerGni : TriggerObj; IN WTriggerGen : TriggerObj);
ASK METHOD Dodaj(IN WSys:SystemObj;IN WKli:KlientObj);
ASK METHOD Usun(IN WKli:KlientObj):KlientObj;
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
GniazdoObj = OBJECT
RandomGen : RandomObj;
System : SystemObj;
Rozklad : INTEGER;
CzasWSMO : SREAL;
IloscOkienek, ZajetychOkienek : TSINTEGER;
KolejkaWY, KolejkaWE : KolejkaObj;
PP : REAL; {prawd petli}
PR1, PR2, PR3 : REAL; {par rozkladu}
KE : BOOLEAN;
TriggerGniazda : TriggerObj;
TriggerGeneratora : TriggerObj;
Dziala : BOOLEAN;
ASK METHOD Start(IN WSeed:INTEGER;IN WSys:SystemObj; IN WRozklad:INTEGER; IN
WIloscOkienek:INTEGER;
IN WKolejkaWY:KolejkaObj; IN WKolejkaWE:KolejkaObj; IN WPR1:REAL; IN WPR2:REAL;
IN WPR3:REAL; IN WPP:REAL; IN WKE : BOOLEAN; IN WTrigger : TriggerObj;
IN WTrigger2 : TriggerObj);
TELL METHOD Obsluz();
TELL METHOD Koniec();
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
KPriorytetowaObj = OBJECT(StatRankedObj)
OVERRIDE
ASK METHOD Rank(IN WKl1 : ANYOBJ; IN WKl2 : ANYOBJ) : INTEGER;
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
OBJECT KolejkaObj;
ASK METHOD Start(IN WSys:SystemObj; IN WGniazdo:GniazdoObj; IN WTyp:INTEGER; IN
WRozmiar:INTEGER;
IN WKE : BOOLEAN; IN WTriggerGni : TriggerObj; IN WTriggerGen : TriggerObj);
VAR
KolejkaLIFO : StatStackObj;
KolejkaPrior : KPriorytetowaObj;
KolejkaFIFO : StatQueueObj;
BEGIN
System := WSys;
Gniazdo := WGniazdo;
Typ := WTyp;
LK := 0;
Rozmiar := WRozmiar;
KE := WKE;
TriggerGniazda := WTriggerGni;
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 WKli:KlientObj);
VAR
CzasCzekania : REAL;
BEGIN
CASE ASK SELF TO Typ
WHEN 1:
CzasCzekania := 0.0;
WHEN 2:
CzasCzekania := 1.0;
WHEN 3:
CzasCzekania := 2.0;
END CASE;
IF Rozmiar > 0
IF LK < Rozmiar
ASK WKli TO CzasWejscia(0,1);
ASK Kolejka TO Add(WKli);
TELL WKli TO Czeka(WSys,SELF,CzasCzekania);
IF (KE)
OUTPUT("Klient numer ",ASK WKli TO Nr," wszedl do kolejki
gniazda ",ASK SELF TO Typ);
END IF;
INC(LK);
ASK TriggerGniazda TO Release;
ELSE
IF (KE)
OUTPUT("Klient numer ",ASK WKli TO Nr," nie wszedl do pelnej
kolejki gniazda ",ASK SELF TO Typ);
END IF;
ASK System TO CzasWyjscia(WKli,FALSE);
END IF;
ELSE
ASK WKli TO CzasWejscia(0,1);
ASK Kolejka TO Add(WKli);
IF (KE)
OUTPUT("Klient numer ",ASK WKli TO Nr," wchodzi do kolejki gniazda
",ASK SELF TO Typ);
END IF;
INC(LK);
ASK TriggerGniazda TO Release;
END IF;
END METHOD;
{----------------------------------------------------------------------------}
ASK METHOD Usun(IN WKli:KlientObj):KlientObj;
VAR
PomKlient : KlientObj;
BEGIN
IF LK > 0
IF WKli = NILOBJ
PomKlient:=ASK Kolejka TO Remove();
DEC(LK);
IF (KE)
OUTPUT("Klient numer ",ASK PomKlient TO Nr," wchodzi do
gniazda ",ASK SELF TO Typ," ", ASK SELF TO LK);
END IF;
ELSE
ASK Kolejka TO RemoveThis(WKli);
DEC(LK);
PomKlient:=WKli;
IF (KE)
OUTPUT("Klient numer ",ASK PomKlient TO Nr," zrezygnowal w
kolejce ",ASK SELF TO Typ);
END IF;
END IF;
IF (TriggerGeneratora <> NILOBJ)
ASK TriggerGeneratora TO Release();
END IF;
RETURN PomKlient;
ELSE
RETURN NILOBJ;
END IF;
END METHOD;
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
OBJECT KlientObj;
ASK METHOD Start(IN WVIP:INTEGER;IN WID:INTEGER; IN WKE : BOOLEAN);
BEGIN
CzasWejS := 0.0;
CzasWejK := 0.0;
Priorytet := WVIP;
Nr := WID;
KE := WKE;
END METHOD;
{----------------------------------------------------------------------------}
ASK METHOD CzasWejscia(IN WSys:INTEGER;IN WKol:INTEGER); {ustawienie czasu wejścia do
systemu lub kolejki}
BEGIN
IF WSys = 1
CzasWejS := SimTime;
END IF;
IF WKol = 1
CzasWejK := SimTime;
END IF;
END METHOD;
{----------------------------------------------------------------------------}
TELL METHOD Czeka(IN WSys: SystemObj; IN WKol:KolejkaObj; IN WCzasCzekania:REAL);
VAR
pom:KlientObj;
BEGIN
IF WCzasCzekania > 0.0;
WAIT DURATION WCzasCzekania;
pom := ASK WKol TO Usun(SELF);
ASK WSys TO CzasWyjscia(SELF, FALSE);
ON INTERRUPT;
END WAIT;
END IF;
END METHOD;
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
OBJECT GeneratorObj;
ASK METHOD Start(IN WSys:SystemObj; IN WNrRoz:INTEGER; IN WGP1:REAL; IN WGP2:REAL;
IN WGP3:REAL; IN WKol:KolejkaObj; IN WMaxWyg:INTEGER; IN
WPaczka:INTEGER;
IN WKE: BOOLEAN; IN WTriggerGen : TriggerObj);
BEGIN
PR1 := WGP1;
PR2 := WGP2;
PR3 := WGP3;
Kolejka := WKol;
Wygen := 1;
NrRozkladu := WNrRoz;
MaWygen := WMaxWyg;
Paczka:= WPaczka;
System := WSys;
KE := WKE;
TriggerGeneratora := WTriggerGen;
END METHOD;
{----------------------------------------------------------------------------}
TELL METHOD Generuj();
VAR
Czas : REAL;
Prior, PaczkaZgloszen, i : INTEGER;
Klient : KlientObj;
BEGIN
WHILE Wygen < MaWygen
Prior := ASK SELF TO UniformInt(1,10); {losowanie priorytetu klienta}
PaczkaZgloszen:= ASK SELF TO UniformInt (1,Paczka);
CASE NrRozkladu
WHEN 1:
Czas := ASK SELF TO Triangular(PR1, PR2, PR3);
WHEN 2:
Czas := ASK SELF TO Weibull(PR1, PR2);
END CASE;
IF Czas<0.0
Czas:=ABS(Czas);
END IF;
WAIT DURATION Czas
END WAIT;
FOR i:=1 TO Paczka
NEW(Klient);
ASK System TO Inc();
ASK Klient TO Start(Prior, ASK System TO LiczbaWygenerowanych, KE);
ASK System TO CzasWejscia(Klient);
IF (KE)
OUTPUT ("Generator ",NrRozkladu," wygenerowal klienta ",ASK
Klient TO Nr);
END IF;
ASK Kolejka TO Dodaj(System, Klient);
INC(Wygen);
END FOR;
END WHILE;
END METHOD;
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
OBJECT SystemObj;
ASK METHOD Start(IN WKE : BOOLEAN);
BEGIN
CzasPrzebywaniaWSystemie:= 0.0;
IloscZgloszen := 0;
ZgloszeniaObsluzone := 0;
LiczbaWygenerowanych := 0;
KE := WKE;
END METHOD;
{----------------------------------------------------------------------------}
ASK METHOD CzasWejscia(IN WKlient : KlientObj);
BEGIN
ASK WKlient TO CzasWejscia(1,0);
INC(IloscZgloszen);
END METHOD;
{----------------------------------------------------------------------------}
ASK METHOD CzasWyjscia(IN WKli:KlientObj; IN Obsluzony:BOOLEAN);
BEGIN
CzasPrzebywaniaWSystemie := (SimTime - (ASK WKli TO CzasWejS));
IF Obsluzony
INC(ZgloszeniaObsluzone);
IF (KE)
OUTPUT("Klient numer ", ASK WKli TO Nr," zostal obsluzony i opuscil
system");
OUTPUT("Liczba obsluzonych klientow : ",ASK SELF TO
ZgloszeniaObsluzone);
END IF;
ELSE
IF (KE)
OUTPUT("Klient numer ", ASK WKli TO Nr," zostal nieobsluzony i opuszcza
system");
END IF;
END IF;
DEC(IloscZgloszen);
END METHOD;
ASK METHOD Inc();
BEGIN
INC(LiczbaWygenerowanych);
END METHOD;
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
OBJECT GniazdoObj;
ASK METHOD Start(IN WSeed:INTEGER;IN WSys:SystemObj; IN WRozklad:INTEGER; IN
WIloscOkienek:INTEGER;
IN WKolejkaWY:KolejkaObj; IN WKolejkaWE:KolejkaObj; IN WPR1:REAL; IN WPR2:REAL;
IN WPR3:REAL; IN WPP:REAL; IN WKE : BOOLEAN; IN WTrigger : TriggerObj;
IN WTrigger2 : TriggerObj);
VAR
Tmp : INTEGER;
BEGIN
System := WSys;
Rozklad := WRozklad;
IloscOkienek:= WIloscOkienek;
KolejkaWY := WKolejkaWY;
KolejkaWE := WKolejkaWE;
PP := WPP;
PR1:= WPR1;
PR2 := WPR2;
PR3 := WPR3;
ZajetychOkienek := 0;
CzasWSMO := 0.0;
NEW(RandomGen);
ASK RandomGen TO SetSeed(WSeed);
KE := WKE;
TriggerGniazda := WTrigger;
TriggerGeneratora := WTrigger2;
FOR Tmp:=0 TO IloscOkienek-1
TELL SELF TO Obsluz();
END FOR;
END METHOD;
{----------------------------------------------------------------------------}
TELL METHOD Obsluz();
VAR
Czas : REAL;
Obslugiwany : KlientObj;
BEGIN
Dziala := TRUE;
WHILE (Dziala)
WAIT FOR TriggerGniazda TO Fire;
ON INTERRUPT
END WAIT;
WHILE (((ASK KolejkaWE TO LK) > 0) AND (IloscOkienek > ZajetychOkienek))
INC(ZajetychOkienek);
CASE Rozklad
WHEN 1:
Czas := ASK RandomGen TO Weibull(PR1,PR2);
WHEN 2:
Czas := ASK RandomGen TO Exponential(PR1);
WHEN 3:
Czas := ASK RandomGen TO Normal(PR1,PR2);
END CASE;
Obslugiwany := ASK KolejkaWE TO Usun(NILOBJ);
Interrupt(Obslugiwany, "Czeka");
WAIT DURATION ABS(Czas);
END WAIT;
CzasWSMO := SimTime - (ASK Obslugiwany TO CzasWejK);
IF ASK RandomGen TO Sample() > PP;
IF (ASK SELF TO Rozklad=1)
IF (KE)
OUTPUT("Klient numer ",ASK Obslugiwany TO Nr," zostal
obsluzony przez gniazdo ",ASK SELF TO Rozklad );
END IF;
IF (TriggerGeneratora <> NILOBJ)
IF ((ASK KolejkaWY TO LK = ASK KolejkaWY TO Rozmiar)
AND (ASK KolejkaWY TO Rozmiar<>0))
IF (KE)
OUTPUT ("Gniazdo numer ",ASK SELF TO
Rozklad," zablokowane.");
END IF;
WAIT FOR TriggerGeneratora TO Fire();
END WAIT;
END IF;
END IF;
ASK KolejkaWY TO Dodaj(System, Obslugiwany);
ELSE
IF (KE)
OUTPUT("-Klient numer ",ASK Obslugiwany TO Nr," zostal
obsluzony przez gniazdo ",ASK SELF TO Rozklad);
END IF;
ASK System TO CzasWyjscia(Obslugiwany, TRUE);
END IF;
DEC(ZajetychOkienek);
ELSE
IF (KE)
OUTPUT("Klient numer", ASK Obslugiwany TO Nr," wraca do
Gniazda", ASK SELF TO Rozklad,".");
END IF;
ASK KolejkaWE TO Dodaj(System, Obslugiwany);
DEC(ZajetychOkienek);
END IF;
END WHILE;
END WHILE;
END METHOD;
{----------------------------------------------------------------------------}
TELL METHOD Koniec();
VAR
Tmp : INTEGER;
BEGIN
{IF((ASK SELF TO ZajetychOkienek=0) AND (ASK KolejkaWE TO LK=0) AND (ASK
KolejkaWY TO LK=0))}
Dziala:= FALSE;
{END IF;}
WAIT DURATION 0.0
ASK TriggerGniazda TO InterruptTrigger;
END WAIT;
END METHOD;
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
OBJECT KPriorytetowaObj;
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;
END OBJECT;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
VAR
System : SystemObj;
Generator1, Generator2 : GeneratorObj;
Gniazdo1, Gniazdo2, Gniazdo3 : GniazdoObj;
KolejkaLIFO, KolejkaPrior, KolejkaFIFO : KolejkaObj;
wybor : CHAR;
TriggerG1, TriggerG2, TriggerG3, TriggerBlokujacy : TriggerObj;
G1min,G1mean,G1max,G2shape,G2scale,Gn1shape,Gn1scale,Gn2z,Gn3a,Gn3b,p1,p2,PrawdopodObslu
zenia:REAL;
G1Seed,G2Seed,DK1,DK3,ilosc:INTEGER;
Plik : StreamObj;
Tekst : STRING;
KE: BOOLEAN;
MonCzas, MonCzasSMO1, MonCzasSMO2, MonCzasSMO3 : RStatObj;
MonLiczbaZgloszenSys, MonLiczbaZajetychGn1, MonLiczbaZajetychGn2,
MonLiczbaZajetychGn3, MonZgloszenWKolejce1, MonZgloszenWKolejce2,
MonZgloszenWKolejce3 : ITimedStatObj;
BEGIN
OUTPUT("Wyswietlac komunikaty T / N ");
wybor := ReadKey();
OUTPUT("");
KE := TRUE;
IF ((wybor = 'n') OR (wybor = 'N'))
KE := FALSE;
ELSIF ((wybor = 't') OR (wybor = 'T'))
KE := TRUE;
END IF;
NEW(Plik);
ASK Plik TO Open("in.txt",Input);
ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(G1min); ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(G1mean);ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(G1max);ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadInt(G1Seed);ASK Plik TO ReadLine(Tekst);
OUTPUT(Tekst) ;
ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(G2shape); ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(G2scale);ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadInt(G2Seed);ASK Plik TO ReadLine(Tekst);
OUTPUT(Tekst) ;
ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(Gn1shape); ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(Gn1scale);ASK Plik TO ReadLine(Tekst);
OUTPUT(Tekst) ;
ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(Gn2z); ASK Plik TO ReadLine(Tekst);
OUTPUT(Tekst) ;
ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(Gn3a); ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(Gn3b); ASK Plik TO ReadLine(Tekst);
OUTPUT(Tekst) ;
ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadInt(DK1); ASK Plik TO ReadLine(Tekst);
OUTPUT(Tekst) ;
ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadInt(DK3); ASK Plik TO ReadLine(Tekst);
OUTPUT(Tekst) ;
ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadInt(ilosc); ASK Plik TO ReadLine(Tekst);
OUTPUT(Tekst) ;
ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(p1); ASK Plik TO ReadLine(Tekst);
OUTPUT(Tekst) ;
ASK Plik TO ReadLine(Tekst);
ASK Plik TO ReadReal(p2); ASK Plik TO ReadLine(Tekst);
ASK Plik TO Close();
DISPOSE(Plik);
OUTPUT("Dane pobrane z pliku wejsciowego");
OUTPUT(" ");
OUTPUT("ROZPOCZECIE SYMULACJI");
OUTPUT(" ");
NEW(System);
NEW(Gniazdo1);
NEW(Gniazdo2);
NEW(Gniazdo3);
NEW(KolejkaLIFO);
NEW(KolejkaPrior);
NEW(KolejkaFIFO);
NEW(Generator1);
NEW(Generator2);
NEW(TriggerG1);
NEW(TriggerG2);
NEW(TriggerG3);
NEW(TriggerBlokujacy);
ASK System TO Start(KE);
ASK KolejkaPrior TO Start (System, Gniazdo1, 1, DK1, KE, TriggerG1, TriggerBlokujacy);
ASK KolejkaFIFO TO Start (System, Gniazdo2, 2, 0, KE, TriggerG2, NILOBJ);
ASK KolejkaLIFO TO Start (System, Gniazdo3, 3, DK3, KE, TriggerG3, NILOBJ);
ASK Generator1 TO SetSeed(G1Seed);
ASK Generator1 TO Start(System, 1, G1min, G1mean, G1max, KolejkaPrior, ilosc, 1, KE, NILOBJ);
ASK Generator2 TO SetSeed(G2Seed);
ASK Generator2 TO Start(System, 2, G2shape,G2scale,0.0, KolejkaLIFO, ilosc, 2, KE, NILOBJ);
ASK Gniazdo1 TO Start(1, System, 1, 3, KolejkaFIFO, KolejkaPrior, Gn1shape, Gn1scale, 0.0, 0.0,
KE, TriggerG1, TriggerBlokujacy);
ASK Gniazdo2 TO Start(1, System, 2, 4, NILOBJ, KolejkaFIFO, Gn2z,0.0, 0.0, p1, KE, TriggerG2,
NILOBJ);
ASK Gniazdo3 TO Start(1, System, 3, 1, NILOBJ, KolejkaLIFO, Gn3a,Gn3b , 0.0, p2, KE,
TriggerG3, NILOBJ);
TELL Generator1 TO Generuj();
TELL Generator2 TO Generuj();
StartSimulation();
TELL Gniazdo1 TO Koniec();
TELL Gniazdo2 TO Koniec();
TELL Gniazdo3 TO Koniec();
StartSimulation;
MonCzas := GETMONITOR(ASK System TO CzasPrzebywaniaWSystemie,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 IloscZgloszen,ITimedStatObj);
MonLiczbaZajetychGn1 := GETMONITOR(ASK Gniazdo1 TO ZajetychOkienek,ITimedStatObj);
MonLiczbaZajetychGn2 := GETMONITOR(ASK Gniazdo2 TO ZajetychOkienek,ITimedStatObj);
MonLiczbaZajetychGn3 := GETMONITOR(ASK Gniazdo3 TO ZajetychOkienek,ITimedStatObj);
MonZgloszenWKolejce1 := GETMONITOR(ASK KolejkaPrior TO LK,ITimedStatObj);
MonZgloszenWKolejce2 := GETMONITOR(ASK KolejkaFIFO TO LK,ITimedStatObj);
MonZgloszenWKolejce3 := GETMONITOR(ASK KolejkaLIFO TO LK,ITimedStatObj);
PrawdopodObsluzenia := FLOAT(ASK System TO ZgloszeniaObsluzone)/FLOAT(ASK System TO
LiczbaWygenerowanych);
NEW(Plik);
ASK Plik TO Open("out.txt",Output);
ASK Plik TO WriteString("WYNIKI: ");
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 "srednia: ***.*** ");ASK
Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonCzas TO StdDev) WITH "odchylenie:
***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteLn();
ASK Plik TO WriteString("Czas przebywania zgloszenia w SMO-1:");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO1 TO Mean) WITH "srednia:
***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO1 TO StdDev) WITH "odchylenie:
***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteLn();
ASK Plik TO WriteString("Czas przebywania zgloszenia w SMO-2:");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO2 TO Mean) WITH "srednia: ***.***
");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO2 TO StdDev) WITH "odchylenie:
***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteLn();
ASK Plik TO WriteString("Czas przebywania zgloszenia w SMO-3:");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO3 TO Mean) WITH "srednia:
***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonCzasSMO3 TO StdDev) WITH "odchylenie:
***.***");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 "srednia:
****.***");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZgloszenSys TO StdDev) WITH
"odchylenie: ***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteLn();
ASK Plik TO WriteString("Liczba kanalow zajetych w gniezdzie O1:");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZajetychGn1 TO Mean) WITH "srednia:
***.*** ");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZajetychGn1 TO StdDev) WITH
"odchylenie: ***.***");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 "srednia:
***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZajetychGn2 TO StdDev) WITH
"odchylenie: ***.***");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 "srednia:
***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonLiczbaZajetychGn3 TO StdDev) WITH
"odchylenie: ***.***");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 "srednia:
***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonZgloszenWKolejce1 TO StdDev) WITH
"odchylenie: ***.***");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 "srednia:
***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonZgloszenWKolejce2 TO StdDev) WITH
"odchylenie: ***.***");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 "srednia:
***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(ASK MonZgloszenWKolejce3 TO StdDev) WITH
"odchylenie: ***.***");ASK Plik TO WriteLn();
ASK Plik TO WriteLn();
ASK Plik TO WriteString( SPRINT(PrawdopodObsluzenia) WITH "Prawdopodobienstwo
obsluzenia klienta w systemie: ***.***");
DISPOSE(Plik);
DISPOSE(KolejkaLIFO);
DISPOSE(KolejkaPrior);
DISPOSE(KolejkaFIFO);
DISPOSE(Generator1);
DISPOSE(Generator2);
DISPOSE(Gniazdo1);
DISPOSE(Gniazdo2);
DISPOSE(Gniazdo3);
DISPOSE(System);
DISPOSE(TriggerG1);
DISPOSE(TriggerG2);
DISPOSE(TriggerG3);
DISPOSE(TriggerBlokujacy);
wybor := ReadKey();
OUTPUT("");
END MODULE.


Wyszukiwarka