2016-07-12 21 views
1

Ich folgte an example über einen genetischen Algorithmus in Java. Obwohl ich das Konzept dieser Anwendung verstehe, verstehe ich nicht, wie ich eine Formel meiner Wahl anwenden und den genetischen Algorithmus mit x (ein Individuum-Gen) seinen höchsten Wert finden lassen würde.Funktion maximieren in Java

Ich habe versucht, den folgenden Code, um die Fitness den Wert der Formel wie folgt zurückkehren zu müssen:

static int getFitness(Individual individual) { 
    int fitness = 0; 

    Integer x = Integer.parseInt(individual.toString(), 2); 
    fitness = calculateFormula(x); 

    return fitness; 
} 

public static int calculateFormula(int x) { 
    int result = (-x * x) + (7 * x); 

    return result; 
} 

Aber mit dem Tutorial Ich folgte, soll man eine Lösung am Anfang spezifizieren. Aber wenn ich das tue, wird es nach dieser Lösung suchen und nicht den Wert von x, der den höchsten result zurückgeben wird. Wenn Sie keine Lösung angeben, endet sie einfach, wenn das Gen 0 gefunden wurde.

Also die Frage: Wie würde ich eine Formel auf den Genetischen Algorithmus anwenden, so wird es für das höchste Ergebnis der Formel -x² + 7x suchen?

+0

„a angeben Lösung am Anfang "- was bedeutet das? Am Anfang von was? –

+0

@KevinHooke [Das Tutorial] (http://www.theprojectspot.com/tutorial-post/creating-a-genetic-algorithm-for-beginners/3) Ich befolgte eine Kandidatenlösung zu Beginn des Programms. Das Programm stoppt, wenn es diesen Kandidaten gefunden hat. Ich möchte, dass der Genetische Algorithmus stoppt, wenn er das maximale Ergebnis der Formel gefunden hat oder wenn die maximale Iteration erreicht wurde. – Lars

+3

Re. "Stop, wenn das maximale Ergebnis gefunden wurde" - Woher wird der Code aufgerufen? Sie haben keine Iteration in Ihrem Code, wie dargestellt, also etwas anderes, das Ihren Code in einer Schleife aufruft? Wo ist die Logik zur Bestimmung des maximalen Ergebnisses? –

Antwort

1

Mit „eine Lösung Angabe von“ meinen Sie wahrscheinlich die folgende Funktion in dem Blog:

static int getMaxFitness() { 
    int maxFitness = solution.length; 
    return maxFitness; 
} 

Welche Probleme in Ihrem Fall verursacht. Die stumme Lösung:

static int getMaxFitness() { 
    return 12; 
} 

Nun wird der Algorithmus finden 3 (00011 Sie benötigen nur 5 Bit/Gene 0-31 zu überprüfen) oder 4 (00100), wie es soll.

Für eine intelligente Lösung, die wir bei den Abbruchkriterien suchen:

int generationCount = 0; 
while(myPop.getFittest().getFitness() < FitnessCalc.getMaxFitness()){ 
    generationCount++; 
    System.out.println("Generation: "+generationCount+" Fittest: "+myPop.getFittest().getFitness()); 
    myPop = Algorithm.evolvePopulation(myPop); 
} 

Sie suchten nach einer Lösung suchen stoppen könnte, wenn keine Verbesserung für X Generationen war:

int bestFitness = Integer.MIN_VALUE; 
Individual bestIndividual = null; 
int noImprovementCount = 0; 
for (int generationCount = 1;; generationCount++) { 
    System.out.println("Generation: "+generationCount+" Fittest: "+myPop.getFittest().getFitness()); 
    myPop = Algorithm.evolvePopulation(myPop); 
    if (bestFitness < myPop.getFittest().getFitness()) { 
    bestIndividual = myPop.getFittest(); 
    bestFitness = bestIndividual.getFitness(); 
    noImprovementCount = 0; 
    } else if (++noImprovementCount == 5) { // X = 5 
    break; 
    } 
} 
+0

Vielen Dank für Ihre Antwort. Was ich mit der Angabe einer Kandidatenlösung gemeint habe, ist [diese Zeile] (https://github.com/TisLars/genetic-algorithm/blob/master/src/Program.java#L12). Mit Ihrem Zusatz zu meinem Code, muss ich noch diese Zeile hinzufügen und sagen, der Algorithmus "00011" ist die Lösung, die ich finden möchte. Oder fehlt mir etwas? Danke für Ihre Antwort. – Lars

+0

@Lars Sie müssen keine Lösung einstellen, soweit ich sehen kann, weil Sie die Funktion getFitness ersetzt haben. Es ist nur dort zu zeigen, dass mit dieser Fitness-Funktion (Zählen der Bits, die die gleiche wie die Lösung sind) die Bevölkerung tatsächlich in Richtung der Kandidatenlösung entwickeln wird. – maraca

+0

So eine späte Antwort kommt von mir, sorry. Das war wirklich perfekt! Du hast mir so viel geholfen und ich konnte es in meinem aktuellen Projekt zum Laufen bringen. – Lars