1)步骤
目的: 找到最优解
选择一定数量的个体作为父本种群
父本种群中随机两个父本结合生成两个子本, 之后对生成的子本进行变异
再从父本种群中选择两个父本生成两个子本, 再变异...
直到 子本种群个数=父本 或 子本种群个数 = 父本种群个数+1
2) 感受
必须敲一遍代码, 单单从文字描述去看较难理解
3) 代码
import random
#选择一定数量的个体作为父本种群
#父本种群中随机两个父本结合生成两个子本, 之后对生成的子本进行变异
#再从父本种群中选择两个父本生成两个子本, 再变异, 直到 子本种群个数=父本 或 子本种群个数 = 父本种群个数+1
#定义个体类, 代表种群中的一个个体
class Individual:
def __init__(self,genes):
self.genes=genes #个体的基因序列,一个列表
self.fitness=self.calculate_fitness() #个体的适应度
def calculate_fitness(self):
# 计算适应度函数, 这里以基因的平方和为例
# 适应度函数就根据具体问题进行定义
return sum(x**2 for x in self.genes)
#初始化种群
def initialize_population(size #size:种群大小
,gene_length): #gene_length: 个体基因序列的长度
# 生成初始种群, 每个个体由随机生成的基因序列组成
return [Individual([random.randint(-10,10) for _ in range(gene_length)]) for _ in range(size)]
#选择过程
def selection(population #population: 当前种群
,num_parents): #num_parents: 选择的父母数量
#根据适应度排序, 选择适应度最高的个体作为父母
return sorted(population, key=lambda population:population.fitness, reverse=True)[:num_parents]
#交叉过程
def crossover(parent1 #parent1和parent2代表选择的两个父本个体
,parent2):
#随机选择交叉点, 交换父本基因, 生成两个子代
point = random.randint(1,len(parent1.genes)-1)#左边界为1的原因是让每个父本都可以参与到交叉过程
child1_genes=parent1.genes[:point]+parent2.genes[point:]
child2_genes=parent2.genes[:point]+parent1.genes[point:]
return Individual(child1_genes),Individual(child2_genes)
#变异过程
def mutation(individual #要变异的个体
,mutation_rate=0.01): #变异概率
#对个体的基因序列进行随机变异
for i in range(len(individual.genes)):
if random.random()<mutation_rate:
#对每个基因位以一定的概率进行增减操作
individual.genes[i]+=random.randint(-1,1)
#更新个体的适应度
individual.fitness=individual.calculate_fitness()
#遗传算法主函数
def genetic_algorithm(population_size, #种群大小
gene_length, #基因长度
num_generations): #进化代数
#初始化种群
population = initialize_population(population_size,gene_length)
for _ in range(num_generations):
#选择
parents = selection(population,population_size//2)
next_generation=[]
#生成与 父本种群 数量相同或多一个个体 的新一代种群
while len(next_generation)<population_size:
parents1,parents2=random.sample(parents,2) #随机从父本种群中抽取2个父本,下一次循环可能会抽到与上次循环相同的父本
child1,child2=crossover(parents1,parents2)
mutation(child1)#对生成的两个子代进行变异操作
mutation(child2)
next_generation.extend([child1,child2])
population = next_generation
#每一代选取适应度最高的个体
best_individual = max(population,key=lambda x:x.fitness)
return best_individual
#运行算法
best = genetic_algorithm(100,5,50)
print(f"最优个体基因: {best.genes}")