161 lines
5.4 KiB
Markdown
161 lines
5.4 KiB
Markdown
|
||
# 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 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.
|