Übungen zu Fuzzy Theorie

 

Ziel der Übung ist es, eine Umgebung für die Erstellung eines Fuzzy Reglers zu erstellen.

Die Umgebung wird aus zwei Komponenten bestehen.

Komponente 1:

Ein graphisches System zur Erzeugung und zum Testen eines Fuzzy Reglers. Dieses System exportiert eine Datei, die alle Informationen über den Fuzzy Regler enthält.

 

Komponente 2:

Ein ausführbares Programm, das bei Initialisierung eine von Komponente 1 erzeugte Regler-Datei importiert und dann als der so erzeugte Regelmechanismus eine konkrete Regelstrecke steuert.

 

Wesentlich für die gesamte Programmierung ist die Trennung von Daten, Funktion und Darstellung. Die Trennung von Daten und Funktion ist in modernen Sprachen meist schon zwingend vorgegeben. Die Darstellung als dritte Komponente muß in zumindest zwei Varianten konzipiert werden, die literale Darstellung zur Abspeicherung in eine Datei und die Graphische Darstellung zur Verwendung in einer GUI.

 

 

Übung Nr. 1
Erzeuge eine Klasse FuzzySet,  die zunächst als Daten die Informationen über die Grundmenge (reelles Intervall [a,b]) und über eine Trapezfunktion a1,a2,a3,a4,h mit
0 <= h <=1 , a <= a1 <= a2 <= a3 <= a4 <= b

Die Klasse muß mit einer Methode wert() ausgestattet werden, die für jede Eingabe aus der Grundmenge den Wert der Funktion  µ  der Fuzzy Menge ausgibt.

Bei der Konzeption des Konstruktors ist dokumentarisch festzuhalten, was mit Eingaben geschieht, die nicht den vorgeschriebenen Bedingungen genügen. Wird eine Voreinstellung (default) verwandt, wird eine exception geworfen, oder wird eine automatische Korrektur vorgenommen?

 

Übung Nr. 2

Erweitere die Klasse FuzzySet um folgende Methoden:

 

 

Übung Nr. 3

Erzeuge eine Klasse FuzzyVariable, die eine endliche Folge von FuzzySet’s (linguistische Terme) auf derselben Grundmenge [a,b] darstellt. Daneben soll eine gleichlange Folge von Strings als Namen für die lingustischen Terme verwaltet werden, über die die Werte der linguistischen Terme abgerufen werden können, diese Namen sind per Voreinstellung die Zahlen 1,2,…n (als Strings).

Per default soll jede FuzzyVariable einen linguistischen Term 0 haben, der konstant 0 ausgibt.

Die Konstruktoren erhalten die Intervallgrenzen a,b als Eingabe, sowie entweder die Zahl n der linguistischen Terme oder einen String mit den durch Leerzeichen getrennten Namen der Terme.

Die Klasse muß Methoden haben, die verwendeten Namen abzufragen oder zu ändern, linguistische Variablen hinzuzufügen oder (außer 0) zu löschen, Die Eigenschaften linguistischer Terme zu setzen (über numerische Eingaben und/oder Strings (aus einer toString() Methode)), dabei soll ein linguistischer Term entweder über seine Nummer oder seinen Namen angesprochen werden können.

Schließlich muß es eine Methode fuzzyfy(x) geben, die für jedes x in [a,b] das array a1,a2,…,an ausgibt, dabei ist ai = term[i].wert(x) der Wert des i-ten Terms an der Stelle x.

Auch hier sollte es eine toString Methode mit dazu passendem Kostruktor geben.

 

 

 

Übung Nr. 4

Es ist nun an der Zeit eine Zeichenroutine für Fuzzy Mengen und Fuzzy Variablen zu denken, um später sehen zu können, wie ein Controller die Eingaben verarbeitet und anhand dessen die linguistischen Terme an das Problem anzupassen.

Dieses Programm soll ein einzelnes Fuzzy set oder eine ganze Fuzzy variable entgegennehmen und sie in einem neuen Fenster zeichnen. Zusätzlich soll es eine Möglichkeit zur Eingabe eines Wertes aus der Grundmenge [a,b] geben, auf das hin das Ausgabe-Tupel der Fuzzy Variable angezeigt wird. 

Insgesamt soll eine graphische Oberfläche entstehen, in der man eine (später mehrere) Fuzzy Variable anlegen und zeichnen kann

 
Eingabe der Grundmenge,

Angabe der Zahl und Namen von Linguistischen Termen in der Variablen

Definition der Zugehörigkeitsfunktion µA für die linguistischen Terme A

Zeichnen der Fuzzy Variablen.  

Es soll möglich sein, neben den frei definierten Termen auch deren Kompositionen mit „nicht“, „und“ und „oder“ als weitere Terme einzuführen.

 

 

Übung Nr. 5

Zweite Komponente unseres Einrichtungssystems für Fuzzy Systeme ist der Regel-Generator.  Dazu muß dem Generator eine Liste  der Namen aller Linguistischen Variablen und der zugehörigen linguistischen Terme übergeben werden ( deren Grundmengen und Definitionen sind für diesen Arbeitsschritt unerheblich ) . Es muß ausgewiesen werden, welche der Variablen zum Input bzw. zum Output gehören.

Nun können die Regeln in Form einer Tabelle eingegeben werden, in der für jede Input- und Output-Variable eine Spalte eingerichtet wird.

In jede Zeile wird nun eine Regel eingetragen, indem in jeder Spalte ein Term (Name oder lfd. Nummer) der zugehörigen Input- bzw. Output-Variable steht.

 

Ort

Geschwindigkeit

Auslenkung

Winkelgeschwindigkeit

Beschleunigung

mitte

langsam

gering

 

starkVorwärts

 

 Diese Zeile bedeutet WENN Ort=mitte AND Geschwindigkeit=langsam AND Auslenkung=gering THEN Beschleunigung=starkVorwärts 
ein leeres Feld entspricht also einem egal das immer eine maximale Erfüllung 1 hat.

 Diese Tabelle wird von dem Regelgenerator zurückgegeben.

Es ist angebracht, den Regelgenerator als eine art primitiven Editor mit einer graphischen Benutzeroberfläche zu konzipieren.

 

 

Übung Nr. 6

Nun können wir die Komponente zur Erzeugung eines Fuzzy systems fertig zusammensetzen.

Wir benötigen eine graphische Oberfläche, die wir mit oder ohne eine Datei-eingabe öffnen können und die zunächst eine Oberfläche öffnet, in der die Varaiablen sortiert nach Input und Output als anklickbare Items aufgelistet sind. Variablen haben einen Namen, Unter-/Ober-grenze und ein Attribut Input/output, die alle editierbar sein sollten und mit einem Button "neue Variable".kann ein leeres Variablenfeld erzeugt werden, das dann editiert werden muß.

Das Anklicken einer der Variablen führt zu einer Seite, auf der die Linguistischen Terme zu dieser Variablen aufgeführt sind, mit der Möglichkeit einzelne davon ein/auszublenden oder ganz zu löschen bzw. weitere hinzuzufügen. Ein Klicken auf einen Term öffnet ein neues Fenster, in dem die zugehörige Fuzzy Menge angezeigt bzw. neu definiert oder verändert werden kann. Angenehm wäre es, wenn die Veränderung sowohl mit der Maus als auch mit den Tastatureinträgen passieren könnte.

Aus dem Eingangsfenster muß auch der Regeleditor aus Aufgabe 5 aufrufbar sein, um das Regessystem für den Regler aufzubauen bzw. zu verarbeiten.

Abschließend sollte es eine Auswahl geben welches t-Norm/t-conorm-Paar und welche Defuzzifizierungsmethode angewandt werden soll (die Implementierung von Normen und Defuzzifizierung kann auf den Ausführungsmodul verschoben werden. Ein Export des so konstruierten Fuzzy Reglers in eine Datei muß realisiert werden. Diese Datei muß sich zur Eingabe in diesen Editor eignen, um einen schon konstruierten Regler zu verändern oder weiter zu entwickeln.

 

 

Übung Nr. 7

Der nächste Schritt ist nun die Konstruktion des eigentlichen Ablaufmodells eines Fuzzy Reglers.

Dieses Programm soll auf command line ablaufen. Es wird mit einer Datei aufgerufen, die gemäß Aufgabe 6 einen Fuzzy Regler beschreibt (Linguistische Variablen für Eingabe und Ausgabe, Liste von Regeln, Angabe des Defuzzifizierers). Danach erwartet das Programm eine double[] (bzw. float[]) mit den Eingaben aus der Regelstrecke und produziert daraus das double[] (bzw. float[]) der Regelgrößen, mit denen die Regelstrecke gesteueret wird.

Zunächst liest das Programm die Linguistischen Variablen, die Liste der Regeln und die Defuzzifizierungsregel aus der Datei des Fuzzy Reglers ein und ist dann bereit für Eingaben

Auf der Eingabe wird nun im ersten Schritt die Fuzzifizierung durchgeführt

Nun wird damit die logische Inferenz mit Hilfe der vorhandenen Regeln durchgeführt (MIN-MAX-Inferenz). Wer mehrere mögliche t-Norm/t-Conorm Paare implementiert hat, kann deren Wahl in die Datei des Fuzzy Reglers aufnehmen und dann die logische Inferenz mit dem gewählten Logik-Paar vornehmen.

Schließlich wird mit Hilfe der vorgegebenen Defuzzifizierungsmethode für jede Ausgabevariable deren scharfer Wert für die Ausgabe ermittelt.

Das Array dieser scharfen Werte wird nun auf den Output-Stream geschrieben und das Programm bleibt inaktiv, bis die nächste Eingabe die Berechnung einer neuen Ausgabe anstößt

 

 

Übung Nr. 8

Für die praktische Anwendung ist die Modellierung einer Anwendung notwendig, wir haben im Kapitel 5 Implementation drei typische Anwendungen beschrieben: Das Pendel, die Laufkatze und das inverse Pendel.

Diese Anwendingsszenarien sollen für den Anschluß an einen Fuzzy Regler programmiert werden, wobei der Output stets Ort, Geschwindigkeit, Auslenkung und Winkelgeschwindigkeit sein soll. Die Eingabe ist die Kraft,die auf den wagen mit der Aufhängung wirkt.

Ein Zusatzprogramm soll die Ausgaben Ort und Winkel visualisieren, entweder als Kurve über die Zeitintervalle oder als Momentanen Zustand in einer Graphik.