# Wykorzystanie pakietu jFuzzyLogic do modelowania sterownika rozmytego {#wykorzystanie_pakietu_jfuzzylogic_do_modelowania_sterownika_rozmytego} \<``{=html}\> ## FCL (FUZZY CONTROL LANGUAGE) {#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](attachment:chris/MIN_2013/Zajecia_8/jFuzzyLogic.jar "wikilink") 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 {#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: {#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): Wyjaśnienie konstrukcji zawartych w kodzie znajduje się na Oficjalnym dokumentem specyfikującym język FCL jest dokument IEC: ## Przykład - Napiwek {#przykład___napiwek} ### Uruchomienie - Archiwum z biblioteką [JFuzzyLogic](JFuzzyLogic "wikilink") [jFuzzyLogic.jar](attachment:chris/MIN_2013/Zajecia_8/jFuzzyLogic.jar "wikilink") wgrać do jednego katalogu z plikami projektu: [napiwek.fcl](attachment:chris/MIN_2013/Zajecia_8/napiwek.fcl "wikilink") [napiwek.java](attachment:chris/MIN_2013/Zajecia_8/napiwek.java "wikilink") - Kompilacja w laboratoriach: - **javac -cp jFuzzyLogic.jar napiwek.java** - Uruchomienie Windows - **java -cp jFuzzyLogic.jar;. napiwek** - Uruchomienie Linux - **java -cp jFuzzyLogic.jar:. napiwek** ### Ewaluacja bez programu java {#ewaluacja_bez_programu_java} - - **java -jar jFuzzyLogic.jar -e napiwek.fcl 8 9** `    gdzie po pliku fcl podane są parametry wejściowe` ### Sformułowanie problemu {#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: {#realizacja_problemu_z_użyciem_pakietu_jfuzzylogic} - Plik z FCL: [napiwek.fcl](attachment:chris/MIN_2013/Zajecia_8/napiwek.fcl "wikilink") - Plik projektu: [napiwek.java](attachment:chris/MIN_2013/Zajecia_8/napiwek.java "wikilink") ```{=mediawiki} {{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.