neat - NEAT - 如何处理单个成员物种?
问题描述
我正在从头开始实施 NEAT,并且偶然发现了一个我找不到具体答案的问题。在所有其他网络都被物种化之后,NEAT 算法如何响应其中只有一个成员的物种?
我已经想到了一些可能的答案,并希望有任何额外的见解。
保持单一成员物种不变,将其唯一幸存的成员传给下一代,希望在未来的某个时候能找到更多该物种的成员并且该物种将能够生长。这样做的主要问题是 NEAT 根据调整后的适应度分配新的物种大小;这意味着如果它的适应度优于种群平均值,它可能会指示(并期望)1 成员物种生长。假设我们有两个物种:大小为 99 和 1 个成员 - NEAT 会(假设较小的物种具有更高的适应度)然后使 99 个物种缩小并且 1 个成员物种生长 - 但小物种由于只有一个而无法繁殖成员。
将该物种的唯一成员克隆给定次数,以匹配 NEAT 计算的该物种的新物种大小。这似乎不是最好的解决方案,因为它大大减少了人口的多样性,并且似乎会很快导致停滞。
通过单个突变繁殖一个成员,然后交叉这个物种的现在两个成员,直到满足新的大小要求。遇到与(2)类似的问题。
通过 N 个突变复制一个成员,其中 N 是由 NEAT 计算的新物种大小。这似乎涉及大量的随机性,并可能导致新物种在该物种内进化,使问题进一步失控。
在物种形成阶段结束时将唯一的物种成员与一些较大的物种混在一起,并导致其当前物种灭绝。这样做的问题是丢失了新网络还没有时间优化的潜在有用突变/网络拓扑。
提前致谢!
解决方案
我只是想添加评论,但我没有足够的声誉,所以我会写一个答案并让它更长,我会根据我对整洁的了解,评论一些我不太同意的部分。
首先,我认为您应该看看 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.在物种形成阶段结束时将物种中唯一的成员与一些较大的物种混在一起,并导致其当前物种灭绝。
你不能只把一个成员放在另一个物种中:如果与其他物种的距离太高,你必须有一个特定的物种,即使它只是一个成员
推荐阅读
- sql - 将日期类型转换为仅显示时间
- windows - 在 Windows Jump Server 的情况下 Ansible 可以工作吗?
- julia - 用于加权方差的 Julia 函数返回“错误”值
- python - 使用向boto3注入变量时出现ValidationException
- php - [Route: admin.event.destroy] [URI: admin/event/event/{id}] 缺少必需的参数
- r - 联合列名
- python - 无法在 Python Selenium 中使用显式等待?
- python-3.x - Pandas 使用列表中的 ColumnNames 创建 DataFrame
- go - Go Gin 中间件事件
- oracle - 金门复制极度延迟