整洁:规范

NEAT: Speciating

我试图自己实现整洁,使用原始论文但卡住了。

假设在上一代我有以下物种:

Specie 1:     members: 100    avg_score: 100
Specie 2:     members: 150    avg_score: 120
Specie 3:     members: 300    avg_score: 50
Specie 4:     members: 10     avg_score: 110

我现在对下一代的尝试。如下:

  1. 从每个物种中,删除除一个随机基因组之外的每个基因组。
  2. 将每个基因组放入物种中/也许创建一个新基因组
  3. 将物种的得分设置为物种中每个基因组得分的平均值。

    4.1 通过杀死每个物种中最差的 90% 来繁殖。

    4.2 根据分数选择一个物种

    4.3 从那个物种中,选择 2 个基因组并培育出一个新的基因组。

我不确定这是否是正确的尝试,尤其是当我 "kill" 90% 的基因组时。 这个百分比值是我现在随机选择的(只是概念)。

If a specie, after the killing, has 0 members. Did it then go extinct?

在我给出的例子中,如果我杀死 90%,Specie 4 可能会灭绝。

Is my attempt correct, or how does a specie usually go extinct?

首先,我强烈建议不要尝试从头开始实施 NEAT。这比一开始看起来要复杂得多(请随意查看许多可用实现的 public 存储库)。

现在,更具体地回答您的问题:

NEAT 有很多种风格。就您而言,您的疑虑似乎与精英主义的概念有关,是的,这通常是您需要自己设定的参数。通常算法是这样工作的:

  1. 物种基因组。也就是说,将它们安排到给定数量的物种中,将彼此更接近的物种放在一起(例如,k-means 物种形成)。
  2. Select精英。您从每个物种中保留给定数量或百分比的个体,并将它们传递给新一代。根据您的应用方式,每个物种总会有至少一名成员存活下来!
  3. 根据适应性(也许还根据物种的适应性)选择用于繁殖的基因组。这也允许不同的特定实现风格。
  4. 复制。有无性繁殖(所选基因组的变异)和有性繁殖。有性繁殖的工作原理是从两个 parent 中获取基因(同样是不同的实现方式),然后对其中一些进行变异。有种间和种内有性繁殖(另一个 parent 来自同一物种或来自不同物种),但您可以自由禁用其中任何一个。
  5. Re-evaluation 的后代(设置新的适应度值)。
  6. 物种形成。

请注意,物种形成是 re-applied 周期性的(通常是每一代),因此物种并没有真正明确的定义(没有什么能真正阻止精英基因组,原封不动地复制到下一代,被分配一个新物种)。

如果您使用的是固定种群规模和 k-means 物种形成,无论如何都会有 k 个物种。从某种意义上说,每一次迭代都是新物种。