算法背景
遗传算法(Genetic Algorithm,GA),美国的 John holland于20世纪70年代提出,是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程(优胜虐汰机制)的计算模型,是一种通过模拟自然进化过程搜索自适应搜索全局最优解的启发式算法。常应用于组合优化、机器学习、信号处理、自适应控制、生产计划、图像处理、机器人和人工生命等领域。
优点:
- 在求解较为复杂的组合优化问题时,通常能够较快地获得较好的优化结果
- 具有内在的隐并行性和更好的全局寻优能力(遗传算法从串集开始搜索,覆盖面大,利于全局择优),遗传算法同时处理群体中的多个个体,即对搜索空间中的多个解进行评估,减少了陷入局部最优解的风险,同时算法本身易于实现并行化。
- 采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向
- 具有自组织、自适应和自学习性。
缺点:
- 编码不规范及编码存在表示的不准确性。
- 单一的遗传算法编码不能全面地将优化问题的约束表示出来。
- 遗传算法容易过早收敛。
- 遗传算法对算法的精度、可行度、计算复杂性等方面,还没有有效的定量分析方法。
算法思想
思想:模拟了自然选择和遗传中发生的选择(复制)、交叉(crossover)和变异(mutation)等现象,从任一初始种群(Population)出发,通过随机选择、交叉和变异操作,产生一群更适合环境的个体,按照适应度从大到小排序,将排名靠前的选为新的种群,即群体进化到搜索空间中越来越好的区域,这样一代一代不断繁衍进化,最后收敛到一群最适应环境的个体(Individual),从而求得问题的优质解(所有迭代次数的中的最优解)。
染色体:将要解决的问题描述为一个数学问题,这个问题的一个可行解称为一条“染色体”(个体),一条染色体有多个部分,每一部分称为基因或基因片段,基因的组合决定染色体的表现。多个染色体称为种群(可行解的集合),仿照基因编码对问题进行简化,对染色体进行二进制编码(问题的表示)
适应度函数:遗传算法中,衡量染色体的优劣由适应度函数(评价函数)完成(根据所求问题的目标函数来进行评估)。运行的过程中会进行N次迭代,每次迭代都会生成若干条染色体。适应度函数会给本次迭代中生成的所有染色体评判适应度,然后将适应度较低的染色体淘汰掉,只保留适应度较高的染色体,从而经过若干次迭代后染色体的质量将越来越优良。染色体的适应度要比较排序,在此基础计算选择概率(适应度大于0),选择概率用于轮盘赌选择出父代的染色体用于交叉和变异。
复制:为了保留上一代优良的染色体,需要将上一代中适应度最高的几条染色体直接原封不动地复制给下一代。(可解释为新的群体的产生是在父代和子代的集合中产生,复制的目的可理解为减小排序的计算量)。
交叉:是遗传算法的核心,交叉的过程需要从上一代的染色体中寻找两条染色体,然后将这两条染色体的某一个位置切断,并拼接在一起,从而生成一条新的染色体。交叉能保证每次进化尽可能留下优良的基因到子代个体。
变异:由于初始化种群的染色体随机,不能保证每个基因片段都有,不断迭代只会找出初始化种群最优的基因片段,会是问题陷入局部最优,因此引入变异,即通过交叉生成了一条新的染色体后,需要在新染色体上随机选择若干个基因,然后随机修改基因的值,从而给现有的染色体引入了新的基因,突破了当前搜索的限制,更有利于算法寻找到全局最优解
遗传学术语 | 遗传算法 |
群体 | 可行解集 |
个体 | 可行解 |
染色体 | 可行解编码 |
基因 | 可详解分量 |
适应度 | 评价函数值 |
交叉 | 可行解交叉操作 |
变异 | 可行解改变 |
算法流程
染色体编码:
- 二进制编码法
- 定义:只用了0和1,将他们串成一条链形成染色体,一个位能表示出2种状态的信息量,因此足够长的二进制染色体便能表示所有的特征。
- 优点:编码、解码操作简单易行;交叉、变异等遗传操作便于实现;合最小字符集编码原则;利用模式定理对算法进行理论分析。
- 缺点:对于一些连续函数的优化问题,由于其随机性使得其局部搜索能力较差,如对于一些高精度的问题;当解迫近于最优解后,由于其变异后表现型变化很大,不连续,所以会远离最优解,达不到稳定。
- 浮点编码法
- 定义:是指个体的每个基因值用某一范围内的一个浮点数来表示,精度可以随浮点数区间大小而改变。在浮点数编码方法中,必须保证基因值在给定的区间限制范围内,遗传算法中所使用的交叉、变异等遗传算子也必须保证其运算结果所产生的新个体的基因值也在这个区间限制范围内。如:1.2-3.2-5.3-7.2
- 优点:适用于在遗传算法中表示范围较大的数;适用于精度要求较高的遗传算法;便于较大空间的遗传搜索;改善了遗传算法的计算复杂性,提高了运算交率;便于遗传算法与经典优化方法的混合使用;便于设计针对问题的专门知识的知识型遗传算子;便于处理复杂的决策变量约束条件
- 缺点:存在着连续函数离散化时的映射误差。个体长度较短时,可能达不到精度要求,而个体编码长度较长时,虽然能提高精度,但增加了解码的难度,使遗传算法的搜索空间急剧扩大。
- 符号编码法
- 定义:是指个体染色体编码串中的基因值取自一个无数值含义、而只有代码含义的符号集如{A,B,C…}。
- 优点:符合有意义积木块编码原则;便于在遗传算法中利用所求解问题的专门知识;便于遗传算法与相关近似算法之间的混合使用。
- 格雷编码
- 定义:两个相邻的数用格雷码表示,其对应的码位只有一个不相同。
- 优点:可以提高算法的局部搜索能力。这是格雷码相比二进制码而言所具备的优势。
初始化:
- 设置最大迭代次数T
- 种群大小 M
- 交叉概率 一般取 0.4-0.99
- 变异概率 一般取 0.001-0.1
- 随机生成 M 个个体作为初始化群体
个体评价:
- 计算初始种群中M 个个体的适应度值,适应度函数表明个体或解的优劣性。对于不同的问题,适应度函数的定义方式不同。根据具体问题,计算群体P(t)中各个个体的适应度。
- 适应度尺度变换:一般来讲,是指算法迭代的不同阶段,能够通过适当改变个体的适应度大小,进而避免群体间适应度相当而造成的竞争减弱,导致种群收敛于局部最优解。
- 尺度变换选用的经典方法:
线性尺度变换:用一个线性函数表示,其中a为比例系数,b为平移系数,F为变换前适应度尺度, 表示变换后适应度尺度。
乘幂尺度变换:将原适应度尺度F取k次幂。其中k为幂,F为转变前适应度尺度,为转变后适应度尺度
指数尺度变换:将原尺度乘以一个 ,然后取反,将作为自然数e的幂,其中的大小决定了适应度尺度变换的强弱。
选择运算:
定义:以一定概率把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。选择算子有时又称为再生算子。个体适应度值越高,被选中的概率越大。以轮盘赌选择法为例,若设种群数为M,个体 i 的适应度为 ,则个体被选中的概率为 :
个体选择的概率给定后,产生[0,1]之间均匀随机数来决定哪个个体参加交配。若个体的选择概率大,则有机会被多次选中,那么它的遗传基因就会在种群中扩大;若个体的选择概率小,则被淘汰的可能性会大。
选择还有其他选择法:
随机遍历抽样法:像轮盘赌一样计算选择概率,只是在随机遍历选择法中等距离的选择个体,设 n 为需要选择的个体数目,等距离的选择个体,选择指针的距离是1/n ,第一个指针的位置由[0,1/n]的均匀随机数决定。
锦标赛选择法:每次从种群中取出一定数量个体(成为竞赛规模),然后选择其中最好的一个进入子代种群。重复该操作,直到新的种群规模达到原来的种群规模。锦标赛选择策略会比轮盘赌选择策略有更好的通用性,而且性能更优。
随机竞争选择法:每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止
均匀排序:对群体中的所有个体按期适应度大小进行排序,基于这个排序来分配各个个体被选中的概率。
排挤选择:新生成的子代将代替或排挤相似的旧父代个体,提高群体的多样性
期望值选择法:根据每个个体在下一代群体中的生存期望来进行随机选择运算。计算群体中每个个体在下一代群体中的生存期望数目N。 若某一个体被选中参与交叉运算,则它在下一代中的生存期望数目减去0.5,若某一个体未 被选中参与交叉运算,则它在下一代中的生存期望数目减去1.0。随着选择过程的进行,若某一个体的生存期望数目小于0时,则该个体就不再有机会被选中。
确定式选择法:按照一种确定的方式来进行选择操作。计算群体中各个个体在下一代群体中的期望生存数目N, 用N的整数部分确定各个对应个体在下一代群体中的生存数目。用N的小数部分对个体进行降序排列,顺序取前M个个体加入到下一代群体中。至此可完全确定出下一代群体中M个个体。
截断选择法:根据适应度值对种群中的个体按照从优到劣的顺序进行排序,只有前n个最好的个体被选择进入下一代。截断选择是一种非常基础的选择算法,尽管它的优势在于能够快速地在大量种群中选择个体,但是在实际中并不常用。截断选择是在动植物育种方面的标准方法,按照表现型价值排序,只有最好的动物才会被选择繁殖。
线性排序选择:当适应度值差别很大时,轮盘赌选择将会出现问题。如果最优染色体的适应度值占适应度值总和的90%,即其占据了轮盘上90%的周长,那么其他染色体被选择到的概率就很低。在线性排序选择中,首先按照适应度值对个体进行排序,最差个体排在第1位,最优个体排在第N位,根据排位先后,线性地分派给染色体i的选择概率P(i):
指数排序选择:使用指数函数为排序后的个体分配生存概率;
其中c必须位于区间[0,1)内,c越小最优个体被选择的概率就越大,如果c=0,则设置最优个体被选择的概率为1,而其他所有个体的选择概率为0。c越接近于1,个体间的选择概率越接近。注意:在计算选择概率前,需要对种群按照适应度值进行降序排序。
结论:基本遗传算法达到收敛的迭代数(number of generations)和选择强度(selection intensity)成反比,选择强度越高,收敛越慢,一般来说较高的选择强度是很好的选择方法,但是太高又会导致收敛过快(早熟,陷入局部最优)。
交叉运算
将交叉算子作用于群体。指把两个父代个体的部分结构加以替换重组而生成新个体的操作。在实际应用中,使用率最高的是单点交叉算子,该算子在配对的染色体中随机的选择一个交叉位置,然后在该交叉位置对配对的染色体进行基因位变换。
单点交叉算子执行过程:
- 对种群个体执行随机配对操作
- 逐一选择配对的染色体,随机设置一个位置交叉点
- 按照设定的交叉概率 进行相互配对
双点交叉或多点交叉:即对配对的染色体随机设置两个或者多个交叉点,然后进行交叉运算,改变染色体基因序列。
均匀交叉:即配对的染色体基因序列上的每个位置都以等概率进行交叉,以此组成新的基因序列。
算术交叉:是指配对染色体之间采用线性组合方式进行交叉,改变染色体基因序列。
变异运算:
将变异算子作用于群体。为了防止遗传算法在优化过程中陷入局部最优解,在搜索过程中,需要对个体进行变异,在实际应用中,主要采用单点变异,也叫位变异,即只需要对基因序列中某一个位进行变异,以二进制编码为例,即0变为1,而1变为0。
实值变异:当个体的染色体采用实数编码表示时,其变异操作应采用实值变异方法。该方法是用另外一个在规定范围内的随机实数去替换原变异位置上的基因值,产生一个新的个体。最常用的实值变异操作有:
- 基于位置的变异方法:先随机地产生两个变异位置,然后将第二个变异位置上的基因移动到第一个变异位置的前面。
- 基于次序的变异:随机地产生两个变异位置,然后交换这两个变异位置上的基因。
终止条件判断:
满足最大迭代次数,以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算
流程图:
算法测试
- 先使用一下matlab 自带的遗传算法工具箱求解以下函数的最小值
MATLAB 代码 。 注:不等式约束化标准型为小于等于。
fun=@(x)(x(1)-2).^2+(x(2)-1).^2+(x(3)-7).^2+(x(4)-9).^2; % 目标函数
n=4; % 自变量个数
A=[-1 2 -1 1;
-2 -1 2 -1]; % 线性不等式约束
b=[1;5]; % 线性不等式约束
Aeq=[]; % 线性等式约束
beq=[]; % 线性等式约束
lb=[-100 -100 0 0]; % 下限
ub=[100 100 10 10]; % 上限
confun=@demo2; % 非线性约束
opts=[]; % 选项
[x,f_val]=ga(fun,n,A,b,Aeq,beq,lb,ub,confun,opts)
- 遗传算法解TSP问题(问题描述参照上一遍博客:蚁群算法)
流程:建立距离矩阵存储任意两个城市之间的距离;种群基因设置为途经城市的依次顺序;路程看做适应度函数;通过遗传算法迭代,找出最短距离的所对应的路径顺序。
% GA 解TSP问题(固定城市群参数)
% author zpp
clear all;clc;close all;
t0=clock; %用于计时
%% 初始化参数
N=30; %定义城市个数 (每个解的基因数)
M =50; %种群的个数(可行解的个数)
iter_max = 1000; %最大迭代次数
Pc=0.5; %交叉概率
Pmutation=0.2; %变异概率
m=2; % 适应度归一化淘汰加速指数
% city=[(randperm(100,N))',(randperm(100,N))']; %获取城市坐标 产生n个1-100的随机数,不重复
load('city.mat'); % 导入城市数据 30*2
%% 求出各个城市之间的距离
D=zeros(N,N); %新建一个N*N的矩阵存放距离
for i=1:N
for j=i+1:N
D(i,j)=sqrt(sum((city(i,:)-city(j,:)).^2));
D(j,i)=D(i,j);
end
end
%% 产生初始种群
popm=zeros(M,N);
for i=1:M
popm(i,:)=randperm(N); %随机排列,比如[2 4 5 6 1 3]
end
%% 随机选择一个种群
R=popm(1,:);
figure(1);
scatter(city(:,1),city(:,2),'o'); %画出所有城市坐标 %描点
grid on %网格线
title('城市位置');
figure(2);
plot_route(city,R); %%画出初始种群对应各城市之间的连线
for i=1:N
text(city(i,1)+0.5,city(i,2),num2str(i)); %标号
end
%% 初始化种群及其适应函数
fitness=zeros(M,1); % 定义种群个体适应度值(存储归一化后的适应度值)数组
len=zeros(M,1); % 定义 存储种群的个体的路程数组
for i=1:M % 计算种群中每个个体对应的总路程
len(i,1)=myLength(D,popm(i,:));
end
maxlen=max(len); % 最大距离
minlen=min(len); % 最小距离
fitness=fit(len,m,maxlen,minlen); % 适应度值的归一化操作
rr=find(len==minlen); % 找到最小值的下标,赋值为rr
R=popm(rr(1,1),:); % 提取该染色体,赋值为R
for i=1:N
fprintf('%d ',R(i)); % 把R(路径最短的个体)的基因(城市序号)顺序打印出来
end
fprintf('\n');
% fitness=fitness/sum(fitness); % 根据归一化后的适应度值,计算每个个体适应度值的概率。
% 适应度值越小归一化处理后的适应度值越大,计算得到的概率最大
distance_min=zeros(iter_max+1,1); % 定义 各次迭代种群中的个体路程最小的距离
iter=0; % 初始化迭代次数为0
while iter<=iter_max % 循环迭代,寻找最短路径
fprintf('迭代第%d次\n',iter); % 打印当前迭代次数
%% 选择操作(轮盘赌选择)
p=fitness./sum(fitness); % 根据归一化后的适应度值,计算每个个体适应度值的概率。
q=cumsum(p); % 累加 ,计算累积概率,p向量,则 cumsum(p) 返回包含p元素累积和的向量。
for i=1:(M-1) % 循环用轮盘赌选择法,每次选一个,存在popm_sel
len_1(i,1)=myLength(D,popm(i,:));
r=rand;
tmp=find(r<=q); % 找出累积概率大于随机值的种群个体
popm_sel(i,:)=popm(tmp(1),:); % 取出第一个即为轮盘赌选择的结果
end
[fmax,indmax]=max(fitness); % 求当前迭代次数的最佳个体
popm_sel(M,:)=popm(indmax,:); % 将最优的一个个体保存到popm_sel
%% 交叉操作
nnper=randperm(M); % 返回行向量,其中包含从 1 到 M 没有重复元素的整数随机排列。
for i=1:M*Pc*0.5 % 乘0.5 是因为每次取两个,按交叉概率对选取的一对个体进行交叉操作
A=popm_sel(nnper(i),:); % 挑选一对
B=popm_sel(nnper(i+1),:);
[A,B]=cross(A,B); % 交叉操作
popm_sel(nnper(i),:)=A; % 将选择步骤中的种群被选中交叉的个体,更新保存在popm_sel
popm_sel(nnper(i+1),:)=B;
end
%% 变异操作
for i=1:M
pick=rand;
while pick==0 % 确保pick 不为0
pick=rand;
end
if pick<=Pmutation % 轮盘赌选择是否进行变异操作,变异概率Pmutation越大,变异的可能性越大
popm_sel(i,:)=Mutation(popm_sel(i,:)); % 变异操作
end
end
%% 求适应度函数
NN=size(popm_sel,1); % 得到种群popm_sel 尺寸
len=zeros(NN,1); % 定义距离存储数组
for i=1:NN % 计算交叉变异后得种群中个体的路程
len(i,1)=myLength(D,popm_sel(i,:));
end
maxlen=max(len); % 得到最大距离
minlen=min(len); % 得到最短距离
distance_min(iter+1,1)=minlen; % 将当前迭代次数的最短距离保存(+1是应为从0开始的)
fitness=fit(len,m,maxlen,minlen); % 计算适应度值数组
rr=find(len==minlen); % 得到最短距离的下标
fprintf('minlen=%d\n',minlen); % 打印最短距离
R=popm_sel(rr(1,1),:); % 得到距离最短的个体
for i=1:N
fprintf('%d ',R(i)); % 打印最短距离对应的个体的城市顺序
end
fprintf('\n');
popm=popm_sel; % 更新种群
iter=iter+1; % 更新迭代次数
end
%end of while
fprintf('============================================================================\n');
last_time=etime(clock,t0);
disp(['最短距离为:' num2str(minlen)]);
disp(['最短路径为:' num2str(R)]);
disp(['运行时间:' num2str(last_time) '秒']);
figure(3)
plot_route(city,R); % 画图,优化后的最短路径对应的城市连线图
figure(4)
plot(distance_min); % 画出随迭代次数增加,最短距离的变化图,即收敛图
%% 画图函数
function plot_route(a,R)
scatter(a(:,1),a(:,2),'o');
hold on;
plot([a(R(1),1),a(R(length(R)),1)],[a(R(1),2),a(R(length(R)),2)]);
hold on;
for i=2:length(R)
x0=a(R(i-1),1);
y0=a(R(i-1),2);
x1=a(R(i),1);
y1=a(R(i),2);
xx=[x0,x1];
yy=[y0,y1];
plot(xx,yy);
hold on;
end
end
%% 染色体的路程代价函数
function len=myLength(D,p)%p是一个排列
[Dr,Dw]=size(D); % 返回一个行向量,其元素是A的相应维数的长度。例如,如果A是一个3 × 4矩阵,那么size(A)返回一个向量[3 4]。
len=D(p(1,Dr),p(1,1)); % 起点和终点那一段的距离
for i=1:(Dr-1)
len=len+D(p(1,i),p(1,i+1)); % 起点到终点路径的距离
end
end
%% 交叉操作函数
function [A,B]=cross(A,B)
L=length(A); % 得到个体基因数
if L<10 % L<10,需交叉的位数(全部交叉)
W=L;
elseif ((L/10)-floor(L/10))>=rand&&L>10 % floor(x)将 x 的每个元素四舍五入到小于或等于该元素的最接近整数。
W=ceil(L/10)+8; % ceil(X) 将 X 的每个元素四舍五入到大于或等于该元素的最接近整数。
% L>10,需交叉的位数,(以一定概率使交叉的位数多一些,L越大,交叉位数多一些的可能性越大)
else
W=floor(L/10)+8; % L=10,需交叉的位数(9)
end
% W为需要交叉的位数
p=unidrnd(L-W+1); % 随机产生一个交叉位置
%fprintf('p=%d ',p); % 交叉位置
for i=1:W
x=find(A==B(1,p+i-1)); % 找到A中 等于B(1,p+i-1)元素的下标
y=find(B==A(1,p+i-1)); % 找到B中 等于A(1,p+i-1)元素的下标
[A(1,p+i-1),B(1,p+i-1)]=exchange(A(1,p+i-1),B(1,p+i-1)); % 将A和B同一个位置的数交换(交换后一个个体出现了两个相同的元素)
[A(1,x),B(1,y)]=exchange(A(1,x),B(1,y)); % 将交叉后的 重复的在交换
end
end
%% 变异操作函数
function a=Mutation(A)
index1=0;index2=0; % 定义两下标保存变量
nnper=randperm(size(A,2)); % 从A中任取两不相等的下标
index1=nnper(1);
index2=nnper(2);
%fprintf('index1=%d ',index1);
%fprintf('index2=%d ',index2);
temp=0; % 定义变量保存个体A中的某个基因
temp=A(index1); % 保存A(index1)这个基因
A(index1)=A(index2); % 将A(index2)这个基因放到index1 这个位置
A(index2)=temp; % 将保存的A(index1)这个基因放到index2 这个位置
a=A; % 相当于讲一个个体的两个位置的基因交换,返回返回变异后的个体
end
%% 对调函数
function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
end
%% 适应度函数
function fitness=fit(len,m,maxlen,minlen)
fitness=len;
for i=1:length(len)
fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+0.0001)).^m; % 当前距离与最小距离差越小,1- 之后值越大(小于1),^m=2之后变小一些
end % 0<=fitness<=1
end
取消 city=[(randperm(100,N))',(randperm(100,N))']; 的注释 可随机生成一组城市数据。
使用 load('city.mat'); 这样就可以处理的一直是同一组城市数据。方便看是否是全局最优(多运行几次)(换蚁群算法用同一组数据试试,参考上一篇博客,换成同一组数据即可。)
很遗憾,蚁群算法试过后效果很好,证明我的遗传算法并没有找到全局最优解。为什么呢??
Rudolph已经采用有限马尔可夫链理论证明了仅采用交叉、变异和选择(比例选择法)三个遗传算子的标准遗传算法(Canonical Genetic Algorithm CGA),不能收敛到全局最优值。原因有如下两个:
- 采用比例选择法,由于存在统计误差,依据产生的随机数进行选择,有可能会出现不正确地反映个体适应度的选择,可能导致适应度高的个体也被淘汰掉;(本测试使用的轮盘赌选择同样存在这个问题)
- 交叉、变异算子可能会破坏掉个体中所隐含的高阶(high-order)、长距(length)、高平均适应度模式(schema),可能导致当前群体中的最优个体在下一代群体中发生丢失,而且这种最优个体丢失现象会周而复始的出现在进化过程中。
总结
算法早熟收敛:在遗传算法早期,在种群中出现了超级个体,该个体的适应值大大超过当前种群的平均个体适应值。从而使得该个体很快在种群中占有绝对的比例,种群的多样性迅速降低,群体进化能力基本丧失,从而使得算法较早收敛于局部最优解的现象。早熟收敛的本质特征是指群体中的各个个体非常相似,群体的多样性急剧减少,当前群体缺乏有效等位基因(最优解位串上的等位基因),在遗传算子作用下不能生成高阶竞争模式。
几中方案缓解局部最优:
- 灾变思想:就是杀掉最优秀的个体,这样才可能产生更优秀的物种。那何时进行灾变,灾变次数又如何设定?何时进行灾变,可以采用灾变倒计数的方式。如果n代还没有出现比之前更优秀的个体时,可以发生灾变。灾变次数可以这样来确定,如果若干次灾变后产生的个体的适应度与没灾变前的一样,可停止灾变。
- 精英主义思想:当利用交叉和变异产生新的一代时,我们有很大的可能把在某个中间步骤中得到的最优解丢失。精英主义的思想是,在每一次产生新的一代时,首先把当前最优解原封不动的复制到新的一代中。精英主义方法可以大幅提高运算速度,因为它可以防止丢失掉找到的最好的解。
灾变与精英主义之间的矛盾:灾变与精英主义之间的矛盾,两者其实是可以共存的。我们在每一代进行交叉运算时,均直接把最优秀的个体复制到下一代,但当连续N代都没有更优秀的个体出现时,便可以猜想可能陷入局部最优解了,这样可以采用灾变的手段。可以说,精英主义是伴随的每一代的,但灾变却不需要经常发生,否则算法可能下降为随机搜索了。当然,每个算法中不一定要用精英主义和灾变的手段,应该根据具体的问题而定。
算法改进
精英保留策略:
即把群体在进化过程中迄今出现的最好个体(称为精英个体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已经从理论上证明了 具有精英保留的标准遗传算法是全局收敛的。
小白一个,参照多篇,自我总结,侵删(私聊我),勿喷!!!