遗传算法之精英保留
一、单目标遗传算法 精英保留政策
遗传算法(Genetic Algorithm)中的基因,并不一定真实地反映了待求解问题的本质,因此各个基因之间未必就相互独立,如果只是简单地进行杂交,很可能把较好的组合给破坏了,这样就没有达到累积较好基因的目的,反而把原本很好的基因给破坏了。精英保留策略可以避免最优个体不会因为杂交操作而被破坏。
“精英保留”(maintain the best solution found over time before selection)策略是De Jong针对遗传算法提出来的。对遗传算法来说,能否收敛到全局最优解是其首要问题。
Rudolph已经采用有限马尔可夫链理论证明了仅采用交叉、变异和选择(比例选择法)三个遗传算子的标准遗传算法(Canonical Genetic Algorithm CGA),不能收敛到全局最优值。
CGA不能全局收敛的原因主要有两个:
(1) 采用比例选择法,由于存在统计误差,依据产生的随机数进行选择,有可能会出现不正确地反映个体适应度的选择,可能导致适应度高的个体也被淘汰掉;
(2) 交叉、变异算子可能会破坏掉个体中所隐含的高阶(high-order)、长距(length)、高平均适应度模式(schema),可能导致当前群体中的最优个体在下一代群体中发生丢失,而且这种最优个体丢失现象会周而复始的出现在进化过程中。
为了防止当前群体的最优个体在下一代发生丢失,导致遗传算法不能收敛到全局最优解,De Jong在其博士论文中提出了“精英选择(elitist selection or elitism)”策略,也称为“精英保留”(elitist preservation)策略。该策略的思想是,把群体在进化过程中迄今出现的最好个体(称为精英个体elitist)不进行配对交叉而直接复制到下一代中。 这种选择操作又称为复制(copy)。
De Jong对精英选择方法作了如下定义:
设到第t代时,群体中 a(t)为最优个体。又设A(t+1)为新一代群体,若A(t+1)中不存在比a(t)优的个体 ,则把a(t)加入到A(t+1)中作为A(t+1)的第n+1个个体,这里n为群体的大小。
为了保持群体的规模不变,如果精英个体被加入到新一代群体中,则可以将新一代群体中适应度值最小的个体淘汰掉。
(注解:一种做法,将精英个体放入到种群中,即种群规模为 N+1。 一种做法,保持种群规模,即将精英个体替换掉种群做的最差个体。)
精英个体是种群进化到当前为止遗传算法搜索到的适应度值最高的个体,它具有最好的基因结构和优良特性。采用精英保留的优点是,遗传算法在进化过程中,迄今出现的最优个体不会被选择、交叉和变异操作所丢失和破坏。精英保留策略对改进标准遗传算法的全局收敛能力产生了重大作用,Rudolph已经从理论上证明了 具有精英保留的标准遗传算法是全局收敛的。
当然精英保留策略同样可以应用于别的智能算法中。
二、代码
第二个约束是(x2-1)^2<=1
要用到geatpy 库
import geatpy as ea
import numpy as np
# 构建问题
r = 1 # 目标函数需要用到的额外数据
@ea.Problem.single
def evalVars(Vars): # 定义目标函数(含约束)
f = np.sum((Vars - r) ** 2) # 计算目标函数值
x1 = Vars[0]
x2 = Vars[1]
CV = np.array([(x1 - 0.5)**2 - 0.25,
(x2 - 1)**2 - 1]) # 约束
return f, CV
problem = ea.Problem(name='增强精英保留策略的遗传算法',
M=1, # 目标维数
maxormins=[1], # 目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标
Dim=5, # 决策变量维数(个数为5)
varTypes=[0, 0, 1, 1, 1], # 决策变量的类型列表,0:实数;1:整数。0表示对应的决策变量是连续型变量;为1表示对应的是离散型变量。
lb=[-1, 1, 2, 1, 0], # 决策变量下界
ub=[1, 4, 5, 2, 1], # 决策变量上界
evalVars=evalVars)
# 构建算法
algorithm = ea.soea_SEGA_templet(problem,
# Encoding='RI实整数编,NIND=20设定了种群有20个个体。
ea.Population(Encoding='RI', NIND=20),
MAXGEN=50, # 最大进化代数。
logTras=1, # 表示每隔多少代记录一次日志信息,0表示不记录。
trappedValue=1e-6, # 单目标优化陷入停滞的判断阈值。
maxTrappedCount=10) # 进化停滞计数器最大上限值。
# 求解
res = ea.optimize(algorithm, seed=1, verbose=True, drawing=1, outputMsg=True, drawLog=False, saveFlag=True, dirName='result')
————————————————
资料来源:CSDN博主「ybhybh666」的原创文章
原文链接:https://blog.csdn.net/abc1234564546/article/details/126190954