kramann.info
© Guido Kramann

Login: Passwort:










COACH2
1 Planung
2 Architektur
3 Anzeige
4 EEPROM
5 I2C
..5.1 MasterSendByte
..5.2 MasterSend2Bytes
..5.3 MasterReceiveByte
..5.4 MasterReceive2Bytes
6 UART
7 DFT
8 FFT
9 Planung2
10 Klassen
..10.1 AnzeigeTaster
..10.2 RS232
..10.3 MotorServo
..10.4 Drehgeber
..10.5 Sensor
..10.6 Funk
11 Adaption
..11.1 Programmiertechnik
..11.2 Evoopt
12 Fuzzy
..12.1 Uebungsaufgabe
..12.2 Fuzzygroesse
..12.3 Fuzzyset
..12.4 Lookuptable
13 Skript
..13.1 Funkkorrektur
..13.2 Skriptsprachen
..13.3 Anforderungen
..13.4 Agentensysteme
..13.5 Implementierung
..13.6 Experimente
14 Gesamtkonzept
..14.1 Skripterweiterung
..14.2 Makroverhalten
67 Echtzeitsysteme
..67.1 Einfuehrung
....67.1.1 Echtzeit
....67.1.2 Korrektheit
....67.1.3 Hardware
....67.1.4 Ziele
....67.1.5 Synchronprogramm
..67.2 Threads
....67.2.1 Java
....67.2.2 Synchronisierung
..67.3 COACH
....67.3.1 Kaskadenregler
....67.3.2 Zeitebene1
....67.3.3 Zeitebene2
....67.3.4 Zeitebene3
....67.3.5 Puck
....67.3.6 Puckschwarm
..67.4 RTAIlab
....67.4.1 Slax
....67.4.1 USB_Stick
....67.4.2 Sinus
..67.5 Semaphor
....67.5.1 Laufkatze
....67.5.2 Java
....67.5.3 Semaphor
..67.6 Audio
....67.6.1 wav
....67.6.2 Linux
..67.7 Lookup
....67.7.1 Fuzzy
....67.7.2 PWM
..67.8 NeuronaleNetze
....67.8.1 Neuron
....67.8.2 Backpropagation
....67.8.3 Umsetzung
....67.8.4 Winkelerkennung
..67.9 Internetprogrammierung
....67.9.1 Codegenerierung
....67.9.2 PHP_Programmierung
....67.9.3 PHP_OOP
....67.9.4 Java
....67.9.5 UDP
..67.10 DFT
..67.11 FFT
..67.12 Zustandsmaschine
..67.13 Fuzzy
....67.13.1 Fuzzylogik
....67.13.2 FuzzyRegler
....67.13.3 Uebung9
....67.13.5 Softwareentwicklung
......67.13.5.1 AgileSoftwareentwicklung
......67.13.5.2 FuzzyRegler
......67.13.5.3 Uebung
....67.13.6 Umsetzung
......67.13.6.1 FuzzyRegler
......67.13.6.2 Simulation
......67.13.6.3 Optimierung
......67.13.6.4 Uebung
....67.13.7 Haengependel
......67.13.7.1 Haengependel
......67.13.7.2 Simulation
......67.13.7.3 FuzzyRegler
......67.13.7.4 Optimierer
......67.13.7.5 Genetisch
....67.13.8 Information
....67.13.9 Energie
67.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 67.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 67.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 67.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 67.13.7.5-3: Verlauf eines Optimierungsvorgangs

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

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