DEAP框架入门:自定义遗传算法个体与种群类型详解

DEAP框架入门:自定义遗传算法个体与种群类型详解

deap Distributed Evolutionary Algorithms in Python deap 项目地址: https://gitcode.com/gh_mirrors/de/deap

前言

在遗传算法和进化计算领域,DEAP框架因其灵活性和强大功能而广受欢迎。本文将深入讲解如何在DEAP中创建和初始化各种类型的个体(Individual)和种群(Population),这是使用DEAP进行进化计算的基础。

适应度(Fitness)的创建

在DEAP中,适应度是一个核心概念。框架提供了基础的Fitness类,但这是一个抽象类,需要添加weights属性才能使用。

单目标适应度

from deap import creator
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))

这里创建了一个名为FitnessMin的单目标最小化适应度。权重为负表示最小化问题,正数则表示最大化问题。

多目标适应度

creator.create("FitnessMulti", base.Fitness, weights=(-1.0, 1.0))

这个例子创建了一个双目标适应度:第一个目标最小化,第二个目标最大化。权重的绝对值大小还可以表示不同目标的重要性程度。

个体(Individual)的创建

DEAP支持创建各种类型的个体,下面介绍几种常见形式。

浮点数列表个体

import random
from deap import creator, tools

creator.create("Individual", list, fitness=creator.FitnessMin)

IND_SIZE = 10
toolbox = base.Toolbox()
toolbox.register("attr_float", random.random)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=IND_SIZE)

这种个体是一个包含浮点数的列表,常用于遗传算法(GA)。initRepeat函数会重复调用attr_float函数IND_SIZE次来填充列表。

排列(Permutation)个体

creator.create("Individual", list, fitness=creator.FitnessMin)

toolbox.register("indices", random.sample, range(IND_SIZE), IND_SIZE)
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.indices)

排列个体适用于旅行商问题(TSP)等需要排列表示的优化问题。这里使用initIterate函数和random.sample来生成排列。

算术表达式个体

from deap import gp

pset = gp.PrimitiveSet("MAIN", arity=1)
pset.addPrimitive(operator.add, 2)
pset.addPrimitive(operator.sub, 2)
pset.addPrimitive(operator.mul, 2)

creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMin, pset=pset)
toolbox.register("individual", tools.initIterate, creator.Individual, gp.genHalfAndHalf, pset=pset, min_=1, max_=2)

这种个体用于遗传编程(GP),表示数学表达式树。PrimitiveSet定义了可用的运算符。

进化策略(ES)个体

creator.create("Strategy", array.array, typecode="d")
creator.create("Individual", array.array, fitness=creator.FitnessMin, strategy=creator.Strategy)

def initES(icls, scls, size, imin, imax, smin, smax):
    ind = icls(random.uniform(imin, imax) for _ in range(size))
    ind.strategy = scls(random.uniform(smin, smax) for _ in range(size))
    return ind

toolbox.register("individual", initES, creator.Individual, creator.Strategy, IND_SIZE, 0, 1, -1, 1)

进化策略个体包含解向量和策略向量两部分,需要自定义初始化函数。

粒子(Particle)个体

creator.create("Particle", list, fitness=creator.FitnessMax, speed=None, 
               smin=None, smax=None, best=None)

def initParticle(pcls, size, pmin, pmax, smin, smax):
    part = pcls(random.uniform(pmin, pmax) for _ in range(size))
    part.speed = [random.uniform(smin, smax) for _ in range(size)]
    part.smin = smin
    part.smax = smax
    return part

toolbox.register("particle", initParticle, creator.Particle, size=IND_SIZE, 
                 pmin=-6, pmax=6, smin=-3, smax=3)

粒子个体用于粒子群优化(PSO),包含位置、速度和历史最佳位置等信息。

种群(Population)的创建

袋(Bag)种群

toolbox.register("population", tools.initRepeat, list, toolbox.individual)
pop = toolbox.population(n=100)

这是最常见的种群类型,本质上是一个个体列表。

网格(Grid)种群

toolbox.register("row", tools.initRepeat, list, toolbox.individual, n=10)
toolbox.register("population", tools.initRepeat, list, toolbox.row, n=10)

网格种群是结构化种群,个体通过二维索引访问,如pop[r][c]

群(Swarm)种群

creator.create("Swarm", list, gbest=None, gbestfit=creator.FitnessMax)
toolbox.register("swarm", tools.initRepeat, creator.Swarm, toolbox.particle)

群种群用于粒子群优化,包含全局最佳位置gbest和全局最佳适应度gbestfit

种子种群

def initIndividual(icls, content):
    return icls(content)

toolbox.register("individual_guess", initIndividual, creator.Individual)
toolbox.register("population_guess", tools.initPopulation, toolbox.individual_guess, "my_guess.json")

可以从文件加载初始种群,这在有先验知识时很有用。

总结

DEAP框架通过creatortoolbox提供了极大的灵活性来定义各种进化计算所需的个体和种群类型。理解这些基础概念是使用DEAP进行更复杂进化计算的关键第一步。在实际应用中,可以根据具体问题选择合适的个体表示形式和种群结构。

deap Distributed Evolutionary Algorithms in Python deap 项目地址: https://gitcode.com/gh_mirrors/de/deap

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常樱沙Vigour

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值