3
1
dydaktyka/chris/MIN_2016/Zajecia_8.md

156 lines
5.3 KiB
Markdown
Raw Normal View History

2021-10-04 17:31:55 +02:00
> Strona automatycznie zmigrowana z systemu Eduwiki z wykorzystaniem Pandoc
2021-10-04 16:58:37 +02:00
# 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**
### 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.