机器学习人工智能【免费下载链接】deapDistributed Evolutionary Algorithms in Python项目地址https://gitcode.com/gh_mirrors/de/deap点击查看免费下载导读本文围绕 DEAP 官方示例 examples/ga/onemax_short.py 展开讲解如何借助deap.algorithms模块内置的eaSimple函数把完整手写的遗传算法主循环压缩成一次函数调用。你会学到如何复用deap.tools中的评估、交叉、变异、选择算子并注册进Toolbox如何用HallOfFame保住历史最优个体、用StatisticsLogbook自动记录每一代的统计数据以及verbose参数如何控制演化过程的可视化输出。读完本文你可以把同样的套路直接迁移到 DEAP 的其他进化算法示例中。本示例是 DEAP 文档中完整版 One Max 教程doc/examples/ga_onemax.rst的“短版”核心差异只有一个不再手写选择—交叉—变异—评估—替换的主循环而是把工具箱交给eaSimple代为执行。One Max 短版与完整版的本质区别完整版示例 examples/ga/onemax.py 用while max(fits) 100 and g 1000手写了每一代的循环选择、克隆、按CXPB/MUTPB概率交叉与变异、失效个体重评估、整代替换、手工计算 min/max/avg/std。而短版示例把这一切交给deap.algorithms模块中实现的基础进化算法代码量大幅缩减逻辑也更不易出错。两者在个体表示、适应度、工具箱注册上几乎完全一致唯一的差别集中在两个地方导入短版额外引入了algorithms模块和numpy用于统计函数演化驱动短版不再自己写循环而是调用algorithms.eaSimple(...)。文档 doc/examples/ga_onemax_short.rst 明确指出短版示例与完整版非常相似唯一区别就是使用了deap.algorithms模块中实现的一些基础进化算法。额外的导入与初始化短版示例在导入阶段引入了完整版没有的依赖对应 examples/ga/onemax_short.pyimport array import random import numpy from deap import algorithms from deap import base from deap import creator from deap import toolsdeap.algorithms提供eaSimple等现成的进化算法骨架numpy作为统计函数numpy.mean、numpy.std等的提供者array个体容器类型这里用typecodeb表示有符号字节数组比 Python 内置list更省内存。随后的个体与适应度定义也和完整版一脉相承examples/ga/onemax_short.pycreator.create(FitnessMax, base.Fitness, weights(1.0,)) creator.create(Individual, array.array, typecodeb, fitnesscreator.FitnessMax) toolbox base.Toolbox() # Attribute generator toolbox.register(attr_bool, random.randint, 0, 1) # Structure initializers toolbox.register(individual, tools.initRepeat, creator.Individual, toolbox.attr_bool, 100) toolbox.register(population, tools.initRepeat, list, toolbox.individual)weights(1.0,)单目标最大化attr_bool从{0, 1}中均匀采样作为基因individual通过tools.initRepeat生成包含 100 个 0/1 基因的个体population个体列表构成种群n参数在使用时再传入。注册算法需要的四个算子要用deap.algorithms里的进化函数必须在工具箱中注册四个关键别名examples/ga/onemax_short.pydef evalOneMax(individual): return sum(individual), toolbox.register(evaluate, evalOneMax) toolbox.register(mate, tools.cxTwoPoint) toolbox.register(mutate, tools.mutFlipBit, indpb0.05) toolbox.register(select, tools.selTournament, tournsize3)evaluate目标函数evalOneMax统计个体中 1 的个数并返回元组。DEAP 要求评估结果是与权重数量等长的可迭代对象返回sum(individual),末尾的逗号保证了这一点。理论上当个体全为 1 时适应度为 100即该问题的全局最优。mate两点交叉tools.cxTwoPoint在两个个体上随机选择两个切点交换中间片段并原地修改两个个体deap/tools/crossover.py。从源码看它先随机生成cxpoint1、cxpoint2两个切点再执行ind1[cxpoint1:cxpoint2], ind2[cxpoint1:cxpoint2] ind2[cxpoint1:cxpoint2], ind1[cxpoint1:cxpoint2]完成片段交换两个个体长度保持不变。mutate位翻转变异tools.mutFlipBit以indpb为每个基因独立的翻转概率把 0 变成 1、1 变成 0deap/tools/mutation.py。源码中的实现是for i in range(len(individual)): if random.random() indpb: individual[i] type(individual[i])(not individual[i])这里indpb0.05意味着每个基因平均有 5% 的概率被翻转。由于示例个体是array.array字节数组type(individual[i])(not individual[i])会借助原类型构造出翻转后的字节值。select锦标赛选择tools.selTournament进行k次独立锦标赛每次从种群中随机抽出tournsize个候选者取其中适应度最优者入选deap/tools/selection.py。tournsize3即“三选一”。eaSimple的伪代码要求选择过程是随机化的——因为每一代都是整代替换selTournament允许同一个体被多次选中这正符合要求而确定性选择函数如selBest在 1:1 替换下会导致完全没有选择压力。用 HallOfFame 与 Statistics 记录演化过程在main()中短版示例用两个 DEAP 工具对象来观察演化examples/ga/onemax_short.pydef main(): random.seed(64) pop toolbox.population(n300) 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) pop, log algorithms.eaSimple(pop, toolbox, cxpb0.5, mutpb0.2, ngen40, statsstats, halloffamehof, verboseTrue) return pop, log, hofHallOfFame保存历史最优个体tools.HallOfFame(1)只保留演化史上出现过的最优个体deap/tools/support.py。文档特别强调它即使在最优个体灭绝的情况下也能继续保留它。从源码看HallOfFame.update(population)会把种群中优于当前最差成员的个体插入并在容量满时淘汰最差者插入时用deepcopy复制个体保证名人堂中的个体与种群中的对象相互独立。maxsize1时hof[0]就是整个演化过程中的全局最优解。Statistics每代统计量tools.Statistics(lambda ind: ind.fitness.values)指定了统计数据的提取键即每个个体的适应度值随后通过stats.register注册四个聚合函数avg、std、min、max。从 deap/tools/support.py 的源码实现可以看到compile(data)会先对种群应用 key 提取数据再对每个注册函数计算并打包成字典。由于注册的是numpy函数它们天然支持对适应度元组这类多维数据的计算。Logbook演化日志eaSimple会内部创建tools.Logbook同样定义在 deap/tools/support.py其表头为[gen, nevals] stats.fields即每一代包含代数编号、本代评估的个体数、以及你注册的全部统计量。最终eaSimple返回(population, logbook)你可以用log.select(gen, avg, max)提取演化曲线数据用于绘图或存档。eaSimple 内部到底做了什么deap.algorithms模块的文档注释deap/algorithms.py说明该模块旨在提供一些常见的进化算法以便直接执行方法更多是“便利性”而非“参考实现”因为进化算法的实现方式千差万别且绝大多数算法都使用注册在工具箱中的算子。其通用的关键字约定为mate交叉、mutate变异、select选择、evaluate评估。eaSimple的核心流程在 deap/algorithms.py 中伪代码为evaluate(population) for g in range(ngen): population select(population, len(population)) offspring varAnd(population, toolbox, cxpb, mutpb) evaluate(offspring) population offspring对应的实际调用链是评估种群中所有适应度无效的个体并把它们记入第 0 代日志若传入了halloffame先对其更新一次进入ngen代循环先用toolbox.select(population, len(population))整代选择再调用varAnd完成变异阶段重新评估变异后适应度失效的个体仅评估not ind.fitness.valid的子集节省计算量更新名人堂用population[:] offspring原地整代替换每代将统计结果写入Logbook若verbose为真则打印当前行的日志。varAnd变异阶段的实现varAnddeap/algorithms.py负责“交叉和变异”这一阶段其命名即来源于此。它的执行细节先用toolbox.clone克隆整个亲代种群保证返回的子代与输入种群互不依赖第一轮循环对相邻个体对按概率cxpb执行toolbox.mate交叉后立刻del掉两个子代的适应度使其失效第二轮循环对每个个体按概率mutpb执行toolbox.mutate同样失效其适应度。因此一个子代可能来自仅交叉、仅变异、交叉加变异、或原样繁殖具体取决于随机数与概率的比较。两个概率都应落在[0, 1]区间内。参数速查表eaSimple(population, toolbox, cxpb, mutpb, ngen, statsNone, halloffameNone, verbose__debug__)的完整参数含义如下参数示例值含义populationpop初始种群list或支持[:]赋值的容器toolboxtoolbox注册了mate/mutate/select/evaluate的 deap/base.py 工具箱cxpb0.5两个个体发生交叉的概率mutpb0.2个体发生变异的概率ngen40演化代数statsstatstools.Statistics对象逐代更新可选halloffamehoftools.HallOfFame对象保存历史最优可选verboseTrue是否逐代打印日志默认等价于__debug__即 Python 非优化模式为真需要特别说明的是verbose默认值是__debug__当以python onemax_short.py正常运行时为True而以python -O优化模式运行时会自动变为False相当于“调试模式下默认打印”。这与 deap/algorithms.py 中的函数签名一致。运行方式与输出解读在仓库根目录执行python examples/ga/onemax_short.py由于main()设置了random.seed(64)每次运行结果可复现。程序会打印类似下面的逐代日志verboseTruegen nevals avg std min max 0 300 49.673 5.09617 34 66 1 181 55.94 6.17816 40 74 ... 40 105 97.73 1.36588 94 100gen代数从 0 开始nevals本代实际评估的个体数。第 0 代为 300整个初始种群之后每代只评估交叉/变异后适应度失效的个体因此远小于 300avg/std/min/max由stats中注册的四个 numpy 函数算出。最终max达到 100说明种群中出现了全 1 的最优个体One Max 问题得到解决hof[0]中即保存着这个全局最优解。若想关闭逐行日志把verboseTrue改为verboseFalse即可log对象仍然完整记录所有数据供事后分析。延伸把短版模式套用到其他算法deap.algorithms模块还提供了其他常用算法骨架调用方式与eaSimple完全一致都接受stats、halloffame、verbose参数eaMuPlusLambda(μ λ)进化策略后代由varOr生成选择在亲代子代并集上进行eaMuCommaLambda(μ, λ)进化策略选择仅在子代中进行要求lambda_ mueaGenerateUpdateask-tell 模型适用于 CMA-ES 等基于分布模型的算法varAnd/varOr仅执行变异阶段的低层函数供自定义算法时复用。完整实现与注释都在 deap/algorithms.py 中。文档 doc/examples/ga_onemax_short.rst 的结尾指出deap.algorithms中的每个算法都能处理HallOfFame与Statistics这类对象而verbose关键字则决定算法是否在每一代之后输出结果。理解了 One Max 短版示例你就掌握了 DEAP 中“注册算子 调用现成算法”这一最常用的开发模式可以直接套用到 examples/ga/nsga2.py、examples/ga/nsga3.py、examples/es/onefifth.py 等各类示例中。赞分享机器学习人工智能【免费下载链接】deapDistributed Evolutionary Algorithms in Python项目地址https://gitcode.com/gh_mirrors/de/deap点击查看免费下载相关推荐QQ空间备份怎么免费做说说、相册、日志一次导出的完整教程QQ空间备份怎么免费做说说、相册、日志一次导出的完整教程 QQ空间导出助手QZoneExport是一个免费的浏览器扩展能把你空间里的说说、日志、私密日记机器学习人工智能FreeCAD装配约束系统架构揭秘从自由度约束到运动学求解的完整技术栈FreeCAD装配约束系统架构揭秘从自由度约束到运动学求解的完整技术栈 FreeCAD作为一款开源参数化3D建模软件其装配模块提供了从基础零件配合到复杂机械桌面应用3D建模图形学工业制造10分钟入门DEAP用遗传算法解决旅行商问题(TSP)的完整指南10分钟入门DEAP用遗传算法解决旅行商问题 TSP 的完整指南 DEAPDistributed Evolutionary Algorithms in Py机器学习人工智能上一篇CANN/ops-nn KL散度目标损失梯度算子下一篇Rufus XZ流处理数据流管理深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考