我目前正在用 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
正确。我的问题是:
交叉是正确的吗?这是进行锦标赛选择的好方法吗?我想确保总体人口仍然具有一定的多样性,这样我就可以避免局部最优。这就是为什么我试图只取前两名表演者并复制他们(尽管,也许这也太多了)。
关于交叉,是否可以只给每个孩子一个小概率使每个基因发生突变?根据当前人群的适应度给出一个可变的突变率会更好吗?
我已经在许多方程上测试了我的方法,但发现有时我仍然陷入局部最大值。使用(来自https://en.wikipedia.org/w/index.php?title=Test_functions_for_optimization&oldid=787014841f(x,y) = -| 2x^2 - 1.05x^4 + ((x^6)/6) + xy + y^2 |
的三峰驼峰函数)我发现大部分时间,但有时仍会卡在它附近。这主要是为什么我想知道我的交叉/突变方法是否关闭。(0, 0)