在Python中,有几个被广泛使用的遗传算法工具箱,每个都有其特点和优势。以下是一些比较受欢迎的工具箱:

  1. DEAP (Distributed Evolutionary Algorithms in Python): DEAP是一个强大的进化计算框架,它允许用户设计并实现各种复杂的遗传算法、遗传编程和其他基于自然选择的优化方法。DEAP提供了丰富的构建模块,如个体定义、适应度函数、选择、交叉、变异等操作符。使用DEAP需要一定的Python基础和对遗传算法的理解。

  2. pymoo: pymoo是另一个专注于多目标优化问题的Python库,包含了多种优化算法,其中包括遗传算法(GA)。该库具有高度灵活性和易用性,适合解决带有约束条件的单目标或多目标优化问题。

  3. Geatpy: 根据之前的描述,Geatpy是一个由华南农业大学、暨南大学、华南理工大学等高校联合团队开发的高性能遗传算法工具箱,支持多种进化算法,如GA、DE、ES,并且特别适合数学建模和研究工作。

  4. inspyred: inspyred 是一个轻量级的演化计算框架,它的设计灵感来源于生物进化过程,可以灵活地应用于各种遗传算法和演化策略的设计。

如何使用这些工具箱: 使用任何上述工具箱时,通常都需要以下几个步骤:

  • 定义问题:确定优化的目标函数以及可能存在的约束条件。
  • 编码方案:设计如何将解决方案表示为个体或染色体。
  • 初始化种群:创建初始的一组解作为算法运行的起点。
  • 适应度评估:定义适应度函数来量化每个个体的优劣程度。
  • 遗传算子设置:配置选择、交叉、变异等操作,用于生成下一代个体。
  • 运行算法:执行遗传算法循环直至满足终止条件(例如达到最大迭代次数或满足收敛标准)。

以DEAP为例,基本的使用流程大致如下:

# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
# 导入数据

from tqdm import tqdm  # 载入进度条的库
import time
import numpy as np  # 定义很多函数的库
import matplotlib.pyplot as plt
import random


import sys
import os

# 假设myfunforld文件夹位于当前工作目录的同一层级
current_dir = os.getcwd()  # 获取当前工作目录
myfunforld_dir = os.path.join(current_dir, 'myfunforld')  # 拼接路径

# 检查myfunforld_dir是否确实是一个文件夹
if os.path.isdir(myfunforld_dir):
    # 如果是文件夹,则添加到sys.path中
    sys.path.append(myfunforld_dir)
else:
    print(f"Warning: {myfunforld_dir} is not a directory!")

# 现在Python应该能够导入myfunforld文件夹中的模块或包了

# import myfun  # 导入文件

# sys.path.append(".")

# 主程序
if __name__ == '__main__':

    import random
    import matplotlib.pyplot as plt
    from deap import base, creator, tools, algorithms

    # 定义问题:OneMax问题
    # 个体由二进制串表示,目标是最小化二进制串中的0的数量(即最大化1的数量)

    # 创建种群类型
    creator.create("FitnessMax", base.Fitness, weights=(1.0,))
    creator.create("Individual", list, fitness=creator.FitnessMax)

    # 初始化工具箱
    toolbox = base.Toolbox()

    # 编码器/解码器 - 在本例中不需要,因为直接使用列表作为基因型和表现型
    # toolbox.register("encode", ... )
    # toolbox.register("decode", ... )

    # 创造者函数
    toolbox.register("attr_bool", random.randint, 0, 1)  # 每个基因位随机生成0或1
    toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, n=100)  # 创建长度为100的二进制串个体
    toolbox.register("population", tools.initRepeat, list, toolbox.individual)  # 创建种群


    # 适应度评价函数
    def eval_one_max(individual):
        return sum(individual),  # 计算二进制串中1的数量


    toolbox.register("evaluate", eval_one_max)

    # 选择操作
    toolbox.register("select", tools.selTournament, tournsize=3)

    # 遗传变异操作
    toolbox.register("mate", tools.cxTwoPoint)
    toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)

    # 设置最大代数
    MAX_GENERATIONS = 200
    FITNESS_HISTORY = [] #
    zero_array = np.zeros((MAX_GENERATIONS,1))
    # 创建初始种群
    pop = toolbox.population(n=100)


    # 记录每一代的最佳适应度
    def record_fitness(population):
        best_ind = tools.selBest(population, k=1)[0]
        FITNESS_HISTORY.append(best_ind.fitness.values[0])


    # 进行演化循环并记录每代的适应度
    for gen in range(MAX_GENERATIONS):
        offspring = algorithms.varAnd(pop, toolbox, cxpb=0.5, mutpb=0.2) #定义
        # 评估新种群
        fitnesses = toolbox.map(toolbox.evaluate, offspring)
        for ind, fit in zip(offspring, fitnesses):
            ind.fitness.values = fit
        pop = toolbox.select(offspring + pop, k=len(pop))  # 更新种群
        record_fitness(pop)

    # 绘制适应度曲线
    print(len(FITNESS_HISTORY))
    print(zero_array)
    plt.figure()
    plt.plot(range(1, len(FITNESS_HISTORY) + 1), FITNESS_HISTORY)
    plt.xlabel('Generation')
    plt.ylabel('Best Fitness Value (Number of Ones)')
    plt.title('Evolution of Best Fitness Over Generations for OneMax Problem')
    plt.grid(True)
    plt.show()

程序结果:

Python实现遗传算法(附完整Python代码)-LMLPHP

02-22 09:31