wzorcowe sprawko


Wrocław, 20 grudnia 2006
ImiÄ™ i nazwisko: Nr indeksu:
MARCIN ROSZKOWSKI 133347
PIOTR TWARÓG 133395
MARCIN śAK 133430
Grupa: CZ 13.15-15.00
Projekt z przedmiotu  Niezawodność i diagnostyka
systemów cyfrowych 2
 System obsługi kas sklepowych
ProwadzÄ…cy:
DR INÅ›. JACEK JARNICKI
Spis Treści
Zało\enia Projektowe................................................................................................................. 3
Strumień zgłoszeń .................................................................................................................. 4
Czas obsługi ........................................................................................................................... 5
Strumień pracy pojedynczej kasy........................................................................................... 5
Symulacja ................................................................................................................................... 6
Dane wejściowe...................................................................................................................... 7
Dane wyjściowe ................................................................................................................... 10
Opis działania symulatora .................................................................................................... 12
Konwersja wyników symulacji do formatu programu SAS..................................................... 19
Skrypty programu SAS ............................................................................................................ 19
Skrypt numer 1 ..................................................................................................................... 20
Skrypt numer 2 ..................................................................................................................... 22
Skrypt numer 3 ..................................................................................................................... 25
Skrypt numer 4 ..................................................................................................................... 26
Analiza wyników symulacji ..................................................................................................... 26
System z ustalonÄ… liczbÄ… kas ................................................................................................ 27
System ze zmniejszonÄ… liczbÄ… kas........................................................................................ 30
System ze zmniejszonÄ… liczbÄ… kas w jednym okresie doby ................................................. 32
System ze zwiększoną liczbą kas ......................................................................................... 33
Wpływ uszkodzenia kas na liczbę klientów nieobsłu\onych............................................... 35
Badanie czasu obsługi w zale\ności od liczby kas............................................................... 37
Dopasowanie histogramów do wykresów zmiennych losowych......................................... 39
Badanie współczynnika niezadowolenia klientów, w zale\ności od liczby kas .................. 40
Wnioski i uwagi końcowe ........................................................................................................ 42
Bibliografia............................................................................................................................... 45
2
Zało\enia Projektowe
Problem kolejkowania jest na tyle powszechny w systemach produkcyjnych i usługowych,
\e ju\ w pierwszej połowie ubiegłego wieku została opracowana teoria obsługi masowej,
zwana równie\ teorią kolejek. Teoria zajmuje się budową modeli matematycznych, które
mo\na wykorzystać w zarządzaniu dowolnymi systemami działania, nazywanymi systemami
masowej obsługi. Przykładami takich systemów są: sklepy, porty lotnicze, podsystemy
u\ytkowania samochodów, przedsiębiorstwa transportowe, podsystemy obsługiwania
obrabiarek itp. Modele matematyczne teorii kolejek pozwalajÄ… na analityczne wyznaczenie
charakterystyk systemu, takich jak:
- procent czasu zajętości wszystkich stanowisk obsługi,
- prawdopodobieństwo, \e system nie jest pusty,
- średnia liczba klientów czekających,
- średnia liczba klientów czekających i obsługiwanych,
- średni czas czekania,
- średni czas czekania i obsługi,
- prawdopodobieństwo, \e przybywający klient czeka,
- prawdopodobieństwo, \e n klientów jest w systemie.
W projekcie zostanÄ… zaprezentowane symulacyjne metody wyznaczania charakterystyk
systemu. Rozpatrywany będzie system kas w supermarkecie z wieloma stanowiskami obsługi
i wieloma kolejkami, po jednej do ka\dego stanowiska. Dodatkowo uwzględnione zostaną
parametry niezawodnościowe całego systemu  praca ka\dego stanowiska obsługi będzie
strumieniem uszkodzeń i odnów. Celem modelu symulacyjnego będzie określenie
zachowania systemu oraz oszacowanie takiego poziomu usługi, który zapewnia minimalizację
kosztu całkowitego, który stanowi sumę dwóch składników:
- kosztu obsługi (utrzymania odpowiedniej liczby stanowisk obsługi),
- kosztu niezadowolenia klienta (czyli np. strat powstałych w wyniku przejścia klienta
do konkurencyjnego sklepu z powodu zbyt długich kolejek w analizowanym).
Poniewa\ wyznaczenie optymalnego poziomu wymagałoby zło\onych zało\eń
ekonomicznych, poszukiwana będzie jedynie minimalna ilość stanowisk obsługi, przy których
prawdopodobieństwo spędzenia przez klienta w kolejce czasu T będzie mniejsze ni\ P[%].
Rozpatrywany będzie model systemu z wieloma stanowiskami obsługi i wieloma
kolejkami, o jednej do ka\dego stanowiska, jak przedstawiono na rysunku poni\ej. Napływ
klientów będzie reprezentowany przez losowy strumień Poissona, a przydział do jednej
z kolejek realizowany będzie za pomocą deterministycznego algorytmu. Czas obsługi
pojedynczego klienta równie\ zostanie zdefiniowany za pomocą odpowiedniego rozkładu
losowego, zgodnego z postulatami teorii masowej obsługi. Obsłu\eni klienci będą generowali
strumień wyjściowy.
3
W systemie Å‚Ä…cznie znajduje siÄ™ N kas o numerach porzÄ…dkowych 1, 2, ..., N, przy
czym w ka\dej chwili t jest czynnych jest X stanowisk.
Strumień zgłoszeń
Poprzez zgłoszenie do systemu rozumiana jest chęć skasowania zakupionych przez
klienta produktów. Proces napływu klientów będzie strumieniem Poissona, w którym
prawdopodobieństwo, \e w czasie t przybędzie n klientów, jest równe:
n
t
ëÅ‚ öÅ‚
ìÅ‚ ÷Å‚
t
öÅ‚
íÅ‚Ä… Å‚Å‚
Pn(t)= Å"expëÅ‚- ÷Å‚
ìÅ‚
n! Ä…
íÅ‚ Å‚Å‚
Czas pomiędzy nadejściem dwóch kolejnych zgłoszeń w strumieniu Poissona opisany jest
rozkładem wykładniczym. Funkcja gęstości tego rozkładu dana jest wzorem:
1 t
öÅ‚
f (t)= Å"expëÅ‚ - ÷Å‚
ìÅ‚
Ä… Ä…
íÅ‚ Å‚Å‚
gdzie parametr ą ma takie samo znaczenie, jak w poprzednim wzorze, i stanowi średni czas
pomiędzy dwoma kolejnymi zgłoszeniami.
Zastosowanie rozkładu wykładniczego dla generacji strumienia wejściowego jest
praktyczne, poniewa\ posiada on właściwość braku pamięci. Oznacza to, \e
prawdopodobieństwo pojawienia się następnego klienta w ciągu najbli\szej minuty jest takie
samo niezale\nie od tego, czy poprzedni klient nadszedł 5 sekund, czy godzinę temu.
Parametr ą będzie dynamicznie zmieniany w czasie trwania symulacji w cyklu dobowym, co
ma odwzorować zmienną częstość nadchodzenia klientów o ró\nych porach dnia. Zmiany
będą miały charakter skokowy co ustalony kwant czasu (godzinę), w czasie trwania którego
ą. będzie pozostawał na stałym poziomie.
Zgłoszenia do kas będą przydzielane w oparciu o prosty i w pełni deterministyczny
algorytm. W momencie nadejścia zgłoszenia hipotetyczny klient będzie wybierał kasę, do
której kolejka jest najkrótsza, i będzie przydzielany do tej kolejki. Przy poszukiwaniu
stanowiska z najkrótszą kolejką uwzględniane będą tylko kasy czynne o numerach od 1 do X.
4
W szczególności, jeśli chocia\ jedna z kas jest bezczynna, klient zostanie obsłu\ony
natychmiast.
Czas obsługi
Teoria kolejek proponuje kilka mo\liwych rozkładów czasu obsługi, przy czym
większość z modeli uwzględnia równie\ rozkład dowolny. Najczęściej wykorzystywanym
rozkładem jest rozkład Erlanga, którego funkcja gęstości dana jest wzorem:
1 ëÅ‚ t öÅ‚
f (t)= Å"tk -1 expìÅ‚- ÷Å‚
k ìÅ‚ ÷Å‚
² Å"(k -1)! ²
íÅ‚ Å‚Å‚
Parametr k jest nazywany parametrem kształtu i pozwala manipulować kształtem
rozkładu, w szczególności dla k = 1 rozkład Erlanga jest rozkładem wykładniczym,
k "
"
a w granicy dla rozkład staje się rozkładem jednostajnym na przedziale (0, ).
Parametr ² stanowi współczynnik skali. Na ogół jako współczynnik skali u\ywany jest
parametr Ä…= 1 / ², ale program Matlab, który bÄ™dzie wykorzystywany na potrzeby symulacji,
u\ywa parametrów rozkładu w takiej właśnie postaci.
W teorii kolejek modele Erlanga to modele stochastyczne stosowane do analizy ruchu
w systemach kolejkowych, zaproponowane przez duńskiego matematyka Agnera Krarupa
Erlanga. Najczęściej są wykorzystywane w analizie ruchu w sieciach telekomunikacyjnych,
choć równie dobrze mogą słu\yć do analizy obsługi klientów w supermarkecie lub na stacji
benzynowej. Modele te pozwalają oszacować prawdopodobieństwo blokady (sytuacji gdy
klient nie mo\e być obsłu\ony) przy danych parametrach modelu. Wiedza ta mo\e posłu\yć
do doboru parametrów w sposób, który pozwoli osiągnąć wymaganą jakość usługi.
Do generowania zmiennych losowych opisanych rozkładem Erlanga u\ywana będzie
funkcja gamrnd (...), poniewa\ rozkład gamma stanowi de facto uogólnienie rozkładu
Erlanga.
Czas obsługi jest znany dopiero w momencie rozpoczęcia obsługi klienta.
Strumień pracy pojedynczej kasy
Ka\da kasa będzie pracować w strumieniu uszkodzeń i odnów. Dodatkowo
przyjmujemy zało\enie, \e kasa nieczynna (o numerze pomiędzy X+1 a N) nie mo\e ulec
awarii, ale wykonanie naprawy jest mo\liwe w dowolnej chwili. W momencie włączenia kasy
do systemu lub wykonania odnowy losowania będzie czas pracy do pierwszego uszkodzenia.
Do losowania wykorzystany będzie generator liczb spełniających warunki rozkładu Weibulla.
Funkcja gęstości w rozkładzie Weibulla opisana jest wzorem:
f (t)=  Å"ºu Å"tºu-1 Å"exp(-  Å"tºu)
Parametry  oraz ºu sÄ… u\yte w takiej samej konwencji, w jakiej u\ywa ich program
Matlab, chocia\ podobnie jak w przypadku rozkładu gamma mo\na u\yć nieco inaczej
wyra\onych współczynników. Parametr ºu jest nazywany współczynnikiem ksztaÅ‚tu, a  to
współczynnik skali.
5
Rozkład Weibulla jest często u\ywany w opisywaniu niezawodności, poniewa\
pozwala na uwzględnienie równie\ procesów starzeniowych, co rozkład wykładniczy
wyklucza. DobierajÄ…c odpowiednio parametr ksztaÅ‚tu ºu mo\emy uzyskać odpowiednio
ukÅ‚ad z malejÄ…cÄ… z czasem intensywnoÅ›ciÄ… uszkodzeÅ„ (0 < ºu < 1), staÅ‚Ä… w czasie (ºu = 1),
rosnÄ…cÄ… podliniowo (1 < ºu < 2), rosnÄ…cÄ… liniowo (ºu = 2) lub rosnÄ…cÄ… ponadliniowo
(ºu > 2).
W momencie nastąpienia uszkodzenia, czas odnowy wyznaczany będzie równie\ przy
wykorzystaniu generatora liczb losowych, spełniających rozkład Weibulla:
f (t)= µ Å"ºo Å"tºo-1 Å"exp(- µ Å"tºo)
Poniewa\ pojedyncza kasa mo\e ulec uszkodzeniu w dowolnym momencie pracy
(szczególnie wtedy, gdy obsługuje klienta), konieczne jest zamodelowanie zachowania
klientów stojących w kolejce do uszkodzonej kasy. Na potrzeby symulacji przyjęto zało\enie,
\e zgłoszenia te po prostu opuszczają system bez obsługi, co w rzeczywistości
reprezentowane byłoby przez odło\enie przez klienta pełnego koszyka i wyjście ze sklepu. W
pózniejszej analizie wyników symulacji będzie trzeba opisać charakterystykę klientów
opuszczających system bez obsługi, a przy optymalizacji systemu przydzielić im pewien stały
koszt niezadowolenia.
Symulacja
Symulacja zostanie wykonywana za pomocą programu Matlab. Symulator będzie
automatem stanów, sterowanych zdarzeniami występującymi w systemie. Za pojedyncze
zdarzenie uznawane będzie nadejście zgłoszenia w strumieniu wejściowym, opuszczenie
przez klienta stanowiska obsługi (odejście do strumienia wyjściowego) oraz uszkodzenia
i odnowy poszczególnych stanowisk obsługi. Ka\dy stan w symulacji zostanie zdefiniowany
w postaci wektora liczb całkowitych, reprezentujących ilość osób czekających w kolejce do
ka\dej z kas. W przypadku, gdy kasa jest nieczynna, oznaczana będzie charakterystyczną
wartością w odpowiadającym jej miejscu wektora (np. liczbą ujemną). W systemie jest
łącznie N stanowisk, więc wektor stanu będzie długości N. Wartości sygnalizacyjne na
poszczególnych jego pozycjach mogą być następujące:
- 0 - kasa jest czynna i sprawna, ale z pustÄ… kolejkÄ…,
- 1- kasa jest uszkodzona, ale znajduje siÄ™ z zbiorze X kas u\ywanych,
- 2 - kasa znajduje siÄ™ poza zbiorem kas u\ywanych (od X+1 do N), ale jest
sprawna,
- 3 - kasa jest uszkodzona i znajduje się poza zbiorem kas u\ywanych w określonym
momencie symulacji.
Zachodzące w systemie wydarzenia będą powodowały zmianę stanu, przy czym
dopuszczalne są następujące zmiany:
- nadejście klienta i przydział do stanowiska  inkrementacja odpowiedniego elementu
składowego wektora stanu,
- opuszczenie stanowiska obsługi  dekrementacja elementu składowego wektora,
- uszkodzenie kasy  zmiana odpowiedniego elementu wektora, odpowiadajÄ…cego
uszkodzonej kasie, na wartość sygnalizacyjną  1,
- odnowa kasy  zmiana wartości sygnalizacyjnej na odpowiedniej pozycji na wartość
0. Oznacza to, \e odnowiona kasa jest na stan bie\ący wolna. W szczególnym
6
przypadku odnowa mo\e dotyczyć elementu znajdującego się poza zbiorem X kas
aktywnych, wtedy wartość na odpowiedniej pozycji będzie nale\ało zmienić na  2.
Poniewa\ liczba kas aktywnych X będzie zmieniała się w czasie, konieczne jest
zamodelowanie tych zmian w systemie. Włączenie nowej kasy do systemu będzie
realizowane poprzez inicjalizację odpowiadającej jej pozycji w wektorze wartością
0, oznaczającą pustą kolejkę (w szczególnym przypadku  1, gdy aktywowana kasa została
w ostatnim cyklu pracy uszkodzona i od tego czasu nie nastąpiła naprawa). Jednocześnie
zmiana wartości X będzie uwzględniana przez funkcję realizującą algorytm przydziału do
kas. Wyłączenie kasy z systemu będzie realizowane przez zmianę wartości X u\ywanej przez
funkcję przydziału zgłoszeń  nowo przychodzące zgłoszenia nie będą ju\ dodawane do
kolejki do odłączanej kasy. Jednak wszystkie zgłoszenia ju\ przydzielone zostaną obsłu\one,
a po zakończeniu obsługi ostatniego pozycja w wektorze stanów odpowiadająca
dezaktywowanej kasie będzie ustawiana na  2. Je\eli moment odłączenia kasy nastąpi
w chwili, gdy stanowisko będzie uszkodzone, wówczas odpowiednia pozycja wektora stanów
będzie ustawiana na wartość sygnalizacyjną  3. Oba zdarzenia będą następować
deterministycznie, na podstawie danych wejściowych.
Nale\y zaznaczyć, \e symulacja została przeprowadzona dla okresu 365 dni. Dokonano
podziału dnia na następujące części:
okres pora dnia liczba kas
0 00:00  03:59 4
1 04:00  07:59 7
2 08:00  11:59 14
3 12:00  15:59 20
4 16:00  19:59 10
5 20:00  23:59 5
Dane wejściowe
Przed przystąpieniem do symulacji nale\y załadować parametry symulatora z pliku
wejściowego. Lokalizacja tego pliku została zdefiniowana w kodzie symulatora, w zmiennej
nazwa. Ście\ka do następującego pliku tekstowego: dane.txt, zawierającego niezbędne
informacje do przeprowadzenia symulacji została określona jako: c:\ndisc\dane.txt.
W pliku tym zostały zapisane wszystkie parametry dotyczące symulacji:
1. Liczba kas w systemie - jest to całkowita liczba kas w systemie (N)  nie ulega
zmianie podczas procesu symulacji. W programie symulatora wartość ta jest
przechowywana przez zmiennÄ… liczbaKas.
2. Wektor wartości współczynnika k w kolejnych godzinach doby  jest to tak zwany
parametr kształtu, wykorzystywany do generowania wartość czasu obsługi klienta.
Czas obsługi klienta jest generowany w symulatorze przy wykorzystaniu funkcji
gamrand(& ). W symulatorze wektor ten przechowywany jest w zmiennej
czasObslugiA.
3. Wektor wartoÅ›ci parametru ² w poszczególnych godzinach doby  parametr ² jest
współczynnikiem skali w rozkładzie Erlanga. Jest to drugi parametr obok
7
współczynnika kształtu, który jest niezbędny do skorzystania z funkcji gamrnd(& ),
wykorzystywanej do wyznaczenia czasu obsługi klienta. W symulatorze wektor ten
przechowywany jest w zmiennej czasObslugiB.
4. Wektor wartości parametru  czasu pracy do uszkodzenia - pojedyncza wartość
określa współczynnik skali w rozkładzie Weibulla. Jest wykorzystywana podczas
generowania czasu uszkodzenia kasy, przy wykorzystaniu funkcji
wblrnd(& ).W symulatorze wektor ten przechowywany jest w zmiennej
uszkodzenieA.
5. Wektor wartoÅ›ci parametru ºu czasu pracy do uszkodzenia - pojedyncza wartość
określa współczynnik kształtu w rozkładzie Weibulla. Jest to drugi parametr
wykorzystywany podczas generowania czasu uszkodzenia kasy, przy wykorzystaniu
funkcji wblrnd(& ).W symulatorze wektor ten przechowywany jest w zmiennej
uszkodzenieB.
6. Wektor wartości parametru  czasu odnowy - pojedyncza wartość określa
współczynnik skali w rozkładzie Weibulla. Jest wykorzystywana podczas
generowania czasu naprawy kasy, przy wykorzystaniu funkcji wblrnd(& ).
W symulatorze wektor ten przechowywany jest w zmiennej odnowaA.
7. Wektor wartoÅ›ci parametru ºo czasu odnowy - pojedyncza wartość okreÅ›la
współczynnik kształtu w rozkładzie Weibulla. Jest to drugi parametr wykorzystywany
podczas generowania czasu odnowy kasy, przy wykorzystaniu funkcji
wblrnd(& ).W symulatorze wektor ten przechowywany jest w zmiennej odnowaB.
8. Wektor wartości parametrów ą  skala czasu przybycia poszczególnych klientów.
Wartość tego wektora zapisywana jest w zmiennej exParam, którego długość
odpowiada liczbie części doby, na jakie została podzielona symulacja. Wektor ten jest
wykorzystywany do losowania kolejnych czasów zgłoszenia za pomocą funkcji
exprnd(..).
9. Liczba kas czynnych w poszczególnych godzinach doby. W programie symulatora
przechowywana jest w wektorze wlaczWylaczKasy, o długości odpowiadającego
liczbie części, na które została podzielona doba.
Zawartość przykładowego pliku z danymi:
10
18 18 18 18 18 18
10 10 10 10 10 10
4.208452e-10 4.208452e-10 4.208452e-10 4.208452e-10 4.208452e-10 4.208452e-10 4.208452e-10
4.208452e-10 4.208452e-10 4.208452e-10
2 2 2 2 2 2 2 2 2 2
2.18166e-6 2.18166e-6 2.18166e-6 2.18166e-6 2.18166e-6 2.18166e-6 2.18166e-6 2.18166e-6 2.18166e-6
2.18166e-6
2 2 2 2 2 2 2 2 2 2
60 30 14 9.5 20 40
2 4 7 10 5 3
Poszczególne wartości zmiennych zapisywane są w kolejnych wierszach pliku.
Średni czas obsługi klienta wynosi 3 minuty (180 sekund), poniewa\:
>> [m,v] = gamstat(18, 10)
m = 180
v = 1800
gdzie m - średnia, v  wariancja
8
Czas kolejnych zgłoszeń jest ró\ny dla poszczególnych okresów symulacji i wynosi
odpowiednio:
okres 0 okres 1 okres 2 okres 3
[m,v]=expstat(60) [m,v]=expstat(30) [m,v]=expstat(14) [m,v]=expstat(9.5)
m = 60 m = 30 m = 14 m = 9.5000
v = 3600 v = 900 v = 196 v = 90.2500
okres 4 okres 5
[m,v]=expstat(20) [m,v]=expstat(40)
m = 20 m = 40
v = 400 v = 1600
Minimalna liczba kas czynnych w poszczególnych godzinach symulacji, została
ustalona w taki sposób, aby dawała wyniki zbli\one do rzeczywistości. To znaczy tak, aby
kolejki sklepowe nie były zbyt krótkie, ani ich długość nie dą\yła do nieskończoności. Do ich
ustalenia wzięto pod uwagę parametry czasu do uszkodzenia, czasu odnowy kasy oraz średni
czas obsługi i kolejnych zgłoszeń w systemie. W przypadku, gdy liczba kas czynnych jest
mniejsza od ustalonej minimalnej liczby kas w systemie (Xmin), długość kolejek będzie dą\yła
do nieskończoności. Gdy liczba kas będzie równa minimalnej liczbie kas, długość kolejek
ustabilizuje się przy bardzo du\ych kolejkach natomiast, gdy liczba kas jest większa od
minimalnej, wyliczonej liczby kas, sytuacja w systemie powinna być stabilna.
Do wyznaczenia tego parametru skorzystano z następującej zale\ności:
E[S] = X Å" AÅ"Ä…
min
gdzie:
A - współczynnik gotowości
Ä… - skala czasu przybycia
E[S]  średni czas obsługi
Współczynnik gotowości został wyznaczony na podstawie średniej oraz wariancji
rozkładu Weibulla, którego parametry zostały podane w pliku wejściowym. Do wyznaczenia
tych wartość (średniej oraz wariancji) skorzystano z funkcji weibstat():
[m1, v1] = weibstat(skala czasu pracy do uszkodzenia, kształt czasu pracy do uszkodzenia)
[m2, v2] = weibstat(skala czasu odnowy, kształt czasu odnowy)
Dla pliku z danymi, który został pokazany w przykładzie:
A = (m1) / (m1+m2) = 43200 / (43200 + 600) = 0,9863
Średni czas obsługi klienta jest iloczynem parametru kształtu funkcji czasu obsługi oraz skali
czasu obsługi:
E[S] = k * ²
Z tego wynika, ze minimalna liczba kas czynnych w systemie zale\y od średniego czasu
obsługi oraz współczynnika gotowości oraz skali czasu przybycia klientów.
E[S]
X =
min
A Å"Ä…
Dla zaprezentowanych wartości pliku wejściowego zostały wyznaczone liczby kas
czynnych w poszczególnych godzinach pracy systemu:
Xmin1 = 91,250127 / 60 = 1,52 2 kasy czynne
Xmin2 = 91,250127 / 30 = 3,04 4 kasy czynne
9
Xmin3 = 91,250127 / 14 = 6,52 6 kas czynnych
Xmin4 = 91,250127 / 9,5 = 9,60 10 kas czynnych
Xmin5 = 91,250127 / 20 = 4,56 5 kas czynnych
Xmin6 = 91,250127 / 40 = 2,28 3 kasy czynne
Dane wyjściowe
Program będzie generował wyniki w postaci sekwencji zmian stanów w systemie. Do
pliku wynikowego w formacie tekstowym zapisywane będą:
1) Czas zajścia zdarzenia, polegającego na zmianie dokładnie jednego elementu wektora
stanu. Czas będzie wyra\any w sekundach w postaci zmiennoprzecinkowej
2) Stan końcowy, do którego przeszedł automat. Stan końcowy będzie wyra\any
w postaci N następujących po sobie liczb całkowitych ze znakiem, rozdzielonych
znakami tabulacji. Początkowe pozycje będą odpowiadały stanowi kolejek do kas
o ni\szych numerach porzÄ…dkowych.
Wygenerowane w ten sposób wyniki będą pózniej dodatkowo przetwarzane w celu
uzyskania na ich podstawie informacji o czasie oczekiwania pojedynczych klientów.
Konwerter będzie napisany w języku C++ i jego zadaniem będzie przygotowanie
odpowiednio sformatowanych plików wejściowych dla programu SAS.
Plik wynikowy (wynik.txt) tworzony jest na dysku c:\\ w katalogu nidsc, a jego
ście\ka został zdefiniowana w skrypcie symulatora (c:\nidsc\wynik.txt). Przykładowy
fragment pliku zawierającego wynik symulacji (aby ułatwić przeglądanie zamieszczonych
przykładów została dodana numeracja wierszy, która nie jest zapisywana w pliku
wynikowym):
Przykład 1:
Numer Czas Wartość Wektora Stanów:
Wiersza: Zdarzenia:
Kasa1 Kasa2 Kasa3 Kasa4 Kasa5 Kasa6 Kasa7 Kasa8 Kasa9 Kasa10
1 129538.076342 1 2 1 2 1 0 0 -2 -2 -2
2 129545.215465 1 2 1 2 1 1 0 -2 -2 -2
3 129550.020411 1 2 1 1 1 1 0 -2 -2 -2
4 129552.122436 1 2 1 1 1 1 1 -2 -2 -2
5 129580.674072 2 2 1 1 1 1 1 -2 -2 -2
6 129583.679538 2 2 2 1 1 1 1 -2 -2 -2
7 129584.820782 2 1 2 1 1 1 1 -2 -2 -2
8 129597.654810 2 1 1 1 1 1 1 -2 -2 -2
9 129600.000000 2 1 1 1 1 1 1 0 0 0
10 129602.033763 2 1 1 1 1 1 1 1 0 0
11 129604.908372 2 1 1 1 1 1 1 1 1 0
12 129606.546754 2 1 1 1 1 1 1 1 1 1
13 129614.394682 1 1 1 1 1 1 1 1 1 1
14 129623.566046 2 1 1 1 1 1 1 1 1 1
15 129633.010641 2 1 1 1 0 1 1 1 1 1
16 129636.183580 2 1 1 1 0 0 1 1 1 1
17 129637.912397 2 1 1 1 1 0 1 1 1 1
18 129640.349342 2 1 1 1 1 0 0 1 1 1
19 129644.003159 2 1 1 1 1 1 0 1 1 1
20 129650.573067 2 1 1 1 1 1 1 1 1 1
21 129654.010692 2 1 1 1 1 1 1 0 1 1
22 129654.587876 2 1 1 1 1 1 1 1 1 1
23 129656.203218 2 2 1 1 1 1 1 1 1 1
24 129656.741652 2 2 2 1 1 1 1 1 1 1
25 129670.789785 2 2 2 0 1 1 1 1 1 1
10
Kolumna Czas Zdarzenia jest pierwsza kolumnÄ… zapisywanÄ… w pliku wynikowym.
Zawarta jest w niej informacja na temat czasu, w którym wystąpiło zdarzenie powodujące
zmianę wektora stanów. W kolejnych kolumnach znajduje się wektor stanów. Poszczególne
kolumny odpowiadajÄ… stanom, w jakim znajdujÄ… siÄ™ kolejne kasy pracujÄ…ce w systemie. Dla
powy\szego przykładu mo\na zauwa\yć, \e w chwili 129538.076342 (pierwszy wiersz
analizowanego wyniku) spośród 10 kas czynnych jest 7. Wartość wektora dla 3 ostatnich kas
wynosi -2, co oznacza, \e kasa jest sprawna, ale nie pracuje w danej chwili czasowej.
W kasach 1-5 znajdują się klienci, długość kolejki jest zapisana w wektorze stanów. Kolejka
w kasach 6 i 7 jest pusta, wartość wektora wynosi 0. W kolejnych chwilach czasowych mo\na
zaobserwować pojawianie się klientów w kasach oraz odchodzenie ich z kolejki, po
wcześniejszym obsłu\eniu. Klienci ustawiają się w kasie, przy której jest najmniejsza kolejka.
Je\eli w dwóch kasach kolejka jest tej samej długości, klient wybiera kasę o najni\szym
numerze porzÄ…dkowym.
Przykład 2:
Numer Czas Wartość Wektora Stanów:
Wiersza: Zdarzenia:
Kasa1 Kasa2 Kasa3 Kasa4 Kasa5 Kasa6 Kasa7 Kasa8 Kasa9 Kasa10
1 57591.394787 1 1 1 1 2 1 1 1 1 1
2 57592.187330 1 1 1 1 1 1 1 1 1 1
3 57600.000000 1 1 1 1 1 1 1 1 1 1
4 57606.930628 2 1 1 1 1 1 1 1 1 1
5 57611.979422 2 1 1 1 1 1 -2 1 1 1
6 57614.017875 2 2 1 1 1 1 -2 1 1 1
7 57618.699551 2 2 2 1 1 1 -2 1 1 1
8 57622.630799 2 2 2 2 1 1 -2 1 1 1
9 57627.364600 2 2 2 2 1 1 -2 1 1 -2
10 57641.941863 1 2 2 2 1 1 -2 1 1 -2
11 57642.201336 1 1 2 2 1 1 -2 1 1 -2
12 57654.418936 1 1 2 1 1 1 -2 1 1 -2
13 57659.441061 1 1 1 1 1 1 -2 1 1 -2
14 57667.865500 1 1 1 1 1 1 -2 1 -2 -2
15 57678.562733 1 1 1 1 1 1 -2 -2 -2 -2
16 57679.455631 2 1 1 1 1 1 -2 -2 -2 -2
17 57686.735076 2 2 1 1 1 1 -2 -2 -2 -2
18 57695.940042 2 2 2 1 1 1 -2 -2 -2 -2
19 57700.958288 2 2 2 2 1 1 -2 -2 -2 -2
20 57702.584427 2 2 2 2 1 -2 -2 -2 -2 -2
21 57709.012738 2 2 2 2 2 -2 -2 -2 -2 -2
Na powy\szym przykładzie mo\emy zaobserwować moment wyłączenia kas. Kasy 6-
10 zostają wyłączone w chwili 57600.000000, co oznacza, \e od tego momentu w kolejce do
tych kas nie będą ustawiali się nowi klienci. W momencie, gdy od kasy przeznaczonej do
wyłączenia odejdzie ostatni klient, stan kasy w wektorze zostanie ustalony na -2, co oznacza,
\e kasa znajduje siÄ™ poza zbiorem kas u\ywanych, ale pozostaje sprawna.
11
Przykład 3:
Numer Czas Wartość Wektora Stanów:
Wiersza: Zdarzenia:
Kasa1 Kasa2 Kasa3 Kasa4 Kasa5 Kasa6 Kasa7 Kasa8 Kasa9 Kasa10
1 49140.171068 2 2 2 2 2 1 1 1 2 1
2 49143.730624 2 2 2 2 2 2 1 1 2 1
3 49161.997046 2 2 2 2 2 2 1 1 1 1
4 49179.210786 2 2 2 2 2 2 2 1 1 1
5 49182.148784 2 2 2 2 1 2 2 1 1 1
6 49184.035615 1 2 2 2 1 2 2 1 1 1
7 49188.058662 1 2 2 -1 1 2 2 1 1 1
8 49188.618234 1 2 1 -1 1 2 2 1 1 1
9 49193.715234 2 2 1 -1 1 2 2 1 1 1
10 49195.181208 2 2 2 -1 1 2 2 1 1 1
11 49199.417082 2 2 2 -1 2 2 2 1 1 1
...
12 49858.384942 3 4 4 -1 3 3 3 3 3 3
13 49866.031758 3 4 4 -1 2 3 3 3 3 3
14 49866.716027 3 4 4 -1 2 3 3 2 3 3
15 49870.825386 3 4 4 0 2 3 3 2 3 3
16 49876.386761 3 4 3 0 2 3 3 2 3 3
17 49880.513645 3 4 3 0 2 2 3 2 3 3
18 49889.289576 3 4 3 0 2 2 3 2 3 2
19 49891.248498 3 3 3 0 2 2 3 2 3 2
20 49895.805922 3 3 3 1 2 2 3 2 3 2
21 49910.742020 3 3 3 1 2 2 3 2 2 2
W tym przykładzie pokazano moment, w którym jedna z kas, numer 4 zostaje
uszkodzona. Uszkodzenie kasy następuje w chwili 49188.058662, wiersz numer 7. Wszyscy
klienci znajdujÄ…cy siÄ™ w kolejce do tej kasy, zostajÄ… wyrzuceni z systemu, a stan kasy zostaje
oznaczony -1. Kasa zostaje wyłączona z systemu a\ do chwili jej naprawienia, co oznacza, \e
do tego momentu klienci nie mogą być obsługiwani przy tej kasie. W chwili czasowej
49866.716027 (wiersz numer 14) kasa numer 4 zostaje naprawiona. Jej stan zostaje ustawiony
na wartość 0, co oznacza, \e kasa znajduje się w zbiorze kas sprawnych i u\ywanych, ale
z pustÄ… kolejkÄ….
Opis działania symulatora
Na początku symulacji ładowane są parametry symulacji z pliku wejściowego.
Następnie w głównej funkcji skryptu czyścimy okno główne oraz wszystkie dotychczasowe
zmienne u\ywane w programie. Za pomocÄ… funkcji fclose() z parametrem  all zamykamy
wszystkie dotychczasowo otwarte pliki. W zmiennej nazwa jest zapisana ście\ka do pliku
z danymi wejściowymi. Plik zostaje otwarty za pomocą polecenia fopen()
function main
clc %czyszczenie środowiska
clear
fclose('all');
nazwa = 'c:\\nidsc\\dane.txt'; %ście\ka do pliku z danymi
[fid, message] = fopen(nazwa,'rt'); %otwórz plik
if fid == -1 %sprawdz poprawność otwarcia
disp(message)
return;
end;
12
Ka\da symulacja przebiega określony czas. Czas ten został podzielony na pewne
okresy (doby), natomiast ka\da doba symulacji została podzielona na sześć krótszych
okresów. W ka\dym z takich okresów, trwających określoną liczbę jednostek (nextInt),
ładowane są kolejne parametry rozkładów wykorzystywanych do generowania czasów
odnowy, uszkodzeń, zgłoszeń oraz obsługi.
Zmienna iloscDni przechowuje wartość określającą ilość iteracji symulacji.
t =6; %ilosc okresow podczas jednego dnia
nextInt =14400; %ile ma trwac jeden okres
iloscDni =365 %ile razy symulacja ma sie zapetlic
Następnie wczytane są parametry zapisane w pliku wejściowym. Do czytania kolejnych
informacji z pliku u\yto funkcji fscanf(), której parametrami są: numer identyfikacyjny
otwartego pliku, format danych oraz ilość odczytywanych rekordów.
liczbaKas=fscanf(fid,'%d',1); %wczytujÄ™ liczbÄ™ kas w systemie
czasObslugiA=fscanf(fid,'%f',t); %kształt czasu obsługi
czasObslugiB=fscanf(fid,'%f',t); %skala czasu obsługi
uszkodzenieA =fscanf(fid,'%f',liczbaKas); %skala czasu pracy do uszkodzenia
uszkodzenieB= fscanf(fid,'%f',liczbaKas); %kształt czasu pracy do uszkodzenia
odnowaA = fscanf(fid,'%f',liczbaKas); %skala czasu odnowy
odnowaB = fscanf(fid,'%f',liczbaKas); %kształt czasu odnowy
exParam =fscanf(fid,'%f',t); %skala czasu przybycia nowego klienta
wlaczWylaczKasy = fscanf(fid,'%d',t); %liczba kas czynna w kolejnych częściach doby
fclose(fid); %zamknięcie pliku wejściowego
Po wczytaniu parametrów potrzebnych do przeprowadzenia symulacji zostaje otwarty
plik, do którego zostanie zapisany wynik symulacji. Ście\ka do tego pliku została
zdefiniowana w symulatorze jako: c:\nidsc\wynik.txt.
nazwa2 = 'c:\\nidsc\\wynik.txt';
[fid2, message] = fopen(nazwa2,'wt');
if fid2 == -1
disp(message)
return;
end;
Po otwarciu pliku, do którego będzie zapisywany wynik, zostają przygotowane
zmienne pomocnicze, które będą brały udział podczas procesu symulacji. W zmiennej
liczbaKasCzynnych zapisana zostaje poczÄ…tkowa liczba kas czynnych w systemie. Tworzony
jest, poprzez wpisanie do niego wartości zerowych, wektor stanów kas kasyStan. W wektorze
będą zapisywane stany, w jakim znajduje się symulowany system. Wartości tego wektora
wraz z czasem jego zmian będą zapisywane do pliku wyjściowego. Obok wektora stanów kas
tworzony jest równie\ wektor pomocniczy kasyDzialanie. W wektorze czasyObslugi będą
przechowywane czasy obsługi klientów znajdujących się przy kasach, jest to czas
przeznaczony na  skasowanie towaru klienta znajdujÄ…cego siÄ™ przy okienku kasy.
czasDoUszkodzenia jest to wektor przechowywujÄ…cy informacjÄ™ na temat chwili czasowej,
w której występuje uszkodzenie kasy  w przypadku gdy jest sprawna, lub jej odnowa  gdy
kasa była uszkodzona.
13
liczbaKasCzynnych = wlaczWylaczKasy(1); %poczÄ…tkowa liczba czynnych kas
kasyStan=zeros(1,liczbaKas); %zerowanie wektora stanów
kasyDzialanie=zeros(1,liczbaKas); %zerowanie wektora pomocniczego
czasyObslugi=zeros(1,liczbaKas); %wektor czasu obsługi klienta przy kasie
czasyDoUszkodzenia=zeros(1,liczbaKas); %czasy do wystÄ…pienia uszkodzenia/odnowy
Dla kas, które początkowo działają w systemie nale\y ustalić czas uszkodzenia. Do tego
celu zostanie wykorzystana funkcja weibrnd(). Parametrami wejściowymi tej funkcji są: ,
czyli wartość współczynnika skali czasu pracy do uszkodzenia oraz ºu, współczynnik ksztaÅ‚tu
funkcji czasu pracy do uszkodzenia. Ostatnie dwa parametry funkcji określają, \e ma zostać
wygenerowana tylko jedna liczba w danym przebiegu pętli for. Funkcja weibrnd() zwraca
jako wynik swojego działania, liczbę, która została wygenerowana na podstawie rozkładu
Weibulla.
for i=1:liczbaKas %losujemy czasy uszkodzenia dla czynnych kas
czasyDoUszkodzenia(i) = weibrnd(uszkodzenieA(godzina),uszkodzenieB(godzina),1,1);
end
Czas po jakim ma nastąpić zgłoszenie w systemie zostaje wyznaczony za pomocą funkcji
exprnd(). Funkcja ta jako parametr otrzymuje współczynnik ą, który jest skalą czasu
przybycia klientów w danym okresie symulacji.
czasZgloszenia= (exprnd(exParam(godzina),1,1)); %losujemy czas pierwszego zgłoszenia
W symulatorze czas \ycia sytemu, ilość dni symulacji, został ustalony w zmiennej
iloscDni na początku programu. Główna pętla programu wykona się tyle razy ile wartość tej
zmiennej. Na początku ka\dej iteracji pętli ustalana jest liczba kas, które nale\y wyłączyć,
zmienna ileKasWylaczamy. Je\eli zmienna ta jest ujemna oznacza to, \e w ostatniej godzinie
poprzedniej doby było czynnych więcej kas ni\ potrzeba w pierwszej godzinie nowej doby.
Nale\y zatem wyłączyć pewną ich ilość. Je\eli zmienna ileKasWylaczamy ma wartość
dodatnią, nale\y włączyć pewną ilość kas. W momencie wyłączania kasy, czas pozostały do
jej uszkodzenia jest zapisywana i przywracany w momencie jej włączenia. Wynika z tego, \e
kasy znajdujące się poza zbiorem kas u\ywanych nie mogą zostać uszkodzone.
ileKasWylaczamy = wlaczWylaczKasy(1) -liczbaKasCzynnych ;
%roznica miedzy ilością kas włączonych w pierwszej godzinie doby a ostatnia
if(ileKasWylaczamy <0) %je\eli wyłączamy kasy
%pętla po wyłączanych kasach
for i=(wlaczWylaczKasy(1)+1):(liczbaKasCzynnych)
tmp =kasyStan(i); %czytaj stan wektora dla i-tej kasy
%je\eli kasa była czynna z niepusta kolejką, oznacz ją w
wektorze pomocniczym do wyłączenia
if( tmp> 0)
kasyDzialanie(i) =-2;
end
%je\eli kasa była czynna z pustą kolejką, oznacz ją jako
wyłączoną
if(tmp == 0)
kasyStan(i) =-2;
kasyDzialanie(i) =-2;
czasyDoUszkodzenia(i)= czasyDoUszkodzenia(i)- czas;
end
%je\eli kasa była uszkodzona, oznacz ją jako uszkodzoną
wyłączoną
14
if(tmp == -1)
kasyStan(i) =-3;
kasyDzialanie(i) =-2;
end
end
end
if(ileKasWylaczamy >0) %je\eli włączamy kasy
%pętla po włączanych kasach
for i=(liczbaKasCzynnych+1):(wlaczWylaczKasy(1))
tmp =kasyStan(i); %pętla po wyłączanych kasach
%je\eli kasa była wyłączona, ale sprawna, oznacz ją jako
działającą
if( tmp==-2)
kasyDzialanie(i) =0;
kasyStan(i)= 0;
czasyDoUszkodzenia(i) = int + czasyDoUszkodzenia(i);
end
%je\eli kasa była wyłączona i niesprawna , oznacz ją jako
włączoną uszkodzoną
if(tmp == -3)
kasyStan(i) =-1;
kasyDzialanie(i) =0;
czasyDoUszkodzenia(i) = int + czasyDoUszkodzenia(i);
end
end
end
%nowa liczba czynnych kas w systemie
liczbaKasCzynnych = wlaczWylaczKasy(1);
Ka\da doba symulowana jest w pętli while, która kończy się w momencie gdy upłynie
czas jej przebiegu. Po ka\dej zmianie wektora stanów kasyStany jest on zapisywany wraz
z czasem jego zmiany do pliku wynikowego.
fprintf(fid2,'%f\t',czas); %zapisz czas
for i =1:liczbaKas
fprintf(fid2,'%d\t', kasyStan(i)); %zapisz i-tÄ… pozycjÄ™ wektora
end
W celu wyliczenia najwcześniejszego zdarzenia wywoływana jest funkcja
WyliczCzasMin(). Jako parametry do funkcji przekazywany jest czas następnego zgłoszenia
klienta w systemie (czasZgloszenia), wektor czasu obsługi klientów przy kasach
(czasObslugi), czasy wystąpienia uszkodzenia/naprawy poszczególnych kas
(czasyDoUszkodzenia), wektor stanów kas kasyStan, liczba kas w systemie (liczbaKas) oraz
czas, po którym zaczynamy kolejną część doby (int). Funkcja zwraca numer zdarzenia
(zdarzenie), informację na której kasie ono wystąpiło (który) oraz czas wystąpienia (czas).
[zdarzenie, ktory, czas] = WyliczCzasMin(czasZgloszenia, czasyObslugi, czasyDoUszkodzenia,
kasyStan, liczbaKas, int);
W funkcji WyliczCzasMin wyszukiwane jest zdarzenie, które ma najwcześniej zajść
w systemie. Je\eli zostało znalezione najwcześniejsze zdarzenie, zwracany jest jego
identyfikator (zdarzenie) czas, w którym wystąpi oraz numer kasy, z którym jest ono
zwiÄ…zane.
function [zdarzenie, ktory, czas]=WyliczCzasMin(czasZgloszenia, czasyObslugi,
czasyDoUszkodzenia, kasyStan, liczbaKas, int)
min = czasZgloszenia; %zakładamy, \e następne wystąpi zgłoszenie w systemie
ktory =0; %numer kasy nie jest jeszcze znany
zdarzenie=0; %identyfikator zdarzenia == 0
for i=1:liczbaKas %szukamy najwcześniejszego wśród innych zdarzeń związanych z i-tą kasą
15
if(min> czasyObslugi(i) & kasyStan(i) > 0) %je\eli jest to obsłu\enie klienta
min = czasyObslugi(i); %czas minimalny = czas tego zdarzenia
ktory =i; %numer kasy, na której wystąpiło zdarzenie
zdarzenie=1; %identyfikator zdarzenia == 1
end
if(min>czasyDoUszkodzenia(i)& kasyStan(i)~= -2) %je\eli jest to uszkodzenie/odnowa kasy
min = czasyDoUszkodzenia(i); %czas minimalny = czas tego zdarzenia
ktory =i; %numer kasy, na której wystąpiło zdarzenie
zdarzenie =2; %identyfikator zdarzenia == 2
end
end
if (min>int) %zdarzeniem jest koniec części doby, lub koniec doby
zdarzenie=3; %identyfikator zdarzenia == 3
min = int; %czas minimalny = czas tego zdarzenia
end
czas = min; %zwracamy czas minimalny
Po wyznaczeniu najwcześniej zachodzącego zdarzenia mo\emy przejść do jego
obsługi. Je\eli najwcześniejszym zdarzeniem było kolejne zgłoszenie klienta w systemie,
nale\y ustawić klienta przy czynnej kasie, do której długość kolejki jest najmniejsza.
W przypadku gdy w systemie znajduje się kilka kas o tej samej, minimalnej długości kolejki,
klient zostanie ustawiony przy kasie o najni\szym numerze porzÄ…dkowym. Po dokonaniu
obsługi tego zdarzenia nale\y wylosować czas kolejnego zgłoszenia w systemie. W tym celu
wykorzystywana jest funkcja gamrnd(& ) z pakietu Matlab. Procedura wyznaczania kasy,
w kolejce do której zostanie ustawiony klient została zaprezentowana poni\ej.
if(zdarzenie ==0) %najwcześniejszym zdarzeniem jest kolejne zgłoszenie klienta
min=65535; %początkowa wartość minimalna
numer_kasy_min =0; %poczÄ…tkowy numer kasy z minimalnÄ… kolejka
for i=1:liczbaKasCzynnych %szukamny działającej kasy, w której jest najmniej klientów
%je\eli znalazł taką kasę, ustaw długość kolejki minimalnej na długość kolejki w tej kasie,
zapisz numer tej kasy w zmiennej numer_kasy_min
if( (kasyStan(i) >= 0)& (kasyDzialanie(i) ~= -2) & (kasyStan(i)< min))
min = kasyStan(i);
numer_kasy_min =i;
end
end
if (numer_kasy_min ~=0) %je\eli znaleziono kasę, do której mo\na ustawić klienta
if (kasyStan(numer_kasy_min) == 0) %i kasa posiada pustÄ… kolejkÄ™
%wyznaczamy czas obsługi klienta korzystając z funkcji gamrand()
czasyObslugi(numer_kasy_min) = czasZgloszenia+ gamrnd(czasObslugiA(godzina),
czasObslugiB(godzina));
end
%zwiększ długość kolejki do tej kasy
kasyStan(numer_kasy_min) = kasyStan(numer_kasy_min) +1;
end
%wyzncz nowy czas zgłoszenia kolejnego klienta
czasZgloszenia= czasZgloszenia + (exprnd(exParam(godzina),1,1));
Je\eli najwcześniejszym zdarzeniem było obsłu\enie klienta. Nale\y dokonać
odpowiedniej zmiany wektora stanów na pozycji kasy, na której zaszło zdarzenie. Je\eli kasa
była przeznaczona do wyłączenia, nale\y sprawdzić, czy kolejka w kasie jest ju\ pusta (został
obsłu\ony ostatni klient w kolejce). Je\eli ten warunek został spełniony, mo\emy oznaczyć
kasę jako wyłączoną. W przypadku gdy został obsłu\ony ostatni klient stojący w kolejce do
kasy, a stanowisko nie jest przeznaczone do wyłączenia, w wektorze stanów (kasyStan) oraz
w wektorze czasObslugi wpisywana jest wartość zerowa.
%je\eli obsłu\ono klienta na kasie o numerze ktory
elseif (zdarzenie ==1)
kasyStan(ktory) = kasyStan(ktory) -1; %zmniejsz kolejkÄ™ do kasy
%je\eli kolejka nie jest pusta nale\y wylosować czas obsługi następnego klienta
if(kasyStan(ktory) >0)
16
czasyObslugi(ktory) = czasyObslugi(ktory)+ gamrnd(czasObslugiA(godzina),
czasObslugiB(godzina)); %losujemy czas obsługi korzystając z funkcji gamrand()
else %je\eli po odejściu klienta kolejka jest pusta
if(kasyDzialanie(ktory) == -2) %sprawdz, czy kasa była przeznaczona do wyłączenia
czasyObslugi(ktory) = 0; %je\eli tak, zmień jej stan na wyłączony
kasyStan(ktory) = -2;
else %je\eli wyzeruj czas obsługi klienta
czasyObslugi(ktory) = 0;
end
end
Gdy najwcześniej zachodzącym zdarzeniem jest uszkodzenie kasy, lub jej odnowa,
nale\y oznaczyć kasę, jako uszkodzoną, lub naprawioną, w zale\ności w jakim stanie
znajdowała się dotychczas. W przypadku gdy kasa znajdowała się poza zbiorem kas
u\ywanych i została naprawiona, nale\y dokonać odpowiedniej zmiany wektora stanów,
oznaczając ją jako sprawną, ale nieu\ywaną. Istnieje równie\ mo\liwość naprawienia kasy,
która jest zbiorze kas uszkodzonych nieu\ywanych. Kasa, która znajduje się poza zbiorem kas
u\ywanych nie mo\e ulec uszkodzeniu.
elseif(zdarzenie ==2) %kasa została uszkodzona/naprawiona
if (kasyStan(ktory) >=0) %je\eli była kolejka przy kasie (kasa sprawna)
if(kasyDzialanie(ktory) == -2) %je\eli była to kasa przeznaczona do zamknięcia
kasyStan(ktory) = -3; %oznacz ja jako niesprawną wyłączona
else
kasyStan(ktory) =-1; %w przeciwnym razie oznacz jÄ… jako popsuta
end
czasyObslugi(ktory) =0;
czasyDoUszkodzenia(ktory) = czasyDoUszkodzenia(ktory) +
weibrnd(odnowaA(ktory),odnowaB(ktory),1,1); %wyznacz czas naprawy
elseif(kasyStan(ktory) == -1 ) %kasa była uszkodzona czynna
kasyStan(ktory) =0; %oznacz jÄ… jako sprawnÄ…
czasyDoUszkodzenia(ktory) = czasyDoUszkodzenia(ktory) +
weibrnd(uszkodzenieA(ktory),uszkodzenieB(ktory),1,1); %wyznacz czas do uszkodzenia
elseif(kasyStan(ktory) == -3) %je\eli kasa była uszkodzona i nieczynna
kasyStan(ktory) =-2; %oznacz ja jak nieczynna naprawiona
czasDoUszkodzenia(ktory)= 0; %kasa jest wyłączona, więc nie mo\e się uszkodzić
end
W przypadku, gdy następnym zdarzeniem jest koniec części doby, nale\y sprawdzić
czy doba nie dobiegła końca. Je\eli tak trzeba zakończyć pętle związaną z obsługa doby
i załadować parametry początkowe. Gdy następuje koniec części doby, nale\y wykonać
odpowiednie kroki związane z włączeniem i wyłączeniem kas.
elseif(zdarzenie==3) %koniec części doby, zamykamy lub otwieramy kasy
godzina= godzina+1; %kolejna część doby
if(t == godzina) %sprawdz, czy doba nie dobiegła do końca
koniec =0;
else
%je\eli symulacja przeszła do kolejnej części doby, nale\y włączyć, lub wyłączyć
odpowiednią ilość kas, zmieniając wartości wektora stanów dla danych kas. Procedura ta ma
podobny przebieg jak procedura włączania/wyłączania kas w przypadku zmiany doby.
%oblicz ilość kas do wyłączenia
kasyDoWylaczenia =liczbaKasCzynnych +(wlaczWylaczKasy(godzina) - liczbaKasCzynnych);
if((wlaczWylaczKasy(godzina)-liczbaKasCzynnych) <0) %je\eli wyłączamy kasy
... %procedura obsługi wyłączania kas w systemie
elseif((wlaczWylaczKasy(godzina)-liczbaKasCzynnych) >0) %je\eli dołączamy kasy
... %procedura obsługi włączania kas w systemie
end
17
liczbaKasCzynnych = wlaczWylaczKasy(godzina); %nowa liczba czynnych kas
int = int +nextInt; %moment kolejnej zmiany części doby
end
Poni\ej został zaprezentowany schemat blokowy działania symulatora
18
Konwersja wyników symulacji do formatu programu SAS
Program "WyznaczCzasy.exe" jest prostą aplikacją napisaną w języku C++, której
zadaniem jest konwersja formatu pliku wygenerowanego przez wymulator na taki, który
będzie łatwy do odczytania i dalszego przetwarzania w SAS-ie. Aplikacja konwertera
przetwarza plik, którego ście\ka dostępu mo\e zostać podana w linii komend jako parametr
wywołania, lub domyślnie plik "wynik.txt", znajdujący się w katalogu roboczym.
"WyznaczCzasy.exe" implementuje N dynamicznych kolejek typu FIFO, które
modelujÄ… kolejki do kas, wygenerowane podczas symulacji. Program automatycznie
wyznacza rozmiar wektora stanów N. Obiektami odkładanymi w kolejkach są liczby
rzeczywiste reprezentujące czas przybycia klienta do systemu. W pojedynczym kroku pętli
głównej programu przetwarzany jest jeden wiersz pliku wejściowego. Po odczytaniu
następuje analiza kolejnych składowych wektora stanów i wykonywana jest odpowiednio
operacja Insert() (wstaw nowego klienta do kolejki) lub Remove () (usuń klienta z kolejki).
W przypadku wstawiania w dodawanym do kolejki obiekcie zapisywany jest czas,
odpowiadający momentowi wystąpienia aktualnie analizowanego wektora stanów. Usuwanie
klienta z kolejki (tzn. spadek odpowiedniej składowej wektora stanów) powoduje pobranie
klienta z kolejki, obliczenie ró\nicy pomiędzy czasem aktualnym a czasem zapisanym
w kolejce jak moment wejścia klienta i zapisanie wyniku jako kolejnej linii w pliku
"czasy.txt".
Je\eli klient opuścił kolejkę w wyniku normalnego wyjścia z systemu (normalnego
w sensie zostania obsłu\onym), to do pliku "czasy.txt" zapisywana jest:
1) aktualna wartość czasu,
2) czas spędzony w kolejce,
3) wartość "1".
W przeciwnym wypadku, gdy nastÄ…pi awaria kasy, to informacja o wszystkich usuwanych
klientach jest zapisywana w "czasy.txt" jako:
1) aktualna wartość czasu (dla wszystkich taka sama),
2) czas oczekiwania w systemie,
3) wartość "0".
Skrypty programu SAS
W celu przeprowadzania analizy wyników uzyskanych za pomocą symulatora zostały
napisane następujące skrypty w programie SAS. Dzięki nim mo\liwym było uzyskanie
szczegółowych wyników statystycznych na temat ilości obsługiwanych klientów i czasie ich
obsługi, ilości klientów, którzy nie zostali obsłu\enie z powodu awarii kas oraz wyznaczenie
zale\ności między czasem obsługi a ilością czynnych kas (regresja liniowa).
Dane zródłowe, wykorzystywane w skrypcie  estymacja.sas zawarte są w pliku  czasy.txt
i pochodzą z symulatora systemu obsługi klientów w supermarkecie. Plik opisuje strumień
wyjściowy klientów i zawiera 3 zmienne:
1) czas wyjścia klienta z systemu (w sekundach od początku symulacji),
2) czas, który klient spędził w kolejce (w sekundach, łącznie z czasem obsługi),
19
3) zmienną logiczną informującą, czy klient został obsłu\ony (1  tak, 0  nie).
Przykładowy fragment pliku wejściowego:
178.506288 115.499351 1
206.972989 159.101793 1
255.073443 132.727025 1
293.455599 181.987135 1
Symulacja prowadzona była dla systemu, którego parametry (częstość przybywania
klientów do kolejek, średni czas obsługi oraz ilość czynnych kas) zmieniane były w cyklu
dobowym w 6 okresach. Pierwszy okres obejmuje godziny od północy do 4 nad ranem, drugi
od 4 do 8 rano, trzeci od 8 do 12, czwarty od 12 do 16 po południu, piąty od 16 do 20
wieczorem i szósty od 20 do północy. Okres, w którym klient przybył do systemu, nie jest
zapisywany w pliku  czasy.txt , ale jest wyliczany w skrypcie i obserwacje z ka\dego okresu
przetwarzane sÄ… niezale\nie.
Skrypt numer 1
Za pomocą tego skryptu realizowana jest procedura wyliczenia ilości klientów, którzy
nie zostali obsłu\eni z powodu awarii kas.
Pierwsze dwa data-stepy w skrypcie sÄ… odpowiedzialne za wczytanie danych z pliku
(instrukcje infile i input, definiująca format danych wejściowych zapisanych w pliku) oraz
obliczenie okresu dnia, w którym klient przybył do systemu:
data wyniki;
infile 'c:\nidsc\czasy.txt';
input t 1-20 czas 21-35 obsluzony 36-40;
twej = t-czas;
run;
data wyniki;
set wyniki;
okres = floor((mod(twej,86400))/14400);
drop twej;
run;
Czas przybycia do systemu wyznaczany jest jako ró\nica czasu wyjścia z systemu
i czasu spędzonego w kolejce. Aby wyznaczyć okres, obliczana jest reszta z dzielenia czasu
wejścia klienta przez 86 400 sekund (czyli 1 dobę), a następnie część całkowita z dzielenia
poprzedniej wartości przez 14 400 sekund (4 godziny). W zbiorze wynikowym znajdują się
cztery zmienne: t (czas wyjścia), czas (czas spędzony w kolejce), obsłu\ony i okres.
Z pliku z danymi wejściowymi symulatora, wczytywana jest ilość otwartych kas dla
poszczególnych okresów doby.
Przed połączeniem tabel nale\y je posortować. Słu\y do tego procedura SORT.
Parametr BY określa, według której kolumny.
proc sort data=wyniki;
by okres;
run;
Rozszerzamy tabelÄ™ wyniki o kolumnÄ™ z liczbÄ… czynnych kas. Ka\dej obserwacji
zostanie przypisana odpowiednia liczba.
20
data wyniki;
merge wyniki tmp_kasy;
by okres;
run;
Do procentowego wyliczenia liczby nieobsłu\onych klientów wykorzystana zostanie
procedura w języku SQL. Dla ka\dego okresu osobno, z tabeli wyniki zostaną zliczone
obserwacje spełniające warunek ,,obsluzony==1. Do tego zostanie dopisana liczba otwartych
kas. Utworzona zostanie tabela statystyki_nieobsluzonych, którą łatwo mo\na
wyeksportować, np. do arkusza kalkulacyjnego. Procedura tworzy pomocnicze tabele
tymczasowe, które usuwa, gdy nie są ju\ potrzebne.
proc sql;
create table tmp_1 as
select okres, count(*) as wszystkich
from wyniki
group by okres;
create table tmp_2 as
select okres, sum(obsluzony) as obsl
from wyniki
group by okres;
quit;
data statystyki_nieobsluzonych;
merge tmp_1 tmp_2;
by okres;
run;
data statystyki_nieobsluzonych;
merge statystyki_nieobsluzonych tmp_kasy;
by okres;
run;
proc sql;
drop table tmp_1 table tmp_2;
quit;
data statystyki_nieobsluzonych;
set statystyki_nieobsluzonych;
nieobsluzonych = wszystkich-obsl;
procent_nieobs = (1-obsl/wszystkich)*100;
run;
W wyniku działania skryptu otrzymujemy tabelę zawierającą informacje na temat
ilości zgłoszeń, ilości klientów obsłu\onych oraz nieobsłu\onych, liczbie kas czynnych
w ka\dej części doby przez cały okres symulacji:
okres wszystkich obsl kas nieobsluzonych procent_nieobs
0 88075 87507 4 568 0,64
1 174769 174121 7 648 0,37
2 374799 374005 14 794 0,21
3 553765 552764 20 1001 0,18
4 262455 261694 10 761 0,29
5 131301 130388 5 913 0,70
21
Skrypt numer 2
Za pomocą tego skryptu generowane są ró\ne statystyki (współczynnik
niezadowolenia) oraz histogramy przedstawiające procentowy rozkład czasu czekania
klientów w kolejkach.
Dane wejściowe wczytywane są w taki sam sposób jak w poprzednim skrypcie. Po
wczytaniu pliku z danymi, analizowane będą jedynie wyniki klientów, którzy zostali
obsłu\eni.
data obsluzeni;
set wyniki;
where (obsluzony=1);
drop obsluzony;
run;
proc sort data=obsluzeni;
by okres;
run;
Wprowadzone zostaną umowne przedziały czasowe, którym odpowiadać będą wagi
,,niezadowolenia klientów . Za pomocą procedury SQL, dla ka\dego przedziału zostanie
zliczona liczba obserwacji. Wyniki zostaną zapisane do tabeli zadowolenie_klientow, która
po wyeksportowaniu do arkusza kalkulacyjnego umo\liwi szybkie obliczanie średniej
wa\onej.
%let p1 = 300; /* definiowanie stałych */
%let p2 = 450;
%let p3 = 600;
%let p4 = 750;
%let p5 = 900;
proc sql;
create table tmp_0 as
select okres, count(*) as ilosc0 from obsluzeni where czas <= &p1 group by okres;
create table tmp_1 as
select okres, count(*) as ilosc1 from obsluzeni where &p1 < czas and czas <= &p2 group
by okres;
create table tmp_2 as
select okres, count(*) as ilosc2 from obsluzeni where &p2 < czas and czas <= &p3 group
by okres;
create table tmp_3 as
select okres, count(*) as ilosc3 from obsluzeni where &p3 < czas and czas <= &p4 group
by okres;
create table tmp_4 as
select okres, count(*) as ilosc4 from obsluzeni where &p4 < czas and czas <= &p5 group
by okres;
create table tmp_5 as
select okres, count(*) as ilosc5 from obsluzeni where czas > &p5 group by okres;
quit;
data zadowolenie_klientow; /* Å‚Ä…czymy ze sobÄ… tabele tymczasowe */
merge tmp_0 tmp_1 tmp_2 tmp_3 tmp_4 tmp_5;
by okres;
run;
data zadowolenie_klientow; /* dodajemy ilości otwartych kas */
merge zadowolenie_klientow tmp_kasy;
by okres;
run;
proc sql; /* usuwamy tymczasowe tabele */
drop table tmp_0 table tmp_1 table tmp_2 table tmp_3 table tmp_4 table tmp_5;
quit;
%let waga0 = 0; /* przykladowe wagi wsp. niezadowolenia dla poszczególnych przedziałów
*/
%let waga1 = 1;
%let waga2 = 2;
22
%let waga3 = 3;
%let waga4 = 4;
%let waga5 = 5;
data zadowolenie_klientow;
set zadowolenie_klientow;
if ilosc0 = . then ilosc0 = 0; /* zabezpieczenie przez brakami obserwacji */
if ilosc1 = . then ilosc1 = 0;
if ilosc2 = . then ilosc2 = 0;
if ilosc3 = . then ilosc3 = 0;
if ilosc4 = . then ilosc4 = 0;
if ilosc5 = . then ilosc5 = 0;
wspolczynnik_niezadowolenia1 = ilosc0*&waga0 +ilosc1*&waga1 +ilosc2*&waga2
+ilosc3*&waga3 +ilosc4*&waga4 +ilosc5*&waga5;
run;
Mo\e się zdarzyć, \e w jakimś przedziale nie wystąpi ani jedna obserwacja. Procedura
COUNT(*) zwraca wtedy ,,brak obserwacji reprezentowany w SASie symbolem kropki. Aby
obliczenia wykonały się poprawnie, nale\y zamienić symbol na wartość liczbową równą zero.
Dodatkowe instrukcje warunkowe rozwiÄ…zujÄ… ten problem.
Wynikiem działania skryptu jest tabela, w której zawarte są informację odnośnie
rozpatrywanego okresu, ilości klientów, którzy znajdują się w grupie o kreślonym
zadowoleniu, liczba kas czynnych w danym okresie oraz współczynnik niezadowolenia
klientów, wyznaczony dla danego okresu.
okres ilosc0 ilosc1 ilosc2 ilosc3 ilosc4 ilosc5 kas wsp_nzd1
0 62556 17598 4705 1414 443 265 4 34347
1 118044 43291 10433 2430 621 167 7 74766
2 338840 34136 1826 29 1 0 16 37879
3 348756 164085 30059 4903 530 65 20 241357
4 163487 72816 18477 4525 769 80 10 126821
5 63610 36485 17183 7429 3291 2015 5 116377
Mo\na definiować nowe ,,współczynniki niezadowolenia , modyfikować w arkuszu
wagi okresów i badać jakość obsługi klienta w zale\ności od wybranych parametrów dla
ró\nych symulacji.
Do tworzenia statystyk i wykresów zostanie wykorzystana procedura CAPABILITY.
Dane wejściowe stanowi tabela obsluzeni. Obliczenia zostaną przeprowadzone oddzielnie
dla ka\dego z okresów. Zdefiniowany zostanie próg górny (usl=450), który będzie
zaznaczony na histogramie kolorem czerwonym. Legenda zawierać będzie ilość obserwacji,
wartość średnią, medianę, odchylenie standardowe, wartości ekstremalne, kwantyle rzędu 95
i 99 oraz procent obserwacji przekraczających próg górny. Wszystkie wyliczenia procedury
CAPABILITY zostanÄ… dodatkowo zapisane do tabeli o nazwie statystyki.
proc capability data=obsluzeni outtable=statystyki;
by okres;
var czas;
spec usl=&p2 cright=red cusl=red;
histogram czas /
cfill=ltgray;
inset NOBS MEAN MEDIAN STD MIN MAX P95 P99 PCTGTR /
pos=ne;
run;
Dyrektywa by określa, według jakiej zmiennej mają być pogrupowane zbiory do
analizy. Je\eli zbiór jest posortowany rosnąco według tej zmiennej, wówczas dla ka\dej
23
wartości zmiennej okres w zbiorze przeprowadzany jest oddzielny zestaw analiz
i otrzymujemy niezale\ne wyniki. Zmienna, dla której mają być prowadzone obliczenia,
określana jest po dyrektywie var.
Dyrektywa spec usl określa specyfikację górnego limitu dla przetwarzanych danych
i powoduje automatyczne wyliczenie ilości obserwacji przekraczających tę specyfikację,
ilości obserwacji mieszczących się w zadanym ograniczeniu oraz tego, jaki stanowią one
odsetek wszystkich obserwacji. Specyfikować mo\na równie\ limit dolny oraz spodziewaną
wartość średnią.
Powy\szy kod powoduje wygenerowanie 6 histogramów, oto przykładowy:
Na histogramie na osi rzędnych zaznaczony jest procent klientów, którzy byli
obsługiwani określony czas  zaznaczony na osi odciętych. Kolorem czerwonym zostali
oddzieleni klienci, dla których czas obsługi przekroczył 450 s.
Aby ułatwić analizę danych, do skryptu dodana zostanie jeszcze jedna funkcja.
Zapisze ona legendy wszystkich 6 histogramów w jednej tabeli, w celu wyeksportowania do
arkusza kalkulacyjnego. Do ka\dego okresu zostanie dopisana liczba otwartych kas.
data sumaryczne;
merge statystyki tmp_kasy;
by okres;
keep okres kas _NOBS_ _MEAN_ _MEDIAN_ _P95_ _P99_ _PCTGTR_ ;
run;
24
Przykładowa tabela statystyki:
okres _NOBS_ _MEAN_ _MEDIAN_ _P95_ _P99_ _PCTGTR_ kas
0 87507 260,36 223,78 505,33 706,95 7,79 4
1 174121 261,42 231,78 481,55 636,21 6,75 7
2 374005 262,28 236,37 466,1 604,8 5,98 14
3 549393 276,39 256,23 492,8 634,62 7,75 20
4 260150 277,26 250,37 515,87 671,71 9,12 10
5 130092 342,98 303,18 699,68 941,24 22,74 5
W tabeli zawarta jest informacja na temat średniej ilości osób nieobsłu\onych, średniej
oraz mediany czasu oczekiwania, kwantyle rzędu 95 oraz 99, procent klientów którzy czekali
w kolejce dłu\ej ni\ pewnie określony czas oraz liczba kas podczas danego okresu.
Dzięki uzyskanym informacjom na temat wartości kwantyli rzędu 95 oraz 99,
wiadomo dla jakiego progu prawdopodobieństwo czasu oczekiwania jest mniejsze od
1 % i 5 %. Mediana (zwana te\ wartością środkową lub drugim kwartylem) to w statystyce
wartość, powy\ej i poni\ej której znajduje się jednakowa liczba obserwacji. Mediana jest
kwantylem rzędu 1/2.
Skrypt numer 3
Skrypt programu SAS słu\ący do wyznaczenia prostej regresji
Do wyznaczenia prostej regresji wykorzystana zostanie procedura REG zawarta
w pakiecie SAS. Dane wejściowe zostały wpisane bezpośrednio przy wywołaniu. Uzyskano
je za pomocÄ… poprzednich procedur, oraz arkusza kalkulacyjnego.
liczba kas klientów > 450 w % ln(procent)
12 281056 75,53 4,32
13 125953 33,66 3,52
14 5811 6,39 1,86
15 4864 1,30 0,26
16 1856 0,50 -0,70
17 914 0,24 -1,41
Parametr MODEL wyznacza, które zmienne mają być porównywane. PLOT tworzy
wykres z opisanymi osiami. (W tym przypadku: zale\ność zmiennej ln_procent (oś
pionowa) od liczby kas (oÅ› pozioma) )
data dane1;
input kas procent ln_procent;
datalines;
12 75.53 4.325
13 33.66 3.516
14 6.39 1.855
15 1.3 0.262
16 0.5 -0.703
17 0.24 -1.410
;
proc reg ;
model ln_procent=kas;
plot ln_procent*kas;
run;
25
Wynikiem działania skryptu jest wykres regresji przedstawiający procent klientów
czekających dłu\ej ni\ określony czas w zale\ności od liczby otwartych kas. Dane wejściowe
do wyznaczenia regresji były brane z wielu ró\nych obserwacji.
Skrypt numer 4
Skrypt programu SAS słu\ący do dopasowania histogramu do krzywej
probabilistycznej o rozkładzie danej zmiennej losowej.
proc capability data=obsluzeni outtable=statystyki;
by okres;
var czas;
spec usl=&prog1 cright=red cusl=red;
histogram czas /
gamma (alpha=est sigma=est theta=est color=green w=2)
outfit=dopasowanieGamma;
qqplot czas /
gamma (alpha=est sigma=est theta=est)
square;
histogram czas /
lognormal (sigma=est slope=est theta=est color=green w=2)
outfit=dopasowanielognorm;
qqplot czas /
lognormal (sigma=est slope=est theta=est)
square;
histogram czas /
weibull (c=est sigma=est theta=est)
outfit=dopasowanieweib;
qqplot czas /
weibull (c=est sigma=est theta=est)
square;
run;
Procedura histogram powoduje wrysowanie na histogramie odpowiedniej krzywej.
W nawiasach podane są parametry rozkładu teoretycznego. Wartość ,,est" oznacza \ądanie
znalezienia najlepszej wartości danego parametru. Klauzula ,,outfit=" definiuje nazwę tabeli
wynikowej dla przeprowadzonych testów.
Za pomocÄ… polecenia QQPLOT dla ka\dego znalezionego dopasowania generowany
jest wykres probabilistyczny. Opcja SQUARE zapewnia odpowiednie skalowanie osi
wykresu, aby uzyskać kwadrat.
Analiza wyników symulacji
W celu przeprowadzenia dokładnej analizy statystycznej symulowanego systemu,
dane zostały poddane analizie za pomocą programu SAS. Dzięki niemu udało się uzyskać
dokładne informacje na temat systemu oraz jego parametrów. Podczas ich analizy ustalono
optymalne parametry pracy systemu, takie przy których koszt jego utrzymania będzie
minimalny, a zyski związane z zadowoleniem szybko obsługiwanych klientów jak
największe.
26
System z ustalonÄ… liczbÄ… kas
Pierwszą symulację przeprowadzono dla systemu, w którym liczba kas została
ustalona w sposób teoretyczny, przy wykorzystaniu wzoru na ilość kas w systemie opisanego
w rozdziale plik wejściowy symulatora.
Dla poszczególnych okresów zostały wygenerowane histogramy przedstawiające
długość czasu obsługi klientów. Z histogramów mo\na odczytać ile procent klientów
(zgłaszających się w systemie w danych okresie) zostało obsłu\onych w danym czasie.
Graniczny próg, uwa\any za komfortowy czas obsługi klienta został ustalony na 450 sekund.
Poni\ej zostają zamieszone histogramy dla wszystkich 6 okresów doby:
27
28
Dodatkowo została wygenerowana następująca tabelka:
okres ilość osób średnia mediana kwantyl 95 kwantyl 99 Procent powy\ej liczba
progu kas
0 86697 254 219 484 668 6,70 4
1 174006 263 232 494 654 7,43 7
2 374130 264 237 473 612 6,39 14
3 549042 275 255 491 624 7,69 20
4 260176 277 251 512 668 8,90 10
5 130063 342 303 698 932 22,42 5
Z tabeli mo\na odczytać ilość osób, które zgłosiły się w systemie w danym okresie
oraz wartość średnia i medianę czasu obsługi klienta w sekundach. W tabeli została równie\
podana wartość dla kwantyla 95 oraz 99. Dla ró\nych okresów symulacji uzyskaliśmy wyniki
z których mo\na odczytać, \e dla ustalonej, teoretycznej liczby kas procent niezadowolonych
klientów jest poni\ej 9%, gdy czas obsługi przekracza 450 s. Obszar ten został zaznaczony na
czerwono. Tylko dla okresu 5 wartość ta wynosi 22%. Przypuszczalnie ma to związek z tym,
ze podczas wyliczania liczby kas dla okresu 5 dokonano najmniejszego zaokrąglenia w górę
do najbli\szej liczby całkowitej.
Na wykresach mo\na zauwa\yć wyrazną dwumodalność, występują dwa maksima.
Wysunięto przypuszczenie, \e powodem tego zjawiska jest fakt psucia się kas. Awaria jednej
lub wielu kas sprawia, \e w systemie pracuje mniejsza ilość kas ni\ liczba wyliczona
teoretycznie. Powoduje to przyrost kolejek w innych kasach. W celu potwierdzenia tej
hipotezy została przeprowadzona sytuacja, w której kasy nie ulegają uszkodzeniom. Wyniki
tej symulacji zostały zaprezentowane poni\ej:
29
Z przeprowadzonego doświadczenia nie udało się uzyskać potwierdzenia tezy. Na
wykresach nadal są widoczne dwa maksima. Dalsze analizy i badania wykluczyły równie\
przypuszczenie, \e przyczyną tego zjawiska jest zmiana parametrów systemu w ró\nych
okresach doby, co oznacza, \e w ró\nych okresach doby dane są ró\ne parametry odnośnie
zgłaszania się klientów (ró\na liczba kas oraz czasy oczekiwania w kolejkach).
System ze zmniejszonÄ… liczbÄ… kas
Kolejna symulacja została przeprowadzona w przypadku gdy liczba czynnych kas
w systemie została zmniejszona o 1. Symulacja została przeprowadzona dla 30 dni i pomimo
tak krótkiego okresu symulacji mo\liwym było zaobserwowanie znacznego pogorszenia się
wydajności systemu. Poni\ej zostały przedstawione histogramy dla 2, 3 i 4 okresu symulacji.
30
Z przeprowadzonych badań jasno wynika, ze zmniejszenie ilości kas o 1 ma znaczny
wpływ na wydajność systemu. Mo\na zauwa\yć, \e dla okresu 2 i 3 ponad 50% klientów
zostało obsłu\onych poza czasem komfortowej obsługi. Pomimo tego, \e w okresie numer 3
w systemie zgłosiło się ponad 2 razy więcej klientów ni\ w okresie 4, to czasy obsługi
w okresie 3 są znacznie lepsze ni\ w okresie następnym. Powodem tego jest to, \e
nieobsłu\eni klienci z okresu 3 czekają a\ do następnego, dopiero w którym są obsługiwani.
W celu potwierdzenia tego zjawiska zostało przeprowadzone następujące
doświadczenie. W jednym z okresów symulacji została wyłączana kasa, a następnie
sprawdzono jaki ma to wpływ na okres sąsiedni.
31
System ze zmniejszonÄ… liczbÄ… kas w jednym okresie doby
Gdy w okresie numer 2 jest czynnych 13 kas, zamiast dotychczasowych 14. Histogram
przedstawiający czas obsługi klientów wygląda następująco:
Ma to następujący wpływ na następny okres symulacji.
Odczytując parametry wynikające z analiz symulacji mo\na zauwa\yć, \e średni czas
czekania w kolejkach wynosi 302,17 s a mediana 278,88 s. W przypadku normalnego
przebiegu symulacji czas średni oczekiwania w kolejce jest krótszy, wynosi on jedyne 274 s,
mediana natomiast 254,5 s. W normalnym przebiegu symulacji, bez zmniejszania ilości kas,
dla okresu 3 liczba niezadowolonych klientów jest na poziomie 7,5 %. W przypadku, gdy we
wcześniejszym okresie była włączona o jedna mniej kasa liczba niezadowolonych klientów
wynosi 13 %.
Zbadano równie\ zachowanie się systemu, gdy w jednym z okresów zostaną wyłączone
dwie kasy. Do doświadczenia wybrano okres numer 2, tak jak w poprzednim eksperymencie
wyłączono kasy, a następnie zbadano wpływ tego zjawiska na okres sąsiedni. W przypadku
gdy w danym okresie zostały wyłączone 2 kasy, histogram czasu obsługi klientów przybiera
następujący kształt:
32
Ma to następujący wpływ na kształt histogramu w okresie numer 3:
Teraz średni czas obsługi klienta, dla okresu numer 3 wynosi 527 s, a mediana prawie
460 s, ponad 50 % klientów czekało ustalone 450 s na obsługę. Jest to znaczne pogorszenie
się parametrów systemu w stosunku, gdy normalnie pracują wszystkie kasy.
Z przeprowadzonego doświadczenia jasno wynika, \e zmieszenie liczby kas w jednym
z okresów ma du\y wpływ na kolejny, bezpośrednio następujący okres. Symulacje wykazały,
\e dla dalszych okresów sytuacja jest stabilna.
System ze zwiększoną liczbą kas
Kolejne doświadczenie zostało przeprowadzone dla systemu, w którym w ka\dym
okresie pracuje więcej kas ni\ wynika to z ustaleń teoretycznych. Poni\ej zostały
zaprezentowane wyniki analizy systemu, w którym dołączono dodatkowe 3 kasy:
33
34
okres ilosć obs. średnia mediana kwantyl 95 kwantyl 99 Procent powy\ej ilość kas
progu
0 87520 182,66 178,01 263,31 324,26 0,05 7
1 174215 186,82 179,79 279,50 362,54 0,11 10
2 374312 192,21 182,20 306,94 395,81 0,24 17
3 550369 197,20 184,61 330,68 411,77 0,36 23
4 261129 190,93 181,67 300,23 388,69 0,19 13
5 130493 187,81 180,25 284,10 370,46 0,13 8
Z przeprowadzonego doświadczenia wynika, \e wszyscy klienci obsługiwani są
bardzo szybko w ka\dym z okresów. Histogramy są do siebie bardzo podobne. Mo\na
zauwa\yć, \e procent klientów nieobsłu\onych w czasie poni\ej 450 s jest znikomy,
poni\ej 1 %. Kolejnym zaobserwowanym zjawiskiem jest zanik dwumodalności
histogramów.
Wpływ uszkodzenia kas na liczbę klientów nieobsłu\onych
Przeprowadzona symulacja ma ukazać jak zmienia się wielkość klientów, którzy nie
zostali obsłu\eni z powodu uszkodzenia kasy.
Do symulacji zostało ustalone następujące parametry niezawodności kas, wykorzystano do
tego celu funkcjÄ™ weibstat() z pakietu Matlab:
Czas pracy do uszkodzenia
>> [m,v] = weibstat(4.208452e-10, 2)
m =
4.3200e+04
v =
5.0993e+08
Czas odnowy
>> [m,v] = weibstat(2.18166e-6, 2)
m =
600.0002
v =
9.8366e+04
Gdzie:
m- mediana
v- variancja
Oznacza to, \e kasy psują się średnio co 12 h na 10 min.
35
Poni\ej zostały zaprezentowane wyniki symulacji w zale\ności od liczby kas
pracujących w systemie, dla systemu z określoną liczbą kas:
okres wszystkich obsl kas nieobsluzonych procent_nieobs
0 87217 86697 4 520 0,6
1 174745 174006 7 739 0,42
2 374969 374130 14 839 0,22
3 553305 549042 20 4263 0,77
4 262519 260176 10 2343 0,89
5 131357 130063 5 1294 0,99
Z przeprowadzonego doświadczenia wynika, \e procent liczby niobsłu\onych
klientów z powodu awarii systemu jest znikomy.
Gdy liczba kas zostanie zmniejszona o 1 dla ka\dego okresu:
okres wszystkich obsl kas nieobsluzonych procent_nieobs
0 7233 6864 3 369 5,1
1 14267 14070 6 197 1,38
2 30708 30626 13 82 0,27
3 45387 44987 19 400 0,88
4 21542 21241 9 301 1,4
5 10809 10127 4 682 6,31
Symulacja została przeprowadzona jedynie dla 30 dni, poniewa\ zmiejszenie liczby
kas spowodowało powstanie bardzo długich kolejek, ich długość dą\y do nieskończoności.
Gdy liczba kas zostanie zwiększona o 1 dla ka\dego okresu:
okres wszystkich obsl kas nieobsluzonych procent_nieobs
0 87571 87145 5 426 0,49
1 174121 173499 8 622 0,36
2 374968 374106 15 862 0,23
3 553357 549451 21 3906 0,71
4 263432 261318 11 2114 0,8
5 132103 131257 6 846 0,64
Gdy liczba kas zostanie zwiększona o 3 dla ka\dego okresu:
okres wszystkich obsl kas nieobsluzonych procent_nieobs
0 87898 87520 7 378 0,43
1 174818 174215 10 603 0,34
2 375194 374312 17 882 0,24
3 553874 550369 23 3505 0,63
4 262783 261129 13 1654 0,63
5 131122 130493 8 629 0,48
36
Mo\na zauwa\yć, \e wraz ze wzrostem liczby kas maleje procent liczby osób, które
nie są obsługiwane w razie awarii systemu. Gdy w systemie jest włączonych większa liczba
kas, kolejki do nich są krótsze, w związku z tym w przypadku awarii mniejsza liczba osób
zostanie z niego usunięta (przy zało\eniu, \e w razie awarii kasy, osoby stojące w kolejce do
niej wychodzą ze sklepu). Dane na temat ilości osób opuszczających system z powodu awarii
mo\na uwzględnić podczas oszacowania ostatecznego kosztu zadowolenia klienta.
Badanie czasu obsługi w zale\ności od liczby kas
W kolejnym doświadczeniu wyznaczono procent klientów, którzy są obsługiwanie
powy\ej ustalonego progu w zale\ności od liczby otwartych kas (regresja liniowa). Regresją
nazywamy funkcyjną zale\ność zmiennej losowej od innej zmiennej z dokładnością do błędu
losowego o wartości oczekiwanej równej zero.
W zapisie formalnym zale\ność przybiera postać Y = f(X) + µ
Gdzie Y - zmienna losowa, f(X) - funkcja regresji, X - dowolna zmienna (lub ich zespół), µ -
zaburzenie losowe. E(µ)=0
Poni\ej zostały zaprezentowane wyniki dla 3 okresu symulacji:
Liczba Liczba klientów obsługiwanych Liczba klientów obsługiwanych
ln [%]
kas powy\ej 450 s powy\ej 450 s [%]
12 281056 75,53 4,32
13 125953 33,66 3,52
14 5811 6,39 1,86
15 4864 1,30 0,26
16 1856 0,50 -0,70
17 914 0,24 -1,41
Za pomocą procedury PROC REG w pakiecie SAS została wyznaczona regresja liniowa:
37
Na początku rozpatrywana była zale\ność liniowa. Dopasowanie jest bardzo słabe, ale
wyraznie widać, \e wraz ze wzrostem liczby kas w systemie spada liczba klientów
obsługiwanych powy\ej 450 s.
Kolejną badaną zale\nością była zale\ność logarytmiczna. Mo\na zauwa\yć bardzo
dobre dopasowanie punktów do prostej. Wynika z tego, \e zale\ność logarytmiczna dobrze
oddaje badane zjawisko.
BadanÄ… regresjÄ™ mo\na zapisać jako: Y = ²X + µ, gdzie:
Y - procent nieobsłu\onych
X  liczba kas
µ  bÅ‚Ä…d (szum)
Poniewa\ dopasowaliśmy zale\ność logarytmiczną:
Z = ln Y
Z = ²X + µ
ZwiÄ™kszenie liczby kas o 1 [² (X+1) = ²X + ² ] powoduje zmianÄ™ Z o ², wiÄ™c:
X X+1
Z Z+²
lnY lnY + ln e² = ln e² Å"Y
Czyli zwiÄ™kszenie liczby kas o 1 zmienia wartość Y e² krotnie.
lnY -1,2264 Å" LiczbaKas +19,091
² = -1,2264
µ = 19,091
e² = 0,2933
38
Dopasowanie histogramów do wykresów zmiennych losowych
Dopasowania histogramów przeprowadzono dla systemu, w którym liczba otwartych
kas w ka\dym okresie była większa o 3 od minimalnej. Dla tego typu histogramów,
pozbawionych dwumodalności udało się uzyskać bardzo dobre dopasowanie. Przedstawione
wyniki dotyczą próby dopasowania dla 3 okresu symulacji. Dopasowywane były funkcje
rozkładu gamma, logarytmiczno-normalny oraz Weibulla.
Dla rozkładu gamma:
Dla rozkładu logarytmiczno-normalnego:
39
Dla rozkładu Weibulla:
Z analizy przeprowadzonego doświadczenia wynika, \e najlepiej dopasowany jest
rozkład gamma. Jest dobrze dopasowany do histogramu, a na wykresie probabilistycznym nie
odbiega znacząco o prostej. Rozkład logarytmiczno-normalny pomimo dobrego dopasowania
do histogramu nie le\y idealnie na prostej probabilistycznej . W przypadku rozkładu Weibulla
uzyskano najgorszy wynik dopasowania. Na histogramach le\y on ewidentnie zbyt nisko, co
uwidocznione jest na wykresie, gdzie odbiega od prostej.
Badanie współczynnika niezadowolenia klientów, w zale\ności od
liczby kas
Celem doświadczenia było wyznaczenia współczynnika niezadowolenia klientów
w zale\ności od liczby czynnych kas. Współczynnik niezadowolenia jest parametrem
określającym jaki jest wpływ czasu oczekiwania w kolejce na zadowolenie z usługi. Czas
oczekiwania został podzielony na okresy, a dla ka\dego z nich przyporządkowano wagę jego
wpływu na współczynnik niezadowolenia. Wraz ze wzrostem długości czasu oczekiwania
wartość ta była większa. Wartości wag jak i długości samych okresów mo\na modyfikować.
Jak pierwszy analizie został poddany system, w którym liczb kas została wyznaczona
w sposób teoretyczny. Uzyskana dla niego następujące wyniki:
okres ilosc0 ilosc1 ilosc2 ilosc3 ilosc4 ilosc5 kas wspolczynnik_niezadowolenia1
0 71,26 20,95 5,51 1,56 0,5 0,22 4 34782
1 68,87 24,38 5,29 1,15 0,25 0,06 7 69125
2 66,95 27,08 4,92 0,84 0,15 0,06 14 150927
3 61,34 30,91 6,24 1,23 0,23 0,04 20 264998
4 63 27,89 7,04 1,6 0,35 0,13 10 126936
5 49,19 28,07 13,43 5,7 2,27 1,35 5 114256
W tabeli, w kolumnach 1-6 zawarty jest procent klientów, którzy byli obsługiwani
w danych przedziałach czasowych ( powy\ej 300, 450, 600, 750, 900 sekund). Dla ka\dego
40
przedziału czasowego przypisano pewną wagę, związaną z wartością czasu czekania, mającą
wpływ na współczynnik niezadowolenia, którego wyliczona wartość została zapisana
w ostatniej kolumnie tabeli. W 7 kolumnie zapisana jest ilość czynnych kas w danym okresie.
Dla takiej ilości kas mo\na zauwa\yć, \e znaczna liczba obsługiwanych osób jest
zadowolonych z czasu oczekiwania na obsługę (większość z obsługiwanych osób znajduje się
w kolumnie ilość0, która odpowiada temu, \e klient został obsłu\ony poni\ej 300 s).
Wynik badania dla systemu, w którym w ka\dym okresie znajduje się jedna kasa
mniej:
okres ilosc0 ilosc1 ilosc2 ilosc3 ilosc4 ilosc5 kas wspolczynnik_niezadowolenia1
0 1,28 1,76 2,21 3,07 4,71 86,96 3 32195
1 10,42 11,39 10,87 9,15 8,28 49,89 6 48281
2 20,22 26,62 22,39 14,44 7,99 8,35 13 57694
3 23,46 29,06 20,23 13,33 8,2 5,7 19 76863
4 16,04 20,79 17,51 12,19 9,26 24,21 9 53201
5 1,74 2,8 3,57 5,07 5,87 80,95 4 45913
Symulacja została przeprowadzona jedynie dla 30 dni, poniewa\ zamknięcie jednej
kasy w danym okresie powoduje blokadę systemu, czas czekania w kolejce wydłu\a się do
nieskończoności. Mo\na zauwa\yć, \e w okresach w których liczba kas jest mniejsza od 10,
większość osób nie jest zadowolona z czasu obsługi. Większość osób jest obsługiwana
powy\ej 900 s, największe wartości w kolumnie ilosc5 tabeli występują dla pierwszego,
drugiego, piÄ…tego i zerowego okresu.
Gdy liczba kas zostanie zwiększona o jeden w ka\dym z rozpatrywanych okresów:
okres ilosc0 ilosc1 ilosc2 ilosc3 ilosc4 ilosc5 kas wspolczynnik_niezadowolenia1
0 71,41 20,38 5,47 1,75 0,63 0,35 4 33762
1 68,55 24,55 5,35 1,1 0,27 0,18 7 71547
2 35,18 31,17 17,81 8,99 4,05 2,81 12 1159015
3 55,49 31,33 8,89 2,84 1,05 0,4 20 1068680
4 61,77 28,39 7,6 1,83 0,36 0,05 10 157047
5 48,08 27,23 13,11 6,4 2,91 2,28 5 114942
W przypadku dołączenia kolejnych kas do systemu, widać poprawę jakości obsługi
klienta. Większy procent klientów obsługiwany jest w pierwszym przedziale czasowym, do
300 s, w stosunku do systemu z mniejszą liczbą czynnych kas. Ma to wpływ na współczynnik
niezadowolenia, który jest mniejszy.
Poni\ej zostały zaprezentowane wyniki dla systemów w którym liczba kas została
zwiększona o 3 w ka\dym okresie:
okres ilosc0 ilosc1 ilosc2 ilosc3 ilosc4 ilosc5 kas wspolczynnik_niezadowolenia1
0 98,23 1,72 0,05 0 0 0 7 1586
1 96,71 3,17 0,11 0 0 0 10 5920
2 94,44 5,31 0,24 0 0 0 17 21715
3 92,33 7,32 0,35 0 0 0 23 44197
4 94,98 4,83 0,19 0 0 0 13 13590
5 96,33 3,53 0,13 0 0 0 8 4962
41
Prawie wszyscy klienci są obsługiwanie są w pierwszym okresie, a współczynnik
niezadowolenia jest znikomy.
Zostały przeprowadzone symulacje pokazujące jak zachowuje się system, gdy kasy
zostaną zamknięte tylko na czas jednej części doby, a nie tak jak miało to miejsce poprzednio
na cały dzien. Tabela zawierająca wynik analizy dla systemu z jedną zamkniętą kasą:
okres ilosc0 ilosc1 ilosc2 ilosc3 ilosc4 ilosc5 kas wspolczynnik_niezadowolenia1
0 71,41 20,38 5,47 1,75 0,63 0,35 4 35656
1 68,55 24,55 5,35 1,1 0,27 0,18 7 70651
2 35,18 31,17 17,81 8,99 4,05 2,81 13 464024
3 55,49 31,33 8,89 2,84 1,05 0,4 20 349764
4 61,77 28,39 7,6 1,83 0,36 0,05 10 132426
5 48,08 27,23 13,11 6,4 2,91 2,28 5 124303
Jedna kasa została zamknięta dla 3 okresu symulacji, mo\na zauwa\yć spadek
zadowolenia klientów w tym okresie w stosunku, dla systemu, w którym działają wszystkie
kasy. Z obserwacji wynika, \e wyłączenie kasy w jednym okresie ma wpływ na zadowolenie
klientów w następnym.
Gdy w systemie zostaną wyłączone 2 kasy, dla jednego okresu:
okres ilosc0 ilosc1 ilosc2 ilosc3 ilosc4 ilosc5 kas wspolczynnik_niezadowolenia1
0 71,77 20,74 5,45 1,35 0,42 0,27 4 33762
1 68,3 24,61 5,38 1,29 0,33 0,09 7 71547
2 10,82 13,65 14 13,15 11,54 36,84 12 1159015
3 26,93 21,98 16,05 12,45 9,21 13,37 20 1068680
4 59,34 27,95 8,25 2,7 1,01 0,75 10 157047
5 48,64 28,75 13,37 5,5 2,3 1,44 5 114942
Wyłączenie dwóch kas w jednym okresie ma większy wpływ na zadowolenie
klientów, znacznie spada liczba osób, która jest obsługiwana poni\ej 300 s. Wyłączenie
dwóch kas w jednym z okresów ma silniejsze oddziaływanie na okres następny.
Wnioski i uwagi końcowe
Celem projektu było zamodelowanie zachowania się systemu z wieloma stanowiskami
obsługi. Rozpatrywany był system kas w supermarkecie z wieloma kasami i kolejkami, po
jednej do ka\dego stanowiska. Głównym zadaniem projektowym, było zasymulowanie
takiego systemu i zbadanie jego zachowania. Zało\enia projektowe, jakie zostały przyjęte we
wstępie projektu zostały wykonane, a otrzymane wyniki są zgodne z przypuszczeniami
teoretycznymi. W sprawozdaniu zostały zamieszczone przykładowe histogramy oraz wyniki
symulacji systemu.
W celu przeprowadzenia symulacji systemu, napisano symulator z wykorzystaniem
programu Matlab. Do wygenerowania zdarzeń losowych zachodzących w systemie takich jak:
czasu zgłoszenia się klienta, czasu uszkodzenia/odnowy kasy oraz czasu obsługi klienta,
zostały wykorzystane funkcje probabilistyczne udostępnione przez program Matlab.
42
W celu dokonania analizy zachowania systemu został wykorzystany specjalistyczny
program do badań statystycznych: SAS. Za jego pomocą, bazując na wynikach symulacji
została dokonana szczegółowa analiza systemu. W pakiecie SAS wykorzystywane są
następujące wzory na rozkład zmiennych losowych:
Rozkład Weibulla:
c-1 c
ëÅ‚ öÅ‚
c x -¸
ëÅ‚ öÅ‚
ìÅ‚- ëÅ‚ x -¸ öÅ‚ ÷Å‚
p(x) = exp dla x > ¸
ìÅ‚ ÷Å‚ ìÅ‚ ÷Å‚
ìÅ‚ ÷Å‚
à à Ã
íÅ‚ Å‚Å‚ íÅ‚ Å‚Å‚
íÅ‚ Å‚Å‚
p(x) = 0 dla x d" ¸
gdzie:
¸ - wartość progowa
à - parametr skali
c - parametr kształtu
Rozkład logarytmiczno-normalny:
ëÅ‚ öÅ‚
1 (log(x -¸ ) -Å› )2 ÷Å‚
ìÅ‚
p(x) = expìÅ‚- dla x > ¸
2
÷Å‚
2Ã
à 2  (x -¸ )
íÅ‚ Å‚Å‚
p(x) = 0 dla x d" ¸
Gdzie:
¸ - wartość progowa
Å› - parametr skali
à - parametr kształtu
Rozkład gamma:
Ä… -1
1 x -¸ x -¸
ëÅ‚ öÅ‚ öÅ‚
p(x) = expëÅ‚- ÷Å‚
dla x > ¸
ìÅ‚ ÷Å‚ ìÅ‚
Ó(Ä… ) à Ã
íÅ‚ Å‚Å‚ íÅ‚ Å‚Å‚
p(x) = 0 dla x d" ¸
Gdzie:
¸ -wartość progowa
Ã
- parametr skali
Ä…
- parametr kształtu
W pierwszej kolejności zostały wygenerowane histogramy przedstawiające zale\ność
czasu czekania w kolejce od liczby otwartych kas. Na ich podstawie otrzymano szczegółową
informację na temat przepustowości systemu oraz skutków, jakie powoduje wyłączenie lub
włączenie dodatkowej kasy w systemie. Badano równie\ wpływ wyłączenia kas w jednym
okresie doby na pozostałe jej części.
Zakładając, \e klient obsługiwany w krótszym czasie jest bardziej zadowolony
z jakości obsługi, zbadano jak zamknięcie/otwarcie dodatkowej liczby kas wpływa na
niezadowolenie klienta. Dla ka\dego przedziału czasu czekania została przypisana
odpowiednia wartość, która rosła wraz ze wzrostem czasu oczekiwania w kolejce. Na
podstawie opracowanego kosztu niezadowolenia klienta, mo\liwym jest podjęcie decyzji, czy
43
opłacalne jest otworzenie dodatkowej kasy, która zmniejszy czas stania w kolejce.
Zakładając, \e prawdopodobieństwo utraty klienta P, który przynosi pewien zysk z, jest
funkcją niezadowolenia. Mo\na obliczyć czy opłacalne jest otwarcie nowej kasy, której koszt
utrzymania wynosi x. W szczególności problem ten sprowadza się do problemu
optymalizacji, czyli wyszukania takiej ilości kas X, \eby spełniona była zale\ność
ż Å" x = Å" z .
"P
Opracowano równie\, jak wpływa fakt psucia się kas na ilość osób opuszczających
system, w zale\ności od liczby czynnych kas. Dzięki temu, mo\liwe jest uwzględnienie
uszkodzeń występujących w systemie na współczynnik niezadowolenia klientów.
Jedną z przeprowadzonych analiz było badanie zale\ności liczby klientów, których
czas stania w kolejce jest dłu\szy ni\ 450 s, od liczby kas działających w systemie (regresja).
W wyniku przeprowadzonego doświadczenia mo\liwe jest oszacowanie optymalnej liczby
kas z jaką ma pracować system, aby liczba klientów czekająca określony czas nie była zbyt
du\a. Badana zale\ność okazała się być zale\nością logarytmiczną, co dla badanego systemu
oznacza, \e wÅ‚Ä…czenie dodatkowej kasy powoduje skrócenie czasu czekania e² = 0.2933
krotnie.
Na histogramach obrazujących procentowy rozkład czasu czekania klientów, dla
systemu z minimalną liczbą kas, mo\na zauwa\yć charakterystyczną dwumodalność,
występują dwa maksima. Przeprowadzono badania mające sprawdzić przyczynę tego
zjawiska. Jednym z nich była próba wyeliminowania czynnika psucia się kas oraz zmiany
parametrów systemu między ró\nymi częściami doby. Stwierdzono, \e jest to zjawisko
kompleksowe, gdy\ eliminacja jednego czynnika nigdy nie prowadziła do zniesienia
dwumodalności. Zauwa\ono natomiast jego zanik gdy do systemu dodano dodatkowe kasy
we wszystkich okresach symulacji.
Zostały równie\ dokonane próby dopasowania histogramów do wykresów
probabilistycznych. Doświadczenie zostało przeprowadzone dla systemu, w którym liczba kas
była większa o 3 od minimalnej ich liczby. W systemie z minimalną liczba kas histogramy
obrazujące czas stania klientów w kolejkach są dwumodalne, przez co dopasowanie do nich
wykresów jest bardzo trudne. Dzięki uzyskanemu dopasowaniu, mo\liwe jest prognozowanie
zachowania systemu dla ró\nych jego parametrów.
Zasadniczą ró\nicą między symulowanym a rzeczywistym systemem było to, \e w
rzeczywistym systemie, w razie awarii kasy osoby, które stoją w kolejce nie opuszczają
sklepu, lecz ustawiajÄ… siÄ™ w kolejce do innej kasy.
Dzięki przeprowadzonym symulacjom oraz ich badaniu, mo\liwe jest ustalenie
optymalnej liczby kas, przy której koszt utrzymania stanowisk jest minimalny, a zyski
z szybkiej i sprawnej obsługi klienta jak największe. Podczas wykonywania prac nad
projektem uzyskaliśmy podstawową wiedzę z zakresu budowania i modelowania systemów
oraz wykonywania ich analizy statystycznej. Dodatkowo nauczyliśmy się wykorzystywać w
praktyce pakiety SAS oraz Matlab, dwa bardzo silne narzędzia, których znajomość na pewno
będzie przydatna w przyszłości.
44
Bibliografia
[1] Programowanie w Matlab Jerzy Brzózka, Lech Dorobczyński, MIKOM, Warszawa,
1998 r.
[2] MATLAB : leksykon kieszonkowy, Bogumiła Mrozek, Zbigniew Mrozek, HELION,
Gliwice 2004
[3] Documentation for SAS 9.1.3 in PDF
[4] Experience SAS Learning Edition 4.1, ze strony internetowej: support.sas.com/training/
[5] Wykład o podstawach programowania w systemie SAS, Henryk Maciejewski
[6] Analiza dynamiki modeli symulacyjnych dla skorelowanych strumieni zgłoszeń, Tomasz
Karwicki, Aleksander Zgrzywa
[7] Teoria kolejek  systemy masowej obsługi, Dr Jerzy Zamke, Katedra Ekonometrii
Wydział zarządzania UG.
45


Wyszukiwarka

Podobne podstrony:
kaskada sprawko
geodezja sprawko 3
sprawko 48 (1)
SPALANIE SPRAWKO 7n
LABORATORIUM CHEMIA I WYTRZYMALOSC MATERIALOW sprawko 1
lab1 sprawko
przykładowe sprawko
Sprawko fizyka IV
sprawko 3 2nd pochodna?lta=4
sprawko nhip regulator
Ekoma sprawko 1
Numerki 5 sprawko
Moje sprawko nr 6

więcej podobnych podstron