遗传算法_Python实现

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}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值