博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Deap: python中的遗传算法工具箱
阅读量:5054 次
发布时间:2019-06-12

本文共 7774 字,大约阅读时间需要 25 分钟。

Overview 程序概览

官方文档:

1. Types : 选择你要解决的问题类型,确定要求解的问题个数,最大值还是最小值
2. Initialization : 初始化基因编码位数,初始值,等基本信息
3. Operators : 操作,设计evaluate函数,在工具箱中注册参数信息:交叉,变异,保留个体,评价函数
4. Algorithm : 设计main函数,确定参数并运行得到结果

Types

# Typesfrom deap import base, creatorcreator.create("FitnessMin", base.Fitness, weights=(-1.0,))  # weights 1.0, 求最大值,-1.0 求最小值# (1.0,-1.0,)求第一个参数的最大值,求第二个参数的最小值creator.create("Individual", list, fitness=creator.FitnessMin)

Initialization

import randomfrom deap import toolsIND_SIZE = 10  # 种群数toolbox = base.Toolbox()toolbox.register("attribute", random.random)# 调用randon.random为每一个基因编码编码创建 随机初始值 也就是范围[0,1]toolbox.register("individual", tools.initRepeat, creator.Individual,                 toolbox.attribute, n=IND_SIZE)toolbox.register("population", tools.initRepeat, list, toolbox.individual)

Operators

# Operators# difine evaluate function# Note that a comma is a mustdef evaluate(individual):    return sum(individual),# use tools in deap to creat our applicationtoolbox.register("mate", tools.cxTwoPoint) # mate:交叉toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1) # mutate : 变异toolbox.register("select", tools.selTournament, tournsize=3) # select : 选择保留的最佳个体toolbox.register("evaluate", evaluate)  # commit our evaluate

高斯变异:

这种变异的方法就是,产生一个服从高斯分布的随机数,取代原先基因中的实数数值。这个算法产生的随机数,数学期望当为当前基因的实数数值。

一个模拟产生的算法是,产生6个服从U(0,1)的随机数,以他们的数学期望作为高斯分布随机数的近似。

mutate方法

  • 这个函数适用于输入个体的平均值和标准差的高斯突变

  • mu:python中基于平均值的高斯变异

  • sigma:python中基于标准差的高斯变异

  • indpb:每个属性的独立变异概率

mate : 交叉

select : 选择保留的最佳个体

evaluate : 选择评价函数,要注意返回值的地方最后面要多加一个逗号

Algorithms 计算程序

也就是设计主程序的地方,按照官网给的模式,我们要早此处设计其他参数,并设计迭代和取值的代码部分,并返回我们所需要的值.

# Algorithmsdef main():    # create an initial population of 300 individuals (where    # each individual is a list of integers)    pop = toolbox.population(n=50)    CXPB, MUTPB, NGEN = 0.5, 0.2, 40    '''    # CXPB  is the probability with which two individuals    #       are crossed    #    # MUTPB is the probability for mutating an individual    #    # NGEN  is the number of generations for which the    #       evolution runs    '''    # Evaluate the entire population    fitnesses = map(toolbox.evaluate, pop)    for ind, fit in zip(pop, fitnesses):        ind.fitness.values = fit    print("  Evaluated %i individuals" % len(pop))  # 这时候,pop的长度还是300呢    print("-- Iterative %i times --" % NGEN)    for g in range(NGEN):        if g % 10 == 0:            print("-- Generation %i --" % g)        # Select the next generation individuals        offspring = toolbox.select(pop, len(pop))        # Clone the selected individuals        offspring = list(map(toolbox.clone, offspring))        # Change map to list,The documentation on the official website is wrong        # Apply crossover and mutation on the offspring        for child1, child2 in zip(offspring[::2], offspring[1::2]):            if random.random() < CXPB:                toolbox.mate(child1, child2)                del child1.fitness.values                del child2.fitness.values        for mutant in offspring:            if random.random() < MUTPB:                toolbox.mutate(mutant)                del mutant.fitness.values        # Evaluate the individuals with an invalid fitness        invalid_ind = [ind for ind in offspring if not ind.fitness.valid]        fitnesses = map(toolbox.evaluate, invalid_ind)        for ind, fit in zip(invalid_ind, fitnesses):            ind.fitness.values = fit        # The population is entirely replaced by the offspring        pop[:] = offspring    print("-- End of (successful) evolution --")    best_ind = tools.selBest(pop, 1)[0]    return best_ind, best_ind.fitness.values  # return the result:Last individual,The Return of Evaluate function

要注意的地方就是,官网中给出的Overview代码中有一行代码是错误的,需要把一个数据类型(map)转换为list.

输出结果

Evaluated 50 individuals-- Iterative 40 times ---- Generation 0 ---- Generation 10 ---- Generation 20 ---- Generation 30 ---- End of (successful) evolution --best_ind [-2.402824207878805, -1.5920248739487302, -4.397332290574777, -0.7564815676249151, -3.3478264358788814, -5.900475519316307, -7.739284213710048, -4.469259215914226, 0.35793917907272843, -2.8594709616875256]best_ind.fitness.values (-33.10704010746149,)
  • best_ind : 最佳个体
  • best_ind.fitness.values : 最佳个体在经过evaluate之后的输出
#!usr/bin/env python# -*- coding:utf-8 _*-"""@author:fonttian @file: Overview.py@time: 2017/10/15 """# Typesfrom deap import base, creatorcreator.create("FitnessMin", base.Fitness, weights=(-1.0,))# weights 1.0, 求最大值,-1.0 求最小值# (1.0,-1.0,)求第一个参数的最大值,求第二个参数的最小值creator.create("Individual", list, fitness=creator.FitnessMin)# Initializationimport randomfrom deap import toolsIND_SIZE = 10  # 种群数toolbox = base.Toolbox()toolbox.register("attribute", random.random)# 调用randon.random为每一个基因编码编码创建 随机初始值 也就是范围[0,1]toolbox.register("individual", tools.initRepeat, creator.Individual,                 toolbox.attribute, n=IND_SIZE)toolbox.register("population", tools.initRepeat, list, toolbox.individual)# Operators# difine evaluate function# Note that a comma is a mustdef evaluate(individual):    return sum(individual),# use tools in deap to creat our applicationtoolbox.register("mate", tools.cxTwoPoint) # mate:交叉toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1) # mutate : 变异toolbox.register("select", tools.selTournament, tournsize=3) # select : 选择保留的最佳个体toolbox.register("evaluate", evaluate)  # commit our evaluate# Algorithmsdef main():    # create an initial population of 300 individuals (where    # each individual is a list of integers)    pop = toolbox.population(n=50)    CXPB, MUTPB, NGEN = 0.5, 0.2, 40    '''    # CXPB  is the probability with which two individuals    #       are crossed    #    # MUTPB is the probability for mutating an individual    #    # NGEN  is the number of generations for which the    #       evolution runs    '''    # Evaluate the entire population    fitnesses = map(toolbox.evaluate, pop)    for ind, fit in zip(pop, fitnesses):        ind.fitness.values = fit    print("  Evaluated %i individuals" % len(pop))  # 这时候,pop的长度还是300呢    print("-- Iterative %i times --" % NGEN)    for g in range(NGEN):        if g % 10 == 0:            print("-- Generation %i --" % g)        # Select the next generation individuals        offspring = toolbox.select(pop, len(pop))        # Clone the selected individuals        offspring = list(map(toolbox.clone, offspring))        # Change map to list,The documentation on the official website is wrong        # Apply crossover and mutation on the offspring        for child1, child2 in zip(offspring[::2], offspring[1::2]):            if random.random() < CXPB:                toolbox.mate(child1, child2)                del child1.fitness.values                del child2.fitness.values        for mutant in offspring:            if random.random() < MUTPB:                toolbox.mutate(mutant)                del mutant.fitness.values        # Evaluate the individuals with an invalid fitness        invalid_ind = [ind for ind in offspring if not ind.fitness.valid]        fitnesses = map(toolbox.evaluate, invalid_ind)        for ind, fit in zip(invalid_ind, fitnesses):            ind.fitness.values = fit        # The population is entirely replaced by the offspring        pop[:] = offspring    print("-- End of (successful) evolution --")    best_ind = tools.selBest(pop, 1)[0]    return best_ind, best_ind.fitness.values  # return the result:Last individual,The Return of Evaluate functionif __name__ == "__main__":    # t1 = time.clock()    best_ind, best_ind.fitness.values = main()    # print(pop, best_ind, best_ind.fitness.values)    # print("pop",pop)    print("best_ind",best_ind)    print("best_ind.fitness.values",best_ind.fitness.values)    # t2 = time.clock()    # print(t2-t1)

转载于:https://www.cnblogs.com/fonttian/p/9162768.html

你可能感兴趣的文章
代码实现导航栏分割线
查看>>
Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...
查看>>
VS 2010打开设计器出现错误
查看>>
SQLServer 镜像功能完全实现
查看>>
Vue-详解设置路由导航的两种方法
查看>>
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
dvwa网络渗透测试环境的搭建
查看>>
Win8 安装VS2012 和 Sql Server失败问题
查看>>
过点(2,4)作一直线在第一象限与两轴围成三角形,问三角形面积的最小值?...
查看>>
java aes CBC的填充方式发现
查看>>
使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法
查看>>
BZOJ 2338 HNOI2011 数矩形 计算几何
查看>>
关于页面<!DOCTYPE>声明
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
C++标准库vector使用(更新中...)
查看>>
cocos2d-x 2.2.6 之 .xml文件数据读取
查看>>
枚举的使用
查看>>
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>