我目前正在实现Kenneth Stanley开发的NEAT算法,并以原始paper为引用。
在描述交叉方法的部分中,有一件事使我感到困惑。
因此,上图说明了NEAT的交叉方法。为了确定一个基因是从哪个 parent 那里继承下来的,论文说:
对于匹配的基因(1-5),很容易理解。您只是从Parent1或Parent2中随机继承(两者都有50%的机会)。但是,对于不相交的(6-8)和多余的(9-10)基因,您不能从更适合的 parent 那里继承,因为您只能在Parent1或Parent2中拥有那些基因。
例如:
Parent1的适应度高于Parent2的适应度。不相交的基因6仅存在于Parent2中(当然,因为不相交和多余的基因仅在一个亲本中出现)
因此,您不能决定从更合适的 parent 那里继承该基因。所有其他不相交和多余的基因也是如此。您只能从它们所在的父级那里继承它们。
所以我的问题是:您是否可能从更合适的 parent 那里继承所有匹配的基因,而只接管那些不相交和多余的基因?还是我在这里误会了什么?
提前致谢。
最佳答案
查看实际的实现并查看如何处理可能会有所帮助。在原始的C++代码here(向前看第2085行)中,似乎跳过了来自不合适的父代的不相交和多余的基因。
在您的实现中,您可以从不适合的父级继承不相交和多余的基因,但以概率1禁用它们,以便稍后可以对它们进行逐点突变(将其禁用切换为启用)。但是,这可能会导致严重的基因组膨胀,因此请测试并查看有效的方法。
关于neural-network - NEAT算法: How to crossover disjoint and excess genes?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50553867/