Metoda Monte Carlo, przykład symulacji statycznej (brak czynnika czasowego). Część I Krok I. Zebranie danych wejściowych (liczba kompletów opon) Częstość (liczba dni) 0 10 1 20 2 40 3 60 4 40 5 30 Razem: W zakresie komórek od B3 do D10 umieszczamy dane źródłowe, wpisując odpowiednie wartości liczbowe. Zwróćmy uwagę że ciąg rejestrowanych w przeszłości wartości zmiennej (u nas: wartości zapotrzebowań) w ogólnym przypadku nie musi zaczynać się ani od zera ani od jedynki ani nie musi składać się z kolejnych wartości liczbowych ze zbioru liczb naturalnych. Ważne jest natomiast żeby było to ciąg rosnący. Jeśli chcemy możemy kolejne wartości ponumerować. Krok II. Wyznaczenie (obliczenie) prawdopodobieństwa poszczególnych wartości zmiennych. Zaczynamy od obliczenia sumy częstości tzn. 10+20+ + 30. Oczywiście powinniśmy napisać elastyczną formułę. Do komórki D10 wpisujemy zatem następujący tekst: =suma(d4:d9) i naciskamy klawisz ENTER Zakres komórek możemy także wprowadzić za pomocą myszy lub z wykorzystaniem klawiszy kierunkowych (strzałki w lewo, w prawo, w górę, w dół). W komórce D10 powinna pojawić się wartość formuły czyli liczba 200. Prawdopodobieństwo w naszym modelu wyliczymy dzieląc częstość pojawienia się danej wartości zmiennej przez sumę wszystkich częstości. Do komórki E4 wpisujemy następującą formułę: =D4/$D$10 i naciskamy klawisz ENTER Symbol dolara oznacza tu adresowanie bezwzględne, formuła kopiowana do komórek leżących poniżej E4 w mianowniku nie będzie ulegać zmianom w przeciwieństwie adresu w liczniku. W komórce E4 powinna pojawić się wartość formuły czyli liczba 0,05. Formułę z E4 należy przekopiować do komórek z zakresu E5 do E9. Zaznaczamy komórkę E4, umieszczamy kursor myszy w bliskiej odległości w kierunku w prawo i w dół względem prawego dolnego krańca komórki. Powinniśmy zobaczyć czarny krzyżyk. Naciskamy lewy przycisk myszy i trzymamy go - przeciągamy aż do komórki E9. Następnie puszczamy lewy przycisk myszy. Powinniśmy otrzymać następujący widok:
Jeśli umieścimy kursor w komórce E10 powinniśmy w niej zobaczyć formułę: =D9/$D$10 Powinniśmy jeszcze poprawić krawędź dolną tej komórki ale zrobimy to kopiując formułę z komórki D10 do E10. Powinniśmy otrzymać następującą formułę w E10: =SUMA(E4:E9) o wartości 1 (jeden). Skumulowane prawdopodobieństwo obliczymy w następujący sposób, wykorzystując elastyczną formułę. Szczególnie jest to ważne jeśli chodzi o pierwszy wiersz tabeli. W komórce F4 wpisujemy: =JEŻELI(CZY.LICZBA(F3);F3+E4;E4) Otrzymujemy wartość 0,05. Następnie przeciągamy formułę z F4 do komórek od F5 do F9. W komórce F9 powinniśmy otrzymać wartość 1 (jeden). Wyjaśnienie formuły. Chociaż możemy wykorzystywać obliczając prawdopodobieństwo skumulowane funkcję suma (np. w F4 byłaby umieszczona formuła =suma($e$4:e4) ) to bardziej naturalne są obliczenia schodkowe polegające na dodawaniu do poprzednio (w poprzednim wierszu) obliczonej wartości skumulowanej aktualnego prawdopodobieństwa. Jednak dla pierwszego wiersza tabelki nie ma jeszcze wartości poprzedniej : powinniśmy tu wpisać bezpośrednio prawdopodobieństwo początkowe czyli wartość z lewej strony. Dlatego też najpierw kontrolujemy funkcja Czy.liczba czy leżąca powyżej aktualnej komórki, komórka zawiera wartość liczbową. Jeśli tak, to obliczamy sumę poprzedniej wartości skumulowanej i aktualnego prawdopodobieństwa (dla wszystkich wierszy tabeli oprócz pierwszego) a jeśli nie to przepisujemy wartość z lewej strony (dla przypadku pierwszego wiersza). Po uzupełnieniu grubej krawędzi dolnej dla komórki F9 otrzymujemy następujący wygląd tabeli: Krok III. Wyznaczenie granic przedziałów kodowania. Dobór szerokości skali. Zawsze można zastosować szerokość skali równą sumie częstości czyli wielkości próbki (w naszym przykładzie wynosi ona 200. Przy prowadzeniu obliczeń ręcznych a także podczas uczenia się zastosowania metody Monte Carlo wygodnie jest zastosować wartości jak najmniejsze ale dopuszczalne. Szerokość skali można dobrać już analizując wzrokowo tabelę wartości skumulowanych prawdopodobieństw. Szukamy takiej
liczby która przemnożona przez kolejno przez wszystkie skumulowane prawdopodobieństwa da nam wynik należący do zbioru liczb naturalnych (zawsze nadaje się suma częstości i szukamy zwykle tylko wartości mniejszych od niej). W przykładzie takie liczby to: 100, 1000, 200, 40, 20 (najmniejsza z możliwych). Liczba 19 i mniejsze już się nie nadają. Zaczniemy od przyjęcia jako szerokości skali w obliczeniach liczby dające najbardziej okrągłe wyniki czyli 100 (sto). Warto zauważyć że 200 jest wielokrotnością liczby 100. Do komórki C1 wpisujemy wartość 100. Najwygodniej najpierw wyznaczyć końce przedziału. Do komórki H4 wpisujemy formułę =$C$1*F4 i przeciągamy ją aż do komórki H9 w której powinna pojawić się wartość 100. Następnie wypełnimy kolumnę z początkami przedziałów. Wykorzystamy formułę elastyczną: =LICZBA.CAŁK(JEŻELI(CZY.LICZBA(G3);H3+1;1)) Logika powyższej formuły jest podobna do opisanej wcześniej przy wypełnianiu komórki F4. Zwróćmy uwagę, że początek przedziału jest przesunięty o 1 (dodajemy jedynkę) względem końca poprzedniego przedziału. Funkcja Liczba.Całk zabezpiecza nas przed błędami związanymi z nieprawidłowym zaokrągleniem wyniku formuły. Otrzymujemy następujący stan tabelki: Szerokość skali 100 (liczba kompletów opon) Prawdopodobieństwo (wyliczone) Przedział Skumulowane prawdopodobieństwo Początek Koniec Częstość (liczba dni) 0 10 0,05 0,05 1 5 1 20 0,1 0,15 6 15 2 40 0,2 0,35 16 35 3 60 0,3 0,65 36 65 4 40 0,2 0,85 66 85 5 30 0,15 1 86 100 Razem: 200 1 Liczność zbioru Jeśli uzyskamy przedziały kończące się w takich okrągłych wartościach liczbowych jak w naszym przykładzie to warto sprawdzić jeszcze jakie wartości mają liczność zbioru dla poszczególnych przedziałów. W tym celu wpiszemy do komórki I4 następującą formułę: =H4-G4+1 i przeciągamy ją aż do komórki I9 w której powinna pojawić się wartość 15. Suma wartości w kolumnie I powinna oczywiście być równa szerokości skali (u nas: 100). Dla wygodniejszego wypełniania dalszych części arkusza powielamy w kolumnie J zawartość kolumny B. W komórce J4 wpisujemy formułę: = B4 i przeciągamy ją aż do komórki J9 w której powinna pojawić się wartość 5. Otrzymujemy następujący stan tabelki: Szerokość skali 100 (liczba kompletów opon) Prawdopodobieństwo (wyliczone) Przedział Skumulowane prawdopodobieństwo Początek Koniec Liczność zbioru Częstość (liczba dni) 0 10 0,05 0,05 1 5 5 0 1 20 0,1 0,15 6 15 10 1 2 40 0,2 0,35 16 35 20 2 3 60 0,3 0,65 36 65 30 3 4 40 0,2 0,85 66 85 20 4 5 30 0,15 1 86 100 15 5 Razem: 200 1 Po naciśnięciu kombinacji klawiszy <CTRL ~> (jednoczeście CTRL i tylda czyli klawisz umiejscowiony najczęściej pod klawiszem Esc) otrzymamy widok arkusza zawierający formuły zamiast ich wartości. Ponowne naciśnięcie powyższej kombinacji klawiszy spowoduje powrót do trybu standardowego. Otrzymujemy następujący stan tabelki:
Szerokość skali 100 Przedział (liczba kompletów opon) Częstość (liczba dni) Prawdopodobieństwo (wyliczone) Skumulowane prawdopodobieństwo Początek 0 10 =D4/$D$10 =JEŻELI(CZY.LICZBA(F3);F3+E4;E4) =LICZBA.CAŁK(JEŻELI(CZY.LICZBA(G3);H3+1;1)) 1 20 =D5/$D$10 =JEŻELI(CZY.LICZBA(F4);F4+E5;E5) =LICZBA.CAŁK(JEŻELI(CZY.LICZBA(G4);H4+1;1)) 2 40 =D6/$D$10 =JEŻELI(CZY.LICZBA(F5);F5+E6;E6) =LICZBA.CAŁK(JEŻELI(CZY.LICZBA(G5);H5+1;1)) 3 60 =D7/$D$10 =JEŻELI(CZY.LICZBA(F6);F6+E7;E7) =LICZBA.CAŁK(JEŻELI(CZY.LICZBA(G6);H6+1;1)) 4 40 =D8/$D$10 =JEŻELI(CZY.LICZBA(F7);F7+E8;E8) =LICZBA.CAŁK(JEŻELI(CZY.LICZBA(G7);H7+1;1)) 5 30 =D9/$D$10 =JEŻELI(CZY.LICZBA(F8);F8+E9;E9) =LICZBA.CAŁK(JEŻELI(CZY.LICZBA(G8);H8+1;1)) Razem: =SUMA(D4:D9) =SUMA(E4:E9) Warto teraz sprawdzić jak zmieniają się początki i końce przedziałów po zmianie szerokości skali. Proszę wypróbować następujące wartości (komórka C1): 200, 40, 20, 10 i wrócić do wartości 100.\ A oto wynik ustalenia szerokości skali na 20. Szerokość skali 20 (liczba kompletów opon) Prawdopodobieństwo (wyliczone) Przedział Skumulowane prawdopodobieństwo Początek Koniec Liczność zbioru Częstość (liczba dni) 0 10 0,05 0,05 1 1 1 0 1 20 0,1 0,15 2 3 2 1 2 40 0,2 0,35 4 7 4 2 3 60 0,3 0,65 8 13 6 3 4 40 0,2 0,85 14 17 4 4 5 30 0,15 1 18 20 3 5 Razem: 200 1 Krok IV. Wyszukanie (przyporządkowanie) symulowanego zapotrzebowania na podstawie wartości wejściowych z zakresu od 1 do szerokości skali. Pamiętajmy o ustawieniu szerokości skali na 100. Wykorzystamy odpowiednio zagnieżdżone funkcje INDEKS i PODAJ.POZYCJĘ (zagnieździmy ją w funkcji INDEKS). Najpierw zbadamy jak działa funkcja PODAJ.POZYCJĘ, która pozwoli nam na wyszukanie numeru wiersza (numeru koszyka ) do którego należy ( wpada ) badana liczba (wartość testowa). Musimy przygotować tabelkę testową dla dość szerokiego zakresu wartości np. od 1 do 30. Ważne aby wartości obejmowały kilka przedziałów w tym wartości graniczne. Proszę wpisać wartości od 1 do 30 z krokiem 1 w zakresie komórek H13 do H42 oraz wpisać H12 słowo test. Zalecane jest wykorzystywanie trybu z podwójnym czarnym krzyżykiem (nacisnąć <CTRL>) podobnym do przeciągania (kopiowania) formuł. W komórce I13 proszę wpisać formułę: =PODAJ.POZYCJĘ(H13;$G$4:$G$9;1) oraz przeciągnąć ją aż do I42. Do komórki I12 można wpisać dla ustalenia uwagi tekst podaj.pozycję. Pierwszy argument (H13) oznacza liczbę której poszukujemy. Drugi argument (zakres $G$4:$G$9) odnosi się do tabeli z początkami poszczególnych przedziałów. Trzeci argument (wartość 1) oznacza wybrany typ porównania (znajdowany jest największa wartość która jest mniejsza lub równa wartości z pierwszego argumentu). W efekcie otrzymujemy informację o numerze (wiersze numerowane są od 1) wiersza (koszyka) do którego można przyporządkować szukaną liczbę. Poniżej przedstawiony jest fragment arkusza między komórkami H12 a I42.
test podaj.pozycję 1 1 2 1 3 1 4 1 5 1 6 2 7 2 8 2 9 2 10 2 11 2 12 2 13 2 14 2 15 2 16 3 17 3 18 3 19 3 20 3 21 3 22 3 23 3 24 3 25 3 26 3 27 3 28 3 29 3 30 3 Zwróćmy uwagę na zmianę wartości formuły podaj.pozycję między wartościami testowymi: 5 i 6, 15 i 16 i porównajmy je z tabelką. Jak się domyślamy, dla końca zakresu danych wejściowych (czyli 100) otrzymamy wartość 6 (numer wiersza, numer koszyka ). Aby przetestować działanie funkcji INDEKS w której zagnieździmy następnie fukcję PODAJ.POZYCJĘ wystarczy wykorzystać sześć wartości: od 1 do 6. W komórce K12 wpiszemy słowo test, w komórce L12 dla ustalenia uwagi słowo INDEKS. Następnie w komórce K13 wpiszemy wartość 1 i ponownie korzystając z trybu z podwójnym czarnym krzyżykiem wypełniamy komórki aż do K18 (kończymy na liczbie 6 ). W komórce L13 wpiszemy formułę: =INDEKS($J$4:$J$9;K13;1) oraz przeciągamy ją aż do L18. Pierwszy argument ($J$4:$J$9) oznacza zakres komórek zawierający uporządkowane rosnąco wartości, etykiety (u nas: symulowane zapotrzebowanie). Drugi argument (komórka K13) odnosi się do numeru wiersza (koszyka) którego etykietę należy wydobyć. Trzeci argument (wartość 1) oznacza wybrany numer kolumny w zakresie podanym w pierwszym argumencie. W efekcie otrzymujemy informację o etykiecie czyli symulowaną wartość. Komórki od H12 do L42 zawierają teraz następujące wartości:
test podaj.pozycję test indeks 1 1 1 0 2 1 2 1 3 1 3 2 4 1 4 3 5 1 5 4 6 2 6 5 7 2 8 2 9 2 10 2 11 2 12 2 13 2 14 2 15 2 16 3 17 3 18 3 19 3 20 3 21 3 22 3 23 3 24 3 25 3 26 3 27 3 28 3 29 3 30 3 Należy teraz połączyć obie funkcje. W komórce C13 umieszczamy formułę: =INDEKS($J$4:$J$9;PODAJ.POZYCJĘ(B13;$G$4:$G$9;1)) oraz przeciągamy ją aż do C112. W komórce C12 umieszczamy dla ustalenia uwagi tekst Wygenerowano. Teraz drugi argument funkcji INDEKS (czyli numer koszyka) wyznaczany jest na podstawie wartości testowej (pierwszy argument funkcji PODAJ.POZYCJĘ). Zwróćmy uwagę na prawidłowość zmian wartości w kolumnie C w zależności od zawartości komórek w kolumnie B. Fragment tabelki w zakresie komórek B12 do C 32 przedstawiono na rysunku.
Testowanie Wygenerowano 1 0 2 0 3 0 4 0 5 0 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 2 17 2 18 2 19 2 20 2 Przygotujemy się teraz do sprawdzenia jak nasze formuły sprawdzają się w testowej, ręcznie przez nas wykonanej symulacji. W komórkach F13 do F22 umieścimy przekształconą odpowiednio formułę. Zaczniemy od komórki F13: =INDEKS($J$4:$J$9;PODAJ.POZYCJĘ(E13;$G$4:$G$9;1)) i przeciągnijmy tę formułę aż do komórki F22. Zwróćmy uwagę na to że teraz wartością szukaną jest wartość z komórek z kolumny E. Ostatnią z obliczonych wartości powinna być liczba 5 (etykieta koszyka zawierającego wartość 90). W komórce F23 wpisujemy formułę =SUMA(F13:F22). Zakres komórek od E12 do F23 powinien wyglądać następująco: Zestaw testowy Symulowane zapotrzebowanie 52 3 37 3 82 4 69 4 98 5 96 5 33 2 50 3 88 5 90 5 Razem 39 V. Generowanie wartości losowych w wybranym zakresie. W celu generowania wartości losowych wykorzystamy funkcję arkusza o nazwie los(). Przypomnijmy że funkcja ta zwraca wartości pseudolosowe ze zbioru liczb rzeczywistych większe lub równe 0 i jednocześnie mniejsze od 1. Oczywiście należy odpowiednio przeskalować ten przedział i zapewnić równe
prawdopobieństwo wylosowania każdej z liczb naturalnych z pożądanego zakresu. U nas jest to zakres od 1 do 100. Jedno z możliwych rozwiązań to wykorzystanie formuły, odwołującej się do szerokości skali kodowania: =$C$1-ZAOKR.DO.CAŁK(LOS()*$C$1) Proszę formułę powyższą skopiować do komórki E39 i przeciągnąć aż do E48, pamiętając o wpisaniu do komórki F39 formuły i jej przeciągnięciu do F48. =INDEKS($J$4:$J$9;PODAJ.POZYCJĘ(E39;$G$4:$G$9;1)) Po każdym naciśnięciu klawisza <F9> arkusz jest ponownie przeliczany i generowane są kolejne wartości pseudolosowe. Powinniśmy teraz otrzymać następujący wygląd zakresu komórek E38 do F49 (pamiętajmy że komórki od E39 do F48 zawierać mogą inne wartości ale kolumna F zależy od wylosowanych w kolumnie E wartości). W komórce F49 obliczana jest suma wartości z kolumny F. Zestaw wylosowany Symulowane zapotrzebowanie 25 2 68 4 12 1 31 2 25 2 71 4 33 2 62 3 31 2 31 2 Razem 24 Pozostaje jeszcze zintegrować generowanie liczb pseudolosowych z symulowanym zapotrzebowaniem. Zamiast odwoływania do komórek z wylosowanymi liczbami losowanie wprowadzimy jako pierwszy argument funkcji PODAJ.POZYCJĘ, tzn. wprowadzając formułę do komórki F51: =INDEKS($J$4:$J$9;PODAJ.POZYCJĘ($C$1-ZAOKR.DO.CAŁK(LOS()*$C$1);$G$4:$G$9;1)) W celu przetestowania naszej formuły skopiujmy ją 200 razy do zakresu komórek od F51 do O70 (20 wierszy, 10 kolumn). Otrzymujemy teraz tabelkę jak w poniższym przykładzie: 4 2 3 2 5 5 1 4 3 2 4 2 2 3 4 3 4 5 4 2 2 5 2 3 5 5 3 3 5 1 3 2 1 1 3 3 5 3 2 3 2 1 4 5 1 3 2 4 5 5 2 3 4 2 4 3 1 5 1 3 2 3 4 2 5 4 2 2 2 3 3 4 4 4 5 5 4 4 3 2 4 3 3 4 2 4 1 4 2 3 3 4 2 3 2 3 0 5 4 5 3 3 3 3 0 5 2 4 5 2 5 2 2 5 2 4 2 2 4 3 0 3 2 4 5 4 5 2 1 4 4 1 2 1 2 4 2 2 3 3 0 1 4 2 5 3 4 3 4 2 4 4 0 2 4 2 2 1 3 4 3 5 3 0 3 3 4 4 2 2 5 3 4 4 4 2 1 5 3 0 3 3 4 2 0 3 1 3 4 2 3 3 5 3 1 4 2 5 4 4 Należy teraz (jeśli dysponujemy wersją MS EXCEL 2003 lub nowszą) sprawdzić czy uzyskany rozkład
symulowanych wartości przypomina rozkład historyczny, brany pod uwagę przy opracowaniu tabelki: (liczba kompletów opon) Częstość (liczba dni) 0 10 1 20 2 40 3 60 4 40 5 30 Razem: 200 Wykorzystamy fukcję LICZ.JEŻELI która pozwoli na obliczenie liczby wystąpień danej wartości w badanym zbiorze. W komórce F73 wpiszemy słowo wartość, w komórce G73 dla ustalenia uwagi nazwę funkcji LICZ.JEŻELI. W komórkach od F74 do F79 umieszczamy liczby 0, 1, 2, 3, 4, 5 (czyli pochodzące z tabeli zapotrzebowań). W komórce F80 wpisujemy dla ustalenia uwagi słowo suma. W komórce G74 wpisujemy formułę: =LICZ.JEŻELI($F$51:$O$70;F74) Następnie przeciągamy ją aż do G79 W komórce G80 wpisujemy formułę =SUMA(G74:G79) Powinniśmy otrzymać wartość 200 i rozkład zbliżony do rozkładu historycznego np. jak przedstawiono na poniższym rysunku: 4 3 3 5 5 3 3 3 3 2 5 4 3 3 4 4 1 3 3 2 3 1 3 3 3 1 2 3 4 4 4 5 4 1 1 2 3 5 4 4 4 3 5 2 5 3 1 5 5 5 1 3 5 4 5 5 0 5 2 2 2 4 2 1 5 4 4 2 2 2 0 5 3 4 3 3 2 4 3 2 3 3 5 5 3 2 2 2 1 4 3 4 2 3 5 3 4 3 1 4 2 1 5 1 3 0 2 5 3 3 2 2 2 4 3 2 3 2 5 5 2 4 3 0 4 5 3 2 5 2 2 3 0 3 3 4 3 0 4 2 1 5 5 1 0 5 2 3 5 1 3 4 2 4 1 5 3 3 5 2 5 4 2 5 5 1 2 1 1 0 3 5 1 1 0 3 1 2 2 2 0 3 4 4 4 5 3 3 3 4 5 4 5 5 4 2 3 4 4 3 wartość LICZ.JEŻELI 0 10 1 22 2 39 3 53 4 37 5 39 razem 200 Uwaga: ewentualne pojawienie się innej liczby wartości niż założona (200) w komórce G80 od razu pozwalałoby
stwierdzić, że rozwiązanie jest nieprawidłowe! Widać jednak, że zarówno etykiety najbardziej licznego (zapotrzebowanie = 3) jak i najmniej licznego koszyk (zapotrzebowanie = 0) pokrywają się. Podkreślić należy, że jak się przekonaliśmy nie ma nic niepokojącego że wyniki z próby nie są dokładnie takie same jak w rozkładzie historycznym. Cały czas bowiem mamy do czynienia z losowością. Można także wykonać test niezależności chi kwadrat.