3
1
dydaktyka/chris/MIN_2016/Zajecia_8.md

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:

{{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.