DEAP框架入门:自定义遗传算法个体与种群类型详解
deap Distributed Evolutionary Algorithms in Python 项目地址: 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框架通过creator
和toolbox
提供了极大的灵活性来定义各种进化计算所需的个体和种群类型。理解这些基础概念是使用DEAP进行更复杂进化计算的关键第一步。在实际应用中,可以根据具体问题选择合适的个体表示形式和种群结构。
deap Distributed Evolutionary Algorithms in Python 项目地址: https://gitcode.com/gh_mirrors/de/deap
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考