5.2 KiB
Wykorzystanie pakietu jFuzzyLogic do modelowania sterownika rozmytego
<<TableOfContents>
{=html}>
FCL (FUZZY CONTROL LANGUAGE)
Fuzzy Control Language jest rozwijany jako standard International Electrotechnical Commission. Na rynku dostępnych jest kilka darmowych bibliotek zgodnych z tym standardem. W tym ćwiczeniu wykorzystana zostanie biblioteka języka Java, jFuzzyLogic.
Do pobrania: jFuzzyLogic.jar
Kod funkcji FCL (.fcl) będziemy edytować korzystając z dowolnego edytora, natomiast do uruchomienia sterownika rozmytego i wizualizacji wyników użyjemy powyższych bibliotek. W tym celu skorzystamy z prostego programu w języku Java, bazującego na nich, który wczyta utworzony sterownik FCL, wykona go dla przykładowych wartości wejściowych i zobrazuje wyniki.
Kod funkcji FCL znajduje się w poniższej ramce:
Szkielet funkcji implementującej sterownik rozmyty
FUNCTION_BLOCK
VAR_INPUT
...
END_VAR
VAR_OUTPUT
...
END_VAR
FUZZIFY
...
END_FUZZIFY
DEFUZZIFY
...
END_DEFUZZIFY
RULEBLOCK
...
END_RULEBLOCK
END_FUNCTION_BLOCK
Poszczególne sekcje zawierają:
- VAR_INPUT - deklaracja zmiennych wejściowych
- VAR_OUTPUT - deklaracja zmiennych wyjściowych
- FUZZIFY - fuzyfikacja (rozmywanie) zmiennych
- DEFUZZIFY - defuzyfikacja (wyostrzanie)
- RULEBLOCK - definicje reguł rozmytych
Zmienne, które pojawiły się w sekcji VAR_INPUT rozmywane są w sekcjach FUZZIFY, dla każdej zmiennej pisze się osobną sekcję FUZZIFY. Definiowane są w niej TERMY , czyli pojęcia rozmyte odpowiadające danej zmiennej. Arbitralnie wybiera się zbiór wartości określający dany termin i każdej z wartości przypisuje się stopień odpowiedniości do określanego terminu.
W sekcji DEFUZZIFY określa się rozmycie/wyostrzenie zmiennej wyjściowej, czyli tej, która pojawiła się w sekcji VAR_OUTPUT. Ponadto podawana jest nazwa metody (METHOD), która ma być użyta do wyliczenia wartości wyjściowej oraz wartość domyślna (DEFAULT) w przypadku, gdyby algorytm nie mógł jej obliczyć.
Dostępne metody obliczania wartości wyjściowej (DEFUZZIFY) w FCL:
- COG (Center of Gravity)
- COGS (Center of Gravity for Singletons)
- COA (Center of Area)
- LM (Left Most Maximum)
- RM (Right Most Maximum)
Linki
Strona projektu (źródła i dokumentacja projektu): http://jfuzzylogic.sourceforge.net/html/index.html
Wyjaśnienie konstrukcji zawartych w kodzie znajduje się na http://jfuzzylogic.sourceforge.net/html/manual.html
Oficjalnym dokumentem specyfikującym język FCL jest dokument IEC: http://www.fuzzytech.com/binaries/ieccd1.pdf
Przykład - Napiwek
Uruchomienie
- Archiwum z biblioteką JFuzzyLogic jFuzzyLogic.jar wgrać do jednego katalogu z plikami projektu: napiwek.fcl napiwek.java
- Kompilacja w laboratoriach:
- javac -cp jFuzzyLogic.jar napiwek.java
- Uruchomienie Windows
- java -cp jFuzzyLogic.jar;. napiwek
- Uruchomienie Linux
- java -cp jFuzzyLogic.jar:. napiwek
Sformułowanie problemu
Zaprojektować rozmyty model pomagający ocenić wysokość napiwku dołączanego do rachunku w restauracji. Wysokość napiwku ma być uzależniona od: jakości obsługi i jedzenia. Klient dokonuje ostrej oceny tych kryteriów w skali od 0 do 10 punktów . Zmienne te podawane są na wejście modelu. Wyjściem jest natomiast wysokość napiwku w procentach:
Zmienne wejściowe (VAR_INPUT):
- obsluga
- jedzenie
Zmienne wyjściowe (VAR_OUTPUT):
- napiwek
Wartości zmiennych wejściowych (FUZZIFY):
- obsluga: zła, dobra, znakomita
- jedzenie: niezbyt smaczne, średnie, wyśmienite
Wartości zmiennych wyjściowych (DEFUZZIFY):
- napiwek: skromny, sredni, hojny
Reguły:
- R1: IF (obsługa kiepska) OR (jedzenie niezbyt smaczne) THEN (napiwek skromny)
- R2: IF (obsługa przeciętna) THEN (napiwek średni)
- R3: IF (obsługa znakomita) OR (jedzenie znakomite) THEN (napiwek hojny)
Realizacja problemu z użyciem pakietu jFuzzyLogic:
- Plik z FCL: napiwek.fcl
- Plik projektu: napiwek.java
{{attachment:chris/MIN_2013/Zajecia_8/napiwek.PNG}}
Zadanie
Wykorzystując pakiet jFuzzyLogic zaprojektuj system rozmyty dokonujący oceny kandydata na pracownika.
Kryteriami oceny są: wiek (w latach), inteligencja (w punktach IQ) oraz doświadczenie (w latach).
Kandydat ma zostać zaklasyfikowany do jednego ze zbiorów: słaby, przeciętny, dobry, bardzo dobry.