Hinweis lesen: dies eher einen längeren Kommentar als Antwort.
Sie sind auf ein Problem gestoßen, das ich auch gerade bei der Entwicklung einer NEAT-Version für Javascript kennengelernt habe. Die Originalarbeit von ~ 2002 ist sehr unklar.
The original paper enthält folgende Komponenten:
Immer wenn ein neues Gens (durch strukturelle Mutation) angezeigt wird, eine globale Innovationsnummer wird inkrementiert und zu diesem Gen zugeordnet. Die Innovationszahlen stellen somit eine Chronologie des Auftretens jedes Gens in dem System dar. [..]; Innovationszahlen werden nie geändert. Somit ist der historische Ursprung jedes Gens in dem System während der gesamten Evolution bekannt.
Aber das Papier ist sehr unklar über den folgenden Fall, sagen wir haben zwei; 'Identisch' (gleiche Struktur) Netzwerke:
Die Netzwerke oben wurden erste Netzwerke; Die Netzwerke haben die gleiche Innovations-ID, nämlich [0, 1]
. Jetzt mutieren die Netzwerke zufällig eine zusätzliche Verbindung.
Boom! Zufällig mutierten sie zur selben neuen Struktur. Die Verbindungs-IDs sind jedoch völlig unterschiedlich, nämlich [0, 2, 3]
für parent1 und [0, 4, 5]
für parent2, da die ID global gezählt wird.
Der NEAT-Algorithmus kann jedoch nicht feststellen, dass diese Strukturen identisch sind. Wenn einer der Eltern höher abschneidet als der andere, ist das kein Problem. Aber wenn die Eltern die gleiche Fitness haben, haben wir ein Problem.
weil das Papier besagt:
bei den Nachkommen Komponieren werden Gene von veither Elternteil in passenden Gene zufällig ausgewählt, während alle Überschuß oder disjunkte Gene werden immer von mehr passen Mutter enthalten, oder wenn Sie sind von beiden Eltern gleichermaßen geeignet.
Also, wenn die Eltern gleichermaßen fit sind, werden die Nachkommen Verbindungen haben [0, 2, 3, 4, 5]
. Das bedeutet, dass einige Knoten doppelte Verbindungen haben ... Wenn Sie globale Innovationszähler entfernen und IDs einfach zuweisen, indem Sie auf node_in und node_out schauen, vermeiden Sie dieses Problem.
Also wenn Sie gleich Eltern haben, ja haben Sie den Algorithmus optimiert. Aber das ist fast nie der Fall.
Ganz interessant: in der newer version des Papiers, sie, dass bolded Linie tatsächlich entfernt! Ältere Version here.
By the way, können Sie dieses Problem, indem anstelle der Zuweisung von Innovation IDs lösen, weisen ID basierend auf node_in und node_out pairing functions verwenden. Das schafft ganz interessant neuronale Netze, wenn Fitness ist gleich:
Ja, ich benutze dieses Dokument meine Rost Version zu implementieren https://github.com/TLmaK0/rustneat. Ich habe keine Inovationsnummer verwendet und bin in der Lage, Spezies zu erhalten, und mache einen Crossover mit Genomen variabler Länge. – TlmaK0
Es würde mich interessieren zu erfahren, wie Sie die Bevölkerung ohne Verwendung der Innovationsnummer beschreiben konnten! Ich werde einen Blick auf Ihren Code werfen –