kramann.info
© Guido Kramann

Login: Passwort:










13.7.5 Genetischer Optimierer für den Fuzzy-geregelten Pendel

  • Direkt in die Klasse OptimiererModGrad wurde in dem Projekt im Ordner 05genetisch ein genetischer Optimierungsalgorithmus implementiert.
  • D.h. ohne den namen zu ändern wurde ein anderer als der bezeichnete Optimierer eingefügt, um gegenüber den vorherigen Projekten möglichst wenig ändern zu müssen.
  • Die Arbeitsweise eines Optimierers auf Basis eines genetischen Algorithmus wurde an anderer Stelle bereits erläutert.
  • Zum besseren Verständnis wird an dieser Stelle das UML-Klassen-Diagramm der Klasse betrachtet:
UML-KLassendiagramm des Genetischen Optimierers

Bild 13.7.5-1: UML-KLassendiagramm des Genetischen Optimierers

  • Die Teilaufgaben für die genetische Optimierung wurde zum leichteren Verständnis in eine Vielzahl an Hilfsmethoden aufgespalten.
  • Die Konfiguration des Optimierers geschieht über groß geschriebene private-Konstanten am Beginn der Klasse.
  • Die Bedeutungen der Konstanten und die Aufgaben der Hilfsfunktion wird im folgenden beschrieben:
ANZAHL_BITS          Anzahl der Bits, aus denen ein Gen besteht.
ANZAHL_GEN           Anzahl der DNA einer Generation
ANZAHL_BEST_GEN      Anzahl der in der Gruppe der Besten befindlichen DNA
ANZAHL_MUTIEREN      Anzahl der Bits, die bei Auswahl in einer DNA mutiert werden.
PMUTATION            Prozentuale Wahrscheinlchkeit für die Mutation
BITWERTMAX           Wert des höchstwertigsten Bits in einem Gen
ANZAHL_GENERATIONEN  Anzahl der in einemOptimierungsdurchgang durchgespielten Generationen

Code 13.7.5-1: Beschreibung der Konfigurations-Konstanten

  • Hinweise:
  • ANZAHL_BITS*anzahlParameter == Anzahl der Bits einer DNA.
  • int[][] gen enthält alle DNA: gen[0]==0.DNA, gen[1]==1.DNA usw.
genToParam                   wandelt ein Gen in einen double-Parameter mit Wertebereich [0,1] um.
paramToGen                   Umkehrung zu genToParam
rekombinieren                würfelt die Bits zweier DNA zufällig zu einer dritten neu zusammen.
kopieren                     kopiert eine DNA in ein anderen Integer-Array
mutieren                     zufälliges flippen von Bits in einer DNA
allokieren                   Vorbereiten aller notwendigen Arrays
findeBestenIndex             Findet die n besten DNA-Sätze heraus.
neueGeneration               Bildet aus den n besten DNA-Sätzen eine neue Generation von DNAs
findeIndexKleinsterFehler    Sucht den Index der DNA heraus, die den kleinsten Fehler liefert.
initialisieren               Füllt das DNA-Array, sucht daraus die besten heraus und bereitet eine neue Generation vor.

Code 13.7.5-2: Aufgaben der Hilfsfunktion

fuzzy_genetisch.zip - Das Projekt mit genetischem Algorithmus in Ordner 05genetisch und auch noch einmal alle vorhergehenden.
Index kleinster Fehler:98 Kleinster Fehler:44.21206672635522
Start-Parametersatz:
Parameter Nr.0: 1.0
Parameter Nr.0: 1.0
Parameter Nr.0: 1.0
Parameter Nr.0: 1.0
Parameter Nr.0: 1.0
Parameter Nr.0: 1.0
Parameter Nr.0: 1.0
Parameter Nr.0: 1.0
Parameter Nr.0: 1.0
Parameter Nr.0: 1.0
Startfehler: 304.4315343901353
Minimierter Fehler: 44.21206672635522
Bester gefundener Parametersatz:
Parameter Nr.0: 0.5032967032967033
Parameter Nr.1: 0.5262515262515263
Parameter Nr.2: 0.5003663003663004
Parameter Nr.3: 2.442002442002442E-4
Parameter Nr.4: 0.5003663003663004
Parameter Nr.5: 0.5001221001221001
Parameter Nr.6: 0.0
Parameter Nr.7: 0.7094017094017094
Parameter Nr.8: 0.5003663003663004
Parameter Nr.9: 0.5628815628815629

Code 13.7.5-3: Verlauf eines Optimierungsvorgangs

Vergleich der Simulationen vor und nach der Optimierung mittels genetischem Algorithmus.

Bild 13.7.5-2: Vergleich der Simulationen vor und nach der Optimierung mittels genetischem Algorithmus.

Übung zum genetisch optimierten Hängependel im Projektordner fuzzy_genetisch/05genetisch
  • Sorgen Sie dafür, dass die Fehlerfunktion berechneFehler(...) in der Klasse FehlerfunktionAntrieb aus mehreren Simulationen mit sinnvollen Anfangsbedingungen gebildet wird.
  • Hierzu können Sie folgendermaßen vorgehen:
  • Ergänzen Sie die Klasse SimulatorAntrieb in 05genetisch durch eine zweite Methode simulieren(phi0,omega0), der die Anfangsbedingungen für die Simulation mitgegeben werden.
  • Rufen Sie diese neue Methode von berechneFehler(...) in FehlerfunktionAntrieb aus mehrmals mit unterschiedlichen Anfangsbedingungen auf und geben Sie den Gesamtfehler zurück.
  • Modifizieren Sie die verwendeten Fuzzy-Regeln in der Klasse Antrieb.java so, dass sie dem an der Tafel entwickelten Entwurf entsprechen.
  • Vergleichen Sie die Güte des alten und des neuen Parametersatzes für die Fuzzy-Regeln, insbesondere für Auslenkungen des Pendels von mehr als 90o.
  • Versuchen Sie möglichst Regelparameter zu finden, die möglichst gut für beliebige Anfangsbedingungen der Simulation funktionieren.