我目前正在使用Python实现遗传算法,并且是在Andries P. Engelbrecht撰写的“计算智能-简介,第二版”一书的基础上进行的。我的理解是您执行fitness calc, selection, crosover and mutation
的每一代。
我目前的总体策略是:
while not stopping_criteria():
next_population = []
# Step 1. Calculate Fitness
for each individual in population:
calculate_fitness()
# Step 2. Grab some number of top performers to copy over
top_performers = ellitism(population, 2) # Grab top 2 for instance
next_population += top_performers
# Step 3. Selection/Crossover/Mutation
# While the next_population has fewer individuals than the current population
while length(next_population) < length(population):
# Step 3.1 tournament selection of tournament size 4, top 2
parent1, parent2 = tournament_selection(population)
# Step 3.2 Crossover using SBX
child1, child2 = simulated_binary_crossover(parent1, parent2)
# Step 3.3 Mutation of children?
gaussian_mutation(child1, 0.05)
gaussian_mutation(child2, 0.05)
next_population += [child1, child2]
我相信我正在正确执行步骤1 - 3.1
。我的问题确实是:
交叉是否正确?这是进行比赛选择的好方法吗?我想确保总体人口仍然具有一定的多样性,这样我就可以避免局部最优。这就是为什么我只想挑选表现最好的两位表演者,然后复制他们(尽管也许太多)了。
关于交叉,可以给每个孩子一个小的概率来突变每个基因吗?根据当前人群的适应性给出可变的突变率会更好吗?
我已经在许多方程式上测试了我的方法,但是发现有时我仍然陷入局部最大值。使用f(x,y) = -| 2x^2 - 1.05x^4 + ((x^6)/6) + xy + y^2 |
(来自https://en.wikipedia.org/w/index.php?title=Test_functions_for_optimization&oldid=787014841的三驼峰骆驼函数),我大部分时间都发现(0, 0)
,但有时还是会卡在它附近。这主要是为什么我想知道我的交叉/变异方法是否关闭的原因。