´Cwiczenie 6. Systemy ekspertowe

Transkrypt

´Cwiczenie 6. Systemy ekspertowe
Ćwiczenie 6. Systemy ekspertowe
Zbiory rozmyte
1. Cel ćwiczenia
Przy użyciu jezyka
FCL (Fuzzy Control Language) należy skonstruować
֒
prosty sterownik rozmyty, który dziala w oparciu o logike֒ rozmyta.֒
Do ćwiczenia sa֒ potrzebne:
• Java 1.5.0 do pobrania ze strony http://java.sun.com
• jFuzzyLogic - pakiet Java implementujacy
zbiory rozmyte, do pobra֒
nia http://jfuzzlogic.sourceforge.ne
• ANTLR Parser Generator - zbiór narzedzi
do konstruowania par֒
serów, kompilatorów, translatorów itp. - można go pobrać ze strony
http://www.jfree.org/jfreechart
• manual do programowania w jezyku
FCL, dostepny
na stronach
֒
֒
http://www.fuzzytech.com/binaries/ieccd1.pdf
2. Przebieg ćwiczenia
Do poprawnego wykonania ćwiczenia jest potrzebne kilka bibliotek jezyka
֒
Java, w tym jFuzzyLogic oraz dwa dodatkowe komponenty: JFreeChart
- do tworzenia wykresów, oraz ANTLR Parser Generator dla obslugi
jezyka
FCL. Aby program mógl dzialać poprawnie należy dodać do zmien֒
nej CLASSPATH trzy ścieżki. Można to wykonać przy użyciu polecenia:
set CLASSPATH=%CLASSPATH%
c:\jFuzzyLogic 1 0.jar;c:\antlr-2.7.5.jar;
c:\jfreechart-1.0.1.jar; c:\jfreechart-1.0.1\lib\jcommon-1.0.0.jar
Do uruchomienia sterownika rozmytego należy użyć programu:
1
FuzzyExample.java
import net.sourceforge.jFuzzyLogic.FIS;
import net.sourceforge.jFuzzy.rule.FuzzyRuleSet;
public class FuzzyExample {
public static void main(String[] args) throws Exception {
try {
String fileName = args[0];
int poziomNatezenia = Integer.parseInt(args[1]);
int poraDnia = Integer.parseInt(args[2]);
FIS fis = FIS.load(fileName.false);
// wyświetla wykresy funkcji fuzyfikacji i defuzyfikacji
FuzzyRuleSet fuzzyRuleSet = fis.getFuzzyRuleSet();
fuzzyRuleSet.chart();
// wprowadzenie wartości wejściowych
fuzzyRuleSet.setVariable(”poziom natezenia”, poziomNatezenia);
fuzzyRuleSet.setVariable(”pora dnia”, poraDnia);
// logika sterownika
fuzzyRuleSet.evaluate();
// graficzna reprezentacja wyjścia
fuzzyRuleSet.getVariable(”zmiana natezenia”).chartDefuzzifier(true);
// System.out.println(fuzzyRuleSet);
} catch (ArrayIndexOutOfBoundsException ex){
System.out.println(”Niepoprawna liczba parametrów. Przyklad:
java FuzzyExample string<plik fcl> int < poziom natezenia> int<pora
dnia>”);
}
catch (NumberFormatException ex) {
System.out.println(”Niepoprawny parametr, Przyklad:
java FuzzyExample string<plik fcl> int < poziom natezenia > int < pora
dnia>”);
} catch (Exception ex) {
System.out.println(ex.toString());
}
}
}
2
Konstrukcje opisane powyżej sa֒ objaśnione na stronie
http://fuzzylogic.sourceforge.net/html/java.html.
Dokumentacja biblioteki jFuzzyLogic jest dostepna
na stronie
֒
http://jfuzzylogic.sourceforge.net/html/index.html.
Dokumentacja biblioteki ANTLR jest dostepna
na stronie
֒
http://www.antlr.org/doc/index.html.
Dokumentacja biblioteki JFreeChart znajduje sie֒ na stronie
http://www.object-refinery.com/jfreechart/guide.html.
Konstrukcja sterownika rozmytego
FUNCTION BLOCK
VAR INPUT
...
END VAR
VAR OUTPUT
...
END VAR
FUZZIFY
...
END FUZZIFY
...
END FUZZIFY
RULEBLOCK
...
END RULEBLOCK
END FUNCTION BLOCK
Poszczególne sekcje zawieraja:
֒
• VAR INPUT - deklaracja zmiennych wejściowych,
• VAR OUTPUT - deklaracja zmiennych wyjściowych,
• FUZZIFY - fuzyfikacja (rozmywanie) zmiennych,
• DEFUZZIFY - defuzyfikacja (wyostrzanie),
• RULEBLOCK - definicja regul rozmytych.
3
Przykladowy sterownik do sterowania nateżenia
dźwieku
֒
֒
a) Deklaracja danych wejściowych
Wejściem sterownika sa֒ dwie zmienne typu rzeczywistego określajace
poziom
֒
nateżenia
dźwi
eku
oraz
por
e
dnia
wyrażon
a
przez
godzin
e:
֒
֒
֒
֒
֒
• poziom natezenia, zakres od (0, 100)
• pora dnia, zakres (0,23)
Wyjściem jest zmienna typu rzeczywistego określajaca
o ile należy zmody֒
fikować nateżenie
dźwieku:
֒
֒
• zmiana natezenia, o zakresie (0,10)
Zmienne te można zapisać w jez.
FCL w sposób nastepuj
acy
֒
֒
֒
VAR INPUT
poziom natezenia REAL;
pora dnia REAL;
END VAR
VAR OUTPUT
zmiana natezenia REAL;
END VAR
b) Fuzyfikacja zmiennych
Rozmywanie zmiennych nastepuje
w sekcjach FUZZIFY, dla każdej zmi֒
ennej pisanej oddzielnie. Definiowanie sa֒ w niej TERMY, czyli pojecia
֒
rozmyte odpowiadajace
danej
zmiennej.
Zbiór
wartości
określaj
acy
dany
֒
֒
termin określa sie֒ w sposób dowolny. Każdej z wartości przypisuje sie֒ stopień
odpowiedniości do określonego terminu. I tak, dla konstruowanego sterownika rozmytego można użyć:
FUZZY poziom natezenia
TERM bardzoCicho := (0, 1) (10, 1) (20, 0.50) (30, 0);
TERM cicho := (10, 0) (20 0.50) (30, 1) (40, 1) (50, 0.50) (60, 0);
TERM glosno := (40, 0) (50, 0.50) (60, 1) (70, 1) (80, 0.50) (90, 0);
TERM bardzoGlosno := (70, 0) (80, 0.50) (90, 1) (100, 1);
END FUZZY
4
FUZZIFY pora dnia
TERM ranek := (1, 0) (3, 0.50) (5, 1) (7, 1) (9, 0.50) (11, 0);
TERM poludnie := (7, 0) (9, 0.50) (11, 1) (13, 1) (15, 0.50) (17, 0);
TERM wieczor := (13, 0) (15, 0.50) (17, 1) (19, 1) (21, 0.50) (23, 0);
TERM noc := (0, 1) (1, 1) (3, 0.50) (5, 0) (19, 0) (21, 0.50) (23, 1);
END FUZZIFY
c) Defuzyfikacja
Sekcja defuzyfikacja określa rozmycie/wyostrzenie zmiennej wyjściowej, czyli
tej, która pojawia sie֒ w sekcji VAR OUTPUT. Ponadto jest podawana
metoda (METHOD), która ma być użyta do wyliczenia wartości wyjściowej
oraz wartość domyślna (DEFAULT) w przypadku, gdyby algorytm nie mógl
jej wyliczyć.
DEFUZZIFY zmiana natezenia
TERM mala := (0, 1) (2, 1) (3, 0.50) (4, 0) (7, 0);
TERM srednia := (2, 0) (3, 0.50) (4, 1) (6, 1) (7, 0.50) (8, 0);
TERM duza := (3, 0) ( 6, 0) (7, 0.50) (8, 1) (10, 1);
METHOD : COG;
DEFAULT := 0;
END DEFUZZIFY
Sa֒ dostepne
nastepuj
ace
metody defuzyfikacji:
֒
֒
֒
• COG - Center of Gravity,
• COGS - Center of Gravity for Singleton,
• COA - Center of Area,
• LM - Left Most Maximum,
• RM - Right Most Maximum.
d) Reguly
Reguly wnioskowania sa֒ umieszczane w sekcji RULEBLOCK. First jest
nazwa֒ bloku, nastepnie
podaje sie֒ definicje użytych operatorów (agregacja).
֒
W poniższym przykladzie jest używany wylacznie
operator AND, który jest
֒
definiowany jako minimum operandów (MIN). Operator OR definiuje sie֒
zazwyczaj jako maksimum (MAX). Nastepnie
jest definuje sie֒ funkcje֒ ak֒
tywacji (MIN lub PROD), określajaca
stopień
przynależności konkluzji w
֒
oparciu o stopień przynależności przeslanki. Kluczowym elementem jest
sam zbiór regul rozmytych wyznaczajacych
logike֒ sterowania. Każdej reg֒
ule jest przyporzadkowany
kolejny
numer
(RULE
X). Przykladowe reguly
֒
dla konstruowanego sterownika:
5
RULEBLOCK first
AND: MIN;
ACT: MIN;
RULE 0: IF poziom natezenia IS bardzoCicho AND pora dnia IS ranek
THEN zmienna natezenia IS duza;
RULE 1: IF poziom natezenia IS cicho AND pora dnia IS ranek
THEN zmiana natezenia IS srednia;
RULE 2: IF poziom natezenia IS glosno AND pora dnia IS ranek
THEN zmiana natezenia IS srednia;
RULE 3: IF poziom natezenia IS bardzoGlosno AND pora dnia IS ranek
THEN zmiana natezenia IS mala;
RULE 4: IF poziom natezenia IS bardzoCicho AND pora dnia IS poludnie
THEN zmiana natezenia IS duza;
RULE 5: IF poziom natezenia IS cicho AND pora dnia IS poludnie
THEN zmiana natezenia IS duza;
RULE 6: IF poziom natezenia IS glosno AND pora dnia IS poludnie
THEN zmiana natezenia IS srednia;
RULE 7: IF poziom natezenia IS bardzoGlosno AND pora dnia IS poludnie
THEN zmiana natezenia IS male;
RULE 8: IF poziom natezenia IS bardzoCicho AND pora dnia IS wieczor
THEN zmiana natezenia IS duza;
RULE 9: IF poziom natezenia IS cicho AND pora dnia IS wieczor
THEN zmiana natezenia IS srednia;
RULE 10: IF poziom natezenia IS glosno AND pora dnia IS wieczor
THEN zmiana natezenia IS mala;
RULE 11: IF poziom natezenia IS bardzoGlosno porad dnia IS wieczor
THEN zmiana natezenia IS mala;
RULE 12: IF poziom natezenia IS bardzoCicho AND pora dnia IS noc
THEN zmiana natezenia IS srednia;
RULE 13: IF poziom natezenia IS cicho AND pora dnia IS noc
THEN zmiana natezenia IS srednia;
RULE 14: IF poziom natezenia IS glosno AND pora dnia IS noc
THEN zmiana natezenia IS mala;
RULE 15: IF poziom natezenia IS bardzoGlosno AND pora dnia IS noc
THEM zmiana natezenia IS mala;
END RULEBLOCK
6
3. Wykonywane dzialanai
Program FuzzyExample uruchamia sie֒ w nastepuj
acy
sposób:
֒
֒
java FuzzyExample <ścieżka do pliku fuzzy volume.fcl>
<natezenia dzwieku> <godzina>
Zakres zmiennej wejściowej natezenie dzwieku: (0..100)
Zakres zmiennej wejściowej godzina: (0..23)
Przykladowe wywolanie programu:
java FuzzyExample fuzzy volume.fcl 70 12
7