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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Auswahl-Methode gezeigt, in der Frage implizit arbeitet nur mit positiven oder null-fitness-Werte.
Negative Werte, eine erste Frage bezüglich der Berechnung der totalFitness: ist dies die algebraische Summe der fitness Werte oder sollte es mit der absoluten Werte davon.
Ein ernsteres Problem entsteht, wenn die randNum ist [sein sollte] sank aber irgendwie ist die negative fitness-Werte führen zu einer wieder wachsenden RandNum.
Ein Vorschlag wäre, zu ändern, die fitness-Funktion, so dass es gibt nur positive Werte.
Ein einfacher Ansatz wäre so etwas wie:
Wo -5000 ist, ist willkürlich gewählt, da die meisten negativen Wert, den Sie würde betrachten, sinnvoll. In der Tat eine form der Trunkierung Auswahl für die zumindest plausible Lösungen, etwas, das Sie versuchen zu vermeiden, mit roulette-Rad, aber anscheinend ist der aktuelle fitness-Funktion erscheint stark verzerrt in Richtung der negativen Seite der Strecke (oder vielleicht sogar ungebunden auf der negativen Seite).
Bearbeiten im Hinblick Hinzugefügt snippets in Frage stellen und Ihre Anmerkungen
Effektiv, durch die Zusammenarbeit mit Abs. Werte Ihre version von
rouletteWheelSelection()
kümmert sich um die "ernsteren" Thema in " meine erste Reaktion.Aber die
getFitness()
Funktion, wie vermutet ist sehr verzerrt zu Gunsten der negativen Werte. Seine Reichweite ist [some_potentially_very_negative_value, +100].Finden Sie unter den code: der größte Wert, der zurückgegeben wird, +100, aber es gibt eine Möglichkeit für die Rückkehr mächtige große negative Werte, wenn der Wert für
ScratchGA.functionTest(x1,x2)
ist sehr Verschieden von derScratchGA.getDesired()
Wert.Es scheint die Notwendigkeit für eine Normalisierung der Arten, um zu verhindern, dass negative Renditen, um so viel größer als 100 (in der absoute Wert).
Diese BTW, erklärt sehr gut, warum mit so einer fitness-Funktion, die rouletteWheelSelection() bevorzugt mangelhaften Chromosomen.
Stellen Sie sich zum Beispiel, dass Sie eine Bevölkerung von 5 Chromosomen mit den jeweiligen fitness-Wert von 80, 70, 30, 20 und -250. Die Summe beträgt 450, mit 200 für alle vier Chromosomen mit einem positiven fitness-und 250, für die ein Chromosom mit einem negativen fitness. In diesem Beispiel-Instanz, es gibt bessere als auch chance, um die schlimmsten Chromosomen!
Die Idee hinter dem roulette-Rad Auswahl bieten die Möglichkeit der Auswahl der Chromosomen, die mit weniger als der optimalen fitness, aber die Wahrscheinlichkeit der Auswahl jedes Chromosom sollte proportional zu der Menge des Chromosom trägt zur gesamten Summe der fitness Werte. Die Implementierung, die Sie haben, effektiv ist das aber das problem ist, dass der Wert dazu beigetragen, die Summe der negativen fitnesses unverhältnismäßig erscheint, was positive fitness-Werte stellen.
Könnten Sie windowing, dass Sie immer addieren oder subtrahieren Sie die Bevölkerung schlechteste fitness. So, dass der Bereich für die Auswahl erweitert sich von 0 in positive Werte. Schlechteste Person niemals eine chance haben, ausgewählt zu werden (ähnlich der Turnier-Auswahl). Denn wenn Sie nicht Fenster Ihre Werte dann die einzelnen mit fitness-98 haben fast die gleiche Auswahl-Druck, der mit 95 und 96. Das ist in Ordnung, solange Ihre Bevölkerung gehören niedrigere Qualität der Lösungen, aber wenn alle Lösungen sind in den 90er Jahren Selektionsdruck deutlich reduzieren. Als Ihre population konvergiert gegen eine optimale Lösung, die Sie mehr und mehr wirken wie zufällige Suche. Sie können nur eine gerichtete exploration wenn man bedenkt, das feinere und feinere details (Unterschiede) in der Bevölkerung.