1.算法-Python遗传算法实例

题记

        以下是一个python遗传算法实例,包括全过程和解析。

编辑main.py文件

        main.py文件如下:

#导入生成伪随机数的模块
import random

# 随机生成初始种群
# 1.初始化种群,在搜索空间内随机生成一组个体,称为种群
# 定义函数,参数为种群数量,基因数量或者长度,随机生成的是基因
def generate_population(size, num_genes):
    return [[random.randint(0, 100) for _ in range(num_genes)] for _ in range(size)]

# 计算适应度函数(这里是目标函数,即列表中的最大数)
# 2.评估适应度,对每个个体计算适应度,适应度表示个体解的优劣程度。适应度函数通常是问题特定的,目标是最大化或最小化适应度函数的值。
# 个体中的最大值
def fitness(individual):
    return max(individual)

# 选择父代
# 3.选择,根据个体的适应度选择父代个体。适应度高的个体被选中的概率较大,模拟了自然选择中适者生存的原则。
# 参数为种群,选择的父代数
def select_parents(population, num_parents):
    parents = []
    for _ in range(num_parents):
        selected = random.choice(population)
        parents.append(selected)
    return parents

# 交叉操作
# 4.交叉,通过某种方式交换两个父代个体的基因信息,产生新的子代个体。交叉操作模拟了生物界的基因交换。
# 参数为父代,和要生成的子代数
def crossover(parents, num_offspring):
    offspring = []
    for _ in range(num_offspring):
        # 从父代随机选两个
        parent1, parent2 = random.sample(parents, 2)
        # 选择交叉的位置
        crossover_point = random.randint(1, len(parent1) - 1)
        #对父代切割,组合
        child = parent1[:crossover_point] + parent2[crossover_point:]
        offspring.append(child)
    return offspring

# 变异操作
# 5.变异,对子代个体的基因信息进行突变操作,引入新的基因特征。变异操作是为了维持种群的多样性,避免陷入局部最优解
# 参数为子代列表,和变异的概率
def mutate(offspring, mutation_rate):
    for child in offspring:
        # 如果生成的0,1的随机数小于概率就变异
        if random.random() < mutation_rate:
            # 选择变异点
            mutate_point = random.randint(0, len(child) - 1)
            child[mutate_point] = random.randint(0, 100)
    return offspring

# 主函数
# 6.替换 ,用新生成的子代个体替代原始种群中适应度较差的个体,形成新一代种群。
# 7.终止条件,判断是否满足停止条件(例如达到最大迭代次数或者找到满足要求的解),如果满足则算法结束,否则返回步骤2
def genetic_algorithm(num_generations, population_size, num_genes, num_parents, num_offspring, mutation_rate):
    # 初始化
    population = generate_population(population_size, num_genes)
    # 进化过程,参数为换代的次数
    for generation in range(num_generations):
        # 计算适应度
        fitness_scores = [fitness(individual) for individual in population]
        # 找到当前种群中适应度最高的个体
        max_fitness = max(fitness_scores)
        best_individual = population[fitness_scores.index(max_fitness)]
        print(f"当前代数 {generation + 1}: 最佳个体 - {best_individual}, 适应度 - {max_fitness}")
        # 选择父代
        parents = select_parents(population, num_parents)
        # 交叉操作
        offspring = crossover(parents, num_offspring)
        # 变异操作
        offspring = mutate(offspring, mutation_rate)
        # 替换当前种群
        population = offspring

# 调用遗传算法函数
genetic_algorithm(num_generations=50, population_size=100, num_genes=10, num_parents=50, num_offspring=50, mutation_rate=0.1)
#导入生成伪随机数的模块
import random

# 随机生成初始种群
# 1.初始化种群,在搜索空间内随机生成一组个体,称为种群
# 定义函数,参数为种群数量,基因数量或者长度,随机生成的是基因
def generate_population(size, num_genes):
    return [[random.randint(0, 100) for _ in range(num_genes)] for _ in range(size)]

# 计算适应度函数(这里是目标函数,即列表中的最大数)
# 2.评估适应度,对每个个体计算适应度,适应度表示个体解的优劣程度。适应度函数通常是问题特定的,目标是最大化或最小化适应度函数的值。
# 个体中的最大值
def fitness(individual):
    return max(individual)

# 选择父代
# 3.选择,根据个体的适应度选择父代个体。适应度高的个体被选中的概率较大,模拟了自然选择中适者生存的原则。
# 参数为种群,选择的父代数
def select_parents(population, num_parents):
    parents = []
    for _ in range(num_parents):
        selected = random.choice(population)
        parents.append(selected)
    return parents

# 交叉操作
# 4.交叉,通过某种方式交换两个父代个体的基因信息,产生新的子代个体。交叉操作模拟了生物界的基因交换。
# 参数为父代,和要生成的子代数
def crossover(parents, num_offspring):
    offspring = []
    for _ in range(num_offspring):
        # 从父代随机选两个
        parent1, parent2 = random.sample(parents, 2)
        # 选择交叉的位置
        crossover_point = random.randint(1, len(parent1) - 1)
        #对父代切割,组合
        child = parent1[:crossover_point] + parent2[crossover_point:]
        offspring.append(child)
    return offspring

# 变异操作
# 5.变异,对子代个体的基因信息进行突变操作,引入新的基因特征。变异操作是为了维持种群的多样性,避免陷入局部最优解
# 参数为子代列表,和变异的概率
def mutate(offspring, mutation_rate):
    for child in offspring:
        # 如果生成的0,1的随机数小于概率就变异
        if random.random() < mutation_rate:
            # 选择变异点
            mutate_point = random.randint(0, len(child) - 1)
            child[mutate_point] = random.randint(0, 100)
    return offspring

# 主函数
# 6.替换 ,用新生成的子代个体替代原始种群中适应度较差的个体,形成新一代种群。
# 7.终止条件,判断是否满足停止条件(例如达到最大迭代次数或者找到满足要求的解),如果满足则算法结束,否则返回步骤2
def genetic_algorithm(num_generations, population_size, num_genes, num_parents, num_offspring, mutation_rate):
    # 初始化
    population = generate_population(population_size, num_genes)
    # 进化过程,参数为换代的次数
    for generation in range(num_generations):
        # 计算适应度
        fitness_scores = [fitness(individual) for individual in population]
        # 找到当前种群中适应度最高的个体
        max_fitness = max(fitness_scores)
        best_individual = population[fitness_scores.index(max_fitness)]
        print(f"当前代数 {generation + 1}: 最佳个体 - {best_individual}, 适应度 - {max_fitness}")
        # 选择父代
        parents = select_parents(population, num_parents)
        # 交叉操作
        offspring = crossover(parents, num_offspring)
        # 变异操作
        offspring = mutate(offspring, mutation_rate)
        # 替换当前种群
        population = offspring

# 调用遗传算法函数
genetic_algorithm(num_generations=50, population_size=100, num_genes=10, num_parents=50, num_offspring=50, mutation_rate=0.1)

 执行程序

        python main.py 

展示图 

 后记

        觉得有用可以点赞或收藏!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值