NEAT算法:如何交叉不相交和多余的基因?

NEAT algorithm: How to crossover disjoint and excess genes?

我目前正在实现Kenneth Stanley开发的NEAT算法,以原paper为参考。

在描述交叉方法的部分,有一件事让我有点困惑。

所以,上图说明了NEAT的交叉方法。为了决定从哪个 parent 遗传基因,论文如下:

Matching genes are inherited randomly, whereas disjoint genes (those that do not match in the middle) and excess genes (those that do not match in the end) are inherited from the more fit parent.

对于匹配基因(1 - 5) 很容易理解。您只是随机继承自 Parent1 或 Parent2(两者都有 50% 的机会)。但是对于不相交的 (6-8) 和多余的 (9-10) 基因,您不能从更合适的 parent 继承,因为您只有 Parent1 或 Parent2 中有这些基因。

例如:

Parent1 的适应度高于 Parent2。不相交的基因6只存在于Parent2中(当然,因为不相交和多余的基因只出现在一个parent) 所以,你不能决定从更合适的人那里继承这个基因parent。所有其他不相交和多余的基因也是如此。您只能从它们存在的 parent 中继承它们。

所以我的问题是:你是否可以从更合适的 parent 那里继承所有匹配的基因,而只接管不相交和多余的基因?还是我在这里误解了什么?

提前致谢。

查看实际实现并查看其处理方式可能会有所帮助。在原始 C++ 代码 here 中(从第 2085 行开始),来自不合适 parent 的不相交和多余的基因似乎被跳过了。

在您的实施中,您可以从不适合的 parent 继承不相交和多余的基因,但以概率 1 禁用它们,以便您稍后可以对它们进行逐点突变(将禁用切换为启用)。然而,这可能会导致显着的基因组膨胀,因此请测试并查看哪些有效。

仅从 'more fit parent' 中获取不匹配的基因更有意义。由于交叉,这将产生强壮的后代。对于匹配基因,应用通常的交叉算子。为了提高多样性,通过从两个 parents.

中随机选择不匹配的基因来创建第二个后代

这样,第一代会更适应,第二代会保持多样性。希望,这有帮助。

该图描述了具有相同适应度的两个 parents 的特殊情况,因此选择再次是随机的,因此可能导致所描述的情况。我同意,如果没有那条额外的信息,它会产生误导。