Wie kann ich verhindern, dass mein Programm an einem lokalen Maximum hängen bleibt? (Künstliches neuronales Netzwerk und genetischer Algorithmus)

Ich arbeite an einem künstlichen neuronalen Netz (ffann), das Eingaben in Form einer einfachen Berechnung vornimmt und das Ergebnis zurückgibt (als Taschenrechner). Das Ergebnis wird nicht genau sein.
Das künstliche Netzwerk wird unter Verwendung eines genetischen Algorithmus auf die Gewichte trainiert.

Momentan bleibt mein Programm bei einem lokalen Maximum hängen:

5-6% richtige Antworten mit 1% Fehlerquote30% richtige Antworten mit 10% Fehlerquote40% richtige Antworten mit 20% Fehlerquote45% richtige Antworten mit 30% Fehlerquote60% richtige Antworten mit 40% Fehlerquote

Ich verwende derzeit zwei verschiedene genetische Algorithmen:
Die erste ist eine grundlegende Auswahl, bei der zwei zufällige aus meiner Population ausgewählt werden, wobei die eine mit der besten Fitness den Gewinner und die andere den Verlierer nennt. Der Verlierer erhält eines der Gewichte vom Sieger.

Die zweite ist die Mutation, bei der der Verlierer aus der Auswahl eine leichte Modifikation erhält, die auf der Menge der resultierenden Fehler basiert. (Die Fitness wird durch richtige und falsche Antworten entschieden). Wenn das Netzwerk also viele Fehler ausgibt, wird es eine große Modifikation erhalten, wobei, als ob es viele richtige Antworten hätte, wir einem akzeptablen Ziel nahe sind und die Modifikation kleiner sein wird.

Also zur Frage: Wie kann ich verhindern, dass mein ffann bei lokalen Maxima hängen bleibt?
Sollte ich meinen aktuellen genetischen Algorithmus auf etwas Fortgeschritteneres mit mehr Variablen umstellen?
Sollte ich eine zusätzliche Mutation oder Frequenzweiche erstellen?
Oder sollte ich vielleicht versuchen, meine Mutationsvariablen in etwas Größeres / Kleineres zu ändern?

Dies ist ein großes Thema. Wenn ich Informationen verpasst habe, die möglicherweise benötigt werden, hinterlassen Sie bitte einen Kommentar

Bearbeiten: Das Ändern der Mutationszahlen auf einen geeigneteren Wert hat eine bessere Antwortrate ergeben, ist aber bei weitem nicht genehmigt:

10% richtige Antworten mit 1% Fehlerquote33% richtige Antworten mit 10% Fehlerquote43% richtige Antworten, mit 20% Fehlerquote65% richtige Antworten mit 30% Fehlerquote73% richtige Antworten mit 40% Fehlerquote

Das Netzwerk ist derzeit eine sehr einfache dreischichtige Struktur mit drei Eingängen, zwei Neuronen in der einzigen verborgenen Schicht und einem einzelnen Neuron in der Ausgangsschicht.
Die verwendete Aktivierungsfunktion ist Tanh, wobei die Werte zwischen -1 und 1 liegen.
Die Auswahlart Crossover ist sehr einfach und funktioniert wie folgt:

[a1, b1, c1, d1] // Selected as winner due to most correct answers
[a2, b2, c2, d2] // Loser

Der Verlierer wird am Ende einen der Werte vom Gewinner erhalten und den Wert direkt nach unten verschieben, da ich glaube, dass die Position im Array (der Gewichte) für die Leistung von Bedeutung ist.

Die Mutation ist sehr einfach und addiert einen sehr kleinen Wert (derzeit irgendwo zwischen ungefähr 0,01 und 0,001) zu einer zufälligen Gewichtung in der Reihe der Gewichte der Verlierer mit einer Wahrscheinlichkeit von 50/50, ein negativer Wert zu sein.

Hier einige Beispiele für Trainingsdaten:

1, 8, -7 // the -7 represents + (1+8)
3, 7, -3 // -3 represents - (3-7)
7, 7, 3  // 3 represents * (7*7)
3, 8, 7  // 7 represents / (3/8)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage