遗传算法:需要对选择以及未发生交叉时的操作进行一些说明
Genetic Algorithm: Need some clarification on selection and what to do when crossover doesn't happen
我正在编写一个遗传算法来最小化一个函数。我有两个问题,一个是关于选择,另一个是关于交叉以及没有发生时该怎么办。
这是我正在做的事情的概要:
while (number of new population < current population)
# Evaluate all fitnesses and give them a rank. Choose individual based on rank (wheel roulette) to get first parent.
# Do it again to get second parent, ensuring parent1 =/= parent2
# Elitism (do only once): choose the fittest individual and immediately copy to new generation
Multi-point crossover: 50% chance
if (crossover happened)
do single point mutation on child (0.75%)
else
pick random individual to be copied into new population.
end
所有这些都在另一个 while
循环下,该循环跟踪健身进展和迭代次数,我没有包括在内。所以,我的问题:
- 如您所见,每个 parent 中随机选择了两个
迭代直到新种群被填满。所以,两者相同
parents 可能会交配不止一次,而且肯定会有几个合适的 parents
多次交配。这有什么不好的吗?
- 在obitko tutorial中,它表示如果没有交叉
发生,那么 child 就是 parent 的精确副本。我什至不明白
这意味着什么,所以,如您所见,我只是随机选择了一个 parent
(统一;不考虑适应性)并复制到新种群。
这对我来说似乎很奇怪。无论我是否真的这样做,我的结果都没有太大变化。什么是正确的处理方式
什么时候不会发生交叉?
- 我不认为同一个人是每一代 child 多个 child 的 parent 有什么不妥。它只会稍微影响你的多样性。如果你不喜欢这样,或者发现最后几代确实缺乏多样性,你实际上可以标记这个个体,这样每一代它不能 parent 超过一次。
- 我实际上并不完全同意教程,我认为在你选择了将成为 parent 的个体之后(当然,基于他们的健康状况)你 应该实际执行交叉。否则你将克隆很多个体到下一代。
一些 parent 有几个后代是很常见的;我什至会说这是默认做法(并考虑生物进化,而这恰恰是主要成分之一)。
"If crossover doesn't happen, then child is exact copy of parents"
这有点令人困惑。交叉(在你的 link 中有很好的解释)意味着从一个 parent 中获取一些基因,从另一个中获取一些基因。这称为有性生殖,需要两个(或更多?)parents.
但是无性繁殖也是可以的。在这种情况下,您只需取一个 parent 并在新个体中突变其基因组。这几乎就是您正在尝试的,但是您错过了重要的突变步骤(注意突变可能非常激进或非常保守!)
请注意,无性繁殖需要在复制基因组后进行突变以创造多样性,而在有性繁殖中,这是一个可选步骤。
使用任何一种复制或混合使用都很好。顺便说一句:在某些问题中,基因的大小可能并不总是相同。在这种情况下,有性生殖是有问题的。如果您对这个问题感兴趣,可以看看 NEAT 算法,这是一种流行的神经进化算法,旨在解决这个问题 (wiki and paper)。
最后,精英主义(将 best-performing 个人复制到下一代)很普遍,但可能存在问题。遗传算法经常停滞在 sub-optimal 解(称为局部最大值,任何变化都会降低适应度)。精英主义会助长这个问题。当然,相反的问题是多样性太多类似于随机搜索,所以你需要找到合适的平衡。
我正在编写一个遗传算法来最小化一个函数。我有两个问题,一个是关于选择,另一个是关于交叉以及没有发生时该怎么办。
这是我正在做的事情的概要:
while (number of new population < current population)
# Evaluate all fitnesses and give them a rank. Choose individual based on rank (wheel roulette) to get first parent.
# Do it again to get second parent, ensuring parent1 =/= parent2
# Elitism (do only once): choose the fittest individual and immediately copy to new generation
Multi-point crossover: 50% chance
if (crossover happened)
do single point mutation on child (0.75%)
else
pick random individual to be copied into new population.
end
所有这些都在另一个 while
循环下,该循环跟踪健身进展和迭代次数,我没有包括在内。所以,我的问题:
- 如您所见,每个 parent 中随机选择了两个 迭代直到新种群被填满。所以,两者相同 parents 可能会交配不止一次,而且肯定会有几个合适的 parents 多次交配。这有什么不好的吗?
- 在obitko tutorial中,它表示如果没有交叉 发生,那么 child 就是 parent 的精确副本。我什至不明白 这意味着什么,所以,如您所见,我只是随机选择了一个 parent (统一;不考虑适应性)并复制到新种群。 这对我来说似乎很奇怪。无论我是否真的这样做,我的结果都没有太大变化。什么是正确的处理方式 什么时候不会发生交叉?
- 我不认为同一个人是每一代 child 多个 child 的 parent 有什么不妥。它只会稍微影响你的多样性。如果你不喜欢这样,或者发现最后几代确实缺乏多样性,你实际上可以标记这个个体,这样每一代它不能 parent 超过一次。
- 我实际上并不完全同意教程,我认为在你选择了将成为 parent 的个体之后(当然,基于他们的健康状况)你 应该实际执行交叉。否则你将克隆很多个体到下一代。
一些 parent 有几个后代是很常见的;我什至会说这是默认做法(并考虑生物进化,而这恰恰是主要成分之一)。
"If crossover doesn't happen, then child is exact copy of parents"
这有点令人困惑。交叉(在你的 link 中有很好的解释)意味着从一个 parent 中获取一些基因,从另一个中获取一些基因。这称为有性生殖,需要两个(或更多?)parents.
但是无性繁殖也是可以的。在这种情况下,您只需取一个 parent 并在新个体中突变其基因组。这几乎就是您正在尝试的,但是您错过了重要的突变步骤(注意突变可能非常激进或非常保守!)
请注意,无性繁殖需要在复制基因组后进行突变以创造多样性,而在有性繁殖中,这是一个可选步骤。
使用任何一种复制或混合使用都很好。顺便说一句:在某些问题中,基因的大小可能并不总是相同。在这种情况下,有性生殖是有问题的。如果您对这个问题感兴趣,可以看看 NEAT 算法,这是一种流行的神经进化算法,旨在解决这个问题 (wiki and paper)。
最后,精英主义(将 best-performing 个人复制到下一代)很普遍,但可能存在问题。遗传算法经常停滞在 sub-optimal 解(称为局部最大值,任何变化都会降低适应度)。精英主义会助长这个问题。当然,相反的问题是多样性太多类似于随机搜索,所以你需要找到合适的平衡。