WOJSKOWA AKADEMIA
TECHNICZNA
SPRAWOZDANIE
Laboratorium Podstaw Symulacji
Prowadzący: dr inż. Jarosław Rulka
Wykonała: Paulina Turlewicz
Grupa: I8G2S1
Numer na liście: 15
Data: 31.01.2011r.
Zadanie laboratoryjne numer 1
Napisać program symulujący działanie 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óką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 wejściowe i wyniki odczytywane/zapisywane z/do pliku.
Program powinien działać w trybie z i bez komunikatów ekranowych.
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.
Zadanie zrealizować w języku MODSIM II.
Obliczenie danych potrzebnych do rozwiązania zadania:
•
rozkład zmiennych Tj: (nrDz + i) mod 6 + 1
T1 = (15+1)mod6 + 1 = 4 + 1 = 5 → rozkład trójkątny
T2 = (15+2)mod6 + 1 = 5 + 1 = 6 → rozkład Weibulla
•
rozkład zmiennych Oi: (nrDz + i + 1) mod 6 + 1
O1 = (15 + 1 + 1)mod6 + 1 = 5 + 1 = 6 → rozkład Weibulla
O2 = (15 + 2 + 1)mod6 + 1 = 0 + 1 = 1 → rozkład wykładniczy
O3 = (15 + 3 + 1)mod6 + 1 = 1 + 1 = 2 → rozkład Erlanga
•
długość kolejki i-tego SMO Li: (nrDz + i) mod 2 + 1
L1 = (15+1)mod2 + 1 = 0 + 1 = 1 → ograniczona (możliwe straty)
L2 = (15+2)mod2 + 1 = 1 + 1 = 2 → nieograniczona
L3 = (15+3)mod2 + 1 = 0 + 1 = 1 → ograniczona (możliwe straty)
•
algorytmy kolejek ALi: (nrDz + i + 2) mod 3 + 1
AL1 = (15 + 1 + 2)mod3 + 1 = 0 + 1 = 1 → FIFO
AL2 = (15 + 2 + 2)mod3 + 1 = 1 + 1 = 2 → LIFO
AL3 = (15 + 3 + 2)mod3 + 1 = 2 + 1 = 3 → z priorytetami
•
wielkość paczki zgłoszeń j-tego strumienia Rj = (nrDz + i + 5) mod 3 + 1
R1 = (15 + 1 + 5)mod3 + 1 = 0 + 1 = 1 → 1
R2 = (15 + 2 + 5)mod3 + 1 = 1 + 1 = 2 → 2
•
liczba stanowisk obsługi w gniazdach Mi = (nrDz + i + 2) mod 4 + 1
M1 = (15 + 1 + 2)mod4 + 1 = 2 + 1 = 3 → 3
M2 = (15 + 2 + 2)mod4 + 1 = 3 + 1 = 4 → 4
M3 = (15 + 3 + 2)mod4 + 1 = 0 + 1 = 1 → 1
•
klienci niecierpliwi w SMOi : Ni = (nrDz + i) mod 4
N1 = (15 + 1) mod4 = 0 → 0
N2 = (15 + 2) mod4 = 1 → 1
N3 = (15 + 3) mod4 = 2 → 2
Opis metody wyznaczania charakterystyk:
•
Rozkład trójkątny
Rozkład trójkątny to ciągły rozkład prawdopodobieństwa zmiennej losowej.
Gęstość prawdopodobieństwa rozkładu trójkątnego można wyrazić jako:
gdzie:
σ – odchylenie standardowe, obliczane wzorem
μ – wartość średnia
•
Rozkład Weibulla
Rozkład Weibulla to ciągły rozkład prawdopodobieństwa często stosowany w analizie przeżycia do
modelowania sytuacji, gdy prawdopodobieństwo śmierci/awarii zmienia się w czasie.
Gęstość prawdopodobieństwa rozkładu Weibulla można wyrazić jako:
gdzie:
λ > 0 parametr skali
k>0 parametr kształtu
•
Rozkład wykładniczy
Rozkład wykładniczy to rozkład zmiennej losowej opisujący sytuację, w której obiekt może przyjmować
stany X i Y, przy czym obiekt w stanie X może ze stałym prawdopodobieństwem przejść w stan Y w
jednostce czasu. Prawdopodobieństwo wyznaczane przez ten rozkład to prawdopodobieństwo przejścia ze
stanu X w stan Y w czasie δt.
Gęstość prawdopodobieństwa rozkładu wykładniczego można wyrazić jako:
gdzie :
λ > 0 odwrotność parametru skali
•
Rozkład Erlanga
Rozkład Erlanga – ciągły rozkład prawdopodobieństwa, związany z rozkładem wykładniczym i rozkładem
gamma.
Gęstość prawdopodobieństwa rozkładu Erlanga można wyrazić jako:
gdzie:
λ > 0 parametr skali
k>0 parametr kształtu
Opis obiektów użytych do rozwiązania zadania:
KlientObj – obiekt reprezentujący klienta
Kolejka1Obj – obiekt reprezentujący pierwszą kolejkę (ograniczona, FIFO)
Kolejka2Obj – obiekt reprezentujący drugą kolejkę (nieograniczona, LIFO)
Kolejka3Obj – obiekt reprezentujący trzecią kolejkę (ograniczona, priorytetowa)
Generator1Obj – obiekt symulujący zgłoszenia do kolejki pierwszej
Generator2Obj – obiekt symulujący zgłoszenia do kolejki drugiej
Gniazdo1Obj – obiekt reprezentujący gniazdo pierwsze
Gniazdo2Obj – obiekt reprezentujący gniazdo drugie
Gniazdo3Obj – obiekt reprezentujący gniazdo trzecie
W każdym obiekcie, który umożliwia generowanie losowego czasu obsługi lub losowego czasu generacji
zgłoszeń, znajduje się obiekt klasy RandomObj pozwalający na generowanie zmiennych losowych o
zadanych w poleceniu rozkładach.
Kod programu:
MAIN MODULE PSproj;
FROM SimMod IMPORT StartSimulation,SimTime,TriggerObj;
FROM IOMod IMPORT ReadKey;
FROM StatMod IMPORT TSINTEGER,SINTEGER,SREAL,RStatObj,IStatObj,ITimedStatObj;
FROM GrpMod IMPORT RankedObj,QueueObj,StackObj;
FROM RandMod IMPORT RandomObj;
TYPE
KlientObj=OBJECT
{obiekt reprezentujacy klienta}
czasS:REAL;
{czas pierwszego pojawienia się klienta}
czasWejsciaK:REAL;
{czas pojawienia się klienta w SMO}
priorytet:REAL;
{priorytet ustawiony dla klienta}
ASK METHOD ustawCzasK(IN cz:REAL);
{ustaw czas w kolejce}
ASK METHOD getCzas():REAL;
ASK METHOD ObjInit();
{inicjalizaja obiektu}
ASK METHOD zwrocCzasS():REAL;
ASK METHOD UstawPriorytet(IN p:REAL);
END OBJECT;
Kolejka1Obj=OBJECT(QueueObj[ANYOBJ:KlientObj]) {kolejka FIFO ograniczona}
iloscMiejsc:INTEGER;
{ilosc miejsc w kolejce}
wolneMiejsca:INTEGER;
{ilosc wolnych miejsc w kolejce}
iloscZgloszen:SINTEGER; {ilosc wszystkich zgloszen}
semafor:TriggerObj;
iloscZadan:TSINTEGER;
{ilosc zadan w kolejce}
ASK METHOD Ustaw(IN lm:INTEGER);
{ustawienie ilosci miejsc w kolejce}
ASK METHOD CzyPelna():BOOLEAN;
{sprawdzenie czy kolejka jest juz pelna}
ASK METHOD Dodaj(IN Zgl: KlientObj):BOOLEAN;
ASK METHOD Pobierz():KlientObj; {metoda wywolywana przez gniazdo w celu obsługi klienta}
END OBJECT;
Kolejka2Obj=OBJECT(StackObj[ANYOBJ:KlientObj]) {kolejka LIFO nieograniczona}
iloscZgloszen:SINTEGER;
iloscZadan:TSINTEGER;
ASK METHOD ObjInit();
ASK METHOD Dodaj(IN Zgl: KlientObj);
ASK METHOD Pobierz():KlientObj;
END OBJECT;
Kolejka3Obj=OBJECT(RankedObj[ANYOBJ:KlientObj]) {kolejka priorytetowa ograniczona}
iloscMiejsc:INTEGER;
{ilosc miejsc w kolejce}
wolneMiejsca:INTEGER;
{ilosc wolnych miejsc w kolejce}
iloscZgloszen:SINTEGER; {ilosc wszystkich zgolszen}
semafor:TriggerObj;
iloscZadan:TSINTEGER;
{ilosc zadan w kolejce}
ASK METHOD Ustaw(IN lm:INTEGER);
ASK METHOD CzyPelna():BOOLEAN;
ASK METHOD Dodaj(IN Zgl: KlientObj):BOOLEAN;
ASK METHOD Pobierz():KlientObj;
OVERRIDE ASK METHOD Rank (IN a, b : KlientObj) : INTEGER;
END OBJECT;
Gniazdo3Obj=OBJECT
mean:REAL;
{paramerty rozkladu}
k:INTEGER;
zablokowane:BOOLEAN;
smo1:Kolejka1Obj;
{referencje do kolejek}
smo2:Kolejka2Obj;
smo3:Kolejka3Obj;
czasPrzebywania:SREAL;
czasPrzebywaniaWsys:SREAL;
iloscObsluzonych:INTEGER;
generator:RandomObj;
p2:REAL; {prawdopodobienstwo przydzielenia zgloszenia}
czasZakonczenia:REAL;
gniaz21:ANYOBJ;
gniaz22:ANYOBJ;
gniaz23:ANYOBJ;
gniaz24:ANYOBJ;
czyZajeta:BOOLEAN;
czasPracy:REAL;
ASK METHOD Ustaw(IN k1:Kolejka1Obj;IN k2:Kolejka2Obj;IN k3:Kolejka3Obj;IN m:REAL;IN kk:INTEGER;IN p:REAL;IN
gn21:ANYOBJ;IN gn22:ANYOBJ;IN gn23:ANYOBJ;IN gn24:ANYOBJ);
ASK METHOD Odblokuj();
ASK METHOD ObjInit();
TELL METHOD Obsluga();
END OBJECT;
Gniazdo1Obj=OBJECT
shape:REAL;
{rozklad Weibulla}
scale:REAL;
zablokowane:BOOLEAN;
smo1:Kolejka1Obj;
smo3:Kolejka3Obj;
czasPrzebywania:SREAL;
iloscObsluzonych:INTEGER;
generator:RandomObj;
p1:REAL; {prawdopodobienstwo gdzie pojdzie zgloszenie}
czasZakonczenia:REAL;
gniaz31:Gniazdo3Obj;
czyZajeta:BOOLEAN;
czasPracy:REAL;
ASK METHOD Ustaw(IN k1:Kolejka1Obj;IN k3:Kolejka3Obj;IN sh:REAL;IN sc:REAL;IN p:REAL;IN gn31:Gniazdo3Obj);
ASK METHOD Odblokuj();
ASK METHOD ObjInit();
TELL METHOD Obsluga();
END OBJECT;
Gniazdo2Obj=OBJECT
mean:REAL; {wykladniczy}
smo2:Kolejka2Obj;
smo3:Kolejka3Obj;
czasPrzebywania:SREAL;
iloscObsluzonych:INTEGER;
generator:RandomObj;
gniaz31:Gniazdo3Obj;
{kto później będzie obsugiwal}
czasZakonczenia:REAL;
czyZajeta:BOOLEAN;
czasPracy:REAL;
ASK METHOD Ustaw(IN k2:Kolejka2Obj;IN k3:Kolejka3Obj;IN m:REAL;IN gn31:Gniazdo3Obj);
ASK METHOD ObjInit();
TELL METHOD Obsluga();
END OBJECT;
Generator1Obj=OBJECT
min:REAL;
mode:REAL;
max:REAL;
generator:RandomObj;
smo1:Kolejka1Obj;
czasZakonczenia:REAL;
gniaz11:Gniazdo1Obj;
gniaz12:Gniazdo1Obj;
gniaz13:Gniazdo1Obj;
ASK METHOD Ustaw(IN k:Kolejka1Obj;IN mi:REAL;IN mo: REAL; IN ma: REAL;IN czas:REAL;IN gn11:Gniazdo1Obj;IN
gn12:Gniazdo1Obj;IN gn13:Gniazdo1Obj);
ASK METHOD ObjInit(); {konstruktor}
TELL METHOD Generuj();
END OBJECT;
Generator2Obj=OBJECT
shape:REAL;
scale:REAL;
generator:RandomObj;
smo2:Kolejka2Obj;
czasZakonczenia:REAL;
gniaz21:Gniazdo2Obj;
gniaz22:Gniazdo2Obj;
gniaz23:Gniazdo2Obj;
gniaz24:Gniazdo2Obj;
ASK METHOD Ustaw(IN k:Kolejka2Obj;IN sh:REAL;IN sc:REAL;IN czas:REAL;IN gn21:Gniazdo2Obj;IN
gn22:Gniazdo2Obj;IN gn23:Gniazdo2Obj;IN gn24:Gniazdo2Obj);
ASK METHOD ObjInit(); {konstruktor}
TELL METHOD Generuj();
END OBJECT;
OBJECT KlientObj;
ASK METHOD ObjInit();
BEGIN
czasS:=SimTime();
czasWejsciaK:=0.0;
END METHOD;
ASK METHOD zwrocCzasS():REAL;
BEGIN
RETURN czasS;
END METHOD;
ASK METHOD ustawCzasK(IN cz:REAL); {czas wejscia do kolejki}
BEGIN
czasWejsciaK:=cz;
END METHOD;
ASK METHOD getCzas():REAL;
BEGIN
RETURN czasWejsciaK;
END METHOD;
ASK METHOD UstawPriorytet(IN p:REAL);
BEGIN
priorytet:=p;
END METHOD;
END OBJECT;
OBJECT Kolejka1Obj;
ASK METHOD CzyPelna():BOOLEAN;
BEGIN
IF wolneMiejsca=0
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END METHOD;
ASK METHOD Dodaj(IN Zgl: KlientObj):BOOLEAN;
BEGIN
IF wolneMiejsca>0
Add(Zgl);
wolneMiejsca:=wolneMiejsca-1;
iloscZgloszen:=iloscZgloszen+1;
iloscZadan:=iloscZadan+1;
ASK Zgl TO ustawCzasK(SimTime());
RETURN TRUE;
ELSE
iloscZgloszen:=iloscZgloszen+1;
RETURN FALSE;
END IF;
END METHOD;
ASK METHOD Pobierz():KlientObj;
BEGIN
IF wolneMiejsca<iloscMiejsc
wolneMiejsca:=wolneMiejsca+1;
iloscZadan:=iloscZadan-1;
ASK semafor TO Release;
RETURN Remove(); {usuwa obiekt i zwraca do niego referencje}
ELSE
RETURN NILOBJ;
END IF;
END METHOD;
ASK METHOD Ustaw(IN lm:INTEGER);
BEGIN
iloscMiejsc:=lm;
wolneMiejsca:=lm;
iloscZgloszen:=0;
{licznikCzasu:=0.0;}
NEW(semafor);
iloscZadan:=0;
END METHOD;
END OBJECT;
OBJECT Kolejka2Obj;
ASK METHOD ObjInit();
BEGIN
iloscZgloszen:=0;
iloscZadan:=0;
END METHOD;
ASK METHOD Dodaj(IN zgl: KlientObj);
BEGIN
Add(zgl);
ASK zgl TO ustawCzasK(SimTime());
iloscZgloszen:=iloscZgloszen+1;
iloscZadan:=iloscZadan+1;
END METHOD;
ASK METHOD Pobierz():KlientObj;
BEGIN
IF numberIn>0
RETURN Remove();
iloscZadan:=iloscZadan-1;
ELSE
RETURN NILOBJ;
END IF;
END METHOD;
END OBJECT;
OBJECT Kolejka3Obj;
ASK METHOD Rank (IN a, b : KlientObj) : INTEGER;
VAR
zgA,zgB:KlientObj;
BEGIN
zgA:=a;
zgB:=b;
IF a.priorytet>b.priorytet
RETURN 1;
END IF;
IF a.priorytet<b.priorytet
RETURN -1;
END IF;
RETURN 0;
END METHOD;
ASK METHOD CzyPelna():BOOLEAN;
BEGIN
IF wolneMiejsca=0
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END METHOD;
ASK METHOD Dodaj(IN Zgl: KlientObj):BOOLEAN;
BEGIN
IF wolneMiejsca>0
Add(Zgl);
wolneMiejsca:=wolneMiejsca-1;
iloscZgloszen:=iloscZgloszen+1;
iloscZadan:=iloscZadan+1;
ASK Zgl TO ustawCzasK
(SimTime());
RETURN TRUE;
ELSE
iloscZgloszen:=iloscZgloszen+1;
RETURN FALSE;
END IF;
END METHOD;
ASK METHOD Pobierz():KlientObj; {wysyla zgloszenie z kolejki}
BEGIN
IF wolneMiejsca<iloscMiejsc
wolneMiejsca:=wolneMiejsca+1;
iloscZadan:=iloscZadan-1;
ASK semafor TO Release;
RETURN Remove();
ELSE
RETURN NILOBJ;
END IF;
END METHOD;
ASK METHOD Ustaw(IN lm:INTEGER);
BEGIN
iloscMiejsc:=lm;
wolneMiejsca:=lm;
iloscZgloszen:=0;
{licznikCzasu:=0.0;}
NEW(semafor);
iloscZadan:=0;
END METHOD;
END OBJECT;
OBJECT Generator1Obj;
ASK METHOD ObjInit();
BEGIN
min:=0.0;
mode:=0.0;
max:=0.0;
NEW(generator);
END METHOD;
ASK METHOD Ustaw(IN k:Kolejka1Obj;IN mi:REAL;IN mo: REAL; IN ma: REAL;IN czas:REAL;IN gn11:Gniazdo1Obj;IN
gn12:Gniazdo1Obj;IN gn13:Gniazdo1Obj);
BEGIN
smo1:=k;
min:=mi;
mode:=mo;
max:=ma;
czasZakonczenia:=czas;
gniaz11:=gn11;
gniaz12:=gn12;
gniaz13:=gn13;
END METHOD;
TELL METHOD Generuj();
VAR
tmp:KlientObj;
fk:BOOLEAN;
i:INTEGER;
BEGIN
WHILE SimTime()<czasZakonczenia
NEW(tmp);
ASK tmp TO UstawPriorytet(ASK generator TO UniformReal(1.0,10.0));
fk:=ASK smo1 TO Dodaj(tmp);
TELL gniaz11 TO Obsluga();
TELL gniaz12 TO Obsluga();
TELL gniaz13 TO Obsluga();
WAIT DURATION (ASK generator TO Triangular(min,mode,max)); END WAIT;
END WHILE;
END METHOD;
END OBJECT;
OBJECT Generator2Obj;
ASK METHOD ObjInit();
BEGIN
scale:=0.0;
shape:=0.0;
NEW(generator);
END METHOD;
ASK METHOD Ustaw(IN k:Kolejka2Obj;IN sh:REAL;IN sc:REAL;IN czas:REAL;IN gn21:Gniazdo2Obj;IN
gn22:Gniazdo2Obj;IN gn23:Gniazdo2Obj;IN gn24:Gniazdo2Obj);
BEGIN
smo2:=k;
shape:=sh;
scale:=sc;
gniaz21:=gn21;
gniaz22:=gn22;
gniaz23:=gn23;
gniaz24:=gn24;
czasZakonczenia:=czas;
END METHOD;
TELL METHOD Generuj();
VAR
tmp:KlientObj;
ileNaraz:INTEGER;
i:INTEGER;
fk:BOOLEAN;
BEGIN
WHILE SimTime()<czasZakonczenia
ileNaraz:=ASK generator TO UniformInt (1,2); {wielkosc paczki zgloszen}
i:=0;
WHILE((i<ileNaraz))
NEW(tmp);
ASK tmp TO UstawPriorytet(ASK generator TO UniformReal(1.0,10.0));
ASK smo2 TO Dodaj(tmp);
i:=i+1;
END WHILE;
TELL gniaz21 TO Obsluga();
TELL gniaz22 TO Obsluga();
TELL gniaz23 TO Obsluga();
TELL gniaz24 TO Obsluga();
WAIT DURATION (ASK generator TO Weibull(shape,scale)); END WAIT;
END WHILE;
END METHOD;
END OBJECT;
OBJECT Gniazdo3Obj;
ASK METHOD ObjInit();
BEGIN
NEW(generator);
mean:=0.0;
k:=0;
zablokowane:=FALSE;
iloscObsluzonych:=0;
czasPrzebywania:=0.0;
czasPrzebywaniaWsys:=0.0;
p2:=0.0;
czyZajeta:=FALSE;
czasPracy:=0.0;
END METHOD;
ASK METHOD Ustaw(IN k1:Kolejka1Obj;IN k2:Kolejka2Obj;IN k3:Kolejka3Obj;IN m:REAL;IN kk:INTEGER;IN p:REAL;IN
gn21:ANYOBJ;IN gn22:ANYOBJ;IN gn23:ANYOBJ;IN gn24:ANYOBJ);
BEGIN
mean:=m;
k:=kk;
smo1:=k1;
smo2:=k2;
smo3:=k3;
p2:=p;
gniaz21:=gn21;
gniaz22:=gn22;
gniaz23:=gn23;
gniaz24:=gn24;
END METHOD;
ASK METHOD Odblokuj();
BEGIN
zablokowane:=FALSE;
END METHOD;
TELL METHOD Obsluga();
VAR
tmp:KlientObj;
time:REAL;
pdb:REAL;
czyDodano:BOOLEAN;
delta:REAL;
BEGIN
IF czyZajeta=FALSE;
czyZajeta:=TRUE;
pdb:=ASK generator TO Sample();
{wygenerowanie p-stwa p2}
tmp:=ASK smo3 TO Pobierz();
WHILE(tmp<>NILOBJ)
IF tmp<>NILOBJ
delta:=ASK generator TO Erlang(mean,k);
WAIT DURATION (delta); END WAIT;
czasPracy:=czasPracy+delta;
IF pdb<p2
ASK smo2 TO Dodaj(tmp);
TELL Gniazdo2Obj(gniaz21) TO Obsluga();
TELL Gniazdo2Obj(gniaz22) TO Obsluga();
TELL Gniazdo2Obj(gniaz23) TO Obsluga();
TELL Gniazdo2Obj(gniaz24) TO Obsluga();
ELSE
czasPrzebywaniaWsys:=SimTime()-tmp.zwrocCzasS();OUTPUT("W
chwili t = ", SimTime()," gniazdo numer 3 zakonczylo zadanie rozpoczete w chwili ",REALTOSTR(ASK tmp TO getCzas()));
END IF;
iloscObsluzonych:=iloscObsluzonych+1;
czasPrzebywania:=SimTime()-(ASK tmp TO getCzas());
END IF;
pdb:=ASK generator TO Sample();
tmp:=ASK smo3 TO Pobierz();
END WHILE;
{kolejk jest pusta}
czyZajeta:=FALSE;
END IF;
END METHOD;
END OBJECT;
OBJECT Gniazdo1Obj;
ASK METHOD ObjInit();
BEGIN
NEW(generator);
shape:=0.0;
scale:=0.0;
zablokowane:=FALSE;
iloscObsluzonych:=0;
czasPrzebywania:=0.0;
czyZajeta:=FALSE;
czasPracy:=0.0;
END METHOD;
ASK METHOD Ustaw(IN k1:Kolejka1Obj;IN k3:Kolejka3Obj;IN sh:REAL;IN sc:REAL;IN p:REAL;IN gn31:Gniazdo3Obj);
BEGIN
shape:=sh;
scale:=sc;
smo1:=k1;
smo3:=k3;
p1:=p;
gniaz31:=gn31;
END METHOD;
ASK METHOD Odblokuj();
BEGIN
zablokowane:=FALSE;
END METHOD;
TELL METHOD Obsluga();
VAR
tmp:KlientObj;
{do pobrania zgloszenia}
pdb:REAL;
{losowane prawdopodobienstwo}
czyDodano:BOOLEAN;
czasWejscia:REAL;
{czas wejscia zadania do kolejki}
delta:REAL;
{czas wykonania zadania/zgloszenia}
BEGIN
IF czyZajeta=FALSE
czyZajeta:=TRUE;
pdb:=ASK generator TO Sample();
IF pdb<p1
{gniazdo z blokowaniem}
zablokowane:= ASK smo1 TO CzyPelna();
IF (zablokowane)
WAIT FOR smo1.semafor TO Fire; END WAIT;
END IF;
ELSE
zablokowane:=ASK smo3 TO CzyPelna();
IF (zablokowane)
WAIT FOR smo3.semafor TO Fire; END WAIT;
END IF;
END IF;
tmp:=ASK smo1 TO Pobierz();
WHILE(tmp<>NILOBJ)
IF tmp<>NILOBJ
delta:=ASK generator TO Weibull(shape,scale);
czasPracy:=czasPracy+delta;
WAIT DURATION (delta); END WAIT;
czasWejscia:=ASK tmp TO getCzas();
IF pdb<p1
czyDodano:=ASK smo1 TO Dodaj(tmp);
ELSE
czyDodano:=ASK smo3 TO Dodaj(tmp);
iloscObsluzonych:=iloscObsluzonych+1;
IF(smo3.numberIn=1)
TELL gniaz31 TO Obsluga();
END IF;
END IF;
OUTPUT("W chwili t = ", SimTime()," gniazdo numer 1 zakonczylo zadanie
rozpoczete w chwili ",REALTOSTR(czasWejscia));
czasPrzebywania:=(SimTime()-czasWejscia);
END IF;
pdb:=ASK generator TO Sample();
IF pdb<p1
zablokowane:= ASK smo1 TO CzyPelna();
IF (zablokowane)
WAIT FOR smo1.semafor TO Fire; END WAIT;
END IF;
ELSE
zablokowane:=ASK smo3 TO CzyPelna();
IF (zablokowane)
WAIT FOR smo3.semafor TO Fire; END WAIT;
END IF;
END IF;
tmp:=ASK smo1 TO Pobierz();
END WHILE;
czyZajeta:=FALSE;
END IF;
END METHOD;
END OBJECT;
OBJECT Gniazdo2Obj;
ASK METHOD ObjInit();
BEGIN
NEW(generator);
mean:=0.0;
iloscObsluzonych:=0;
czasPrzebywania:=0.0;
czasPracy:=0.0;
END METHOD;
ASK METHOD Ustaw(IN k2:Kolejka2Obj;IN k3:Kolejka3Obj;IN m:REAL;IN gn31:Gniazdo3Obj);
BEGIN
mean:=m;
smo2:=k2;
smo3:=k3;
gniaz31:=gn31;
czyZajeta:=FALSE;
END METHOD;
TELL METHOD Obsluga();
VAR
tmp:KlientObj;
czyDodano:BOOLEAN;
delta:REAL;
BEGIN
IF czyZajeta=FALSE
czyZajeta:=TRUE;
tmp:=ASK smo2 TO Pobierz();
WHILE(tmp<>NILOBJ)
delta:= ASK generator TO Exponential(mean);
WAIT DURATION (delta); END WAIT;
czasPracy:=czasPracy+delta;
IF (tmp<>NILOBJ)
WAIT FOR smo3.semafor TO Fire; END WAIT;
OUTPUT("W chwili t = ", SimTime()," gniazdo numer 1 zakonczylo zadanie rozpoczete w chwili ",REALTOSTR(ASK tmp TO
getCzas()));
iloscObsluzonych:=iloscObsluzonych+1;
czasPrzebywania:=SimTime()-(ASK tmp TO getCzas());
czyDodano:=ASK smo3 TO Dodaj(tmp);
IF (smo3.numberIn=1)
TELL gniaz31 TO Obsluga();
END IF;
END IF;
tmp:=ASK smo2 TO Pobierz();
END WHILE;
czyZajeta:=FALSE;
END IF;
END METHOD;
END OBJECT;
VAR
smo1:Kolejka1Obj;
smo2:Kolejka2Obj;
smo3:Kolejka3Obj;
gniaz11:Gniazdo1Obj;
gniaz12:Gniazdo1Obj;
gniaz13:Gniazdo1Obj;
gniaz21:Gniazdo2Obj;
gniaz22:Gniazdo2Obj;
gniaz23:Gniazdo2Obj;
gniaz24:Gniazdo2Obj;
gniaz31:Gniazdo3Obj;
gen1:Generator1Obj;
gen2:Generator2Obj;
p1:REAL;
gmin1:REAL;
gmode1:REAL;
gmax1:REAL;
p2:REAL;
gshape2:REAL;
gscale2:REAL;
iloscMiejsc1:INTEGER;
iloscMiejsc3:INTEGER;
shape1:REAL;
{do kolejki 1}
scale1:REAL;
mean2:REAL;
{do kolejki 2}
mean3:REAL;
{parametr dla kolejki 3}
k3:INTEGER;
czasProby:REAL;
stop:CHAR;
tmp:REAL;
BEGIN
p1:=0.5;
gmin1:=1.0;
gmode1:=3.0;
gmax1:=10.0;
p2:=0.1;
gshape2:=1.0;
gscale2:=8.0;
iloscMiejsc1:=4;
iloscMiejsc3:=5;
shape1:=2.0;
{parametry dla kolejki 1}
scale1:=4.0;
mean2:=5.0;
{parametr dla kolejki 2}
mean3:=10.0;
{parametry dla kolejki 3}
k3:=2;
czasProby:=100.0;
tmp:=0.0;
stop:='0';
NEW(smo1);
NEW(smo2);
NEW(smo3);
ASK smo1 TO Ustaw(iloscMiejsc1);
ASK smo3 TO Ustaw(iloscMiejsc3);
NEW(gniaz11);
NEW(gniaz12);
NEW(gniaz13);
NEW(gniaz21);
NEW(gniaz22);
NEW(gniaz23);
NEW(gniaz24);
NEW(gniaz31);
NEW(gen1);
NEW(gen2);
ASK gniaz11 TO Ustaw(smo1, smo3, shape1, scale1, p1, gniaz31);
ASK gniaz12 TO Ustaw(smo1, smo3, shape1, scale1, p1, gniaz31);
ASK gniaz13 TO Ustaw(smo1, smo3, shape1, scale1, p1, gniaz31);
ASK gniaz21 TO Ustaw(smo2, smo3, mean2, gniaz31);
ASK gniaz22 TO Ustaw(smo2, smo3, mean2, gniaz31);
ASK gniaz23 TO Ustaw(smo2, smo3, mean2, gniaz31);
ASK gniaz24 TO Ustaw(smo2, smo3, mean2, gniaz31);
ASK gniaz31 TO Ustaw(smo1,smo2, smo3, mean3 ,k3, p2, gniaz21, gniaz22, gniaz23, gniaz24);
ASK gen1 TO Ustaw(smo1, gmin1, gmode1, gmax1, czasProby, gniaz11, gniaz12, gniaz13);
ASK gen2 TO Ustaw(smo2, gshape2, gscale2, czasProby, gniaz21, gniaz22, gniaz23, gniaz24);
TELL gen1 TO Generuj();
TELL gen2 TO Generuj();
StartSimulation();
OUTPUT( );
OUTPUT("OSZACOWANIE ZADANYCH CHARAKTERYSTYK GRANICZNYCH SYSTEMU ORAZ
POSZCZEGOLNYCH SMO");
tmp:=ASK(GETMONITOR(gniaz11.czasPrzebywania,RStatObj))Mean()
+ASK(GETMONITOR(gniaz12.czasPrzebywania,RStatObj))Mean()
+ASK(GETMONITOR(gniaz13.czasPrzebywania,RStatObj))Mean();
tmp:=tmp/3.0;
OUTPUT("Sredni czas przebywania zgloszenia w SMO 1: ",tmp);
tmp:=ASK(GETMONITOR(gniaz21.czasPrzebywania,RStatObj))Mean()
+ASK(GETMONITOR(gniaz22.czasPrzebywania,RStatObj))Mean()
+ASK(GETMONITOR(gniaz23.czasPrzebywania,RStatObj))Mean()
+ASK(GETMONITOR(gniaz24.czasPrzebywania,RStatObj))Mean();
tmp:=tmp/4.0;
OUTPUT("Sredni czas przebywania zgloszenia w SMO 2: ",tmp);
tmp:=ASK(GETMONITOR(gniaz31.czasPrzebywania,RStatObj))Mean();
{tmp:=ASK(GETMONITOR(gniaz31.czasPrzebywania,RStatObj))Variance();}
OUTPUT("Sredni czas przebywania zgloszenia w SMO 3: ",tmp);
tmp:=ASK(GETMONITOR(gniaz31.czasPrzebywaniaWsys, RStatObj)) Mean();
OUTPUT("Sredni czas przebywania zgloszenia w Systemie: ",tmp);
OUTPUT("Srednia ilosc zadan w kolejce 1: ",ASK (GETMONITOR(smo1.iloscZadan, ITimedStatObj)) Mean());
OUTPUT("Srednia ilosc zadan w kolejce 2: ", (ASK (GETMONITOR(smo2.iloscZadan, ITimedStatObj))Mean()));
OUTPUT("Srednia ilosc zadan w kolejce 3: ",(ASK (GETMONITOR(smo3.iloscZadan, ITimedStatObj)) Mean()));
tmp:=(gniaz11.czasPracy+gniaz12.czasPracy+gniaz13.czasPracy)/(SimTime());
OUTPUT("Srednia ilosc zajetych kanalow w kolejce 1 :",tmp*3.0);
tmp:=(gniaz21.czasPracy+gniaz22.czasPracy+gniaz23.czasPracy+gniaz24.czasPracy)/(SimTime());
OUTPUT("Srednia ilosc zajetych kanalow w kolejce 2 :",tmp*4.0);
tmp:=gniaz31.czasPracy/(SimTime());
OUTPUT("Srednia ilosc zajetych kanalow w kolejce 3 :",tmp*1.0);
INPUT(stop);
END MODULE.