我试图使用原始论文实现整洁,但卡住了。
假设在上一代我有以下物种:
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
我现在对下一代的尝试如下:
- 从每个物种中,删除每个基因组,除了一个随机基因组。
- 将每个基因组放在物种中/也许创建一个新的基因组 将物种的
分数设置为物种中每个基因组的分数的平均值。
4.1 通过杀死每个物种中最差的 90% 来繁殖。
4.2 根据分数选择一个物种。
4.3 从该物种中选择 2 个基因组并培育一个新的基因组。
我不确定这是否是正确的尝试,尤其是当我"杀死"90%的基因组时。 这个百分比值是我现在随机选择的(这只是关于概念(。
如果一个物种,在杀戮后,有 0 个成员。然后它灭绝了吗?
在我给出的例子中,如果我杀死 90%,Specie 4 很可能会灭绝。
我的尝试是否正确,或者物种通常如何灭绝?
首先,我强烈建议不要尝试从头开始实现 NEAT。这是一件比起初看起来要复杂得多的事情(随意查看许多可用实现的公共存储库(。
现在,更具体地回答您的问题:
NEAT有很多口味。在你的情况下,你的怀疑似乎涉及精英主义的概念,是的,这通常是你需要为自己设置的参数。通常,该算法的工作方式如下:
- 对基因组进行指定。也就是说,将它们排列成给定数量的物种,使它们彼此更靠近(例如,k均值物种形成(。
- 选择精英。您从每个物种中保留给定数量或百分比的个体,并将其传递给新一代。根据你如何应用这一点,每个物种总会有一个成员存活下来! 根据适应性(
- 也许还有物种的适应性(选择基因组进行繁殖。这也允许不同的特定实现风格。
- 繁殖。有无性繁殖(所选基因组的变异(和有性生殖。有性生殖的工作原理是从两个父母那里获取基因(再次,不同的实现(,然后突变一些。有种间和种内有性繁殖(是来自同一物种或不同物种的另一方父母(,但您可以自由禁用其中任何一个。
- 重新评估后代(设置新的适应度值(。
- 物种形成。
请注意,物种形成会定期(通常是每一代(重新应用,因此物种并没有真正的定义(没有什么能真正阻止一个精英基因组,原封不动地复制到下一代,被分配给一个新物种(。
如果您使用的是固定的种群规模和 k 均值物种形成,那么无论如何,总会有 k 个物种。从某种意义上说,它们每次迭代都是新物种。