3
1
dydaktyka/chris/MIN_2017/Zajecia_8.md

161 lines
5.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Wykorzystanie pakietu jFuzzyLogic do modelowania sterownika rozmytego {#wykorzystanie_pakietu_jfuzzylogic_do_modelowania_sterownika_rozmytego}
\<`<TableOfContents>`{=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):
<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 {#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  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.