WOJSKOWA AKADEMIA TECHNICZNA
im. Jarosława Dąbrowskiego
Prowadzący: mgr inż. Michał Kapałka
Treść zadania
Napisać program symulujący działanie sieci SMO.
Przy realizacji zadania należy określić:
Ti – zmienna losowa oznacząjaca czas pomiędzy kolejnymi napływami zgłoszeń do systemu
Oi – zmienna losowa oznacząjaca czas obsługi pojedynczego zgłoszenia w gnieździe
pi – prawdopodobieństwa przemieszczenia się zgłoszenia po danym łuku
Li – długośc kolejek poszczególnych SMO
ALi – alogrytm kolejek (w przypadku istnienia kolejki z priorytetami należy przyjąć, że zgłoszenia posiadają priorytety)
Mi – liczba stanowisk obsługi w gniazdach
Ri – ilość zgłoszeń jednocześnie napływających do systemu
Rozkłady zmiennych losowych:
Wykładniczy
Erlanga
Normalny
Jednostajny
Trójkątny
Weibulla
Długość kolejek pojedynczych SMO
ograniczone (możliwe straty)
nieograniczone
Algorytm kolejek
FIFO
LIFO
Z priorytetami
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
Sposób rozwiązania
Zadanie rozpocząłem od zrobienia dekompozycji obiektowej, w jej wyniku otrzymałem następujące obiekty:
SmoObj
SystemObj
WejscieSystemuObj
StanowiskoObj
ZgloszenieObj
Wyróżnienie takich obiektów pozwala na zbudowanie dowolnego wariantu z zadania. Wystarczy odpowiednio zainicjować poszczególne elementy, aby otrzymać odpowiedni system. Podczas inicjalizacji obiektów ustawiane są wszystkie dane tzn. typ rozkładu zmiennych losowych, dlugości kolejek, algorytmy kolejek itp.
Obiekt SystemObj posiada dostęp do każdego innego obiektu przy pomocy referencji na obiekty, znajdują się w nim także niezbędne zmienne statystyczne, które wykorzystywane są przez obiekt monitorujący. Pozwala to na oszacowanie charakterystyk granicznych systemu.
Działanie systemu rozpoczyna się od wywołania metody typu TELL Dzialaj() przez system. Jedyna co ta metoda robi, to wprowadza w ruch poszczególne SMO oraz wejścia do systemu. Robi to wywołując odpowiednio metody Work() z obiektu SmoObj oraz GenerujZgloszenia() z obiektu WejscieSystemuObj.
Metoda GenerujZgloszenia() tworzy nowe obiekty ZgloszenieObj przypisując im czas wejścia do systemu, dzięki czemu później można obliczyć średni czas przebywania zgłoszenia w systemie oraz odchylenie standardowe. Następnie zgłoszenie kierowane jest do odpowiedniego SMO za pomocą metody Idz(). Numer SMO na które jest kierowane zależy od posiadanej referencji przez wejscie systemu na obiekt SmoObj.
Metoda Work() z obiektu SmoObj wprawia w ruch stanowiska obsługi w danym SMO przy pomocy metody Obsluguj(). Obsluga trwa przez caly czas symulacji. W czasie symulacji możliwe są 2 warianty w tej metodzie: stanowisko będzie obsługiwało zgłoszenie lub czekało na nie. Jeśli nie obsługuje, to wytracany jest czas do momentu uzyskania informacji za pomocą triggera, że w kolejce pojawiło się zgłoszenie. Jak już jest obsługiwane zgłoszenie, to pobierany jest pierwszy element z kolejki, zwiększane wartości zmiennych statystycznych dotyczących ilości zajętych kanałów w danym SMO oraz całym systemie. Dane zgłoszenia zostaje także usunięte z kolejki i tym samym zmieniona zostaje wartość kolejnych zmiennych statystycznych mowiacych o długości kolejki w całym systemie oraz konkretnym SMO. Następnie w zależności od rozkładu wytracany jest pewien czas, mówiący ile dane zgłoszenie jest obsługiwane. Po tym czasie znowu zmienne statystyczne są zmieniane. Za ich pomocą i po tym momencie można już wyznaczyć wszystkie niezbędne charakterystyki dla SMO oraz systemu. Na koniec metody Obsluguj() wywoływana jest metoda Idz() z obiektu ZgloszenieObj().
Metoda Idz() odpowiada za przemieszczanie zgloszenia pomiedzy poszczegolnymi SMO oraz wyjściem z systemu. Jeśli zgłoszenie opuszcza system to ustawiany jest jego czas przebywania w nim oraz czy został obsłużony. Jeśli zgłoszenie może wejść do kolejki danego SMO, to wywoływana jest metoda Dodaj() która, pomijając to co nazwa sugeruje, ustawia także długośc kolejki oraz czas wejścia zgłoszenia do systemu.
Sposób oszacowania charakterystyk
Czas przebywania zgłoszenia w systemie
Zapisywany jest czas wygenerowania zgłoszenia, co jest równoważne z jego wejściem do systemu. Następnie przy opuszczaniu systemu, odejmowany jest czas opuszczenia od czasu wejścia. W ten sposób osiągany jest czas przebywania zgłoszenia w systemie, który jest zapisany w odpowiedniej zmiennej statystycznej.
Czas przebywania zgłoszenia w SMO
Przy wejściu do danej kolejki zapisywany czas wejścia oraz po obsłużeniu zgłoszenia czas wyjścia. Za ich pomocą robiona jest różnica i otrzymywany czas przebywania zgłoszenia w systemie.
Liczba zgłoszeń w systemie
Przez cały czas trwania symulacji zwiększana jest zmienna statystyczna IloscZgloszenWSys. Każde wejście do systemu zwiększa jej wartość o 1, każde wyjście zmniejsza o 1. Zapamiętuje ona ile było zgłoszeń w danej chwili czasu.
Liczba zgłoszeń w SMO
To samo co wyżej, tyle, że przy użyciu zmiennej IloscZgloszenSMO oraz robione lokalnie dla danego SMO
Liczba zajętych kanałów w systemie
Zwiększanie lub zmniejszanie zmiennej IloscZajetychKanalowSys przy obsługiwaniu zgłoszenia.
Liczba zajętych kanałów w SMO
Zwiększanie lub zmniejszanie zmiennej IloscZajetychKanalowSMO przy obsługiwaniu zgłoszenia.
Liczba zgłoszeń w kolejce systemu
Zwiększanie lub zmniejszanie zmiennej IloscZgloszenWKolejkach przy dodawaniu do kolejki oraz przy obsludze usuwając je z kolejki.
Liczba zgłoszeń w kolejce SMO
Zwiększanie lub zmniejszanie zmiennej DlugoscKolejki rzy dodawaniu do kolejki oraz przy obsludze usuwając je z kolejki.
Prawdopodobieństwo
obsłużenia zgłoszenia w systemie
Podzielenie ilości
obsłużonych zgłoszeń które opuściły system przez całkowitą
liczbę zgłoszeń jaka byłą w systemie.
Prawdopodobieństwo
obsłużenia zgłoszenia w SMO
Podobnie jak w punkcie
wcześniejszym, biore liczbę obsłużonych pozytywnie zgłoszeń i
dziele ją przez wszystkie zgłoszenia jakie weszły do danego SMO
Przy wykorzystaniu obiektów monitorujących obliczyłem śrędnią oraz odchylenie standardowe.
Wnioski
Zadanie to pozwoliło mi poznać metody symulacji przy wykorzystaniu języka MODSIM II. Można było poznać praktyczne zastosowanie metod typu TELL oraz ASK i różnice między nimi. Na podstawie otrzymanego programu widać wykorzystanie czasu w metodach TELL oraz brak tego w metodach ASK. W języku tym znajdują się także interesujące obiekty monitorujące. Pozwalają one na zapamiętanie wartości danej zmiennej w każdej chwili czasu „t”.
MODSIM II jest językiem zorientowanym obiektowo, dzięki czemu można było także dokonać dekompozycji obiektowej, jednakże po dokładniejszym poznaniu składni i technik tego języka oraz lepszego zrozumienia zadania, początkowa dekompozycja znacznie uległa zmianie.
MODSIM II jest także językiem pascalo-podobnym, co z mojego punktu widzenia jest jego wadą, gdyż stosowana syntaktyka jest trochę problematyczna, jednakże po dłuższym spędzeniu czasu nad tym językiem, można się do niej przeyzwyczaić i nawet ją polubić. Największym problemem składniowym w tym języku jest argument wejściowy dla metody, będący tablicą. Kompilator nie pozwala podawać tablicy jako takiej, należy stworzyć typ tablicowy, który dopiero zostanie zaakceptowany.