一、算法原理
借鉴生物进化论,遗传算法通过选择、交叉(配)、变异等操作产生下一代的解,并逐步淘汰掉适应度函数值低的解,增加适应度函数值高的解,从而进化N代后就很有可能会进化出适应度函数值很高的个体。
二、算法流程图
三、算法参数设计原则
1.种群的规模N
影响算法搜索能力和效率,种群不宜过大也不宜过小。种群规模的建议值为20-100。
2.染色体长度L
影响算法的计算量和交配变异操作,L的设置与优化密切相关。一般由问题定义的解的形式和选择编码方式决定。
- 对于二进制编码方法,染色体的长度L根据解的取值范围和规定精度要求选择大小。
- 对于浮点数编码方法,染色体的长度L与问题定义的解的维度D相同。
3.变异概率pm
增加群体进化的多样性,决定进化过程中群体发生变异的基因的平均数。变异概率也不宜过大或者过小。一般取值为0.001-0.1
4.交配概率pc
决定了进化过程种群参加交配的染色体平均数目pc×N。不宜过大或者过小。一般取值 为0.4-0.99。
5.进化代数
不宜过大或者过小。一般取值为100-500。根据具体问题可做相应修改。
6.适应度评价
影响算法对种群的选择,恰当的评估函数应能够对染色体优劣做出合适区分,保证选择机制的有效性,从而提高群体的进化能力。
四、代码实现及分析
matlab代码实现遗传算法:
%下面为代码。函数最大值为3904.9262,此时两个参数均为-2.0480,有时会出现局部极值,此时一个参数为-2.0480,一个为2.0480。变
%异概率pm=0.05,交叉概率pc=0.8。
clc;clear all;
format long;%设定数据显示格式
%初始化参数
T=500;%仿真代数
N=80;% 群体规模
pm=0.05;pc=0.8;%交叉变异概率
umax=30;umin=-30;%参数取值范围
L=10;%单个参数字串长度,总编码长度Dim*L
Dim=5;%Dim维空间搜索
bval=round(rand(N,Dim*L));%初始种群,round函数为四舍五入
bestv=-inf;%最优适应度初值
funlabel=2; %选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank
Drawfunc(funlabel);%画出待优化的函数,只画出二维情况作为可视化输出
%迭代开始
for ii=1:T
%解码,计算适应度
for i=1:N %对每一代的第i个粒子
for k=1:Dim
y(k)=0;
for j=1:1:L %从1到L,每次加以1
y(k)=y(k)+bval(i,k*L-j+1)*2^(j-1);%把第i个粒子转化为十进制的值,例如y1是第一维
end
x(k)=(umax-umin)*y(k)/(2^L-1)+umin;%转化为实际的x1
end
% obj(i)=100*(x1*x1-x2).^2+(1-x1).^2; %目标函数
obj(i)=fun(x,funlabel);
xx(i,:)=x;
end
func=obj;%目标函数转换为适应度函数
p=func./sum(func);
q=cumsum(p);%累加
[fmax,indmax]=max(func);%求当代最佳个体
if fmax>=bestv
bestv=fmax;%到目前为止最优适应度值
bvalxx=bval(indmax,:);%到目前为止最佳位串
optxx=xx(indmax,:);%到目前为止最优参数
end
Bfit1(ii)=bestv; % 存储每代的最优适应度
%%%%遗传操作开始
%轮盘赌选择
for i=1:(N-1)
r=rand;
tmp=find(r<=q);
newbval(i,:)=bval(tmp(1),:);
end
newbval(N,:)=bvalxx;%最优保留
bval=newbval;
%单点交叉
for i=1:2:(N-1)
cc=rand;
if cc<pc
point=ceil(rand*(2*L-1));%取得一个1到2L-1的整数
ch=bval(i,:);
bval(i,point+1:2*L)=bval(i+1,point+1:2*L);
bval(i+1,point+1:2*L)=ch(1,point+1:2*L);
end
end
bval(N,:)=bvalxx;%最优保留
%位点变异
mm=rand(N,Dim*L)<pm;%N行
mm(N,:)=zeros(1,Dim*L);%最后一行是精英不变异,强制赋0
bval(mm)=1-bval(mm);
end
%输出
figure;
plot(-Bfit1);% 绘制最优适应度进化曲线
bestv %输出最优适应度值
optxx %输出最优参数
代码分析:
先初始化群体规模、交叉(配)概率,变异概率等参数,使用二进制编码方式构造染色体,迭代下列操作,根据优化函数计算最佳适应度,采用轮盘赌选择算法选择父代染色体,父代染色体交叉(配)得到子代染色体,子代染色体变异后得到新群体,最后输出最优适应度和最优参数并绘制最优适应度进化曲线。
染色体编码方式有许多种,常用的较简单的为二进制编码和浮点数编码,本代码采用的为二进制编码,其中染色体长度L是10为10位二进制符号串,Dim为解的变量维度,即1个解对应的染色体编码有5维,因此最优解输出5个参数。需要注意的是,二进制编码的精度为(Umax-Umin)/(2^L-1),若要求高精度或大范围数则需增加L,因此二进制编码不适合解决要求精度较高或者解含有较多变量的优化问题。
(1)选择待优化函数——Schaffer函数
①当迭代次数为500,种群数量为80,Dim为5维
最优适应度值为:
最优参数为:
分析:定义了Dim为5维,所以最优参数有5维,输出了5个。
分析:调用待优化函数Schaffer,迭代完成后时间为0.474s,占总时间17%。
分析:由图可知,Bfit1变量中显示了每次迭代中每代的最优适应度,在迭代149次后,适应度函数趋于最优,达到0.9983,并在后续迭代中保持稳定。
②当迭代次数为500,种群数量为80,Dim为3维
最优适应度以及最优参数:
分析:在迭代257次后,最优适应度趋于稳定达到0.9983,fun函数计算适应度耗时0.352s,占运行总时间18%。
运行2次后结果情况:
运行5次后结果情况:
分析:多次运行发现,当解空间维度为3维,输出的最优参数为3个,最优适应度均达到0.9983。
③当迭代次数为500,种群数量为80,Dim为2维
④当迭代次数为500,种群数量为80,Dim为7维
分析:种群数量不变,解空间维度变化,最佳适应度不变。
(2)选择待优化函数——Rastrigin函数
①当迭代次数为500,种群数量为80,Dim为5维
最优适应度以及最优参数:
分析:Dim为5维,输出5个参数,由于优化函数为多峰值函数,在最优适应度进化曲线图可看出呈跳跃性,多次出现迭代稳定区间,最终在迭代320次后最优适应度趋于稳定为 -73.6920,fun函数计算适应度耗时0.351s,占运行总时间15%。
②当迭代次数为500,种群数量为100,Dim为5维
最优适应度以及最优参数:
分析:最优适应度由 -73.6920变为-81.9550。fun函数计算适应度耗时0.424s,占运行总时间17%。
③当迭代次数为500,种群数量为120,Dim为5维
分析:最优适应度由 -73.6920变为-79.5124,当种群数量变大后,最优适应度变小。
(3)选择待优化函数——Griewank函数
①当迭代次数为500,种群数量为80,Dim为5维
最优适应度以及最优参数:
分析:最优适应度在迭代245次后达到稳定值为-0.2475,fun函数计算适应度耗时0.421s,占运行总时间18%。
①当迭代次数为500,种群数量为50,Dim为5维
运行1次:
运行3次:
运行5次:
分析:种群数量为50,Dim为5维,最优适应度在-0.1到-0.2左,最佳适应度较种群数量为80时下降。
五、小结
- 优化函数为Schaffer函数,当种群数量不变,解空间维度变化,最佳适应度不变。
- 优化函数为Rastrigin函数,当种群数量变大,解空间维度不变,最优适应度下降。
- 优化函数为Griewank函数,当种群数量变小,解空间维度不变,最优适应度上升。
- 不同优化函数,最优适应度不同,本例中3种优化函数,Schaffer函数的最优适应度较大。