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.