我正在努力完全理解如何在 GA 中获得新一代。AFAIK,这些是步骤(让我们考虑elitist
方法):
- 选择(保留 20% 的最佳种群并将其放在下一代中)
- 交叉(交叉其余 70% - 每个父代只与另一个父代交叉一次;我们如何处理交叉概率?)
- mutate(以概率 MP 对世代中的所有样本进行变异)
我不确定这是否可行,也如上所述 - 你如何处理交叉概率 CP?我的意思是,你需要在几代人之间有相同的种群规模,因此你需要从最差的 70% 的种群中交叉所有样本 - 使 CP 无用。
我正在努力完全理解如何在 GA 中获得新一代。AFAIK,这些是步骤(让我们考虑elitist
方法):
我不确定这是否可行,也如上所述 - 你如何处理交叉概率 CP?我的意思是,你需要在几代人之间有相同的种群规模,因此你需要从最差的 70% 的种群中交叉所有样本 - 使 CP 无用。
交叉的概率如下:
if rand() < crossProb:
child1, child2 = crossover(parent1, parent2)
else:
child1, child2 = parent1, parent2
假设 rand() 给出 [0, 1) 之间的浮点数,并且您的交叉函数旨在返回两个值。突变的工作原理基本相同,但只有一个父子关系。
您选择过程中最初的 20% 可以保证没有突变/交叉。
每个个体可以包含两个基因组拷贝,而配子包含一个拷贝。通过随机从这两个拷贝中的每一个中获取所需的基因,从这种双重基因组中产生配子。当配子加入时,会产生一个具有两个副本的新个体。至少,这就是它在自然界中总是发生交叉的工作方式(没有像 CP 这样的东西)。
然而,这需要解决两个基因组如何反映到参与选择的单一表型。根据您尝试使用遗传算法解决的任务,这可能从微不足道到非常成问题。
我还推荐使用JGap包,它提供了许多自然和人类发明的算法。