W O J S K O W A A K A D E M I A
T E C H N I C Z N A
SPRAWOZDANIE
Z PROGRAMU LABORATORYJNEGO
Z PRZEDMIOTU
PODSTAWY SYMULACJI
Wydział: Cybernetyka
Kierunek: Informatyka
Specjalność: Informatyczne Systemy Zarządzania
Wykonał: Paweł Bujalski
Grupa: I7E1S1
Prowadzący laboratoria: mgr inż. Michał Kapałka
Zadanie laboratoryjne
Napisać program symulujący działanie sieci SMO jak na rysunku:
Wariant I
Przy realizacji zadania należy określić:
Ti - 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;
pi - prawdopodobieństwa przemieszczenia się zgłoszenia po danym łuku;
Li - długości kolejek poszczególnych SMO;
AL.i - algorytmy kolejek (w przypadku istnienia kolejki z priorytetami należy przyjąć, że zgłoszenia posiadają priorytety);
- liczba stanowisk obsługi w gniazdach
- ilość zgłoszeń jednocześnie napływających do systemu
Rozkłady zmiennych losowych:
Wykładniczy
Erlanga
Normalny
Jednostajny
Trojkątny
Weibulla
Długości kolejek pojedynczych SMO
ograniczone (możliwe straty)
nieograniczone
Algorytm kolejek:
FIFO
LIFO
Z priorytetami
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 źró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.
Określenie zmiennych użytych w zadaniu.
W powyższym zadaniu należało zaimplementować dwa generatory o zadanym rozkładzie:
T1 - rokład weibulla
T2 - rozkład wykładniczy
W zadaniu odpowiednio Generator1Obj i Generator2Obj dla kolejek Kolejka1Obj i Kolejka2Obj. Posiadają kluczową metodę Generuj(); króra generuje klientów paczkami.
Kolejnym etap na schemacie jest zaimplementowanie poczekalni dla klientów Kolejka1Obj, Kolejka2Obj i Kolejka3Obj. Dla nich natomiast należało wybrać algorytm z jakim będą w niej przechowywani:
Kolejka1Obj - LIFO nieograniczona
Kolejka2Obj - priorytet ograniczona
Kolejka3Obj - FIFO nieograniczona
Budowa kolejek Kolejka1Obj i Kolejka3Obj jest podobna, użyto dwóch zmiennych do poźniejszego monitorowania ilość klientów w kolejkach. Głowną metodą odpowiedzialną za dodawanie zgłoszeń do kolejki jest Dodaj(IN zgl: KlientObj) , która gdy zgłoszenie zostanie dodane ustawia zmienna na czas symulacji w którym to się stalo potrzebnej do późniejszych charakterystyk. Są zliczani klienci zarówno którzy weszli do kolejki jak i Ci którym nie udało się tego zrobic.
Dla kolejki Kolejka2Obj należało przeciązyć metodę Rank : OVERRIDE ASK METHOD Rank (IN a, b : KlientObj) : INTEGER . Metoda rank musi być przykryta i uzupelniona , wartość parametru zwracającego powinna oznaczać:
`-1' - element pierwszy(a) gorszy od drugiego(b)
` 0' - elementy jednakowe
` 1' - element pierwszy(a) lepszy od drugiego(b)
Kolejnie należało zaimplementować gniazda poszczególnych kolejek. Dla nich również należało wybrac charakterystyki czasu obsługi zgłoszenia w gnieździe oraz ilość gniazd obsługi w danym gnieździe:
Gniazdo1Obj - rozkład wykładniczy i 1 gniazdo obsługi
Gniazdo2Obj - rozkład erlanga i 2 gniazda obsługi
Gniazdo3Obj - rozkład normalny i 3 gniazda obsługi
Główna metodą jest Obsluga() w której pobierane jest zgłoszenie z poszczególnej kolejki, następnie w pętli WHILE sprawdzany jest warunek czy akurat dany klient przypadkiem nie jest NULL'em i jeżeli nie to zostaje obsługiwany z zadanym czasem o zadanym dla danego gniazda rozkładem. Wychodzący klient z gniazda pierwszego i trzeciego może pójść dwoma ścieżkami. Dla obliczenia któredy ma iśc należy pod odpowiednią zmienną wylosować pewną liczbe a potem porównać z tą króra została przekazana przez metode Ustaw(...); . w zależności od tego jakie to było prawdopodobieństwo zgłoszenie jest dodawane do odpowiedniej kolejki.
Oszacowanie charakterystyk
czas przebywania zgłoszenia (średnia, odchylenie standardowe):
ASK(GETMONITOR(gniaz11.czasPrzebywania,RStatObj))Mean(); za pomocą monitorów możemy śledzić zmiany wartości wybranej zmiennej. Nasza zmienna czasPrzebywania jest liczone jako różnica pomiedzy czasem symulacji wyjscią klienta z danego gniazda a czasem w którym wszedł do kolejki. Jest to zmienna typu SREAL poniważ tylko takiego typu dane mogą być monitorowane (SREAL = LMONITORED REAL BY RstatObj;). W zadaniu należy podac wartości srednie jak i wariancje, których liczenie wymaga jedynie wpisania gotowej funkcji które posiada minitor Mean() lub Variance().
czas przebywania zgłoszenia w systemie
ASK(GETMONITOR(gniaz31.czasPrzebywaniaWsys, RStatObj)) Mean(); za pomocą zmiennej czasPrzebywaniaWsys, która jest obliczana na podstawie różnicy czasu symulacji kiedy klient opuszcza gniazdo numer 3 i nie powraca spowrotem do gniazda nr 2 tylko wychodzi z systemu i czasu w którym się pojawił.
liczbę zgłoszeń w kolejkach(średnia, odchylenie standardowe)
ASK (GETMONITOR(smo1.liczbaZadan, ITimedStatObj)) Mean() za pomocą zmiennej liczbaZadan mżemy śledzić ilość zadań w kolejkach. Zmienna ta zwiększa się o 1 gdy zgłoszenie zostanie dodane do poszczególnej kolejki.
liczbę zajętych kanałów (średnia, odchylenie standardowe)
(gniaz11.czasPracy)/(SimTime() za pomocą zmiennej czasPracy która zostaje zwiększana za każdym razen gdy gniazdo obsłuży klienta poprzez dodanie to wartości poprzedniej wartośc czasu jaki zajęło gnieździe obsłuzenie klienta. Jeżeli mamy wieciej gniazd w gnieździe to wtedy te czasy dodajemy do siebie.
liczbę zgłoszeń (średnia, odchylenie standardowe)
ASK (GETMONITOR(smo1.liczbaZgloszen, IStatObj)) Mean() podobnnie jak w przypadku wyżej z tą różnicą że zgłoszenie może zostać dodane do kolejki badź też nie.
Rozkłady użyte w zadaniu
Rozkład Weibulla
Jest 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. Może on w zależności od parametrów przypominać zarówno rozkład normalny (dla k=3.4) , jak i rozkład wykładniczy (sprowadza się do niego dla k=1). Parametr k rozkładu określa zachowanie prawdopodobieństwa awarii (śmierci) w czasie:
dla k<1 prawdopodobieństwo awarii (śmierci) maleje z czasem. W przypadku modelowania awarii urządzenia sugeruje to, że egzemplarze mogą posiadać wady fabryczne i powoli wypadają z populacji.
dla k=1 (rozkład wykładniczy) prawdopodobieństwo jest stałe. Sugeruje to, że awarie mają charakter zewnętrznych zdarzeń losowych.
dla k>1 prawdopodobieństwo rośnie z czasem. Sugeruje to zużycie części z upływem czasu jako główną przyczynę awaryjności.
Parametr λ można zinterpretować jako czas po którym zginie
1-1/e≈63,2% osobników.
Gęstość prawdopodobieństwa:
Dystrybuanta:
Rozkład Erlanga
Jest to ciągły rozkład prawdopodobieństwa, związany z rozkładem wykładniczym i rozkładem gamma. Rozkład Erlanga został opracowany przez A. K. Erlanga do szacowania liczby rozmów telefonicznych, łączonych jednocześnie przez operatora w ręcznej centrali telefonicznej. Później uwzględniono również czas oczekiwania w kolejce. Obecnie rozkład ten znalazł też zastosowanie w teorii procesów stochastycznych.
Gęstość prawdopodobieństwa
Dystrybuanta
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.
Dystrybuanta tego rozkładu to prawdopodobieństwo, że obiekt jest w stanie Y.
Innymi słowy, jeżeli w jednostce czasu ma zajść 1/λ niezależnych zdarzeń, to rozkład wykładniczy opisuje odstępy czasu pomiędzy kolejnymi zdarzeniami.
Funkcja charakterystyczna:
Dystrybuanta:
Gęstość Prawdopodobieństwa :
Rozkład Normalny
Rozkład normalny, zwany też rozkładem Gaussa, lub krzywą dzwonową, jest jednym z najważniejszych rozkładów prawdopodobieństwa. Odgrywa ważną rolę w statystycznym opisie zagadnień przyrodniczych, przemysłowych, medycznych, socjalnych itp.
Przyczyną jest jego popularność w naturze. Jeśli jakaś wielkość jest sumą lub średnią bardzo wielu drobnych losowych czynników, to niezależnie od rozkładu każdego z tych czynników, jej rozkład będzie zbliżony do normalnego, stąd można go bardzo często zaobserwować w danych. Ponadto rozkład normalny ma interesujące właściwości matematyczne, dzięki którym oparte na nim metody statystyczne są dość proste obliczeniowo.
Funkcja gęstości:
Dystrybuanta:
Kod programu.
W pliku.
Wnioski
Zadanie to pozwoliło mi poznać metody symulacji przy wykorzystaniu języka MODSIM II. Monitorowanie zmiennych w MODSIMIE polega na ścisłym powiązaniu pewnych zachowań z operacjami dostępu do zmiennych. Powiązanie to ma charakter ukryty i automatyczny. MODSIM dostarcza 4 podstawowe typy monitorów statycznych typów liczbowych, tylko takie typy mogą być monitorowane. Podstawowymi metodami użytymi w projekcie są metody TELL, WAIT i ASK. Dwie pierwsze są związane z upływem czasu a trzecia jest wykonywana natychmiast bez wytrącania czasu symulacji.
SMO
SMO
SMO
p1
p2
T1
T2
O1
O2
O3