#=结合/交叉过程===========
def crossover(parent1, parent2):
child1, child2 = indivdual(), indivdual()#父亲,母亲初始化
child1.x = 0.9 * parent1.x + 0.1 * parent2.x #交叉0.9,0.1,可以设置其他系数
child2.x = 0.1 * parent1.x + 0.9 * parent2.x
child1.fitness = fitness(child1.x)#子1适应度函数值
child2.fitness = fitness(child2.x)#子2适应度函数值
return child1, child2
#=变异过程======
def mutation(pop):
种群中随机选择一个进行变异
ind = np.random.choice(pop)
用随机赋值的方式进行变异
ind.x = np.random.uniform(-10, 10)
ind.fitness = fitness(ind.x)
#最终执行=====
def implement():
#=种群中个体数量==
N = 40
种群
POP = []
迭代次数
iter_N = 400
初始化种群
initPopulation(POP, N)
#进化过程==
for it in range(iter_N):#遍历每一代
a, b = selection(N)#随机选择两个个体
if np.random.random() < 0.65: # 以0.65的概率进行交叉结合
child1, child2 = crossover(POP[a], POP[b])
new = sorted([POP[a], POP[b], child1, child2], key=lambda ind: ind.fitness, reverse=True)#将父母亲和子代进行比较,保留最好的两个
POP[a], POP[b] = new[0], new[1]
if np.random.random() < 0.1: # 以0.1的概率进行变异
mutation(POP)
POP.sort(key=lambda ind: ind.fitness, reverse=True)
return POP