遗传算法:需要对选择进行一些澄清以及在没有发生交叉时该怎么做

时间:2018-03-17 23:20:16

标签: optimization genetic-algorithm

我正在编写遗传算法来最小化函数。我有两个问题,一个是关于选择的问题,另一个是关于交叉的问题,以及当它没有发生时该怎么做。

以下是我正在做的事情的概述:

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循环下,跟踪健身进展和迭代次数,我没有包括。所以,我的问题:

  1. 如您所见,每个人都随机选择两个父母 迭代直到新的人口被填满。所以,两者一样 父母可以不止一次交配,肯定会有几个适合父母的人 交配的次数比一次多。这有什么不好吗?
  2. obitko tutorial中,它表示如果交叉没有 发生,那么孩子就是父母的精确副本。我甚至不明白 这意味着什么,所以,正如你所看到的,我只选了一个随机的父母 (统一;没有考虑适应性)并复制到新的人口。 这对我来说似乎很奇怪。无论我是否真的这样做,我的结果确实不会改变那么多。什么是处理案件的正确方法 什么时候没有发生交叉?

2 个答案:

答案 0 :(得分:1)

一些有几个后代的父母很常见;我甚至说这是默认的做法(并考虑生物进化,这恰恰是主要成分之一)。

“如果没有发生交叉,那么孩子就是父母的精确副本”

这有点令人困惑。 Crossover(在你的链接中很好地解释)意味着从一个父母和一些父母中获取一些基因。这被称为有性生殖,需要两个(或更多?)父母。

但无性繁殖也是可能的。在这种情况下,你只需要一个父母,并在新个体中改变其基因组。这几乎就是你所尝试的,但你错过了重要的突变步骤(注意突变可能非常具有侵略性或非常保守!)

请注意,在复制基因组以创建多样性后,无性繁殖需要突变,而在有性生殖中,这是一个可选步骤。

使用任何一种复制品或混合使用都可以。顺便说一句:在一些问题中,基因可能并不总是具有相同的大小。在这种情况下,有性生殖是有问题的。如果您对此问题感兴趣,请查看NEAT算法,这是一种流行的神经进化算法,旨在解决此问题(wikipaper)。

最后,精英主义(将表现最佳的人复制到下一代)很常见,但可能会有问题。遗传算法通常在次优解中停滞(称为局部最大值,其中任何变化都会降低适应度)。精英主义可能导致这个问题。当然,相反的问题是太多的多样性与随机搜索类似,所以你需要找到适当的平衡。

答案 1 :(得分:0)

  1. 我认为同一个人是每代不止一个孩子的父母,我没有看到任何错误。它只会影响你的多样性。如果你不喜欢这样,或者在最后几代中发现真正缺乏多样性,你实际上可以标记个体,因此每代不能超过父母一次。
  2. 我实际上并不完全同意这个教程,我认为在你选择了将成为父母的个人(当然,基于他们的健康状况)之后,你应该实际执行交叉。否则你将把很多人克隆到下一代。