Ich programmiere einen genetischen Algorithmus unter Verwendung der grammatikalischen Evolution. Mein Problem ist, dass ich lokale optimale Werte erreiche (vorzeitige Konvergenz) und wenn das passiert, weiß ich nicht, was ich tun soll. Ich denke darüber nach, das Mutationsverhältnis zu erhöhen (5% ist der Standardwert), aber ich weiß nicht, wie ich entscheiden soll, wann es notwendig ist.
Die Daten, die ich zu jeder Generation habe, sind zweidimensionale Arrays, deren erste Spalte die Fitness ist
adn[i][0] ← fitness
row → is the values of the Grammar
column ↓ Each indiviual result
Wenn Sie eine Klärung benötigen, fragen Sie bitte und ich werde gerne Änderungen vornehmen. Beachten Sie, dass dies nicht meine Muttersprache ist und entschuldigen Sie die Fehler und die Unannehmlichkeiten.
Bei der Beantwortung einer Anfrage sind meine Operationen wie folgt und genau in dieser Reihenfolge:
- Ich generiere eine zufällige Population (Eine Matrix mit Zufallszahlen)
- Ich generiere eine Matrix, die das gewünschte Ergebnis enthält. Zu diesem Zweck habe ich einige Funktionen implementiert, die zusätzlich eine Abweichung von + -5% aufweisen, zum Beispiel: fun (x) = (2 * cos (x) + sen (x) - 2X) * (0,95+) (eine Zahl, die zwischen 0 und 0,1 oszilliert) , das x enthält jedes f (x) mit einer Sequenz von 0 bis N (da N die Größe der Zeile ist), das y enthält genau das gleiche (mehr Ergebnisse)
- Startet den Algorithmus (Generationen beginnen sich zu ändern
Die Aktionen, die jede Generation ausmachen, sind:
- Mutation: Eine Zufallszahl jedes Cromosoms kann auf jedem Gen mutieren → adn [i] [zufällig] = Zufallszahl (mit einer Wahrscheinlichkeit von 5%, dass dies geschieht)
- Crossover: Ich kreuze jedes adn mit einem anderen adn (80% ist die Wahrscheinlichkeit einer Mutation für jedes Paar). Für die Paarung wähle ich eine Zufallszahl und sehe adn [i] und adn [(i + j) mod NumADNs].
Übersetzen. Ich erhalte eine Matrix, die die Werte f (0 bis N) enthält, die in einem Schritt transkribiert und die Grammatik auf das Bild übertragen
-Fitness: Ich vergleiche die erhaltenen Werte mit den erwarteten und aktualisiere die Fitness.
-Elitismus: Danach wähle ich die besten 4 Adns aus und bringe sie nach oben, sie werden ausgewählt
-Auswahl: Jede nicht-elitäre ADN wird einer völlig zufälligen ADN gegenüberstehen, und wenn ihre Fitness geringer ist (niedriger ist besser), wird sie sich durchsetzen, was eine Möglichkeit für das schlechtere Überleben darstellt