Wojskowa Akademia Techniczna
im. Jarosława Dąbrowskiego
Laboratorium
Podstawy symulacji
Prowadzący:
dr inż. Jarosław Rulka
Sprawozdanie projekt zaliczeniowy
Wykonał:
Dawid Zarodkiewicz
I8G1S1
Zadanie
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 Tj: (nrDz + i) mod 6 + 1;
b) rozkład zmiennych Oi: (nrDz + i + 1) mod 6 + 1;
c) Li: (nrDz + i) mod 2 + 1;
d) ALi: (nrDz + i + 2) mod 3 + 1;
e) Rj = (nrDz + i + 5) mod 3 + 1;
f) Mi = (nrDz + i + 2) mod 4 + 1;
g) Blokowanie zgłoszeń 1. SMO;
h) Klienci niecierpliwi w SMOi : Ni = (nrDz + i) mod 4 (ograniczony czas oczekiwania na rozpoczęcie obsługi);
gdzie:
i - numer SMO;
j - numer strumienia;
Tj - zmienna losowa oznaczająca czas pomiędzy kolejnymi napływami zgłoszeń do systemu;
Oi - zmienna losowa oznaczająca czas obsługi pojedynczego zgłoszenia w gnieździe;
Ni - zmienna losowa oznaczająca czas niecierpliwości zgłoszenia (gdy i = 0 => zgłoszenia cierpliwe);
Rj - zmienna losowa oznaczająca wielkość paczki zgłoszeń (wchodzących w tej samej chwili) j-tego strumienia;
pk - prawdopodobieństwa przemieszczenia się zgłoszenia po danym łuku;
Li - długość kolejki i-tego SMO;
AL.i - algorytmy kolejek (w przypadku istnienia kolejki z priorytetami należy przyjąć, że zgłoszenia posiadają priorytety);
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
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.
Dane przyjęte dla zadania:
Dla nrDz (numeru z dziennika) = 18.
Rozkłady zmiennych losowych oznaczających czas pomiędzy kolejnymi napływami zgłoszeń do systemu:
T1= rozkład Erlanga
Paczka R1 = 1
Rozkłady zmiennych losowych oznaczających czas obsługi pojedynczego zgłoszenia w gnieździe:
O1 - rozkład Normalny
O2 - rozkład Jednostajny
O3 - rozkład Trójkątny
Długości kolejek pojedynczych SMO:
L1 - nieograniczona
L2 - ograniczona
L3 - nieograniczona
Algorytmy kolejek:
AL1 - FIFO
AL2 - LIFO
AL3 - Z priorytetami
Zmienne losowe oznaczające czas niecierpliwości zgłoszenia:
N1 - rozkład Wykładniczy
N2 - rozkład Erlanga
N3 - rozkład Normalny
Liczba stanowisk obsługi:
M1 - 2
M2 - 3
M3 - 4
Rozkłady prawdopodobieństw:
Rozkład normalny:
Gęstość prawdopodobieństwa:
dwuparametrowy o parametrach:
μ - wartość oczekiwana
σ - odchylenie standardowe
Rozkład jednostajny:
Rozkład wykładniczy:
Gęstość prawdopodobieństwa:
Dystrybuanta:
λ - wartość oczekiwana
Rozkład Erlanga:
Gęstość:
o parametrach:
k > 0
λ >0
Rozkład Trójkątny:
Gęstość:
a - min
b -środek
c - max
Sposób rozwiązania zadania:
Wygenerowani klienci przekazywani są do pierwszej kolejki FIFO po jednym kliencie. Priorytet i prawdopodobieństwo przejść między elementami systemu zostaje przypisany
każdemu klientowi. Do pierwszego gniazda obsługi o rozkładzie Normalnym i ilości stanowisk obsługi równej 2 klient przechodzi z pierwszej kolejki. Klient wychodzi z pierwszego gniazda obsługi z nadanym prawdopodobieństwem do gniazda drugiego o rozkładzie Jednostajnym i ilości stanowisk obsługi równej 3 lub do trzeciego o rozkładzie Trójkątnym i ilości stanowisk obsługi równej 4. Po wyjściu z gniazd może opuścić system, bądź do niego powrócić. Jeśli klient powróci, zostanie tym samym zmniejszone prawdopodobieństwo , że przy następnym wyborze zostanie w systemie. System został zaprojektowany tak, żeby wybór liczby klientów dla symulacji był określany przez użytkownika.
Sposób wyznaczania charakterystyk:
Charakterystyki graniczne systemu wyznaczane są przy wykorzystaniu zmiennych monitorowanych odpowiedniego typu.
Czas przebywania zgłoszenia:
Zmienna typu SREAL monitoruje czasy wejścia i wyjścia poszczególnych klientów z kolejki. Skutkuje to możliwością wyliczenia średniego czasu przebywania zgłoszenia w SMO po zakończeniu symulacji.
Liczba zgłoszeń:
Liczbę klientów przebywających w danej chwili w systemie oznacza zmienna typu TSINTEGER. Liczba zgłoszeń jest zmieniana przy wychodzeniu klienta w trzech przypadkach: gdy nie jest obsługiwany, zniecierpliwiony odchodzi , lub nie może wejść.
Liczba zgłoszeń w kolejce:
Zmienna typu TSINTEGER obliczana dla poszczególnych SMO za pomocą odpowiednich metod obiektów StatQueueObj, StatStackObj lub StatRankedObj.
Prawdopodobieństwo obsłużenia zgłoszenia:
Jest wyznaczane jako stosunek liczby obsłużonych klientów wchodzących do SMO do liczby wszystkich klientów z niego wychodzących.
Liczba zajętych kanałów:
Przyrost zmiennej typu TSINTEGER następuje w chwili gdy dany kanał rozpoczyna obsługę klienta, a jej redukcja, gdy obsługa się kończy.
Przykład działania programu:
------------------------------- Parametry symulacji ------------------------------- Liczba klientow: 47 Dlugosc kolejki: 4 Parametr 'k' dla generatora o rozkladzie Erlanga: 1 Parametr 'lambda' dla generatora o rozkladzie Erlanga: 3 Parametr nr 1 dla SMO o rozkladzie Normalnym: 2 Parametr nr 2 dla SMO o rozkladzie Normalnym: 4 Parametr nr 1 dla SMO o rozkladzie Jednostajnym: 6 Parametr nr 2 dla SMO o rozkladzie Jednostajnym: 7 Parametr nr 1 dla SMO o rozkladzie Trojkatnym(minimum): 3 Parametr nr 2 dla SMO o rozkladzie Trojkatnym: 5 Parametr nr 3 dla SMO o rozkladzie Trojkatnym(maximum): 7 ------------------------------------------------------------------- P O C Z A T E K S Y M U L A C J I ------------------------------------------------------------------- Klient w kolejce FIFO Klient w SMO1 Klient w kolejce FIFO Klient obsluzony w 1 gniezdzie Klient w kolejce LIFO Klient w SMO2 Klient w kolejce FIFO Klient w SMO1 Klient w kolejce FIFO Klient obsluzony w 1 gniezdzie Klient w kolejce LIFO Klient w kolejce FIFO Klient w SMO1 Klient obsluzony w 1 gniezdzie Klient w kolejce LIFO Klient w kolejce FIFO Klient w SMO1 Klient w kolejce FIFO Klient obsluzony w 2 gniezdzie !KLIENT POZA SYSTEMEM! Klient w SMO2 Klient w kolejce FIFO Klient w kolejce FIFO Klient w kolejce FIFO Klient w SMO2 Klient w kolejce FIFO Klient w SMO1 Klient w kolejce FIFO Klient obsluzony w 1 gniezdzie Klient w kolejce PRIORYTETOWEJ Klient w SMO3 Klient w kolejce FIFO Klient w SMO1 Klient w kolejce FIFO Klient w kolejce FIFO Klient obsluzony w 1 gniezdzie Klient w kolejce LIFO Klient obsluzony w 3 gniezdzie !KLIENT POZA SYSTEMEM! Klient w kolejce FIFO Klient w SMO1 Klient obsluzony w 2 gniezdzie !KLIENT POZA SYSTEMEM! Klient w SMO2 Klient obsluzony w 1 gniezdzie Klient w kolejce PRIORYTETOWEJ Klient w SMO3 Klient w kolejce FIFO Klient w SMO1 Klient w kolejce FIFO Klient w kolejce FIFO Klient obsluzony w 1 gniezdzie Klient w kolejce LIFO Klient w kolejce FIFO Klient w SMO1 Klient w kolejce FIFO Klient obsluzony w 3 gniezdzie Klient w kolejce FIFO Klient w kolejce FIFO Klient obsluzony w 2 gniezdzie !KLIENT POZA SYSTEMEM! Klient w SMO2 Klient obsluzony w 1 gniezdzie Klient w kolejce PRIORYTETOWEJ Klient w SMO3 Klient obsluzony w 2 gniezdzie !KLIENT POZA SYSTEMEM! Klient obsluzony w 3 gniezdzie !KLIENT POZA SYSTEMEM!
|
Klient obsluzony w 1 gniezdzie Klient w kolejce LIFO Klient w kolejce FIFO Klient w SMO1 Klient obsluzony w 2 gniezdzie !KLIENT POZA SYSTEMEM! Klient w SMO2 Klient w kolejce FIFO Klient obsluzony w 1 gniezdzie Klient w kolejce LIFO Klient w kolejce FIFO Klient w SMO1 Klient w kolejce FIFO Klient w kolejce FIFO Klient w kolejce FIFO Klient obsluzony w 2 gniezdzie Klient w kolejce LIFO Klient w SMO2 Klient w kolejce FIFO Klient w kolejce FIFO Klient w kolejce FIFO Klient w kolejce FIFO Klient w kolejce FIFO Klient w kolejce FIFO Klient obsluzony w 1 gniezdzie Klient w kolejce PRIORYTETOWEJ Klient w SMO3 Klient w kolejce FIFO Klient w SMO1 Klient obsluzony w 2 gniezdzie !KLIENT POZA SYSTEMEM! Klient w kolejce FIFO Klient obsluzony w 1 gniezdzie Klient w kolejce LIFO Klient w SMO2 Klient w kolejce FIFO Klient w SMO1 Klient w kolejce FIFO Klient obsluzony w 3 gniezdzie Klient w kolejce FIFO Klient w kolejce FIFO Klient obsluzony w 1 gniezdzie Klient w kolejce PRIORYTETOWEJ Klient w SMO3 Klient w kolejce FIFO Klient w SMO1 Klient w kolejce FIFO Klient obsluzony w 2 gniezdzie !KLIENT POZA SYSTEMEM! Klient w kolejce FIFO Klient w kolejce FIFO Klient obsluzony w 3 gniezdzie !KLIENT POZA SYSTEMEM! Klient w kolejce FIFO Klient w kolejce FIFO ------------------------------------------------------------------- S T A T Y S T Y K I ------------------------------------------------------------------- Sr czas przebywania zgloszenia w systemie : 11.260723; Odchylenie standardowe: 3.665226 Sr czas przebywania zgloszenia w SMO1 : 3.164868; Odchylenie standardowe: 2.499532 Sr czas przebywania zgloszenia w SMO2 : 7.598444; Odchylenie standardowe: 1.208811 Sr czas przebywania zgloszenia w SMO3 : 4.894017; Odchylenie standardowe: 0.755823
------------------------------------------------------------------- Sr liczba zajetych kanalow w SMO1 : 0.710934; Odchylenie standardowe: 0.453329 Sr liczba zajetych kanalow w SMO2 : 0.849251; Odchylenie standardowe: 0.357804 Sr liczba zajetych kanalow w SMO3 : 0.392628; Odchylenie standardowe: 0.488335 ------------------------------------------------------------------- Sr liczba zgloszen w kolejce FIFO : 27.107284; Odchylenie standardowe: 15.694832 Sr liczba zgloszen w kolejce LIFO : 6.269915; Odchylenie standardowe: 2.828372 Sr liczba zgloszen w kolejce priorytetowej : 1.677240; Odchylenie standardowe: 1.788276 ------------------------------------------------------------------- Prawdopodobienstwo obslugi zgloszenia w SMO1: 0.268926 Prawdopodobienstwo obslugi zgloszenia w SMO2: 0.580204 Prawdopodobienstwo obslugi zgloszenia w SMO3: 0.765908 ------------------------------------------------------------------- -------------------------------------------------- K O N I E C S Y M U L A C J I -------------------------------------------------- Koniec programu? Tak(t)/Nie(n) |
Kod programu:
MAIN MODULE dawid;
FROM StatMod IMPORT SREAL, TSREAL, TSINTEGER, RStatObj, RTimedStatObj, ITimedStatObj; FROM RandMod IMPORT RandomObj; FROM SimMod IMPORT SimTime, StartSimulation, StopSimulation, TriggerObj, Interrupt; FROM GrpMod IMPORT QueueObj, StackObj, RankedObj;
(********D E K L A R A C J A************)
(********MONITORY************) VAR MCzasPrzebywania : SREAL; MCzasPrzebywaniaSMO1, MCzasPrzebywaniaSMO2, MCzasPrzebywaniaSMO3: SREAL; MNiecierpli : TSINTEGER; MKolej1Z, MKolej2Z, MKolej3Z : TSINTEGER; MKolej1W, MKolej2W, MKolej3W : TSINTEGER; MZajKanalSMO1, MZajKanalSMO2, MZajKanalSMO3 : TSINTEGER;
(*******OBIEKTY*******) TYPE SystemObj = OBJECT; FORWARD; SMONormalObj = OBJECT; FORWARD; SMOJednosObj = OBJECT; FORWARD; SMOTriangleObj = OBJECT; FORWARD; FIFOObj = OBJECT; FORWARD; LIFOObj = OBJECT; FORWARD; PriorytObj = OBJECT; FORWARD; GeneratorErlangObj = OBJECT; FORWARD;
(********OBiEKT SYSTEM************) SystemObj = OBJECT(RandomObj) MaxZglosz, IloscWygen : INTEGER; Kol1 : FIFOObj; Kol2 : LIFOObj; Kol3 : PriorytObj; Gen : GeneratorErlangObj; Smo1 : SMONormalObj; Smo2 : SMOJednosObj; Smo3 : SMOTriangleObj;
ASK METHOD Init (IN maxzgl : INTEGER; IN kol1 : FIFOObj; IN kol2 : LIFOObj; IN Kol3 : PriorytObj; IN gen : GeneratorErlangObj; IN smo1 : SMONormalObj; IN smo2 : SMOJednosObj; IN smo3, trojk : SMOTriangleObj; IN j,k,l, r,i, a,b, g1 : REAL; IN g2: INTEGER; IN dlkol2, z: INTEGER);
ASK METHOD ZwiekszW; ASK METHOD Rozpocznij; ASK METHOD ObjTerminate; END OBJECT;
(********OBIEKT KLIENT************) KlientObj = OBJECT(RandomObj) KolejkaID: INTEGER; P1,P2,P3: REAL; CzasWe,CzasWy : REAL; CzasWeDoKol : REAL; J,K : REAL; PriorytKlienta : INTEGER; KolejkaFifo : FIFOObj; KolejkaLifo : LIFOObj; KolejkaPrio : PriorytObj;
ASK METHOD Init (IN ziarno, prior : INTEGER; IN j,k : REAL; IN kolfifo : FIFOObj; IN kollifo : LIFOObj; IN kolprio: PriorytObj); (*******OBIEKT SMO - ROZKLAD TROJKATNY**********) SMOTriangleObj = OBJECT(TriggerObj) System : SystemObj; KolejkaPrzed : PriorytObj; KolejkaZa : FIFOObj; Generator : RandomObj; SmoID : INTEGER; IloscStanowisk : INTEGER; IloscZajetych : INTEGER; J: REAL; K: REAL; L: REAL;
ASK METHOD Init (IN smoid, iloscstanow, ziarno : INTEGER;IN j,k,l: REAL; IN kolza: FIFOObj; IN kolprzed : PriorytObj; IN system : SystemObj); TELL METHOD Obslugiwanie; OVERRIDE ASK METHOD ObjTerminate; END OBJECT;
(*********OBIEKT SMO - ROZKLAD JEDNOSTAJNY********) SMOJednosObj = OBJECT(TriggerObj) System : SystemObj; KolejkaPrzed : LIFOObj; KolejkaZa : LIFOObj; Generator : RandomObj; SmoID : INTEGER; IloscStanowisk : INTEGER; IloscZajetych : INTEGER; A: REAL; B: REAL; ASK METHOD Init(IN smoid, iloscstanow, ziarno : INTEGER; IN a,b: REAL;IN kolza:LIFOObj; IN kolprzed : LIFOObj; IN system : SystemObj); TELL METHOD Obslugiwanie; OVERRIDE ASK METHOD ObjTerminate; END OBJECT;
(**********OBIEKT GENERATOR -ROZKLAD ERLANGA **********) GeneratorErlangObj = OBJECT(RandomObj) System : SystemObj; Kolejka : LIFOObj; KolejkaFIFO : FIFOObj; KolejkaPrior : PriorytObj; G1: REAL; G2: INTEGER; ASK METHOD Init(IN kolejkaprior : PriorytObj; IN kolejkalifo : LIFOObj;IN kolejkafifo : FIFOObj; IN ziarno : INTEGER ;IN g1 : REAL; IN g2: INTEGER; IN system : SystemObj); TELL METHOD MakeKlient; END OBJECT;
(**********I M P L E M E N T A C J A **********)
(*******SYSTEM- METODY*******) OBJECT SystemObj;
ASK METHOD Init (IN maxzgl : INTEGER; IN kol1 : FIFOObj; IN kol2 : LIFOObj;IN kol3 : PriorytObj; IN gen : GeneratorErlangObj; IN smo1 : SMONormalObj; IN smo2 : SMOJednosObj; IN smo3, trojk :SMOTriangleObj; IN j,k,l,r,i, a,b,g1 : REAL; IN g2: INTEGER; IN dlkol2,z : INTEGER);
BEGIN ASK SELF TO SetSeed(z); NEW(kol1); NEW(kol2); NEW(kol3); NEW(gen); NEW(smo1); ASK METHOD ZmienPstwo; BEGIN P1 := ASK SELF TO UniformReal(1.0, 100.0); P2 := ASK SELF TO UniformReal(1.0, 100.0); P3 := ASK SELF TO UniformReal(1.0, 100.0); END METHOD;
ASK METHOD ZmienKolejkaID (IN kolejkaid : INTEGER); BEGIN KolejkaID := kolejkaid; END METHOD;
TELL METHOD Niecierpliwi; VAR czas : REAL; BEGIN
IF KolejkaID=1 czas := ABS(ASK SELF TO Exponential(1.0/ASK SELF TO UniformReal(1.0,20.0))); WAIT DURATION(czas); ASK KolejkaFifo TO RemoveThis(SELF); ON INTERRUPT; END WAIT; ELSIF KolejkaID=2 czas := ABS(ASK SELF TO Erlang(ASK SELF TO UniformReal(1.0,20.0),ASK SELF TO UniformInt(1,20))); WAIT DURATION(czas); ASK KolejkaLifo TO RemoveThis(SELF); ON INTERRUPT; END WAIT; ELSIF KolejkaID=3 czas := ABS(ASK SELF TO Normal(ASK SELF TO UniformReal(1.0,20.0),ASK SELF TO UniformReal(1.0,10.0))); WAIT DURATION(czas); ASK KolejkaPrio TO RemoveThis(SELF); ON INTERRUPT; END WAIT; END IF; INC (MNiecierpli); END METHOD; ASK METHOD ZmienCzasWeDoKol (IN czas:REAL); BEGIN CzasWeDoKol := czas; END METHOD; END OBJECT; (*******KOLEJKA FIFO- METODY **********) OBJECT FIFOObj; ASK METHOD Init ( IN smo : SMONormalObj); BEGIN Smo := smo; END METHOD;
ASK METHOD Dodaj (IN klient : KlientObj); BEGIN Add(klient); ASK klient TO ZmienCzasWeDoKol(SimTime); ASK klient TO ZmienKolejkaID(1); OUTPUT("Klient w kolejce FIFO"); TELL klient TO Niecierpliwi; INC(MKolej1Z); ASK Smo TO Release; END METHOD;
ASK METHOD Usun(IN klient: KlientObj); BEGIN ASK SELF TO RemoveThis(klient); DISPOSE (klient); DEC(MKolej1Z); END METHOD; END OBJECT;
(********SMO - ROZKLAD TROJKATNY- METODY ********) OBJECT SMOTriangleObj; ASK METHOD Init(IN smoid, iloscstanow, ziarno : INTEGER; IN j,k,l : REAL; IN kolza:FIFOObj; IN kolprzed : PriorytObj; IN system: SystemObj); BEGIN SmoID := smoid; IloscStanowisk := iloscstanow; IloscZajetych := 0; J := j; K := k; L := l; KolejkaPrzed := kolprzed; KolejkaZa :=kolza; System :=system; NEW(Generator); ASK Generator TO SetSeed(ziarno); END METHOD;
TELL METHOD Obslugiwanie; VAR klient: KlientObj; t: REAL; BEGIN IF IloscStanowisk > IloscZajetych IF (ASK KolejkaPrzed TO numberIn) > 0 OUTPUT("Klient w SMO3"); INC(MZajKanalSMO3);
INC(IloscZajetych); klient := ASK KolejkaPrzed TO Remove; ASK SELF TO Release; Interrupt (klient,"Niecierpliwi"); t:= ABS(ASK Generator TO Triangular(J,K,L)); WAIT DURATION(t); END WAIT; MCzasPrzebywaniaSMO3 := SimTime -klient.CzasWeDoKol; OUTPUT("Klient obsluzony w 3 gniezdzie"); INC(MKolej3W); IF (ASK klient TO P3)>= 50.0 ASK klient TO ZmienPstwo; ASK KolejkaZa TO Dodaj(klient); ELSE MCzasPrzebywania := SimTime-klient.CzasWe; DISPOSE(klient); OUTPUT("!KLIENT POZA SYSTEMEM!"); END IF; DEC(IloscZajetych); DEC(MZajKanalSMO3); ELSE WAIT FOR SELF TO Fire; END WAIT; END IF; END IF;
TELL SELF TO Obslugiwanie; END METHOD;
ASK METHOD ObjTerminate; BEGIN DISPOSE(Generator); END METHOD; END OBJECT;
(********SMO - ROZKLAD JEDNOSTAJNY- METODY **********) OBJECT SMOJednosObj; ASK METHOD Init (IN smoid, iloscstanow, ziarno : INTEGER; IN a,b: REAL; IN kolza:LIFOObj; IN kolprzed : LIFOObj; IN system : SystemObj); BEGIN SmoID := smoid; IloscStanowisk :=iloscstanow; IloscZajetych := 0; A :=a; B :=b; KolejkaPrzed :=kolprzed; KolejkaZa :=kolza; System := system; NEW(Generator); ASK Generator TO SetSeed(ziarno); END METHOD;
TELL METHOD Obslugiwanie; VAR klient : KlientObj; t: REAL; BEGIN IF IloscStanowisk > IloscZajetych IF (ASK KolejkaPrzed TO numberIn) >0 OUTPUT("Klient w SMO2"); INC(MZajKanalSMO2);
INC(IloscZajetych); klient := ASK KolejkaPrzed TO Remove; Interrupt(klient, "Niecierpliwi"); t := ABS(ASK Generator TO UniformReal(A,B)); WAIT DURATION(t); END WAIT; MCzasPrzebywaniaSMO2 := SimTime- klient.CzasWeDoKol; MCzasPrzebywania := SimTime -klient.CzasWe; OUTPUT("Klient obsluzony w 2 gniezdzie"); INC(MKolej2W); IF (ASK klient TO P2)>= 80.0 ASK klient TO ZmienPstwo; ASK KolejkaZa TO Dodaj(klient); ELSE MCzasPrzebywania := SimTime-klient.CzasWe; DISPOSE(klient); OUTPUT("!KLIENT POZA SYSTEMEM!"); END IF; DEC(IloscZajetych); DEC(MZajKanalSMO2); ELSE WAIT FOR SELF TO Fire; END WAIT; END IF; END IF;
TELL SELF TO Obslugiwanie; END METHOD;
ASK METHOD ObjTerminate; BEGIN DISPOSE(Generator); END METHOD; END OBJECT;
OUTPUT("Parametr nr 1 dla SMO o rozkladzie Jednostajnym:"); INPUT(a); OUTPUT("Parametr nr 2 dla SMO o rozkladzie Jednostajnym:"); INPUT(b);
OUTPUT("Parametr nr 1 dla SMO o rozkladzie Trojkatnym(minimum): "); OUTPUT("Parametr 'k' dla generatora o rozkladzie Erlanga: "); INPUT(g1); OUTPUT("Parametr 'lambda' dla generatora o rozkladzie Erlanga: "); INPUT(g2);
OUTPUT("Parametr nr 1 dla SMO o rozkladzie Normalnym: "); INPUT(r); OUTPUT("Parametr nr 2 dla SMO o rozkladzie Normalnym: "); INPUT(i);
INPUT(j); OUTPUT("Parametr nr 2 dla SMO o rozkladzie Trojkatnym: "); INPUT(k); OUTPUT("Parametr nr 3 dla SMO o rozkladzie Trojkatnym(maximum): "); INPUT(l);
OUTPUT("-------------------------------------------------------------------"); OUTPUT("P O C Z A T E K S Y M U L A C J I"); OUTPUT("-------------------------------------------------------------------");
NEW(System); ASK System TO Init(maxzgl+1,Kolejka1,Kolejka2,Kolejka3,Gen,SMO1,SMO2,SMO3,trojk, j,k,l,r,i,a,b,g1, g2, dlkol2,z); ASK System TO Rozpocznij; StartSimulation; StopSimulation; M1:=GETMONITOR(MCzasPrzebywania,RStatObj); M2:=GETMONITOR(MCzasPrzebywaniaSMO1,RStatObj); M3:=GETMONITOR(MCzasPrzebywaniaSMO2,RStatObj); M4:=GETMONITOR(MCzasPrzebywaniaSMO3,RStatObj); M5:=GETMONITOR(MZajKanalSMO1,ITimedStatObj); M6:=GETMONITOR(MZajKanalSMO2,ITimedStatObj); M7:=GETMONITOR(MZajKanalSMO3,ITimedStatObj); M8:=GETMONITOR(MKolej1Z,ITimedStatObj); M9:=GETMONITOR(MKolej2Z,ITimedStatObj); M10:=GETMONITOR(MKolej3Z,ITimedStatObj); M12:=GETMONITOR(MKolej1W, ITimedStatObj); M13:=GETMONITOR(MKolej2W, ITimedStatObj); M14:=GETMONITOR(MKolej3W, ITimedStatObj); M11:=GETMONITOR(MNiecierpli,ITimedStatObj); OUTPUT(" "); OUTPUT("-------------------------------------------------------------------"); OUTPUT("S T A T Y S T Y K I"); OUTPUT("-------------------------------------------------------------------"); OUTPUT("Sr czas przebywania zgloszenia w systemie : ",ASK M1 TO Mean,"; Odchylenie standardowe: ",ASK M1 TO StdDev); OUTPUT("Sr czas przebywania zgloszenia w SMO1 : ",ASK M2 TO Mean,"; Odchylenie standardowe: ", ASK M2 TO StdDev); OUTPUT("Sr czas przebywania zgloszenia w SMO2 : ",ASK M3 TO Mean,"; Odchylenie standardowe: ", ASK M3 TO StdDev); OUTPUT("Sr czas przebywania zgloszenia w SMO3 : ",ASK M4 TO Mean,"; Odchylenie standardowe: ", ASK M4 TO StdDev); OUTPUT("-------------------------------------------------------------------"); OUTPUT("Sr liczba zajetych kanalow w SMO1 : ",ASK M5 TO Mean,"; Odchylenie standardowe: ", ASK M5 TO StdDev); OUTPUT("Sr liczba zajetych kanalow w SMO2 : ",ASK M6 TO Mean,"; Odchylenie standardowe: ", ASK M6 TO StdDev); OUTPUT("Sr liczba zajetych kanalow w SMO3 : ",ASK M7 TO Mean,"; Odchylenie standardowe: ", ASK M7 TO StdDev); OUTPUT("-------------------------------------------------------------------"); OUTPUT("Sr liczba zgloszen w kolejce FIFO : ",ASK M8 TO Mean,"; Odchylenie standardowe: ", ASK M8 TO StdDev); OUTPUT("Sr liczba zgloszen w kolejce LIFO : ",ASK M9 TO Mean,"; Odchylenie standardowe: ", ASK M9 TO StdDev); OUTPUT("Sr liczba zgloszen w kolejce priorytetowej : ",ASK M10 TO Mean,"; Odchylenie standardowe: ", ASK M10 TO StdDev);
|
ASK METHOD ZmienPstwo; ASK METHOD ZmienKolejkaID(IN kolejkaid : INTEGER); TELL METHOD Niecierpliwi; ASK METHOD ZmienCzasWeDoKol (IN czas : REAL); END OBJECT;
(****OBIEKT KOLEJKA FIFO*******) FIFOObj = OBJECT(QueueObj) Smo : SMONormalObj; Klient: KlientObj;
ASK METHOD Init (IN smo : SMONormalObj); ASK METHOD Dodaj(IN klient : KlientObj); ASK METHOD Usun (IN klient : KlientObj); END OBJECT;
(********OBIEKT KOLEJKA LIFO*************) LIFOObj = OBJECT(StackObj) Smo: SMOJednosObj; Klient : KlientObj; Dlugosc : INTEGER;
ASK METHOD Init(IN dl : INTEGER; IN smo : SMOJednosObj); ASK METHOD Dodaj (IN klient: KlientObj); ASK METHOD Usun (IN klient : KlientObj); END OBJECT;
(*******OBIEKT KOLEJKA PRIORYTETOWA*******) PriorytObj = OBJECT(RankedObj) Smo : SMOTriangleObj; Klient : KlientObj;
ASK METHOD Init (IN smo : SMOTriangleObj); ASK METHOD Dodaj (IN klient: KlientObj); ASK METHOD Usun (IN klient : KlientObj); OVERRIDE ASK METHOD Rank(IN k1, k2 : ANYOBJ):INTEGER; END OBJECT;
(*******OBIEKT SMO - ROZKLAD NORMALNY**********) SMONormalObj = OBJECT(TriggerObj) System : SystemObj; KolejkaPrzed : FIFOObj; KolejkaZa1 : LIFOObj; KolejkaZa2 : PriorytObj; Generator : RandomObj; Trojk : SMOTriangleObj; SmoID : INTEGER; IloscStanowisk : INTEGER; IloscZajetych : INTEGER; R,I : REAL;
ASK METHOD Init(IN smoid, iloscstanow, ziarno : INTEGER; IN r,i : REAL; IN kolza1 :LIFOObj; IN kolza2 : PriorytObj; IN kolprzed : FIFOObj; IN system : SystemObj; IN trojk : SMOTriangleObj); TELL METHOD Obslugiwanie; OVERRIDE ASK METHOD ObjTerminate; END OBJECT;
NEW(smo2); NEW(smo3); Kol1:=kol1; Kol2:=kol2; Kol3:=kol3; Smo1:=smo1; Smo2:=smo2; Smo3:=smo3; Gen := gen; MaxZglosz:=maxzgl; IloscWygen:=0;
ASK Kol1 TO Init(smo1); ASK Kol2 TO Init(dlkol2, smo2); ASK Kol3 TO Init(smo3); ASK Gen TO Init(kol3, kol2, kol1, ASK SELF TO UniformInt (1, 100) ,ASK SELF TO UniformReal(1.0,5.0), ASK SELF TO UniformInt(5,15),SELF); ASK Smo1 TO Init(1,2, ASK SELF TO UniformInt(1,100),r,i, kol2, kol3, kol1, SELF, trojk ); ASK Smo2 TO Init(2,3, ASK SELF TO UniformInt(1,100),a,b, kol2, kol2,SELF); ASK Smo3 TO Init(3,4, ASK SELF TO UniformInt(1,100),j,k,l, kol1, kol3, SELF); END METHOD;
ASK METHOD Rozpocznij; BEGIN TELL Gen TO MakeKlient; TELL Smo1 TO Obslugiwanie; TELL Smo2 TO Obslugiwanie; TELL Smo3 TO Obslugiwanie; END METHOD;
ASK METHOD ZwiekszW; BEGIN INC(IloscWygen); END METHOD;
ASK METHOD ObjTerminate; BEGIN DISPOSE(Kol1); DISPOSE(Kol2); DISPOSE(Kol3); DISPOSE(Gen); DISPOSE(Smo1); DISPOSE(Smo2); DISPOSE(Smo3); END METHOD; END OBJECT;
(*********KLIENT- METODY **********) OBJECT KlientObj; ASK METHOD Init (IN ziarno, prior : INTEGER; IN j,k : REAL; IN kolfifo : FIFOObj; IN kollifo : LIFOObj; IN kolprio: PriorytObj); BEGIN SetSeed (ziarno); PriorytKlienta := prior; J := j; K := k; P1 := ASK SELF TO UniformReal(1.0, 100.0); P2 := ASK SELF TO UniformReal(1.0, 100.0); P3 := ASK SELF TO UniformReal(1.0, 100.0); KolejkaFifo := kolfifo; KolejkaLifo := kollifo; KolejkaPrio := kolprio; CzasWe := SimTime; END METHOD;
(********KOLEJKA LIFO- METODY ********) OBJECT LIFOObj; ASK METHOD Init(IN dl : INTEGER; IN smo : SMOJednosObj); BEGIN Smo:= smo; Dlugosc := dl; END METHOD;
ASK METHOD Dodaj (IN klient: KlientObj); BEGIN IF numberIn < Dlugosc Add (klient); ASK klient TO ZmienCzasWeDoKol(SimTime); ASK klient TO ZmienKolejkaID(2); OUTPUT("Klient w kolejce LIFO"); TELL klient TO Niecierpliwi; INC(MKolej2Z); ASK Smo TO Release; END IF; END METHOD;
ASK METHOD Usun (IN klient: KlientObj); BEGIN ASK SELF TO RemoveThis(klient); DISPOSE(klient); DEC(MKolej2Z); END METHOD; END OBJECT; (*******KOLEJKA PRIORYTETOWA- METODY *******) OBJECT PriorytObj; ASK METHOD Init ( IN smo: SMOTriangleObj); BEGIN Smo :=smo; END METHOD;
ASK METHOD Dodaj(IN klient: KlientObj); BEGIN Add(klient); ASK klient TO ZmienCzasWeDoKol(SimTime); ASK klient TO ZmienKolejkaID(3); OUTPUT("Klient w kolejce PRIORYTETOWEJ"); TELL klient TO Niecierpliwi; INC(MKolej3Z); ASK Smo TO Release; END METHOD; ASK METHOD Usun (IN klient : KlientObj); BEGIN ASK SELF TO RemoveThis(klient); DISPOSE (klient); DEC (MKolej3Z); END METHOD; ASK METHOD Rank (IN k1, k2 : ANYOBJ):INTEGER; VAR klient1, klient2 :KlientObj; BEGIN klient1 := k1; klient2 := k2; IF klient1.PriorytKlienta > klient2.PriorytKlienta RETURN -1; ELSIF klient1.PriorytKlienta = klient2.PriorytKlienta RETURN 0; ELSE RETURN 1; END IF; END METHOD; END OBJECT; (******SMO - ROZKLAD NORMALNY- METODY **********) OBJECT SMONormalObj;
ASK METHOD Init(IN smoid, iloscstanow, ziarno: INTEGER; IN r,i: REAL; IN kolza1 :LIFOObj; IN kolza2: PriorytObj; IN kolprzed : FIFOObj;IN system : SystemObj; IN trojk : SMOTriangleObj); BEGIN SmoID :=smoid; Trojk := trojk; IloscStanowisk :=iloscstanow; IloscZajetych:=0; I:= i; R:=r; KolejkaPrzed := kolprzed; KolejkaZa1 := kolza1; KolejkaZa2 := kolza2; System := system; NEW(Generator); ASK Generator TO SetSeed(ziarno); END METHOD;
TELL METHOD Obslugiwanie; VAR klient: KlientObj; t : REAL; BEGIN IF IloscStanowisk > IloscZajetych IF (ASK KolejkaPrzed TO numberIn) > 0 OUTPUT("Klient w SMO1"); INC(MZajKanalSMO1);
INC(IloscZajetych); klient := ASK KolejkaPrzed TO Remove; Interrupt(klient,"Niecierpliwi"); t := ABS(ASK Generator TO Normal(R,I)); WAIT DURATION(t); END WAIT; MCzasPrzebywaniaSMO1 := SimTime-klient.CzasWeDoKol; OUTPUT("Klient obsluzony w 1 gniezdzie"); INC(MKolej1W); IF klient.P1 >= 50.0 WHILE KolejkaZa1.numberIn = KolejkaZa1.Dlugosc WAIT FOR Trojk TO Fire(); END WAIT; END WHILE; ASK KolejkaZa1 TO Dodaj(klient); ELSE ASK KolejkaZa2 TO Dodaj(klient); END IF; DEC(IloscZajetych); DEC(MZajKanalSMO1); ELSE WAIT FOR SELF TO Fire; END WAIT; END IF; END IF;
TELL SELF TO Obslugiwanie; END METHOD;
ASK METHOD ObjTerminate; BEGIN DISPOSE(Generator); END METHOD; END OBJECT; (******GENERATOR - ROZKLAD ERLANGA- METODY *********) OBJECT GeneratorErlangObj; ASK METHOD Init (IN kolejkaprior :PriorytObj; IN kolejkalifo : LIFOObj; IN kolejkafifo: FIFOObj; IN ziarno : INTEGER; IN g1: REAL; IN g2 : INTEGER; IN system: SystemObj); BEGIN Kolejka := kolejkalifo; KolejkaFIFO:=kolejkafifo; KolejkaPrior:= kolejkaprior; SetSeed(ziarno); System:=system; G1 :=g1; G2 :=g2; END METHOD;
TELL METHOD MakeKlient; VAR t: REAL; klient1,klient2,klient3 : KlientObj; BEGIN WHILE System.IloscWygen < System.MaxZglosz-1 t := ABS(ASK SELF TO Erlang(G1, G2)); WAIT DURATION(t); END WAIT; NEW(klient1); ASK System TO ZwiekszW; ASK klient1 TO Init(ASK SELF TO UniformInt (1, 100), ASK SELF TO UniformInt(1, 100), ASK SELF TO UniformReal(1.0, 10.0), ASK SELF TO UniformReal(1.0, 10.0),KolejkaFIFO, Kolejka, KolejkaPrior); ASK KolejkaFIFO TO Dodaj(klient1);
END WHILE; END METHOD; END OBJECT;
VAR System : SystemObj; Kolejka1 : FIFOObj; Kolejka2 : LIFOObj; Kolejka3 : PriorytObj; SMO1 : SMONormalObj; SMO2 : SMOJednosObj; SMO3, trojk : SMOTriangleObj; Gen : GeneratorErlangObj; maxzgl : INTEGER; dlkol2, z : INTEGER; j,k,l : REAL; r,i : REAL; a,b,g1 : REAL; g2 : INTEGER; M1,M2,M3,M4 : RStatObj; M5,M6,M7,M8,M9,M10,M11,M12,M13,M14 : ITimedStatObj; key : CHAR;
BEGIN REPEAT OUTPUT("-------------------------------"); OUTPUT("Parametry symulacji"); OUTPUT("-------------------------------"); OUTPUT("Liczba klientow: "); INPUT(maxzgl); OUTPUT("Dlugosc kolejki:"); INPUT(dlkol2); OUTPUT("-------------------------------------------------------------------"); OUTPUT("Prawdopodobienstwo obslugi zgloszenia w SMO1: ",ASK M12 TO Mean / ASK M8 TO Mean); OUTPUT("Prawdopodobienstwo obslugi zgloszenia w SMO2: ",ASK M13 TO Mean / ASK M9 TO Mean); IF (ASK M10 TO Mean) > 0.0 OUTPUT("Prawdopodobienstwo obslugi zgloszenia w SMO3: ",ASK M14 TO Mean / ASK M10 TO Mean); ELSE OUTPUT("Prawdopodobienstwo obslugi zgloszenia w SMO3: 0"); END IF; OUTPUT("-------------------------------------------------------------------"); OUTPUT("--------------------------------------------------"); OUTPUT("K O N I E C S Y M U L A C J I"); OUTPUT("--------------------------------------------------"); OUTPUT("Koniec programu? Tak(t)/Nie(n) "); INPUT(key); UNTIL UPPER(key)<>'N'; END MODULE.
|
7