注意です:答えよりも拡張されたコメントの本より。
問題が発生しました。私はまた、javascript用のNEATバージョンを開発中に遭遇しました。 〜2002年に出版された原著は非常に不明である。
original paperには、次のものが含まれています
新しい 遺伝子が(構造的変異によって)表示されたときはいつでも、世界の技術革新の数が インクリメントし、その遺伝子に割り当てられています。したがって、イノベーション番号は、システム内のすべての遺伝子の出現の年表を表す。 [..];イノベーションの数は変わらない。したがって、システム内の全ての 遺伝子の歴史的起源は、進化を通じて知られている。
しかし、次のケースでは紙が非常に不明です。 '同じ'(同構造)ネットワーク:
ネットワーク上記初期ネットワークました。ネットワークには同じイノベーションID、つまり[0, 1]
があります。これで、ネットワークは余分な接続をランダムに変更します。
ブーム!偶然、彼らは同じ新しい構造に変異した。ただし、IDがグローバルにカウントされるため、接続IDはparent1の場合は[0, 2, 3]
、parent2の場合は[0, 4, 5]
と完全に異なります。
しかし、NEATアルゴリズムは、これらの構造が同じであると判断できません。親の1つが他のものよりも高いスコアをつけた場合、それは問題ではありません。しかし、両親の体力が同じであれば、問題があります。
紙状態ので:すべての過剰又は互いに素遺伝子は常に、よりフィット親、から、または場合は含まれ、一方、子孫を構成するにおいて
は、遺伝子がランダムにマッチング遺伝子でveither親から選択されます彼らは両方の親から同等に適合しています。
親が等しくフィットする場合、子孫は接続[0, 2, 3, 4, 5]
を持つでしょう。これは、いくつかのノードが二重接続を持っていることを意味します...グローバルイノベーションカウンターを削除し、node_inとnode_outを見てIDを割り当てるだけで、この問題を回避できます。
あなたが両親にぴったり合っている場合は、アルゴリズムを最適化しました。しかし、これはほとんど決してありません。
非常に興味深い:紙のnewer versionで、彼らは実際には太字、その行を削除!古いバージョンhere。ところで
、あなたはnode_in上とpairing functionsを使用してnode_outベースのIDを割り当てる代わりに、革新IDを割り当てることにより、この問題を解決することができます。フィットネスが等しいとき、これは非常に興味深いニューラルネットワークを作成します。
はい、私は私の錆バージョンhttps://github.com/TLmaK0/rustneatを実装するために、この文書を使用しています。私はイノベーション番号を使用せず、種を得ることができ、可変長ゲノムを持つクロスオーバーを行います – TlmaK0
イノベーション番号を使用せずに人口をどのように特定できるか知りたいと思っています。私はあなたのコードを見てみましょう –