我正在编写遗传算法来最小化函数。我有两个问题,一个是关于选择的问题,另一个是关于交叉的问题,以及当它没有发生时该怎么做。
以下是我正在做的事情的概述:
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
循环下,跟踪健身进展和迭代次数,我没有包括。所以,我的问题:
答案 0 :(得分:1)
“如果没有发生交叉,那么孩子就是父母的精确副本”
这有点令人困惑。 Crossover(在你的链接中很好地解释)意味着从一个父母和一些父母中获取一些基因。这被称为有性生殖,需要两个(或更多?)父母。
但无性繁殖也是可能的。在这种情况下,你只需要一个父母,并在新个体中改变其基因组。这几乎就是你所尝试的,但你错过了重要的突变步骤(注意突变可能非常具有侵略性或非常保守!)
请注意,在复制基因组以创建多样性后,无性繁殖需要突变,而在有性生殖中,这是一个可选步骤。
使用任何一种复制品或混合使用都可以。顺便说一句:在一些问题中,基因可能并不总是具有相同的大小。在这种情况下,有性生殖是有问题的。如果您对此问题感兴趣,请查看NEAT算法,这是一种流行的神经进化算法,旨在解决此问题(wiki和paper)。
最后,精英主义(将表现最佳的人复制到下一代)很常见,但可能会有问题。遗传算法通常在次优解中停滞(称为局部最大值,其中任何变化都会降低适应度)。精英主义可能导致这个问题。当然,相反的问题是太多的多样性与随机搜索类似,所以你需要找到适当的平衡。
答案 1 :(得分:0)