遗传算法(GA)是一种进化算法,是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法把问题参数编码为染色体,利用层层迭代的方式进行选择、交叉以及变异等运算交换种群中染色体信息,最终生成符合优化目标的染色体。
本文将使用到Sheffield遗传算法工具箱。Sheffield遗传算法工具箱是由英国谢菲尔德大学开发的。该工具箱提供了大量的遗传算法应用到的m函数,为我们研究遗传算法提供了非常多的便捷。
我将在下面通过一个实例来介绍遗传算法的过程。下面的实例是利用遗传算法寻找一元函数的最小值。
%% 画出函数图
figure(1);
hold on;
lb=1;ub=2; %函数自变量范围[1,2]
ezplot('sin(10*pi*X)/X',[lb,ub]); %画出函数曲线
xlabel('自变量/X')
ylabel('函数值/Y')
%% 定义遗传算法参数
NIND=40; %个体数目
MAXGEN=20; %最大遗传代数
PRECI=20; %变量的二进制位数
GGAP=0.95; %代沟
px=0.7; %交叉概率
pm=0.01; %变异概率
trace=zeros(2,MAXGEN); %寻优结果的初始值
FieldD=[PRECI;lb;ub;1;0;1;1]; %区域描述器
Chrom=crtbp(NIND,PRECI); %初始种群
%% 优化算法(主要部分)
gen=0; %计算迭代次数
X=bs2rv(Chrom,FieldD); %计算初始种群的十进制转换
ObjV=sin(10*pi*X)./X; %计算目标函数值
while gen<MAXGEN
FitnV=ranking(ObjV); %分配适应度值
SelCh=select('sus',Chrom,FitnV,GGAP); %选择
SelCh=recombin('xovsp',SelCh,px); %重组
SelCh=mut(SelCh,pm); %变异
X=bs2rv(SelCh,FieldD); %子代个体的十进制转换
ObjVSel=sin(10*pi*X)./X; %计算子代的目标函数值
[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群
X=bs2rv(Chrom,FieldD);
gen=gen+1; %计算迭代次数加一
%获取每代的最优解及其序号,Y为最优解,I为个体的序号
[Y,I]=min(ObjV);
trace(1,gen)=X(I); %记下每代的最优值
trace(2,gen)=Y; %记下每代的最优值
end
plot(trace(1,:),trace(2,:),'bo'); %画出每代的最优点
grid on;
plot(X,ObjV,'b*'); %画出最后一代的种群
hold off
%% 画进化图
figure(2);
plot(1:MAXGEN,trace(2,:));
grid on
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
bestY=trace(2,end);
bestX=trace(1,end);
fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n'])
由定义遗传算法参数部分可知,我们将生成的种群包含40个个体,每个个体长度为20,最大遗传迭代次数为20次。代沟为0.95,交叉概率为0.7,变异概率为0.01。
优化部分为遗传算法的核心内容,其中也大量使用谢菲尔德工具箱中提供的m函数,绿色标记即为所使用函数。
-
crtbp函数
功能:该函数功能为创建初始离散随机种群。
一般调用格式:Chrom=crtbp(种群个体数,个体长度)
-
bs2rv函数
功能:二进制到十进制的转换
一般调用格式:Phen=bs2rv(Chrom,Field)
-
ranking函数
功能:基于排序的适应度分配
一般调用格式:FitnV=ranking(ObjV)
-
selcet函数
功能:从种群中选择个体
一般调用格式:SelCh=select('sus',Chrom,FitnV,GGAP)
-
recombin函数
功能:重组个体
一般调用格式:SelCh=recombin('recdis',Chrom)
-
mut函数
功能:离散变异算子
一般调用格式:SelcCh=mut(NewChrom,pm)
-
reins函数
功能:重插入子代到种群
一般调用格式:Chrom=reins(Chrom,SelCh)
过程可表述为:初代种群通过分配适应度值进行淘汰选择,再进行重组,再进行变异而得到第二代种群,第二代种群重插入到初代种群而产生新种群。
注:假设数据为二进制,则在重组中每一列不会产生0或1个数的变化。而变异会使某种群个体中某一长度编码变化,即某几个元素由0变1或是由1变0,从而使0和1数量发生变化。重插入指后代种群中某几个种群直接取代了前代某几个种群,即发生某一行的全部替代。
运行上述代码后可得到结果为:取值点X=1.1497,最小值Y=-0.86977
该图中圈符号为每代最优解,星符号为优化20代后的种群分布。两者大部分集中在一个点,该点即为最优解。
该图为最优解的迭代过程。
需要源码请在文章下留言