2013-12-13 12 views
6

Meine Aufgabe:Genetische/evolutionäre Algorithmus - Maler

Erstellen Sie ein Programm nur ein Bild (angegeben als Eingang) mit Primitiven kopieren (wie Dreieck oder etwas). Das Programm sollte einen evolutionären Algorithmus verwenden, um ein Ausgabebild zu erzeugen.


Meine Frage:

Ich brauche einen Algorithmus zu erfinden Populationen zu erstellen und überprüfen Sie sie (wie viel - in% - sie das Eingangsbild entsprechen). Ich habe eine Idee; Sie können es unten finden.

Also, was will ich von Ihnen: Beratung (wenn Sie meine Idee finden nicht so schlecht) oder Inspiration (vielleicht haben Sie eine bessere Idee?)


Meine Idee:

Nehmen wir an, ich verwende nur Dreiecke, um das Ausgabebild zu erstellen.

Meine erste Population ist P Bilder (erzeugt durch die Verwendung T zufällig generierten Dreiecke - genannt Elements).

prüfe ich durch meine Fitness-Funktion alle Bilder in der Bevölkerung und wählen E von ihnen als Elite und der Rest der Bevölkerung entfernen Sie einfach:

To compare 2 pictures we check every pixel in picture A and compare his R,G,B with 
    the same pixel (the same coordinates) in picture B. 
    I use this: 
      SingleDif = sqrt[ (Ar - Br)^2 + (Ag - Bg)^2 + (Ab - Bb)^2] 
    then i sum all differences (from all pixels) - lets call it SumDif 
    and use: 
      PictureDif = (DifMax - SumDif)/DifMax 
    where 
      DifMax = pictureHeight * pictureWidth * 255*3 

Die besten werden verwendet, um die nächste Bevölkerung auf diese Weise zu erstellen:

picture MakeChild(picture Mother, picture Father) 
    { 
      picture child; 
      for(int i = 0; i < T; ++i) 
      { 
         j //this is a random number from 0 to 1 - created now 
         if(j < 0.5) child.element(i) = Mother.element(i); 
         else child.element(i) = Father.element(i) 
         if(j < some small %) mutate(child.element(i)); 
      } 
      return child; 
    } 

So ist es ziemlich einfach. Nur die Mutation benötigt einen Kommentar: Es gibt also immer eine kleine Wahrscheinlichkeit, dass Element X in Kind anders ist als X in seinem Elternteil. Um dies zu tun, machen wir zufällige Änderungen im Element in Kind (ändern Sie seine Farbe durch Zufallszahl oder fügen Sie Zufallszahl zu seiner (x, y) Koordinate - oder seinem Knoten) hinzu.

Also das ist meine Idee ... Ich habe es nicht getestet, habe es nicht programmiert. Bitte überprüfen Sie meine Idee - was denken Sie darüber?

+0

Sie könnten vielleicht versuchen, die Zielfunktion so zu variieren, dass Sie am Anfang größere Patches als einzelne Pixel abgleichen möchten. Vielleicht sollte man einen Filter anwenden, um das Bild und die Kandidaten zu vergröbern, und man kann die Paarung und Mutation so durchführen, dass alle Elemente in einem solchen Patch verschoben werden. Sie reduzieren die Größe der Patches progressiv, bis Sie Pixel erhalten. (Jetzt, wo ich darüber nachdenke, ist es wie simuliertes Glühen in einem genetischen Algorithmus.) – Fortunato

+2

[Dieser Blogbeitrag] (http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona- lisa /) scheint genau zu beschreiben, was Sie erreichen möchten, obwohl er bei jedem Schritt nicht aus einer Population auswählt, sondern diese einfach mit der vorherigen Iteration vergleicht. Das fühlt sich eher wie simuliertes Glühen an, als irgendetwas genetisches für mich, aber trotzdem denke ich, dass es für Sie wertvoll wäre, darüber zu schauen. –

Antwort

2

Ich würde die Anzahl der Patches jedes Kindes dynamisch machen und die Mutationsoperation zum Einfügen/Löschen von Patches mit einer (niedrigen) Wahrscheinlichkeit erhalten. Natürlich könnte dies zu einer Menge Redundanz und Aufblähung im Genom des Kindes führen. In diesen Situationen ist es normalerweise eine gute Idee, die Länge des Genoms eines Individuums als einen Parameter der Fitnessfunktion zu verwenden, so dass Individuen belohnt werden (mit einem höheren Fitnesswert), um weniger Patches zu verwenden. Wenn zum Beispiel die PictureDif der Individuen A und B gleich sind, aber das A weniger Flecken hat als B, dann hat A eine höhere Fitness.

Ein anderes Problem ist der Reproduktionsoperator, den Sie vorgeschlagen haben (nämlich die Crossover-Operation). Damit der evolutionäre Prozess effizient funktioniert, müssen Sie eine angemessene Explorations- und Ausbeutungsbilanz erreichen. Eine Möglichkeit, dies zu tun, besteht darin, eine Reihe von Fortpflanzungsoperatoren zu haben, die eine gute Fitnesskorrelation [1] aufweisen, was bedeutet, dass die Fitness eines Kindes an die Fitness seiner Elternteile sein muss.

Bei der Reproduktion eines Elternteils müssen Sie nur die richtigen Mutationsparameter finden. Wenn es jedoch um die Wiedergabe mehrerer Eltern geht (Crossover), ist eine der häufig verwendeten Techniken, 2 Kinder (anstelle von 1) von den gleichen 2 Eltern zu erzeugen. Für das erste Kind kommt jedes Gen von der Mutter mit der Wahrscheinlichkeit von 0,2 und vom Vater mit der Wahrscheinlichkeit von 0,8 und für das zweite Kind umgekehrt. Natürlich können Sie nach dem Crossover die Mutation machen.

Oh, und noch eine Sache, für die Mutation Operator, wenn Sie

sagen ... machen zufällige Veränderungen in Elemente in Kind (seine Farbe durch gelegentliches Nummer ändern, oder Zufallszahl in dem sein (x, y) -Koordinate - oder sein Knoten)

es eine gute Idee, eineGaußschen Verteilung zu verwenden, um die Farbe zu ändern, koordinieren usw.

[1] Evolutionäre Berechnung: Ein einheitlicher Ansatz von Kenneth A. De Jong, Seite 69