Roulette-Rad-Selektion nach Genetischen Algorithmus in Java

Ich die Umsetzung eines roulette-wheel-selection-Methode für einen genetischen Algorithmus. Meine Frage ist im Grunde ganz einfach, aber ich kann nicht wickeln meinem Kopf herum. In meinem fitness-Funktion, wenn eine Antwort ist extrem falsch kann es wieder rund um -3000%. Mein problem ist, wenn ich Versuch die Wahrscheinlichkeiten für meine Ergebnisse bekommen Sie schräg gegenüber die falschen Antworten.

Zum Beispiel:
Wenn meine Anteile in ein array und [92, 68, 5, -4, -3546] (von hoch zu niedrig)
Ich muss zu geben die zahlen in der unteren Indizes haben eine größere chance, ausgewählt zu werden als die zahlen mit höheren Indizes.

Ignoriert meine fitness-Funktion wie erstelle ich eine Wahrscheinlichkeit auf dieser Grundlage unter Berücksichtigung der große negative zahlen?

Einige basic-code habe ich gebastelt mit der ich in einer anderen Frage:

public Individual rouletteWheelSelection() { 
    double randNum = m_rand.nextDouble() * this.totalFitness; 
    int idx; 
    for (idx=0; idx<POP_SIZE && randNum>0; ++idx) { 
        randNum -= m_population[idx].getFitnessValue(); 
    } 
    return m_population[idx-1]; 
} 

(original-link hier: GA in Java geschrieben)

Hatte ich mein GA arbeiten für eine andere Methode für die Auswahl, aber jetzt bin ich versucht zu ändern, diese zu arbeiten, statt. Jegliche Hilfe würde sehr geschätzt werden.

***Edit

Folgende code ist mein rouletteWheelSelection ich geändert habe:

private Chromosome rouletteWheelSelection(){
    double randNum = Math.abs(rand_num.nextDouble() * totalFitness);
    int idx;
    for (idx=0;idx<NUM_CHROMOSOMES && randNum>0;++idx){
        randNum -= Math.abs(population[idx].getFitness());
    }
    return population[NUM_CHROMOSOMES-idx];
}

Hier ist mein fitness-Funktion:

public double getFitness()
{
    String working = bitString;
    int x1 = Integer.parseInt(working.substring(0,6),2);
    int x2 = Integer.parseInt(working.substring(6),2);
    double result = ScratchGA.functionTest(x1,x2);
    double percentAccuracy = (1- Math.abs(((ScratchGA.getDesired() - result)/ScratchGA.getDesired())))*100;
    if (percentAccuracy <= 100)
    {
    return percentAccuracy;
    }
    else
    {
    return -percentAccuracy;
    }
}

Der Gedanke war, dass ist ein Wert mehr als 100% von dem unterscheidet, was ich brauchte, machte ich es negativ zu schieben, um das Ende meiner sortierten Liste.

InformationsquelleAutor Ramrod | 2012-10-08
Schreibe einen Kommentar