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

Podobne dokumenty