看完必会的 python DEAP遗传算法库讲解+实战(初级)


喜欢的话请关注我们的微信公众号~《 你好世界炼丹师》。

  • 公众号主要讲统计学,数据科学,机器学习,深度学习,以及一些参加Kaggle竞赛的经验。
  • 公众号内容建议作为课后的一些相关知识的补充,饭后甜点。
  • 此外,为了不过多打扰,公众号每周推送一次,每次4~6篇精选文章。

微信搜索公众号:你好世界炼丹师。期待您的关注。


一个简单的遗传算法

我们来找这个函数的最大值:
在这里插入图片描述

  • 该函数的最大值应该出现在处28.309,值为1657.423。
  • 可以看到该函数有很多局部极值作为干扰项,如果进化算法过早收敛,很容易陷入某个局部最优。

我们用二进制编码来解决这样的问题

  • 如果要求精度是六位的话,从-30到30,总共需要考虑 60 × 1 0 6 60 \times 10^6 60×106种情况。在这里插入图片描述
  • 所以编码长度为26

代码详细讲解

from deap import algorithms

random.seed(42) #确保可以复现结果
# 描述问题
# 我们要解决的是哪个多项式的最大值为题
# 而且编码用list来表示,遗传算法中的每一个个体是[1,0,1,1,1,1,0,0,...]这样的list
creator.create('FitnessMax', base.Fitness, weights=(1.0,)) # 单目标,最大值问题
creator.create('Individual', list, fitness = creator.FitnessMax) # 编码继承list类

# 个体编码
GENE_LENGTH = 26 # 需要26位编码
# creator上定义了目标问题和个体的表示方式list,然后再toolbox中进行注册。
# toolbox定义编码方式二进制,在toolbox中注册个体
toolbox = base.Toolbox()
toolbox.register('binary', bernoulli.rvs, 0.5) #注册一个Binary的alias,指向scipy.stats中的bernoulli.rvs,概率为0.5
toolbox.register('individual', tools.initRepeat, creator.Individual, toolbox.binary, n = GENE_LENGTH) #用tools.initRepeat生成长度为GENE_LENGTH的Individual

# 评价函数,求极大值的函数
def decode(individual):
    num = int(''.join([str(_) for _ in individual]), 2) # 解码到10进制
    x = -30 + num * 60 / (2**26 - 1) # 映射回-30,30区间
    return x

def eval(individual):
    x = decode(individual)
    return ((np.square(x) + x) * np.cos(2*x) + np.square(x) + x),

# 生成初始族群
# 之前在toolbox中注册了个体,现在重复个体,注册一个群体
N_POP = 100 # 族群中的个体数量
toolbox.register('population', tools.initRepeat, list, toolbox.individual)
pop = toolbox.population(n = N_POP)

# 在工具箱中注册遗传算法需要的工具
# 之后的交叉,重组,选择,突变也要一一在toolbox中注册
# 先注册评价函数,eval是之前定义的函数名字
# 定义选择配种人群的方式,这里采用的是锦标赛选择
# 然后重组采用的是均匀重组
# 然后选择一个突变的方式
toolbox.register('evaluate', eval)
toolbox.register('select', tools.selTournament, tournsize = 2) # 注册Tournsize为2的锦标赛选择
toolbox.register('mate', tools.cxUniform, indpb = 0.5) # 注意这里的indpb需要显示给出
toolbox.register('mutate', tools.mutFlipBit, indpb = 0.5)

# 注册计算过程中需要记录的数据
stats = tools.Statistics(key=lambda ind: ind.fitness.values)
stats.register("avg", np.mean)
stats.register("std", np.std)
stats.register("min", np.min)
stats.register("max", np.max)

# 调用DEAP内置的算法
# 这里采用简单进化算法,所以用了eaSimple
resultPop, logbook = algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=50, stats = stats, verbose = False)

# 输出计算过程
logbook.header = 'gen', 'nevals',"avg", "std", 'min', "max"
print(logbook)

如果还有不懂的问题,可以私信问我。欢迎交流

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python中常用的遗传算法DEAP(Distributed Evolutionary Algorithms in Python)。 DEAP是一个基于Python的开源遗传算法框架,可以用来构建和应用遗传算法和其他进化算法。它提供了许多内置的进化算法操作和多种编程范式,支持并行处理和分布式计算。DEAP的主要特点是易于使用、高效和灵活。 下面是一个简单的DEAP遗传算法示例,用于解决一个TSP(旅行商问题): ```python import random import numpy as np from deap import algorithms, base, creator, tools # 创建适应度函数 def evalTSP(individual): distance = 0 for i in range(len(individual)): j = (i+1) % len(individual) distance += dist_matrix[individual[i]][individual[j]] return distance, # 创建遗传算法工具箱 creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) creator.create("Individual", list, fitness=creator.FitnessMin) toolbox = base.Toolbox() toolbox.register("indices", random.sample, range(n), n) toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.indices) toolbox.register("population", tools.initRepeat, list, toolbox.individual) toolbox.register("mate", tools.cxOrdered) toolbox.register("mutate", tools.mutShuffleIndexes, indpb=0.05) toolbox.register("select", tools.selTournament, tournsize=3) toolbox.register("evaluate", evalTSP) # 加载数据 dist_matrix = np.array([[0, 1, 2, 3], [1, 0, 4, 5], [2, 4, 0, 6], [3, 5, 6, 0]]) n = len(dist_matrix) # 运行遗传算法 pop = toolbox.population(n=100) algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=50, verbose=False) # 输出结果 best_individual = tools.selBest(pop, k=1)[0] print("Best individual is ", best_individual) print("Best fitness is ", evalTSP(best_individual)) ``` 这个示例演示了如何使用DEAP解决一个TSP问题。它创建了一个包含100个个体的种群,并在50代内运行遗传算法来寻找最优解。在每一代中,使用选择、交叉和变异操作来更新种群。最后,找到最优个体并输出其路径和总路程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值