文章目录

  • Deap框架—结合demo进行学习
    • 1. One Max Problem
      • 1.1 General Version
        • Modules
        • Creator
        • Toolbox
        • Evaluation Function
        • Genetic Operators
        • Main
        • 简单进化算法
      • 1.2 One Max Problem: Short Version
      • 1.3 One Max Problem: Numpy Version
    • 2. Knapsack Problem - 背包问题
      • Modules
      • Init
      • Creator
      • Toolbox
      • Evaluation Function
      • Genetic Operators
      • Main
      • $(\mu+\lambda)$ 进化算法
      • $(\mu,\lambda)$ 进化算法

Deap框架—结合demo进行学习

1. One Max Problem

1.1 General Version

问题描述:列表中仅有0和1,求和最大的情况

Modules
import random
import numpy as npfrom deap import base
from deap import creator
from deap import tools
from deap import algorithms
Creator
# 创建FitnessMax类, 继承base.Fitness, attribute为weights
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
# Individual, 继承list, attribute为fitness
creator.create("Individual", list, fitness=creator.FitnessMax) # 定义个体类型
Toolbox

我们将使用的所有对象: 个体、种群以及所有函数、运算符和参数都将存储在一个名为“Toolbox”的DEAP container中。它包含两种添加和删除内容的方法: register()和unregister()

toolbox = base.Toolbox()
# attr_bool是函数random.randint(0,1)的别名
# 定义基因
toolbox.register("attr_bool", random.randint, 0, 1)# individual是函数tools.initRepeat(creator.Individual, toolbox.attr_bool, 100)的别名
# tools.initRepeat(container, func, n)由func中的数据填充的容器实例
# container – 用于放入func生成的数据的类型
# func – 将被调用n次以填充container的函数
# n – 重复func的次数# 创建个体,编码长度为100
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, 100)
# 创建种群
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
Evaluation Function
# 返回值的长度必须等于目标数(权重个数)。
def evalOneMax(individual):# 返回的是个元祖,注意,return sum(individual),
Genetic Operators
toolbox.register("evaluate", evalOneMax)
# 两点交叉,编码串中随机设置两段交叉点进行基因交换
toolbox.register("mate", tools.cxTwoPoint)
# 变异,用于bool值(二进制类型)的变异,indpb为变异概率
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
# 选择,先随机选择tournsize个个体,然后根据个体的fitness,选择最佳个体,重复k次
toolbox.register("select", tools.selTournament, tournsize=3)
Main
def main():# 创建300个大小的种群,300*100(个体编码长度)pop = toolbox.population(n=300)# CXPB: 两个个体之间交叉的概率# MUTPB: 个体的变异概率CXPB, MUTPB = 0.5, 0.2print("Start of evolution")# 评价整个种群fitnesses = list(map(toolbox.evaluate, pop))for ind, fit in zip(pop, fitnesses):ind.fitness.values = fit# 获取整个种群的适应度fits = [ind.fitness.values[0] for ind in pop]# 当前种群的代数g = 0# 开始进化while max(fits) < 100 and g < 1000:# 下一代g += 1print("-- Generation %i --" % g)# 下一代种群选择offspring = toolbox.select(pop, len(pop))# 克隆选择的种群,确保每个个体为独立的实例,而不是引用offspring = list(map(toolbox.clone, offspring))# 交叉,inplace修改for child1, child2 in zip(offspring[::2], offspring[1::2]):if random.random() < CXPB:toolbox.mate(child1, child2)del child1.fitness.valuesdel child2.fitness.values# 变异,inplace修改for mutant in offspring:if random.random() < MUTPB:toolbox.mutate(mutant)del mutant.fitness.values# 对新的子代进行评估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# 下一代替代父代pop[:] = offspring# 种群适应度fits = [ind.fitness.values[0] for ind in pop]length = len(pop)mean = sum(fits) / lengthsum2 = sum(x*x for x in fits)std = abs(sum2 / length - mean**2)**0.5# 输出当前种群状态print("  Min %s" % min(fits))print("  Max %s" % max(fits))print("  Avg %s" % mean)print("  Std %s" % std)main()
简单进化算法

DEAP中预置的简单进化算法deap.algorithms.eaSimple流程描述如下:

  1. 根据工具箱中注册的toolbox.evaluate评价族群
  2. 根据工具箱中注册的toolbox.select选择与父代相同个数的育种个体
  3. 在族群中进行第一次循环,用工具箱中注册的toolbox.mate进行配种,并用生成的两个子代替换对应父代
  4. 在族群中进行第二次循环,用工具箱中注册的toolbox.mutate进行变异,用变异后的子代替换对应父代
  5. 从1开始重复循环,直到达到设定的迭代次数

需要注意的是在这个过程中,生成子代有四种情况:受到配种影响;受到变异影响;既受到配种也受到变异影响;既不受配种影响也不受变异影响。

对应的伪代码可以表述为:

evaluate(population)
for g in range(ngen):population = select(population, len(population))offspring = varAnd(population, toolbox, cxpb, mutpb)evaluate(offspring)population = offspring

1.2 One Max Problem: Short Version

def main():pop = toolbox.population(n=300)# 用于trace最佳样本hof = tools.HallOfFame(1)# 对每次迭代时进行种群效果计算stats = tools.Statistics(lambda ind: ind.fitness.values)stats.register("avg", numpy.mean)stats.register("std", numpy.std)stats.register("min", numpy.min)stats.register("max", numpy.max)# 简单进化算法, ngen代数pop, log = algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=40, stats=stats, halloffame=hof, verbose=True)return pop, logpop, log, hof = main()

1.3 One Max Problem: Numpy Version

'''第一处修改'''
creator.create("Individual", np.ndarray, fitness=creator.FitnessMax) # 定义个体类型# 自定义numpy情况下的基因交叉操作
def cxTwoPointCopy(ind1, ind2):"""Execute a two points crossover with copy on the input individuals. Thecopy is required because the slicing in numpy returns a view of the data,which leads to a self overwritting in the swap operation. It prevents::>>> import numpy>>> a = numpy.array((1,2,3,4))>>> b = numpy.array((5,6,7,8))>>> a[1:3], b[1:3] = b[1:3], a[1:3]>>> print(a)[1 6 7 4]>>> print(b)[5 6 7 8]"""size = len(ind1)cxpoint1 = random.randint(1, size)cxpoint2 = random.randint(1, size - 1)if cxpoint2 >= cxpoint1:cxpoint2 += 1else: # Swap the two cx pointscxpoint1, cxpoint2 = cxpoint2, cxpoint1# 注意copy操作ind1[cxpoint1:cxpoint2], ind2[cxpoint1:cxpoint2] \= ind2[cxpoint1:cxpoint2].copy(), ind1[cxpoint1:cxpoint2].copy()return ind1, ind2'''第二处修改'''
toolbox.register("mate", cxTwoPointCopy)def main():'''第三处修改,增加similar的定义'''hof = tools.HallOfFame(1, similar=numpy.array_equal)

2. Knapsack Problem - 背包问题

Modules
import random
import numpy as npfrom deap import base
from deap import creator
from deap import tools
from deap import algorithms
Init
IND_INIT_SIZE = 5  # 初始化物品数
MAX_ITEM = 50  # 最大可选物品数
MAX_WEIGHT = 50  # 最大背包承重
NBR_ITEMS = 20  # 物品数# 保证可复现性
random.seed(64)# 创建随机项字典,用来表示NBR_ITEMS个物品的重量及价值
items = {}
for i in range(NBR_ITEMS):items[i] = (random.randint(1, 10), random.uniform(0, 100))
Creator
# 物品重量最小化, 物品价值最大化, 多目标优化问题 — 物品重量尽可能小,价值尽可能大
creator.create("Fitness", base.Fitness, weights=(-1.0, 1.0))
# 继承自set,保证每个物品只取一次
creator.create("Individual", set, fitness=creator.Fitness)
Toolbox
toolbox = base.Toolbox()
# 基因取值-[0,NBR_ITEMS)表示各个物品的index
toolbox.register("attr_item", random.randrange, NBR_ITEMS)# 个体, 基因长度IND_INIT_SIZE, 代表选IND_INIT_SIZE个物品
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_item, IND_INIT_SIZE)
# 种群
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
Evaluation Function

返回weight, value代表两个目标的当前适应度值

def evalKnapsack(individual):weight = 0.0value = 0.0for item in individual:weight += items[item][0]value += items[item][1]if len(individual) > MAX_ITEM or weight > MAX_WEIGHT:return 10000, 0             # 行李超重return weight, value
Genetic Operators
def cxSet(ind1, ind2):"""两个set的交叉方法"""temp = set(ind1)                # Used in order to keep typeind1 &= ind2                    # 求 交集ind2 ^= temp                    # 求 并集-交集return ind1, ind2def mutSet(individual):"""变异情况为增加或减少物品数"""if random.random() < 0.5:if len(individual) > 0:     # We cannot pop from an empty set# set不支持index操作,因此不能随机选择,要进行类型转换individual.remove(random.choice(sorted(tuple(individual))))else:individual.add(random.randrange(NBR_ITEMS))return individual,toolbox.register("evaluate", evalKnapsack)
toolbox.register("mate", cxSet)
toolbox.register("mutate", mutSet)
# 这是一个多目标问题,采用NSGA-II选择方案,在多目标情况下选择合适较优的种群
toolbox.register("select", tools.selNSGA2)
Main
def main():random.seed(64)NGEN = 50  # 进化代数MU = 50  # 种群数,每次保留的种群数LAMBDA = 100 # 每一代生成的子代数CXPB = 0.7  # 交叉率MUTPB = 0.2  # 变异率pop = toolbox.population(n=MU)hof = tools.ParetoFront()stats = tools.Statistics(lambda ind: ind.fitness.values)stats.register("avg", np.mean, axis=0)stats.register("std", np.std, axis=0)stats.register("min", np.min, axis=0)stats.register("max", np.max, axis=0)# 每次生成100子代,在父代+子代中选择MU个作为子代# mu+lambda进化算法,该算法中子代不会同时受到变异和配种影响algorithms.eaMuPlusLambda(pop, toolbox, MU, LAMBDA, CXPB, MUTPB, NGEN, stats,halloffame=hof)# pop, log = algorithms.eaSimple(pop, toolbox, cxpb=CXPB, mutpb=MUTPB, ngen=NGEN, #                                stats=stats, halloffame=hof, verbose=True)return pop, stats, hofpop, stats, hof = main()
(μ+λ)(\mu+\lambda)(μ+λ) 进化算法

Deap中的 (μ+λ)(\mu+\lambda)(μ+λ) 进化算法deap.algorithms.eaMuPlusLambda

该算法的流程如下:

  1. 根据工具箱中注册的toolbox.evaluate评价族群
  2. 在族群中进行循环,在每次循环中,随机选择crossover,mutation和reproduction三者之一:如果选择到crossover,那么随机选择2个个体,用工具箱中注册的toolbox.mate进行配种,将生成的第一个子代加入到后代列表中,第二个子代丢弃;如果选择到mutation,用工具箱中注册的toolbox.mutate进行变异,将变异后的子代加入到后代列表中;如果选择到reproduction,随机选择一个个体,将其复制加入到后代列表中
  3. 根据工具箱中注册的toolbox.select,在父代+子代中选择给定数量的个体作为子代
  4. 从1开始重复循环,直到达到设定的迭代次数

注意在这个子代生成的过程中,子代不会同时受到变异和配种影响

对应的伪代码可以表述为:

evaluate(population)
for g in range(ngen):offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)evaluate(offspring)population = select(population + offspring, mu)
(μ,λ)(\mu,\lambda)(μ,λ) 进化算法

Deap中的 (μ,λ)(\mu,\lambda)(μ,λ) 进化算法deap.algorithms.eaMuCommaLambda

该算法的流程和(μ+λ)(\mu+\lambda)(μ+λ)基本相同,唯一的区别在于生成子代族群时,只在产生的子代中选择,而丢弃所有父代。

对应的伪代码可以表述为

evaluate(population)
for g in range(ngen):offspring = varOr(population, toolbox, lambda_, cxpb, mutpb)evaluate(offspring)population = select(offspring, mu)

Deap框架—结合demo进行学习相关推荐

  1. python 的 DEAP框架学习

    学习DEAP框架,找到如下资源: 1.github源码:https://github.com/deap/deap 2.deap文档:http://deap.gel.ulaval.ca/doc/dev/ ...

  2. 遗传编程(Genetic Programming)学习笔记(三):利用DEAP框架创建一个GP表达式

    DEAP框架   Python 的 DEAP库是一个进化算法框架,可以帮助我们快速实现各种进化算法,例如遗传算法(GA).粒子群算法(PSO).遗传编程(GP).分布估计算法(EDA).多目标优化算法 ...

  3. 【遗传规划/计算智能】 彻底学会 DEAP 框架,从零搭建 GP

    1. 应用方向 DEAP是一个新颖的进化计算框架,用于快速原型设计和测试.它旨在使算法清楚和数据结构透明. 它可以在并行机制之间完美协调,例如多处理和SCOOP(简单并发性面向对象程序设计). DEA ...

  4. DL框架:主流深度学习框架(TensorFlow/Pytorch/Caffe/Keras/CNTK/MXNet/Theano/PaddlePaddle)简介、多个方向比较、案例应用之详细攻略

    DL框架:主流深度学习框架(TensorFlow/Pytorch/Caffe/Keras/CNTK/MXNet/Theano/PaddlePaddle)简介.多个方向比较.案例应用之详细攻略 目录 深 ...

  5. 基于asp.net + easyui框架,一步步学习easyui-datagrid——界面(一)

    从这篇博客,我会一步步的为大家讲解,easyui框架中最常用的一个控件datagrid.在使用easyui框架时,datagrid是使用最多的控件,它不仅好用,关键是实用. 我为大家建立一个博客更新的 ...

  6. 从 Demo 中学习 Solidity

    从 Demo 中学习 Solidity [注解译文] 前 (全文参考) Solidity官方文档 以太坊白皮书_ZH 以太坊白皮书_EN 发现网上的资料太过琐碎, 惊奇的发现官方有详细的教程, 和例子 ...

  7. python return用法_遗传算法(Python) #4 DEAP框架入门

    1. DEAP框架简介 DEAP(Distributed Evolutionary Algorithms in Python)是一个热门的Python进化算法框架,我们可以用这个框架在Python内实 ...

  8. Quartz框架调用Demo

    Quartz框架调用Demo 任务调度在JAVA应用程序中运用的十分普遍,掌握QUARTZ是必备的技能; 官网:http://www.quartz-scheduler.org/ 下载最新1.80资源包 ...

  9. android开发banner框架,Android 轮播图 最火的banner框架 (包含demo和代码解释)

    在android里,轮播图的实现可以使用viewpage的控件实现,但由于实现有点繁琐,可以使用banner框架,方便快捷的实现轮播图的效果.这里首先贴上github的banner框架地址:https ...

  10. Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习

    Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习 目录 Python 基础 之 jupyter notebook 中机器学习的简单入门书写 ...

最新文章

  1. Existing Linux Wireless drivers
  2. TListBox的项目个数
  3. Linux-kernel 网桥代码分析(一)
  4. fastjson取某个key_JAVA学习:怎么给函数取一个“合理”的名字
  5. 笔记本电脑配置知识大全
  6. weblogic部署war
  7. 数学建模:Malthus人口模型
  8. RL78开发问题记录
  9. Java宠物商店源代码
  10. 进击的“懒人经济”,快手又迎来一个万亿蓝海市场
  11. 启动tomcat报错:Destroying ProtocolHandler [ajp-nio-8009]
  12. 微信获取临时素材接口
  13. 城市空中交通和无人系统的空中交通管制评估
  14. centos抓包使用
  15. 学习笔记 | 面对海量数据,为什么无法设计出完美的分布式缓存体系?
  16. 如何刻录服务器安装系统光盘启动,刻盘之刻录系统安装光盘和启动光盘的注意事项小结...
  17. 提升物业服务品质,提高业主满意度:物业客户服务管理解决方案设计
  18. Java 设计模式之Builder模式
  19. java swing界面美化_java Swing界面优化Jpanel教程
  20. BinaryEditor:用ListView实现编辑二进制文件

热门文章

  1. Win32/Conficker 蠕虫的病毒警报
  2. 2019新零售商家和企业,如何构建私域流量的思维和方法分享[附案例]
  3. 国内外云服务器运维面板有哪些?运维面板全面汇总
  4. k3note Android8,价格只差100 乐檬K3 Note对比红米Note
  5. android httpclient post 参数,Android HttpClient GET或者POST请求基本使用方法
  6. android httpclient 设置超时
  7. 企业信息安全管理制度
  8. foxmail删除服务器文件,无法真正删除?Foxmail文件中转站BUG
  9. md5 java_JAVA使用MD5加密解密
  10. 使用python将豆瓣妹子的图片批量搬运到百度网盘