Programmieraufgabe 107

In den letzten Tage habe ich noch ein bisschen weiter an dem Genetischen Algorithmus von der Aufgabe 106 rumprobiert und ein paar Verbesserungen durchgeführt. Der zugehörige Quelltext steht wieder ganz unten und kann gerne benutzt werden.

Verbesserungen

In der letzten Version habe ich an einer Stelle zwei zufällig große Kreise gemalt und die Fitnessfunktion verglichen. Wenn die bessere Version auch besser ist als das, was ich schon erzeugt habe, dann habe ich es übernommen.

Dies habe ich jetzt insofern verbessert, als das

  • es nicht mehr nur 2 Kreise, sondern pro Genereation eine vorher einstellbare Anzahl ist. 20 ist ganz gut und 100 sollte das Maximum sein, da sonst das Programm zu langsam wird. Diese Anzahl wird durch die Klasse Population verwaltet.
  • die Kreise jetzt beginnend mit 1 Pixel Durchmesser schrittweise hochskaliert werden und nicht mehr nur einfach zufällig groß gewählt werden.
  • es jetzt auch möglich wäre andere geometrische Formen zu benutzen, da ich – hoffe ich, alles auf einer abstrakten Basisklasse GeoObject beruht.
  • die Entstehung der Bilder in einer Art Genom, nämlich einer ArrayList der GeoObject verwaltet wird.

Dennoch ist das Ergebnis nicht so gut, wie ich gehofft hatte (das erste ist nach 500 Kreisen, das zweite ist nach 2000):

Probleme

Vor allem der zeitliche Aufwand ist deutlich gestiegen. Zunächst habe ich zur Berechnung der Fitnessfunktion für jedes der 20 Bilder, die pro Generation erzeugt werden, das Bild komplett neu zeichnen lassen, um dann die Fitnessfunktion zu berechnen. Das war mit zunehmener Anzahl von Kreisen natürlich irre zeitaufwendig. Daher wird das Bild der besten Annäherung an die jeweils nächste Generation weitergegeben und nur ergänzt.

Was aber immer noch schlecht ist, ist die Tatsache, dass ich ganz häufig Generationen habe, in den denen keine Verbesserung auftritt. Man erkennt das daran, dass “frameCount” hochzählt, aber kein Kreis ergänzt wurde. Im Bild lässt sich erkennen, dass framecount die Werte 16-22 annimmt ohne das eine neue Generation erzeugt wurde. Und dieser Effekt wird natürlich mit zunehmender Generation immer deutlicher.

Eine geschickte Lösung ist mir dazu noch nicht eingefallen. Der Autor spricht da von “simulated annealing” als Ansatz, aber ich habe noch keine Idee, wie genau ich das genau umsetzen soll (s. Aufgabe unten). Vor allem nicht, bei anderen geometrischen Figuren wie beispielweisen Ellipsen (2 Halbachsen + Rotation) oder Dreiecken (3 Ecckpunkte + Rotation) oder Rechtecken (4 Eckpunkte + Rotation). Im Grunde muss ich halt geschickter die geometrischen Figuren durchprobieren, aber wie?

Aufgabe 107

Lade dir den Quelltext herunter bearbeite die folgenden Teilaufgaben:

a) Verändere die Zahl der GeoObjects pro Generation.

b) Verändere die Mutierung dieser Objekte.

c) Überlege dir eine neue Fitnessfunktion.

d) Ergänze das Programm so, dass Ellipsen mit Rotation statt Kreise gezeichnet werden.

Hier noch der Quelltext: GenetischerAlgBsp5

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Durch die weitere Nutzung der Seite (Scrollen, Navigieren) stimmen Sie der Verwendung von Cookies zu. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen