NEAT - 如何处理单一成员物种?

问题描述

我正在从头开始实施 NEAT,并且偶然发现了一个我找不到具体答案的问题。在所有其他网络都被指定之后,NEAT 算法如何对只有一个成员的物种做出反应?

我已经想到了一些可能的答案,如果您有任何其他见解,我将不胜感激。

  1. 保持单一成员物种不变,将其唯一幸存的成员带入下一代,希望将来某个时候能找到更多该物种的成员,并且该物种能够生长。主要问题是 NEAT 根据调整后的适应度分配新物种大小;这意味着如果 1 成员物种的适应度优于种群平均值,它可能会指示(并期望)其生长。假设我们有两个物种:大小为 99 和 1 个成员 - NEAT 会(假设较小的物种具有更高的适应性)然后使 99 个物种缩小而 1 个成员增长 - 但小物种由于只有一个而无法繁殖会员。

  2. 按给定次数克隆该物种的唯一成员,以匹配 NEAT 为该物种计算的新物种大小。这似乎不是最好的解决方案,因为它会大大减少种群的多样性,而且似乎会很快导致停滞。

  3. 通过单个突变复制一个成员,然后交叉这个物种的现在两个成员,直到满足新的大小要求。遇到与 (2) 类似的问题。

  4. 通过 N 次突变复制一个成员,其中 N 是 NEAT 计算的新物种大小。这似乎涉及高度随机性,并可能导致新物种在该物种内进化,使问题进一步失控。

  5. 在物种形成阶段结束时,将该物种的唯一成员与一些较大的物种混在一起,并导致其当前物种灭绝。这样做的问题是丢失了新网络还没有时间优化的潜在有用的突变/网络拓扑。

提前致谢!

解决方法

我只是想添加一条评论,但我没有足够的声誉,所以我会写一个答案并使其更长,根据我对整洁的了解,我会评论一些我不太同意的部分。

首先,我认为您应该查看 youtube 上的 Finn Eggers 频道​​(或其他实现,我之所以说这个是因为我看过视频),他实现了整洁,并且在视频 8 中(我认为)他处理了这个问题。他所做的是将所有具有 1 个成员的物种标记为“灭绝”并将其移除。事实上,如果该物种只有 1 个成员,则意味着所有成员都被杀死了,而这种情况发生在他们得分较低的情况下,因此保留该物种没有意义。

假设我们有两个物种:大小为 99 和 1 个成员 - NEAT 会(假设较小的物种具有更高的适应度)然后使 99 个物种缩小而 1 个成员增长

我不明白这一点:假设你从 2 个物种开始,每个物种 50 名成员,杀死前 80% 的种群(基于适应度分数),繁殖幸存者并以 99-1 结束。 这是什么意思?

首先,这意味着您杀死的 80 个个体分别来自物种 2 的 49 个和物种 1 的 31 个,这意味着物种 2 中的个体的适应度比物种 1 中的个体差。

此外,您没有物种 2 的新生儿:当父母不属于该物种时,就会发生这种情况,也许有,但仍然无法将孩子归类为该物种的成员。由于父母选择也是基于适应度得分,这意味着物种 1 的元素比物种 2 中唯一的一个幸存者得分更高,并且被更频繁地选择,因此我们仍然认为物种 1 优于 2。 总之,如果一个物种最终只有一个成员并且没有成长,这意味着它很糟糕。

但是这种小物种由于只有一个成员而无法繁殖。

1 个成员物种可以变得更大:你可以从两个不同物种中取出两个亲本,创建一个孩子,如果距离函数告诉孩子属于那个物种,你就把它放在那里。你不需要让所有来自同一物种的父母来为那个物种创造一个孩子。

5. 在物种形成阶段结束时,将物种中唯一的成员与一些较大的物种混在一起,并导致其现有物种灭绝。

你不能只把一个成员放在另一个物种中:如果与其他物种的距离太远,你必须有一个特定的物种,即使它只是一个成员