´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