Politechnika Wrocławska Wydział Elektroniki PROJEKT
Transkrypt
Politechnika Wrocławska Wydział Elektroniki PROJEKT
Politechnika Wrocławska Wydział Elektroniki Kierunek: Informatyka (INF) Specjalność: Inżynieria systemów informatycznych (INS) PROJEKT INŻYNIERSKI System wspierający zarządzanie ryzykiem oparty na liczbach rozmytych z przedziałowymi wartościami funkcji przynależności Interval-valued fuzzy numbers based risk management supporting system Autor: Jacek Niemiec Prowadzący pracę: prof. dr hab. inż. Jan Magott, I-6 Ocena pracy: WROCŁAW 2014 Spis treści 1. Specyfikacja projektu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.1. Cel i zakres projektu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2. Wypadki lotnicze oraz priorytetowanie ryzyka ich wystąpienia . . . . . . . 2 1.3. Zbiory rozmyte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.4. Reguły matematyczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2. Opis projektu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.1. Wybrane technologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.2. Implementacja systemu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2.1. Dostęp do danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.2.2. Reprezentacja liczb rozmytych . . . . . . . . . . . . . . . . . . . . . 22 2.2.3. Wyprowadzanie wartości ryzyka . . . . . . . . . . . . . . . . . . . . 23 2.2.4. Interfejs użytkownika . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3. Etap wdrożeniowy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.1. Testy oprogramowania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2. Instrukcja obsługi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4. Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5. Ocena realizacji założeń projektowych . . . . . . . . . . . . . . . . . . . . . 37 6. Możliwości rozwoju . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Spis rysunków . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Spis tabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Spis listingów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 1 1. Specyfikacja projektu 1.1. Cel i zakres projektu Celem pracy jest opracowanie, zamodelowanie, oraz implementacja systemu, dzięki któremu, można będzie wspierać zarządzanie ryzykiem na lotniskach w przypadku wypadków typu ”wtargnięcie na drogę startową”. Zakres pracy obejmuje studia literaturowe z zakresu zarządzania ryzykiem oraz z zakresu zbiorów rozmytych z przedziałowymi wartościami funkcji przynależności. Następnie wykonany zostanie projekt systemu wspierającego zarządzanie ryzykiem. Ostatnim etapem pracy będzie implementacja systemu oraz przetestowanie go przede wszystkim pod względem poprawności zwracanych wyników. 1.2. Wypadki lotnicze oraz priorytetowanie ryzyka ich wystąpienia Wypadki lotnicze towarzyszą ludzkości odkąd ta postanowiła wzbić się w przestworza. Powodowane są przez różnorakie czynniki od warunków pogodowych, przez właściwości fizyczne lotnisk, właściwości mechaniczne samolotów, a na ludzkiej niedoskonałości i omylności kończąc. Ogólnie rzecz biorąc wszystkie wypadki lotnicze można podzielić na pięć kategorii: — wtargnięcie na drogę startową, — wypadnięcie z drogi startowej, — kolizja w powietrzu, — utrata kontroli w powietrzu, — lądowanie z usterkami. Jak napisano w poprzednim podrozdziale, uściślając cel pracy, kategorią, na którą zwrócono szczególną uwagę podczas pisania pracy, jest kategoria ”wtargnięcie na drogę startową”. 2 Każde zdarzenie na lotnisku z udziałem błędnej obecności pojazdu, statku powietrznego lub osób na chronionym obszarze powierzchni wyznaczonej do lądowania i startu samolotów.[4] Sytuacje wywołujące wtargnięcia na drogę startową są ekstremalnymi wydarzeniami - są one dość rzadkie, ale bardzo niebezpieczne, ponieważ mogą zakłócić starty oraz lądowania samolotów na lotniskach. Wtargnięcia na drogę startową są prekursorami wypadków lotniczych i mają miejsce coraz częściej na przestrzeni ostatnich lat. Wypadki takie są określane również, jako nie wypadki w ogóle lecz jako błędy zarządzania ryzykiem.[2] Na prawdopodobieństwo wystąpienia powyższej kategorii wypadku lotniczego, tak samo jak i na inne, ma wpływ wiele czynników, są to tzw. czynniki ryzyka. Czynniki te, to uporządkowane właściwości lotniska, czy też pogody, zestawione przez specjalistów w tej dziedzinie. W poniższej tabeli (1.1) przedstawiono czynniki ryzyka brane pod uwagę przy wyznaczaniu prawdopodobieństwa wypadku typu ”wtargnięcie na drogę startową”: Tabela 1.1. Czynniki ryzyka wypadku typu ”wtargnięcie na drogę startową”. Generalna geometria lotniska Łączna liczba geometrii lotniska Liczba operacji lotniska Operacje skrzyżowania Liczba wtargnięć w operacjach lotniska Wtargnięcia typu A lub B Wtargnięcia w operacjach skrzyżowania Wtargnięcia w 105 operacji Procent aktywności Dni od ostatniego przeglądu bezpieczeństwa Roczny opad śniegu Deszczowe dni Mroźne dni Gorące dni Różnica w długości dnia Inne informacje Powyższe czynniki tworzą tzw. hierarchie czynników ryzyka. Jest ich około 11 i każda z nich kładzie nacisk na inną z gałęzi czynników. Pisząc tę pracę postanowiono używać hierarchii uwzględniającej wszystkie gałęzie, a od użytkownika systemu zależeć będzie, które z gałęzi uzna za istotne, a które z nich pominie. Poniżej przedstawiono ilustrację hierarchii użytej w tej pracy. 3 4 Rysunek 1.1. Hierarchia czynników ryzyka. Na powyższym rysunku (1.1) wyraźnie widać kolejne poziomy oraz połączenia w drzewie hierarchii. Idąc od najniższych gałęzi, przy pomocy reguł matematycznych, można wspinać się po drzewie coraz wyżej i dojść na sam jego szczyt, którym jest całościowe ryzyko wystąpienia wypadku typu ”wtargnięcie na drogę startową”. Warto jeszcze nieco szerzej opisać podane w tabeli (1.1) czynniki ryzyka, aby wiadome było jakie zdarzenia czy też miejsca na lotniskach zawierają się w danym czynniku oraz z jakimi danymi zostały wprowadzone do systemu. Poniższa tabela (1.2) zawiera krótkie uszczegółowienie wszystkich czynników ryzyka. Z racji, iż system, który jest tematem niniejszej pracy, operuje na liczbach rozmytych, dane z tabeli (1.2), poddano zabiegowi rozmycia. W wyniku tego zabiegu zamieniono większość funkcji prostokątnych z tabeli na funkcje trapezowe, na których operuje system. Dołożono przy tym wszelkich starań, by w jakikolwiek sposób nie zniekształcić danych i aby przedziały danych odpowiedzialnych za poszczególne ryzyka pozostały jak najbardziej wierne pierwowzorowi. W poniższych tabelach (1.3-1.18) oraz na ilustracjach (1.2-1.17) przedstawione zostały szczegółowe dane czynników ryzyka po zabiegu rozmywania. Oznaczenia danych aL1 , aL2 , aL3 , aL4 , aU1 , aU2 , aU3 oraz aU4 nawiązują do oznaczenia danych na rysunku (1.19) przedstawiającym zbiór rozmyty z przedziałowymi wartościami funkcji przynależności. 5 6 1 Wysokie ryzyko 3 lub więcej: dróg startowych o operacjach zależnych, równoległych dróg startowych, krótkich dróg kołowania, formacji ”byczego oka”1 3 lub więcej: skrzyżowań, skrzyżowań dróg startowych w kształcie litery ”T”, krzyżujących się stref zabezpieczających drogi startowe, dróg kołowania przecinających wiele dróg startowych 155,000 lub więcej operacji 250,000 lub więcej operacji skrzyżowania 4 lub więcej wtargnięć 1 lub więcej wtargnięć 1.0 x 10−5 lub więcej wtargnięć 2.5 lub więcej wtargnięć 70-100% 1025 lub więcej dni Więcej niż 45 Więcej niż 130 dni Więcej niż 150 dni Więcej niż 20 dni Więcej niż 6 h 30 min 2 lub więcej: certyfikat 139, szkoła latania, wieże kontroli lotów Skrzyżowanie wielu dróg kołowania i dróg startowych w jednym punkcie. Liczba wtargnięć w operacjach lotniska Wtargnięcia typu A lub B Wtargnięcia w operacjach skrzyżowania Wtargnięcia w 105 operacji Procent aktywności Dni od ostatniego przeglądu bezpieczeństwa Roczny opad śniegu Deszczowe dni Mroźne dni Gorące dni Różnica w długości dnia Inne informacje Liczba operacji lotniska Operacje skrzyżowania Łączna liczba geometrii lotniska Czynnik ryzyka Generalna geometria lotniska 1-2 N/A 0-1.0 x 10−5 0-2.5 30-70% 625-1024 30-45 70-130 125-150 10-20 5 h 45 min-6 h 30 min 1 70,000-154,999 1-249,999 1-2 Średnie ryzyko 1-2 Tabela 1.2. Szczegóły czynników ryzyka wypadku typu ”wtargnięcie na drogę startową”. 0 0 0 lub niezdefiniowane 0 0-30% 0-624 Mniej niż 30 Mniej niż 70 Mniej niż 125 Mniej niż 10 Mniej niż 5 h 45 min 0 0-69,999 0 0 Niskie ryzyko 0 Tabela 1.3. Funkcje przynależności dla czynnika ”Generalna geometria lotniska”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko Generalna aL 2 0,005 0,005 1,01 1,01 3,005 3,005 aL 1 geometria lotniska aL aL aU 3 4 1 0,005 0,005 0 1,99 1,99 0,99 3,005 3,005 2,99 aU 2 0 0,99 2,99 aU 3 0,01 2,01 3,01 aU 4 0,01 2,01 3,01 Rysunek 1.2. Wykres funkcji przynależności dla czynnika ”Generalna geometria lotniska”. Tabela 1.4. Funkcje przynależności dla czynnika ”Łączna liczba geometrii lotniska”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko Łączna liczba geometrii lotniska aL aL aL aL aU 1 2 3 4 1 0,005 0,005 0,005 0,005 0 1,01 1,01 1,99 1,99 0,99 3,005 3,005 3,005 3,005 2,99 aU 2 0 0,99 2,99 aU 3 0,01 2,01 3,01 aU 4 0,01 2,01 3,01 Rysunek 1.3. Wykres funkcji przynależności dla czynnika ”Łączna liczba geometrii lotniska”. 7 Tabela 1.5. Funkcje przynależności dla czynnika ”Liczba operacji lotniska”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko aL 1 0 50000 125000 Liczba operacji lotniska aL aL aU 3 4 1 0 40000 55000 0 65000 115000 130000 40000 140000 155000 155000 115000 aL 2 aU 2 0 55000 130000 aU 3 50000 125000 155000 aU 4 65000 140000 155000 Rysunek 1.4. Wykres funkcji przynależności dla czynnika ”Liczba operacji lotniska”. Tabela 1.6. Funkcje przynależności dla czynnika ”Operacje skrzyżowania”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko aL 1 0 3500 210000 aL 2 0 5000 225000 Operacje skrzyżowania aL aL aU 3 4 1 2500 4000 0 200000 215000 2500 250000 250000 200000 aU 2 0 4000 215000 aU 3 3500 210000 250000 aU 4 5000 225000 250000 Rysunek 1.5. Wykres funkcji przynależności dla czynnika ”Operacje skrzyżowania”. 8 Tabela 1.7. Funkcje przynależności dla czynnika ”Liczba wtargnięć w operacjach lotniska”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko Liczba wtargnięć w operacjach lotniska aL aL aL aL aU aU 1 2 3 4 1 2 0,005 0,005 0,005 0,005 0 0 1,01 1,01 1,99 1,99 0,99 0,99 4,005 4,005 4,005 4,005 3,99 3,99 aU 3 0,01 2,01 4,01 aU 4 0,01 2,01 4,01 Rysunek 1.6. Wykres funkcji przynależności dla czynnika ”Liczba wtargnięć w operacjach lotniska”. Tabela 1.8. Funkcje przynależności dla czynnika ”Wtargnięcia typu A lub B”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko aL 1 0 0,075 0,9 Wtargnięcia typu A lub B aL aL aL aU 2 3 4 1 0 0,05 0,1 0 0,125 0,875 0,925 0,05 0,95 1 1 0,875 aU 2 0 0,1 0,925 aU 3 0,075 0,9 1 aU 4 0,125 0,95 1 Rysunek 1.7. Wykres funkcji przynależności dla czynnika ”Wtargnięcia typu A lub B”. 9 Tabela 1.9. Funkcje przynależności dla czynnika ”Wtargnięcia w operacjach skrzyżowania”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko Wtargnięcia w operacjach skrzyżowania aL aL aL aL aU aU aU aU 1 2 3 4 1 2 3 4 [10−5 ] [10−5 ] [10−5 ] [10−5 ] [10−5 ] [10−5 ] [10−5 ] [10−5 ] 0 0 0,5 1 0 0 0,75 1,25 0,75 1,25 8,75 9,25 0,5 1 9 9,5 9 9,5 10 10 8,75 9,25 10 10 Rysunek 1.8. Wykres funkcji przynależności dla czynnika ”Wtargnięcia w operacjach skrzyżowania”. Tabela 1.10. Funkcje przynależności dla czynnika ”Wtargnięcia w 105 operacji”. Wtargnięcia Stopień ryzyka aL aL 1 2 Niskie ryzyko 0 0 Średnie ryzyko 0,3 0,5 Wysokie ryzyko 2,1 2,3 w 105 operacji aL aL aU 3 4 1 0,2 0,4 0 2 2,2 0,2 2,5 2,5 2 aU 2 0 0,4 2,2 aU 3 0,3 2,1 2,5 aU 4 0,5 2,3 2,5 Rysunek 1.9. Wykres funkcji przynależności dla czynnika ”Wtargnięcia w 105 operacji”. 10 Tabela 1.11. Funkcje przynależności dla czynnika ”Procent aktywności”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko Procent aktywności aL aL aL 2 3 4 0 0 29 32 30 33 68 71 67 70 100 100 aL 1 aU 1 0 29 68 aU 2 0 32 71 aU 3 30 67 100 aU 4 33 70 100 Rysunek 1.10. Wykres funkcji przynależności dla czynnika ”Procent aktywności”. Tabela 1.12. Funkcje przynależności dla czynnika ”Dni od ostatniego przeglądu bezpieczeństwa”. Dni od ostatniego przeglądu bezpieczeństwa Stopień ryzyka aL aL aL aL aU aU 1 2 3 4 1 2 Niskie ryzyko 0 0 610 620 0 0 Średnie ryzyko 615 625 1000 1010 610 620 Wysokie ryzyko 1005 1015 1025 1025 1000 1010 aU 3 615 1005 1025 aU 4 625 1015 1025 Rysunek 1.11. Wykres funkcji przynależności dla czynnika ”Dni od ostatniego przeglądu bezpieczeństwa”. 11 Tabela 1.13. Funkcje przynależności dla czynnika ”Roczny opad śniegu”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko Roczny opad śniegu aL aL aL aU 2 3 4 1 0 0 23 25 0 24 26 39 41 23 40 42 45 45 39 aL 1 aU 2 0 25 41 aU 3 24 40 45 aU 4 26 42 45 Rysunek 1.12. Wykres funkcji przynależności dla czynnika ”Roczny opad śniegu”. Tabela 1.14. Funkcje przynależności dla czynnika ”Deszczowe dni”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko aL 1 0 65 122 Deszczowe aL aL 2 3 0 63 70 120 127 130 dni aL 4 68 125 130 aU 1 0 63 120 aU 2 0 68 125 aU 3 65 122 130 aU 4 70 127 130 Rysunek 1.13. Wykres funkcji przynależności dla czynnika ”Deszczowe dni”. 12 Tabela 1.15. Funkcje przynależności dla czynnika ”Mroźne dni”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko aL 1 0 122 141 Mroźne dni aL aL 3 4 0 121 124 125 140 143 144 150 150 aL 2 aU 1 0 121 140 aU 2 0 124 143 aU 3 122 141 150 aU 4 125 144 150 Rysunek 1.14. Wykres funkcji przynależności dla czynnika ”Mroźne dni”. Tabela 1.16. Funkcje przynależności dla czynnika ”Gorące dni”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko aL 1 0 8,5 18 Gorące dni aL aL 3 4 0 7,5 9 10 17 18,5 19,5 20 20 aL 2 aU 1 0 7,5 17 aU 2 0 9 18,5 aU 3 8,5 18 20 aU 4 10 19,5 20 Rysunek 1.15. Wykres funkcji przynależności dla czynnika ”Gorące dni”. 13 Tabela 1.17. Funkcje przynależności dla czynnika ”Rożnica w długości dnia”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko Rożnica aL 2 0 0 5,25 5,75 6,3 6,4 aL 1 w długości dnia aL aL aU 3 4 1 5 5,5 0 6,25 6,35 5 6,5 6,5 6,25 aU 2 0 5,5 6,35 aU 3 5,25 6,3 6,5 aU 4 5,75 6,4 6,5 Rysunek 1.16. Wykres funkcji przynależności dla czynnika ”Rożnica w długości dnia”. Tabela 1.18. Funkcje przynależności dla czynnika ”Inne informacje”. Stopień ryzyka Niskie ryzyko Średnie ryzyko Wysokie ryzyko aL 1 0,005 1 2,005 Inne informacje aL aL aL 2 3 4 0,005 0,005 0,005 1 1 1 2,005 2,005 2,005 aU 1 0 0,99 1,99 aU 2 0 0,99 1,99 aU 3 0,01 1,01 2,01 aU 4 0,01 1,01 2,01 Rysunek 1.17. Wykres funkcji przynależności dla czynnika ”Inne informacje”. 14 1.3. Zbiory rozmyte Zbiory tzw. klasyczne są najprostszymi zbiorami, których nie da się już zdefiniować za pomocą czegoś prostszego (jest to tzw. pojęcie pierwotne matematyki). Potocznie zbiorem nazywa się pewną ilość, zestaw obiektów, które są do siebie podobne i jakoś ze sobą powiązane, przy czym zakłada się, że można stwierdzić z całą pewnością czy dany element należy do danego zbioru czy też nie. W języku naturalnym jednak często występują określenia zbiorów, dla których niezbędne jest wprowadzenie pośrednich stopni przynależności elementów. Wyobrazić sobie można najprostszy z takich przykładów, jakim jest zbiór ludzi wysokich. Można zapytać czy człowiek o wzroście 180 cm jest wysoki?, a 179 cm?, a 178 cm? Trudno zauważyć, gdzie leży granica pomiędzy wysokimi i niewysokimi ludźmi. Próba odnalezienia tej granicy jest śmieszna i nigdy nie skończy się zadowalającym nas rezultatem. Zachodzi tutaj bowiem próba opisania przy pomocy pojęć ilościowych czegoś co jest wygodnie i naturalnie opisane przy pomocy pojęć jakościowych. W takim przypadku należy przyjąć, że wszyscy ludzie są wysocy, jednak każdy w pewnym stopniu. W tym momencie pojawia się pojęcie zbioru rozmytego. Zbiory rozmyte (liczby rozmyte) są to zbiory definiowane przez funkcję, która przyjmuje wartości z przedziału [0, 1]. Wartość z podanego przedziału nazywana jest stopniem przynależności elementu do danego zbioru. Inaczej mówiąc zbiory rozmyte to zbiory klasyczne, w których rozważamy przynależność elementów, wraz z ich stopniem przynależności. Zbiory te używane są przede wszystkim, by przezwyciężyć wady algorytmów komputerowych, które to algorytmy zawodzą w sytuacjach, w których człowiek rozwiązuje problem bez większych problemów. Najłatwiej przedstawić taki zbiór na rysunku (1.18). Rysunek ten przedstawia zbiór rozmyty zadany funkcją trapezową (najpopularniejsze funkcje to trójkątna, trapezowa oraz gaussowska) System wspierający zarządzanie ryzykiem, który jest tematem tej pracy, postanowiono oprzeć na liczbach rozmytych z przedziałowymi wartościami funkcji przynależności. Oznacza to tyle, że wartość funkcji przynależności nie jest całym polem pod wykresem funkcji przynależności, tak jak to było w przypadku liczb rozmytych typu pierwszego. Teraz wartość ta zadawana jest przedziałem znajdującym się pomiędzy dolną a górną funkcją przynależności. Jak pokazano na rysunku (1.19) taka liczba rozmyta składa się z dwóch liczb rozmytych typu pierwszego, z których jedna pełni rolę dolnej, a druga górnej funkcji przynależności. 15 Rysunek 1.18. Zbiór rozmyty typu pierwszego. Rysunek 1.19. Zbiór rozmyty z przedziałowymi wartościami funkcji przynależności. 1.4. Reguły matematyczne Powyżej przedstawiono dwa główne filary, na których opiera się niniejsza praca. Ważne jednak jest jeszcze ustalenie reguł matematycznych, wg których liczone będzie ryzyko wystąpienia wypadku typu ”wtargnięcie na drogę startową”. Reguły te określają w jaki sposób uwzględniając i opierając się na liczbach rozmytych z przedziałowymi wartościami funkcji przynależności, przedstawionymi w podrozdziale 2., da się dojść na szczyt drzewa-hierarchii wnioskowania przedstawionego w podrozdziale 1. Także zaczynając od początku, dane do systemu przekazywane są w formie liczb rozmytych z przedziałowymi wartościami funkcji przynależności. Mając te liczby można wyliczyć wartość ryzyka danego czynnika. Poniżej podano przykładowy obrazek (1.20), by móc unaocznić kolejne kroki wyliczania tej wartości. Należy zawsze pamiętać o założeniu, że fM (x) + fS (x) = 1, gdzie fM oznacza 16 Rysunek 1.20. Przykładowe wykresy liczb rozmytych z przedziałowymi wartościami funkcji przynależności. górną funkcję przynależności zbioru rozmytego M i odpowiednio fS oznacza dolną funkcję przynależności zbioru rozmytego S. Na powyższym rysunku (1.20) widać dwie liczby rozmyte M (małe ryzyko) oraz S (średnie ryzyko). Każda z tych funkcji (dolna oraz górna) ma swoją odpowiednią wagę w, tzw. wzajemną wagę wartości ryzyka, która bierze udział w wyliczaniu ryzyka dla danego czynnika. Wybierając odpowiedni punkt x obliczone zostaną górna i dolna wartość ryzyka dla danego czynnika wg poniższych wzorów: wCi = fM (x) ∗ wM + fS (x) ∗ wS (1.1) wCi = fM (x) ∗ wM + fS (x) ∗ wS (1.2) Każdy z czynników ryzyka posiada własną wagę ri , z jaką uwzględniany jest w obliczeniach w warstwie wyżej. Posiadając tak wyliczone: górną wartość ryzyka czynnika Ci (1.1) oraz dolną wartość czynnika ryzyka Ci (1.2), można wyliczyć wartość danego czynnika, który znajduje się poziom wyżej w drzewie. Poniższe wzory (1.3) i (1.4), to odpowiednio wzór na górną wartość ryzyka sumarycznego oraz dolną wartość ryzyka sumarycznego. n X wCi ∗ ri i=1 17 (1.3) n X wCi ∗ ri (1.4) i=1 Na podstawie powyższych równań matematycznych oparte jest działanie całego systemu, który jest kwintesencją niniejszej pracy. 18 2. Opis projektu 2.1. Wybrane technologie Do realizacji projektu jakim jest system zarządzania ryzykiem oparty na liczbach rozmytych z przedziałowymi wartościami funkcji przynależności, po wielu namysłach i dociekaniach, wybrano język Java. Język Java jest bardzo dobrym wyborem głównie ze względu na jego przenośność na większość urządzeń oraz obiektową naturę, ponieważ jak powszechnie wiadomo był on tworzony od razu jako język obiektowy. Przenośność Javy polega na tym, że kod programu kompilowany jest do kodu pośredniego, który jest niezależny od architektury procesora i systemu operacyjnego. Wirtualna maszyna Javy, która jest dostępna dla większości systemów operacyjnych, tłumaczy kod pośredni na kod maszynowy dostosowany do aktualnego środowiska. Java posiada wiele zalet oraz udogodnień, dzięki którym programowanie w tym języku jest naprawdę przyjemne. Do podstawowych zalet na pewno należy zaliczyć to, iż język ten znacznie przyśpiesza tworzenie kodu, zdejmując z programisty obowiązek zarządzania pamięcią programu. Kolejną zaletę stanowi dobrze pomyślany system obsługi błędów (wyjątków). Interfejs użytkownika aplikacji został stworzony przy pomocy biblioteki Swing. Jest ona podstawowym zestawem narzędziowym do budowania interfejsów programów pisanych w języku Java. Biblioteka ta znacznie upraszcza tworzenie nawet bardzo skomplikowanych interfejsów użytkownika. W łatwy sposób można dodawać kolejne okna programu, jak również wstawiać do tychże okien rożne elementy, takie jak np. pola tekstowe, przyciski, panele. Umożliwia także łatwe zarządzanie tymi elementami oraz zdarzeniami, które mają miejsce np. po naciśnięciu danego przycisku. Na wyróżnienie zasługuje również biblioteka jFreeChart, która znacznie uprościła pracę w przypadku wykresów znajdujących się w interfejsie użytkownika. Każde z kolejnych okien interfejsu zawiera wykres trapezowych funkcji przynależności i rysowanie kolejnych wykresów byłoby trudnym i żmudnym zadaniem. Jednak dzięki tej bibliotece, rysowanie nawet skomplikowanych wykresów, zostaje zredukowane do kilku przejrzystych linii kodu, w których działaniu nie trudno się odnaleźć. Jest to 19 kolejna z bibliotek, dzięki której pisanie programów w języku Java staję się szybsze, przyjemniejsze i bardziej efektywne. Niezbędne również było ściągnięcie biblioteki jCommon, która jest używana przez bibliotekę jFreeChart. Biblioteka jCommon zawiera rożne klasy, które obsługują m.in. narzędzia tekstowe, zarządzanie niestandardowym wyglądem aplikacji czy też narzędzia serializacji. Niniejszy projekt powstał w środowisku programistycznym NetBeans IDE w wersji 7.4, które również przyczynia się do szybkości powstawania kodu oraz jego poprawności. Łatwy sposób refaktoryzacji kodu znacznie usprawnia pracę, ponieważ przy pomocy jednego kliknięcia kod programu staję się bardziej przejrzysty i czytelny. Środowisko NetBeans posiada również wiele narzędzi wspomagających tworzenie kodu, m.in. GUI Builder, generator krótkich kodów (setery, getery). Wartym wspomnienia jest także program launch4j. Za jego pomocą, w końcowym etapie tworzenia aplikacji, możliwe było proste wygenerowanie natywnego pliku wykonywalnego programu o rozszerzeniu .exe. Jest to kolejne udogodnienie, tym razem dla użytkownika. Dzięki temu nie musi posiadać on środowiska programistycznego na maszynie, na której chce uruchomić program. Wystarczy tylko kliknąć dwa razy na plik wykonywalny, a aplikacja rozpocznie swoje działanie. 2.2. Implementacja systemu Niniejszy rozdział w całości został poświęcony klasom, które są głównymi częściami programu i które współdziałając umożliwiają bezbłędne działanie aplikacji. Ze względu na wygodę i przejrzystość pracy opisy kolejnych klas programu podzielono na 4 podrozdziały. Pierwszy z nich opisuje klasy dostępu do danych, tzn. wczytywanie danych z pliku czy też przechowywanie danych podawanych przez użytkownika podczas działania programu. Kolejny podrozdział zawiera opis klas umożliwiających przechowywanie liczb rozmytych w logiczny i przydatny sposób. W podrozdziale trzecim znajdują się opisy klas odpowiedzialnych za obliczanie całościowe wartości ryzyka wg ustalonej hierarchii czynników. Ostatni z podrozdziałów traktuje o klasach tworzących interfejs użytkownika. Z racji, iż praktycznie każda klasa zawiera jakieś funkcje umożliwiające dostęp do danych (setery i getery), zostały one pominięte przy opisach kolejnych klas. 20 2.2.1. Dostęp do danych W tym podrozdziale zajmiemy się opisem klas umożliwiających dostęp do danych. Aby program w ogóle mógł działać, konieczne są dane wejściowe, które stanowią liczby rozmyte z przedziałowymi wartościami funkcji przynależności, na których opiera się cały system. Dane te wczytywane są z pliku .txt wybieranego na początku programu. Klasa odpowiedzialna za wczytywanie danych z pliku nosi nazwę FileData i znajduje się w paczce engineer.data w plikach kodu źródłowego. Zawiera ona jedynie funkcję do wczytywania danych z pliku i z tych danych tworzy obiekty klasy RiskFactor (o której później). Główna pętla while funkcji została przedstawiona na poniższym listingu (2.1). Listing 2.1. Główna pętla funkcji wczytującej dane z pliku. while ( s c a n . hasNextLine ( ) ) { riskName = s c a n . next ( ) ; f o r ( int i = 0 ; i < 3 ; i ++) { l a = s c a n . nextDouble ( ) ; l b = s c a n . nextDouble ( ) ; l c = s c a n . nextDouble ( ) ; l d = s c a n . nextDouble ( ) ; ua = s c a n . nextDouble ( ) ; ub = s c a n . nextDouble ( ) ; uc = s c a n . nextDouble ( ) ; ud = s c a n . nextDouble ( ) ; i t 2 f s [ i ] = new IT2FS ( l a , lb , l c , ld , ua , ub , uc , ud ) ; } r i s k F a c t o r = new R i s k F a c t o r ( riskName , i t 2 f s [ 0 ] , i t 2 f s [ 1 ] , it2fs [2]) ; t h i s . r i s k F a c t o r s . put ( riskName , r i s k F a c t o r ) ; } Kolejne punkty la, lb, itd. to kolejne punkty odpowiednio dolnej oraz górnej funkcji trapezowej danej liczby rozmytej. Pobierana jest tu również nazwa (riskName) danej liczby rozmytej, co w późniejszym etapie obliczania ryzyka umożliwia utworzenie odpowiedniej hierarchii czynników. Następną klasą używaną do obsługi danych jest klasa przechowująca dane uzyskane od użytkownika w czasie działania programu, UserData, również znajdująca się w paczce engineer.data w plikach kodu źródłowego. Klasa ta zawiera jedynie konstruktor ustawiający punkt x wybrany przez użytkownika oraz podaną przez niego wagę danego czynnika ryzyka. 21 Ostatnią z klas dotyczących obsługi danych jest klasa I18N, w której to znajduje się funkcja odpowiedzialna za internacjonalizację nazw czynników. W pliku wejściowym bowiem czynniki dla wygody podawane są w swoich angielskich nazwach. Klasa ta ”widząc” nazwę angielską dopasowuje jej odpowiadającą jej nazwę w języku polskim z pliku językowego znajdującego się w folderze z kodem źródłowym projektu. 2.2.2. Reprezentacja liczb rozmytych Wg tego, co już zostało wielokrotnie napisane w niniejszej pracy system opiera się na liczbach rozmytych z przedziałowymi wartościami funkcji przynależności i to właśnie ich reprezentacji poświęcony jest ten podrozdział. Idąc droga rozumowania podobną do tej we wstępie pracy, możemy wywnioskować, że na liczby rozmyte składają się dwie liczby rozmyte pierwszego typu określone funkcjami trapezowymi: górną i dolną. Każda z tych funkcji z kolei składa się z czterech punktów, z których każdy ma dwie współrzędne x oraz y. Idąc tą droga rozumowania na samym początku stworzono klasę Point, jako klasę bazową dla kolejnych klas. Zawiera ona konstruktor, w którym ustawiane są wartości współrzędnych x oraz y każdego z punktów. Kolejną fazą na drodze do uzyskania liczb rozmytych było stworzenie klasy T1FS (od angielskiego Type 1 Fuzzy Sets). Zawiera ona reprezentację liczby rozmytej pierwszego typu opartej na wcześniej opisanej klasie Point. Tutaj również występuje tylko konstruktor ustalający wartości kolejnych obiektów typu Point. Z racji, że operujemy na liczbach rozmytych danych funkcjami trapezowymi, punkty y ustalane są zawsze na 0, 1, 1, 0 w kolejnych punktach. Oznacza to, że pierwszy punkt znajdował się będzie na wysokości 0, kolejne dwa na wysokości 1, a ostatni znów na 0, w wyniku czego otrzymamy trapez. Punkty x są to natomiast punkty zawarte w pliku .txt z danymi, który jest wczytywany na początku działania programu. Właściwą klasą systemu jest klasa IT2FS (od angielskiego Interval Type 2 Fuzzy Sets). Zawiera ona reprezentację liczb rozmytych, na których opiera się działanie całego systemu. Każda z liczb rozmytych składa się z obiektów klasy T1FS. W konstruktorze tworzone są dwa obiekty tej klasy nazwane odpowiednio lower (dolna) oraz upper (górna) funkcja trapezowa. Tworzy się je na podstawie przekazanych jako parametry funkcji punktów x wczytanych z pliku .txt zawierającym dane wejściowe. Jest to najważniejsza klasa z paczki engineer.fuzzysets w plikach kodu źródłowego, ponieważ to na niej, jak już wspomniałem, opiera się działanie całego systemu i 22 wszystkie kolejne wartości ryzyka, jak również ryzyko całościowe, są wyliczane na podstawie obiektów właśnie tej klasy. 2.2.3. Wyprowadzanie wartości ryzyka W tym podrozdziale zajmiemy się kwintesencją projektu, tj. klasami odpowiedzialnymi za reprezentację czynników ryzyka w systemie oraz za wyliczanie całościowej wartości ryzyka. Pierwsza z klas, odpowiedzialna za reprezentację czynników ryzyka, nosi nazwę RiskFactor. Klasa ta zawiera wszystkie informacje o danym czynniku, takie jak: nazwa czynnika ryzyka, 3 liczby rozmyte oznaczające kolejno niskie, średnie oraz wysokie ryzyko, górną i dolną wartość ryzyka, wagę, a także nazwę wyświetlaną, czyli nazwę czynnika widoczną w interfejsie użytkownika. Konstruktor tej klasy przyjmuje 4 dane: nazwę oraz 3 liczby rozmyte. Główna część klasy to 3 metody. Pierwsza z nich findIntersectionPoint przyjmuje za parametry dwa obiekty klasy Point oraz liczbę x, która została podana przez użytkownika. Funkcja ta oblicza punkt przecięcia (y) prostej przechodzącej przez dwa dane punkty (a, b) z prostą przechodzącą przez punkt x na osi współrzędnych wg poniższego wzoru (2.4). Wzór ten wyprowadzony został ze wzoru równania prostej przechodzącej przez zadane punkty (2.1). We wzorze tym znane są wszystkie punkty (punkty prostych jako dane wejściowe czynników ryzyka) oraz zmienna x podawana przez samego użytkownika. Pozostaje więc przekształcić ten wzór tak, aby otrzymać wartość y (2.2 - 2.4). (y − ya )(xb − xa ) − (yb − ya )(x − xa ) = 0 (2.1) (y − ya )(xb − xa ) = (yb − ya )(x − xa ) (2.2) (yb − ya )(x − xa ) (xb − xa ) (2.3) (yb − ya ) ∗ (x − xa ) + ya (xb − xa ) (2.4) y − ya == y= Kolejna funkcja, countRiskValue, oblicza i zwraca wartość ryzyka w tzw. przedziałach rozmycia. Są to takie przedziały, w których element nie należy całościowo do danego zbioru, tylko do dwóch zbiorów, do każdego w odpowiednim stopniu. Pobiera ona jako parametry po dwa punkty sąsiadujących ze sobą zbiorów, ich wagi oraz 23 punkt x wybrany przez użytkownika. Działanie tej funkcji opiera się o poprzednią funkcję wyznaczającą punkt przecięcia. Ostatnia z funkcji w tej klasie nosi nazwę countFactorRisk. Cała funkcja jest jedną wielką, wielokrotnie złożoną instrukcją warunkową if. Funkcja ta sprawdza po kolei kolejne przedziały, aż trafi na taki, w którym zawiera się liczba x podana przez użytkownika. Wtedy to uruchamia odpowiednie funkcje w celu wyliczenia upperRiskValue (górna wartość ryzyka) oraz lowerRiskValue (dolna wartość ryzyka) dla danego czynnika ryzyka. Drugą klasą odpowiedzialną za wyliczanie całościowej wartości ryzyka jest klasa Hierarchy. Jak sama nazwa wskazuje, to w niej zawarta jest hierarchia czynników ryzyka, wg której wyliczana jest całościowa wartość ryzyka, jak również funkcje obliczające wartości ryzyk pośrednich na kolejnych poziomach drzewa hierarchii. Klasa ta przechowuje wszystkie czynniki ryzyka. Główną funkcją, obok konstruktora i funkcji wyliczających kolejne wartości ryzyk, jest funkcja (2.2) obliczająca ryzyko dla pojedynczego czynnika. Pobiera ona punkt x oraz wagę podane przez użytkownika. Następnie pobierając nazwę czynnika, dla którego liczy aktualne ryzyko uruchamia funkcję countFactorRisk z uprzednio opisanej klasy. Następnie przypisuje wyliczone wartości górnej i dolnej wartości ryzyka pól danego czynnika. Na podstawie tej funkcji wykonywane są wszystkie obliczenia w klasie Hierarchy, od najniżej znajdujących się w drzewie czynników, aż po całościową wartość ryzyka. Listing 2.2. Funkcja wyliczająca wartości ryzyk dla danego czynnika. x = t h i s . userData . g e t ( s t r ) . getX ( ) ; w = t h i s . userData . g e t ( s t r ) . getW ( ) ; riskFactor = this . r i s k F a c t o r s . get ( s t r ) ; riskFactor . countFactorRisk ( x ) ; r i s k F a c t o r . s e t U p p e r R i s k V a l u e ( r i s k F a c t o r . getUpperRiskValue ( ) ∗ w) ; r i s k F a c t o r . s e t L o w e r R i s k V a l u e ( r i s k F a c t o r . getLowerRiskValue ( ) ∗ w) ; 2.2.4. Interfejs użytkownika Klasy interfejsu użytkownika stanowią zdecydowaną większość, spowodowane jest to przede wszystkim przez to, że każdy widok czy okno wyświetlane w interfejsie wymaga oddzielnej klasy, by wszystko trzymać w miarę czytelny i uporządkowany sposób. Dzięki takim udogodnieniom jak GUI Builder w środowisku NetBeans, główna część kodu odpowiedzialna za obsługę zdarzeń czy też działanie odpowiednich komponentów została wygenerowana automatycznie. 24 Pierwszą i najważniejsza klasą interfejsu użytkownika, którego wszystkie klasy znajdują się w paczce engineer.gui w plikach kodu źródłowego, jest klasa Engineer. W niej to znajduje się główna funkcja uruchamiająca cały program i umożliwiająca jego poprawne działanie, funkcja main. To tutaj zdefiniowane są takie elementy widoczne w interfejsie użytkownika jak pasek postępu oraz przyciski: Dalej, Wstecz i Zakończ. Każdy z elementów jest odpowiednio obsłużony. Po przyciśnięciu odpowiedniego przycisku wywoływane są akcje odpowiedzialne za kolekcjonowanie danych oraz przekazywanie ich dalej w celu wykonywania obliczeń. Są tu również obsłużone wyjątki na wypadek, gdyby funkcje nie mogły być wykonane lub użytkownik popełniłby jakiś błąd. W tej paczce w plikach kodu źródłowego znajduje się również paczka engineer.gui.panels, która jak sama nazwa wskazuje przechowuje klasy kolejnych wyświetlanych w interfejsie paneli. Klasa Alert na przykład, jak nie trudno się domyślić, odpowiada za komunikaty czy tez ostrzeżenia, jakie pojawiają się w trakcie działania programu w interfejsie użytkownika, gdy ten popełni błąd, np. poda niewłaściwe dane. Klasa Charts odpowiada za wyświetlanie wykresów funkcji przynależności. Korzysta ona z klasy jFreeChart, która była już opisywana wcześniej. Pokrótce polega to na tym, że tworzymy serię danych do wyświetlenia i tworzymy obiekt klasy jFreeChart, który następnie umieszczamy na panelu. Klasa jFreeChart sama w sobie udostępnia dużo opcji rysowania wykresów, udostępniając w łatwej formie narzędzia do ich formatowania. Klasa Panels została stworzona tylko po to, by wszystkie pozostałe klasy paneli mogły po niej dziedziczyć, dzięki czemu zarządzanie nimi staje się o wiele prostsze. Po klasie Panels dziedziczą trzy kolejne klasy. Są to: LoadPanel, Panel oraz EndPanel. Klasa LoadPanel zawiera panel powitalny interfejsu. W niej oprogramowany jest przycisk wczytujący dane z pliku. Oczywiście w tym przypadku również zostały obsłużone wyjątki na wypadek, gdyby plik był błędnie sformatowany i jego wczytanie byłoby niemożliwe. Kolejna klasa, Panel, odpowiada za wygląd i mechanikę działania paneli przedstawiających kolejne czynniki ryzyka. To tutaj używana jest klasa Charts, w celu wyświetlania wykresów funkcji przynależności. Znajdują się tutaj także elementy odpowiedzialne za odczytanie danych wprowadzanych dla kolejnych czynników ryzyka przez użytkownika oraz za przekazywanie ich dalej w celu wykonywania właściwych obliczeń. Ostatnia klasa, EndPanel, to klasa zawierająca ostatni 25 panel interfejsu użytkownika. Wyświetlane są na nim wyniki obliczeń uwzględniające dane podawane przez użytkownika podczas działania programu. 26 3. Etap wdrożeniowy 3.1. Testy oprogramowania Aby stwierdzić czy dany system działa poprawnie należy przeprowadzić niezbędne testy. Tak było i w tym przypadku. Powstały system zarządzania ryzykiem został podany serii testów, dzięki którym można stwierdzić z całą pewnością, że system ten działa w pełni poprawnie. Pierwszym testem jaki przeprowadzono, ze względu na postęp prac, było sprawdzenie czy dane z pliku wejściowego są dobrze wczytywane oraz interpretowane przez system. Wynik tego testu całkiem łatwo sprawdzić przyglądając się kolejnym wykresom pojawiającym się w interfejsie użytkownika. Poniższy listing (3.1) przedstawia przykładowe dane wejściowe dla czynnika ”Wtargnięcia typu A lub B”. Listing 3.1. Dane wejściowe dla czynnika ”Wtargnięcia typu A i B”. TypeAorB 0 0 0 ,05 0 ,1 0 0 ,075 0 ,125 0 ,875 0 ,925 0 ,05 0 ,9 0 ,95 1 1 0 0 ,075 0 ,125 0 ,1 0 ,9 0 ,875 0 ,925 1 0 ,95 1 Na poniższej ilustracji (3.1) przedstawiono wykres, który powstał na podstawie danych z powyższego listingu. Z całą pewnością można stwierdzić, że obrazek ten jest poprawny. Warto od razu przypatrzeć się tym danymi wykresowi, gdyż dla użytkownika nieobytego z oprogramowaniem mogą się one wydawać nieco dziwne i niejasne. Pierwsza linia poniższego listingu zawiera nazwę czynnika ryzyka w języku angielskim, co zostało wprowadzone ze względu na użycie klasy internacjonalizującej. Na wykresie widać, że nazwa czynnika w języku polskim to ”Wtargnięcia typu A i B”, co zgadza się z angielską nazwą ”TypeAorB” (słowo ”wtargnięcia” zostało dodane w celu zwiększenia czytelności interfejsu, w algorytmie jednak czynnik pozostaje z nazwą ”TypeAorB” (typ A lub B), ponieważ ułatwia to obliczenia i implementację całej hierarchii). Kolejne trzy linie (pod nazwą czynnika ryzyka), to dane do wyświetlania kolejnych ryzyk danego czynnika: pierwsza linia odpowiada za wykres niskiego ryzyka, druga - średniego ryzyka, a 3 za wykres dużego ryzyka. 27 Każda z tych linii odpowiada za wyświetlanie dwóch funkcji trapezowych dla danego ryzyka. Pierwsze 4 liczby w każdej linii to punkty, z których składa się dolna funkcja trapezowa, a 4 kolejne odpowiadają za górną funkcję trapezową. Jak widać wykres na poniższym rysunku zgadza się z danymi podanymi jako dane wejściowe w pliku. Np. dla średniego ryzyka widać, że dolna funkcja zaczyna się w punkcie 0,075 na wysokości 0, następnie przebiega prze punkty 0,125 oraz 0,875 na wysokości 1, by skończyć się w punkcie 0,925 na wysokości 0. To samo działa dla górnej funkcji trapezowej, tzn. funkcja rozpoczyna się w punkcie 0,05 na poziomie 0, przechodzi przez punkty 0,1 i 0,9 na poziomie 1, a następnie schodzi do wartości 0 w punkcie 0,95, gdzie się kończy. Rysunek 3.1. Wykres ryzyk dla czynnika ”Wtargnięcia typu A i B”. By potwierdzić poprawność wyświetlania wykresów na podstawie danych wejściowych poniżej podano kolejny przykład danych wejściowych na listingu (3.2), którym odpowiada wykres przedstawiony na rysunku (3.2). Listing 3.2. Dane wejściowe dla czynnika ”Mroźne dni”. FreezeingDays 0 0 121 124 0 0 122 125 122 125 140 143 121 124 141 144 141 144 150 150 140 143 150 150 28 Rysunek 3.2. Wykres ryzyk dla czynnika ”Mroźne dni”. Kolejnym etapem testowania aplikacji było sprawdzenie poprawności wykonywanych przez program obliczeń. Do wprowadzania danych służy panel przedstawiony na poniższym rysunku (3.3). Trzy górne pola tekstowe służą do wprowadzenia tzw. wzajemnych wag wartości czynnika ryzyka. Innymi słowy są to wagi z jakimi brane są pod uwagę liczby rozmyte przedstawiające małe, średnie oraz duże ryzyko do późniejszych obliczeń ryzyka całościowego. Poniżej znajdują się jeszcze dwa pola tekstowe służące do wpisywania wartości czynnika i jego wagi. Oczywiście należy pamiętać, aby wpisywać poprawne dane. Rysunek 3.3. Panel do wprowadzania danych przez użytkownika. W ramach pierwszego takiego testu postanowiono obliczyć ryzyko wpisując dla każdego czynnika ryzyka dane takie jak podano poniżej (3.4). Jak widać na rysunku, wszystkie wprowadzone dane są poprawne (zgodne z wytycznymi znajdującymi się koło odpowiednich pól tekstowych). 29 Rysunek 3.4. Panel do wprowadzania danych wypełniony testowymi danymi. Wpisując powyższe dane dla każdego z czynników, na ostatnim panelu (3.5) uzyskano wynik obliczonego całościowego ryzyka. Wynik ten jest zgodny z wynikiem otrzymanym dla tych samych danych wejściowych, który został uzyskany poprzez ręczne obliczanie wartości kolejnych ryzyk. Rysunek 3.5. Obliczone przez system całościowe ryzyko. Kolejne, już bardziej sensowne dane, na których przeprowadzono test poprawności obliczania wartości ryzyka, podano w listingu poniżej (3.3). Wzajemne wagi wartości czynników ryzyka pozostawiono niezmienione (0.1 dla małego ryzyka, 0.5 dla średniego oraz 1 dla dużego). Listing 3.3. Dane testowe. Generalna g e o m e t r i a l o t n i s k a : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 2 Wysokie ryzyko : 1 Waga c z y n n i k a : 30 Łączna l i c z b a g e o m e t r i i l o t n i s k a : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 2 Wysokie ryzyko : 1 Waga c z y n n i k a : 50 Liczba o p e r a c j i l o t n i s k a : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 50000 Wysokie ryzyko : 1 Waga c z y n n i k a : 79 Operacje skrzyżowania : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 215000 Wysokie ryzyko : 1 Waga c z y n n i k a : 35 Liczba wtargnięć w operacjach l o t n i s k a : 30 N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : Wartość c z y n n i k a : 1 . 7 5 0 . 5 Wysokie ryzyko : 1 Waga c z y n n i k a : 10 W t a r g n i ę c i a typu A l u b B : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 0 . 9 Wysokie ryzyko : 1 Waga c z y n n i k a : 60 Wtargnięcia w operacjach skrzyżowania : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 0 . 0 0 0 0 1 Wysokie ryzyko : 1 Waga c z y n n i k a : 45 W t a r g n i ę c i a w 10ˆ5 o p e r a c j i : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 1 . 9 Wysokie ryzyko : 1 Waga c z y n n i k a : 50 Pr oce nt a k t y w n o ś c i : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 70 Wysokie ryzyko : 1 Waga c z y n n i k a : 85 Dni od o s t a t n i e g o p r z e g l ą d u b e z p i e c z e ń s t w a : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 623 Wysokie ryzyko : 1 Waga c z y n n i k a : 45 Roczny opad ś n i e g u : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 40 Wysokie ryzyko : 1 Waga c z y n n i k a : 70 Deszczowe d n i : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 66 Wysokie ryzyko : 1 Waga c z y n n i k a : 20 Mroźne d n i : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 125 Wysokie ryzyko : 1 Waga c z y n n i k a : 30 Gorące d n i : N i s k i e ryzyko : 0 . 1 Ś r e d n i e ryzyko : 0 . 5 Wartość c z y n n i k a : 19 Wysokie ryzyko : 1 Waga c z y n n i k a : 45 Rożnica w d ł u g o ś c i d n i a : N i s k i e ryzyko : 0 . 1 Wartość c z y n n i k a : 5 . 3 Ś r e d n i e ryzyko : 0 . 5 Wysokie ryzyko : 1 Waga c z y n n i k a : 20 Inne i n f o r m a c j e : N i s k i e ryzyko : 0 . 1 Wartość c z y n n i k a : 1 Ś r e d n i e ryzyko : 0 . 5 Wysokie ryzyko : 1 Waga c z y n n i k a : 50 Wynik obliczeń przeprowadzonych przez program dla powyższych danych przedstawiono na rysunku poniżej (3.6). Wyniki te, tak jak i poprzednie, są w pełni zgodne z wynikami otrzymanymi poprzez obliczenia ręczne. 31 Rysunek 3.6. Obliczone przez system całościowe ryzyko dla danych testowych zawartych w listingu (3.3). Poprzednio wykonane testy poprawności wczytywania danych, jak również i testy obliczania wartości ryzyka przebiegły pomyślnie. Można zatem z całą pewnością stwierdzić, iż system działa i wykonuje obliczenia w pełni poprawnie. 3.2. Instrukcja obsługi Program uruchamiamy klikając dwa razy na pliku engineer.exe. Należy pamiętać, aby obok pliku .exe znajdował się katalog lib zawierający pliki .jar z bibliotekami niezbędnymi do poprawnego działania aplikacji. Po uruchomieniu ukazuje nam się panel powitalny aplikacji (3.7). Rysunek 3.7. Ekran powitalny aplikacji. Do działania aplikacji niezbędne są dane, więc na początku klikamy przycisk Przeglądaj. Po jego naciśnięciu na ekranie pokazuje się okno wyboru pliku (3.8). 32 Rysunek 3.8. Wybór pliku z danymi. Należy pamiętać, że plik z danymi musi być odpowiednio sformatowany. Dane dotyczące czynników ryzyka powinny wyglądać tak jak na przykładzie (3.4). jak zostało to już napisane w podrozdziale wcześniej pierwsza linia zawiera nazwę czynnika ryzyka (bez spacji, każdy nowy wyraz od wielkiej litery, np. DaysSinceLastSafetyReview). Następne linie to kolejne punkty na osi x odpowiednio dla małego, średniego oraz dużego ryzyka. Listing 3.4. Przykładowy fragment pliku danych. General 0 ,005 0 ,005 0 ,005 0 ,005 0 0 0 ,01 0 ,01 1 ,01 0 ,99 0 ,99 2 ,01 2 ,01 3 ,005 3 ,005 3 ,005 3 ,005 2 ,99 2 ,99 3 ,01 3 ,01 1 ,01 1 ,99 1 ,99 Jeżeli nastąpi próba wczytania nieodpowiedniego pliku, system wyświetli ostrzeżenie (3.9). 33 Rysunek 3.9. Błąd wczytywania pliku z danymi. Jeżeli plik z danymi jest poprawny, na panelu podświetli się przycisk Dalej, dzięki któremu można przejść do kolejnego etapu działania aplikacji, którym są kolejne panele (3.10) wyświetlające odpowiednie czynniki ryzyka. Dla każdego z czynników przedstawiono wykres jego funkcji przynależności. Poniżej znajdują się pola, które użytkownik musi wypełnić danymi, odpowiednio wg zaleceń znajdujących się koło nich. Rysunek 3.10. Przykładowy panel przedstawiający czynnik ryzyka. Również w tym przypadku, jeśli dane wprowadzone przez użytkownika będą błędne lub któreś z pól pozostanie pusta, na ekranie zostanie wyświetlony komunikat (3.11). 34 Rysunek 3.11. Przykładowy panel przedstawiający czynnik ryzyka. Jeżeli w czasie działania programu zostaną podane wszystkie dane i będą one poprawne, program na ich podstawie obliczy dolną oraz górną wartość ryzyka, które zostaną wyświetlone na panelu końcowym (3.12). Rysunek 3.12. Przykładowy panel przedstawiający czynnik ryzyka. Na tym aplikacja kończy swoje działanie, a użytkownik otrzymuje poprawnie wyliczone wyniki. 4. Podsumowanie Ogólnie rzecz ujmując niniejszy projekt trudno określić jako trudny bądź łatwy. Z jednej strony zadanie wydawało się proste i szybkie w wykonaniu. Z drugiej jednak strony teoria liczb rozmytych z przedziałowymi wartościami funkcji przynależności była pewną nowością. Całość teorii: dotycząca liczb rozmytych, jak również dotycząca całego procesu wnioskowania i wyliczania ryzyka zajścia wypadku stanowiła poważne wyzwanie. Problemem także, w pewnym momencie, stało się wymyślenie sensownych i w pełni poprawnych reguł matematycznych, za pomocą których obliczane jest ryzyko na kolejnych poziomach drzewa hierarchii. Warto jednak było pokonać wszystkie trudności, by przekonać się, że liczby rozmyte stanowią bardzo dobrą bazę do próby przetłumaczenia świata rzeczywistego, na rzecz algorytmów i programów. Choć pojęcie sensu ich istnienia nie należy do najprostszych, w pełni odpłacają za poświęcony im czas otwierając przed programistą czy tez zwykłym człowiekiem całkiem nowe możliwości. Tak samo jest w przypadku systemów eksperckich czy też systemów wnioskowania. Zrozumienie zasad ich działania nie należny do najprostszych. Uświadomiwszy sobie jednak jak ważną takie systemy pełnią rolę, jak bardzo pomagają ludziom w życiu codziennym i pomagają wejrzeć w przyszłość obliczając ryzyka czy cokolwiek innego, należy poświęcić im trochę więcej czasu. Wtedy wszystko zaczyna się ze sobą łączyć dając wspaniałe efekty. 36 5. Ocena realizacji założeń projektowych Realizacja założeń projektowych powiodła się w całym tego słowa znaczeniu. Udało się zaimplementować w pełni działający system operujący na liczbach rozmytych z przedziałowymi wartościami funkcji przynależności. Zaimplementowana została również hierarchia czynników ryzyka, wg której odbywa się liczenie kolejnych poziomów drzewa hierarchii. Wszystko to zostało oprawione przejrzystym i czytelnym interfejsem użytkownika. Wszystkie możliwe wyjątki zgłaszane przez program zostały obsłużone, dzięki czemu prawdopodobieństwo ”wysypania” się aplikacji jest znikome. Na końcu został stworzony plik .exe, dzięki któremu można uruchomić program klikając dwa razy na plik wykonywalny. 37 6. Możliwości rozwoju Główną możliwość rozwoju aplikacji upatruje się w uczynieniu z niej bardziej uniwersalnego narzędzia. Póki co, jest to program liczący wg wpisanej w siebie hierarchii. Należałoby sprawić, by program otrzymywał hierarchię czynników ryzyka, wg której ma liczyć, także w pliku z danymi i na podstawie tego budował hierarchię wśród obiektów znajdujących się w aplikacji. Dzięki temu program ten nie musiałby już służyć tylko do jednego celu lecz stałby się aplikacją otwartą np. na inne kategorie wypadków, które biorą pod uwagę inne czynniki ryzyka. Wszystko zależałoby od tego co zostało podane w pliku z danymi. 38 Spis rysunków 1.1. Hierarchia czynników ryzyka. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2. Wykres funkcji przynależności dla czynnika ”Generalna geometria lotniska”. . 7 1.3. Wykres funkcji przynależności dla czynnika ”Łączna liczba geometrii lotniska”. 7 1.4. Wykres funkcji przynależności dla czynnika ”Liczba operacji lotniska”. . . . . 8 1.5. Wykres funkcji przynależności dla czynnika ”Operacje skrzyżowania”. . . . . . 8 1.6. Wykres funkcji przynależności dla czynnika ”Liczba wtargnięć w operacjach lotniska”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.7. Wykres funkcji przynależności dla czynnika ”Wtargnięcia typu A lub B”. . . . 9 1.8. Wykres funkcji przynależności dla czynnika ”Wtargnięcia w operacjach skrzyżowania”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.9. Wykres funkcji przynależności dla czynnika ”Wtargnięcia w 105 operacji”. . . 10 1.10. Wykres funkcji przynależności dla czynnika ”Procent aktywności”. . . . . . . . 11 1.11. Wykres funkcji przynależności dla czynnika ”Dni od ostatniego przeglądu bezpieczeństwa”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.12. Wykres funkcji przynależności dla czynnika ”Roczny opad śniegu”. . . . . . . . 12 1.13. Wykres funkcji przynależności dla czynnika ”Deszczowe dni”. . . . . . . . . . . 12 1.14. Wykres funkcji przynależności dla czynnika ”Mroźne dni”. . . . . . . . . . . . 13 1.15. Wykres funkcji przynależności dla czynnika ”Gorące dni”. . . . . . . . . . . . . 13 1.16. Wykres funkcji przynależności dla czynnika ”Rożnica w długości dnia”. . . . . 14 1.17. Wykres funkcji przynależności dla czynnika ”Inne informacje”. . . . . . . . . . 14 1.18. Zbiór rozmyty typu pierwszego. . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.19. Zbiór rozmyty z przedziałowymi wartościami funkcji przynależności. . . . . . . 16 1.20. Przykładowe wykresy liczb rozmytych z przedziałowymi wartościami funkcji przynależności. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1. Wykres ryzyk dla czynnika ”Wtargnięcia typu A i B”. . . . . . . . . . . . . . . 28 3.2. Wykres ryzyk dla czynnika ”Mroźne dni”. . . . . . . . . . . . . . . . . . . . . . 29 3.3. Panel do wprowadzania danych przez użytkownika. . . . . . . . . . . . . . . . . 29 3.4. Panel do wprowadzania danych wypełniony testowymi danymi. . . . . . . . . . 30 3.5. Obliczone przez system całościowe ryzyko. . . . . . . . . . . . . . . . . . . . . 30 3.6. Obliczone przez system całościowe ryzyko dla danych testowych zawartych w listingu (3.3). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 39 3.7. Ekran powitalny aplikacji. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.8. Wybór pliku z danymi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.9. Błąd wczytywania pliku z danymi. . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.10. Przykładowy panel przedstawiający czynnik ryzyka. . . . . . . . . . . . . . . . 34 3.11. Przykładowy panel przedstawiający czynnik ryzyka. . . . . . . . . . . . . . . . 35 3.12. Przykładowy panel przedstawiający czynnik ryzyka. . . . . . . . . . . . . . . . 35 Spis tabel 1.1. Czynniki ryzyka wypadku typu ”wtargnięcie na drogę startową”. . . . . . . . . 3 1.2. Szczegóły czynników ryzyka wypadku typu ”wtargnięcie na drogę startową”. . 6 1.3. Funkcje przynależności dla czynnika ”Generalna geometria lotniska”. . . . . . 7 1.4. Funkcje przynależności dla czynnika ”Łączna liczba geometrii lotniska”. . . . . 7 1.5. Funkcje przynależności dla czynnika ”Liczba operacji lotniska”. . . . . . . . . . 8 1.6. Funkcje przynależności dla czynnika ”Operacje skrzyżowania”. . . . . . . . . . 8 1.7. Funkcje przynależności dla czynnika ”Liczba wtargnięć w operacjach lotniska”. 9 1.8. Funkcje przynależności dla czynnika ”Wtargnięcia typu A lub B”. . . . . . . . 9 1.9. Funkcje przynależności dla czynnika ”Wtargnięcia w operacjach skrzyżowania”. 10 1.10. Funkcje przynależności dla czynnika ”Wtargnięcia w 105 operacji”. . . . . . . . 10 1.11. Funkcje przynależności dla czynnika ”Procent aktywności”. . . . . . . . . . . . 11 1.12. Funkcje przynależności dla czynnika ”Dni od ostatniego przeglądu bezpieczeństwa”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.13. Funkcje przynależności dla czynnika ”Roczny opad śniegu”. . . . . . . . . . . . 12 1.14. Funkcje przynależności dla czynnika ”Deszczowe dni”. . . . . . . . . . . . . . . 12 1.15. Funkcje przynależności dla czynnika ”Mroźne dni”. . . . . . . . . . . . . . . . . 13 1.16. Funkcje przynależności dla czynnika ”Gorące dni”. . . . . . . . . . . . . . . . . 13 1.17. Funkcje przynależności dla czynnika ”Rożnica w długości dnia”. . . . . . . . . 14 1.18. Funkcje przynależności dla czynnika ”Inne informacje”. . . . . . . . . . . . . . 14 41 Spis listingów 2.1 Główna pętla funkcji wczytującej dane z pliku. . . . . . . . . . . . . . . . . 21 2.2 Funkcja wyliczająca wartości ryzyk dla danego czynnika. . . . . . . . . . . . 24 3.1 Dane wejściowe dla czynnika ”Wtargnięcia typu A i B”. . . . . . . . . . . . 27 3.2 Dane wejściowe dla czynnika ”Mroźne dni”. . . . . . . . . . . . . . . . . . . 28 3.3 Dane testowe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.4 Przykładowy fragment pliku danych. . . . . . . . . . . . . . . . . . . . . . . 33 42 Bibliografia [1] Jerry M. Mendel Dongrui Wu. The linguistic weighted average. 2006. [2] James H. Lambert Ellen C. Rogerson. Prioritizing risks via several expert perspectives with application to runway safety. Reliability Engineering and System Safety, 2012. [3] Michael Hadjimichael. A fuzzy expert system for aviation risk assessmentay safety. Expert Systems with Applications, 2009. [4] ICAO. Approval of amendment 1 to the pans–atm. 2008. [5] S.-M. Chen S.-J. Chen. Fuzzy risk analysis based on measures of similarity between interval-valued fuzzy numbers. Computers and mathematics with Applications, 2008. 43