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