看了很多,发现这个遗传算法,进化算法是一个非常有用的一个方法。而且可解释性远远强于神经网络。之前写了一篇博文,专门讲解基于DEAP库的python编程,来编写遗传算法,但是那一篇主要偏重代码,出于想要深入理解代码的含义,因此专门记下这篇博文,既是笔记,也是分享。
所有的用python实现的代码,请看这个博文:
GEAP 遗传算法/遗传编程 genetic programming + python(deap库)实现
如果需要还有这两个:
遗传算法GA和遗传编程GP有什么不同?
粒子群算法PSO 和 遗传算法GA 的相同点和不同点
“物竞天择,优胜劣汰”, 达尔文提出了著名的生物进化理论,即所有的动植物都是由较早期、较原始的形式演变而来的。而遗传编程(遗传规划)则在数学和计算机科学领域应用了这一演化过程:从基数较为庞大的原始、粗糙的程序种群中通过评估适应性选择父系、进行遗传操作生成新一代种群,再判断终止条件决定是否再次迭代、生成下一代种群。类比如下:
讲到这里可否理解了,进化算法的本质就是模拟优胜劣汰,下面进入正题
整个包含以下几个方面!一定要看一下
咱们看个流程图理解理解:
这个不再理解范围内,但是,如果要用python编程进化算法的话,就需要先设置这个问题。
有单优化问题:creator.create(‘FitnessMin‘, base.Fitness, weights=(-1.0, ))
和多优化问题:creator.create(‘FitnessMulti‘, base.Fitness, weights=(-1.0, 1.0))
toolbox.register(‘population‘, tools.initRepeat, list, toolbox.individual)
toolbox.register("deme", tools.initRepeat, list, toolbox.individual)
DEME_SIZES = 10, 50, 100
population = [toolbox.deme(n=i) for i in DEME_SIZES]
creator.create("Swarm", list, gbest=None, gbestfit=creator.FitnessMax)
toolbox.register("swarm", tools.initRepeat, creator.Swarm, toolbox.particle)
评价部分是根据任务的特性高度定制的,DEAP库中并没有预置的评价函数模版。
这里给一个例子
from deap import base, creator, tools
import numpy as np
# 定义问题
creator.create(‘FitnessMin‘, base.Fitness, weights=(-1.0,)) #优化目标:单变量,求最小值
creator.create(‘Individual‘, list, fitness = creator.FitnessMin) #创建Individual类,继承list
# 生成个体
IND_SIZE = 5
toolbox = base.Toolbox()
toolbox.register(‘Attr_float‘, np.random.rand)
toolbox.register(‘Individual‘, tools.initRepeat, creator.Individual, toolbox.Attr_float, n=IND_SIZE)
# 生成初始族群
N_POP = 10
toolbox.register(‘Population‘, tools.initRepeat, list, toolbox.Individual)
pop = toolbox.Population(n = N_POP)
# 定义评价函数
def evaluate(individual):
return sum(individual), #注意这个逗号,即使是单变量优化问题,也需要返回tuple
# 评价初始族群
toolbox.register(‘Evaluate‘, evaluate)
fitnesses = map(toolbox.Evaluate, pop)
for ind, fit in zip(pop, fitnesses):
ind.fitness.values = fit
print(ind.fitness.values)
# 结果:
# (2.593989197511478,)
# (1.1287944225903104,)
# (2.6030877077096717,)
# (3.304964061515382,)
# (2.534627558467466,)
# (2.4697149450205536,)
# (2.344837782191844,)
# (1.8959030773060852,)
# (2.5192475334239,)
# (3.5069764929866585,)
deap.tools.selTournament(individuals, k, tournsize, fit_attr = ‘fitness‘)
锦标赛选择顾名思义,就是模拟锦标赛的方式,首先在族群中随机抽取tournsize个个体,然后从中选取具有最佳适应度的个体,将此过程重复k次,获得育种族群。tournsize越大,选择强度(selection intensity)越高,在选择之后留下的育种族群的平均适应度也就越高。比较常用的tournsize是2。
假设tournsize是2,就是在原来的种群中取出来2个,然后再这两个中选一个最适应的,然后重复k次,我们就可以得到k个最适应的,这个就是育种族群,用来后面生孩子重组基因的;
如图,假设这个族群有5个人,tournsize为3,就是选出来3个人,然后在3个人中选取一个最好的
锦标赛选择相比于轮盘赌选择,通常能够有更快的收敛速度,在实际场景中应用较多。
deap.tools.selRoulette(individuals, k, fit_attr = ‘fitness‘)
在轮盘赌选择中,每个个体a被选中的概率P(a)与他的评价函数f(a)成正比
但是如果评价函数出现负数,就不适用
并且很多文章指出来,轮盘赌选择的效果并不好
deap.tools.selStochasticUniversalSampling(individuals, k, fit_attr = ‘fitness‘)
随机普遍抽样选择是一种有多个指针的轮盘赌选择,其优点是能够保存族群多样性,而不会像轮盘赌一样,有较大几率对重复选择最优个体。
在与前文相同的例子中使用随机普遍抽样选择,设定指针数k为3,那么指针间距即为,如下图所示:
就是我一选就选3个个体,一选选3个,保证了多样性
deap.tools.cxOnePoint(ind1, ind2)
deap.tools.cxTwoPoint(ind1, ind2)
deap.tools.cxUniform(ind1, ind2, indpb)
deap.tools.cxPartialyMatched(ind1, ind2)
tools.mutGaussian(individual, mu, sigma, indpb)
tools.mutShuffleIndexes(individual, indpb)
tools.mutFlipBit(individual, indpb)
对个体中的每一个基因按给定对变异概率取非。
tools.mutUniformInt(individual, low, up, indpb)
对序列中的每一位按概率变异,变异后的值为[low, up]中按均匀分布随机选取的一个整数。
GEAP 遗传算法/遗传编程 genetic programming + python(deap库)实现
泛用性强,对连续变量和离散变量都能适用;
不需要导数信息,因此不要求适应度函数的连续和可微性质(或者说不需要问题内在机理的相关信息);
可以在解空间内大范围并行搜索;
不容易陷入局部最优;
高度并行化,并且容易与其他优化方法整合。
对于凸优化问题,相对基于梯度的优化方法(例如梯度下降法,牛顿/拟牛顿法)收敛速度更慢;
进化算法需要在搜索空间投放大量个体来搜索最优解。对于高维问题,由于搜索空间随维度指数级膨胀,需要投放的个体数也大幅增长,会导致收敛速度变慢;
设计编码方式、适应度函数以及变异规则需要大量经验。
简单说最大的缺点就是慢
参考:
GEAP 遗传算法/遗传编程 genetic programming + python(deap库)实现
【遗传编程/基因规划】Genetic Programming
【Python Deap库】遗传算法/遗传编程 进化算法基于python DEAP库深度解析讲解
原文:https://www.cnblogs.com/PythonLearner/p/12907857.html