当前位置:首页 > Python > 正文

Python实现遗传算法详解(从零开始掌握遗传算法编程)

在人工智能和优化领域,遗传算法(Genetic Algorithm, GA)是一种受生物进化启发的搜索启发式算法。它模拟自然选择、交叉(杂交)和变异等过程,用于解决复杂的优化问题。本教程将手把手教你使用Python语言实现遗传算法,即使你是编程小白,也能轻松上手!

什么是遗传算法?

遗传算法的核心思想是“适者生存”。它通过以下步骤不断演化种群,寻找最优解:

  • 初始化:随机生成一组候选解(称为“个体”),构成初始种群。
  • 评估:计算每个个体的适应度(Fitness),衡量其优劣。
  • 选择:根据适应度选择优秀个体作为父母。
  • 交叉:父母个体交换部分基因,产生后代。
  • 变异:以小概率对后代进行随机改变,增加多样性。
  • 更新种群:用新后代替代旧个体,重复上述过程直到满足终止条件。
Python实现遗传算法详解(从零开始掌握遗传算法编程) Python遗传算法 遗传算法入门 Python优化算法 遗传算法实战 第1张

实战:用Python实现一个简单的遗传算法

我们将解决一个经典问题:寻找函数 f(x) = x² 在区间 [0, 31] 内的最大值。由于 x 是整数,我们可以用 5 位二进制编码表示(因为 2⁵ = 32)。

步骤 1:导入所需库

import randomimport numpy as np

步骤 2:定义辅助函数

# 将二进制字符串转为十进制整数def binary_to_decimal(binary_str):    return int(binary_str, 2)# 计算适应度(目标函数 f(x) = x²)def fitness(individual):    x = binary_to_decimal(individual)    return x ** 2# 初始化种群(每个个体是5位二进制字符串)def initialize_population(pop_size, gene_length=5):    return [''.join(random.choice('01') for _ in range(gene_length))             for _ in range(pop_size)]# 轮盘赌选择def selection(population, fitnesses):    total_fitness = sum(fitnesses)    probabilities = [f / total_fitness for f in fitnesses]    selected = []    for _ in range(len(population)):        r = random.random()        cumulative = 0        for i, prob in enumerate(probabilities):            cumulative += prob            if r <= cumulative:                selected.append(population[i])                break    return selected# 单点交叉def crossover(parent1, parent2, crossover_rate=0.8):    if random.random() < crossover_rate:        point = random.randint(1, len(parent1) - 1)        child1 = parent1[:point] + parent2[point:]        child2 = parent2[:point] + parent1[point:]        return child1, child2    else:        return parent1, parent2# 变异def mutate(individual, mutation_rate=0.01):    individual_list = list(individual)    for i in range(len(individual_list)):        if random.random() < mutation_rate:            individual_list[i] = '1' if individual_list[i] == '0' else '0'    return ''.join(individual_list)

步骤 3:主遗传算法循环

def genetic_algorithm(pop_size=10, generations=20, crossover_rate=0.8, mutation_rate=0.01):    # 初始化种群    population = initialize_population(pop_size)        for gen in range(generations):        # 计算适应度        fitnesses = [fitness(ind) for ind in population]                # 找到当前最优个体        best_idx = np.argmax(fitnesses)        best_individual = population[best_idx]        best_value = binary_to_decimal(best_individual)        print(f"第 {gen+1} 代: 最优解 x={best_value}, f(x)={fitnesses[best_idx]}")                # 选择        selected = selection(population, fitnesses)                # 交叉和变异(生成新一代)        new_population = []        for i in range(0, pop_size, 2):            parent1 = selected[i]            parent2 = selected[(i+1) % pop_size]  # 避免索引越界            child1, child2 = crossover(parent1, parent2, crossover_rate)            child1 = mutate(child1, mutation_rate)            child2 = mutate(child2, mutation_rate)            new_population.extend([child1, child2])                population = new_population[:pop_size]  # 确保种群大小不变        # 返回最终最优解    final_fitnesses = [fitness(ind) for ind in population]    best_idx = np.argmax(final_fitnesses)    return population[best_idx], final_fitnesses[best_idx]# 运行算法best_sol, best_fit = genetic_algorithm()print(f"\n最终结果: x={binary_to_decimal(best_sol)}, f(x)={best_fit}")

运行结果示例

当你运行上述代码,你可能会看到类似以下的输出:

第 1 代: 最优解 x=25, f(x)=625第 2 代: 最优解 x=28, f(x)=784...第 20 代: 最优解 x=31, f(x)=961最终结果: x=31, f(x)=961

为什么学习遗传算法?

遗传算法是Python优化算法中的重要一员,适用于传统方法难以处理的非线性、多峰、离散或黑箱优化问题。掌握它不仅能提升你的算法思维,还能应用于机器学习超参数调优、工程设计、调度问题等多个领域。

总结

本教程带你从零开始,用Python语言实现遗传算法,并通过一个简单例子理解其核心机制。希望你现在对遗传算法入门有了清晰的认识!你可以尝试修改目标函数、调整参数(如种群大小、交叉率、变异率),观察算法表现的变化,进一步巩固所学知识。

关键词回顾:Python遗传算法遗传算法入门Python优化算法遗传算法实战