Turlewicz Paulina podstawy symulacji

background image

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.

background image

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.

background image

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.

background image

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.

background image

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;

background image

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

background image

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

background image

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;

background image

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;

background image

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();

background image

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;

background image

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)

background image

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);

background image

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);

background image

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.


Wyszukiwarka

Podobne podstrony:
egzamin 00, WAT, SEMESTR V, podstawy symulacji, psy, symulacja, symulacja egzamin
Podstawy Symulacji sprawko
Podstawy Symulacji 1
bank-program, WAT, SEMESTR V, podstawy symulacji, projekty, PS, PSym
2008-Laboratorium-zadania, WAT, SEMESTR V, podstawy symulacji, projekty, PS, PSym
Podstawy Symulacji sprawko
PSy - Sprawozdanie, WAT, SEMESTR V, podstawy symulacji, 17 moj
I9G2S1 Wegrecki sprawozdanie, WAT, SEMESTR V, podstawy symulacji
podstawy symulacji projekt
zadania laboratoryjne, WAT, SEMESTR V, podstawy symulacji, projekty, PS, RURKU, psy lrm-20091111, la
Sprawozdanie z podstaw symulacji Konrad Czupryn
burduk,podstawy zarządzania,motywowanie i symulacja
Sprawozdanie Pauliny, Elektrotechnika, dc pobierane, Podstawy Nauk o materialach, Przydatne, Sprawka
smalec,podstawy automatyzacji L,?dania symulacyjne elementów automatyki w środowisku Matlab Simulink
podstawowe pojęcia prognozowania i symulacji na podstawie mo, Ekonometria

więcej podobnych podstron