简单一元函数优化
利用遗传算法计算以下函数的最小值:
选择二进制编码,遗传算法参数设置如下:
种群大小 | 最大遗传代数 | 个体长度 | 代沟 | 交叉概率 | 变异概率 |
40 | 20 | 20 | 0.95 | 0.7 | 0.01 |
遗传算法优化程序代码:
clc
clear
%%画出函数图
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]=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'])
计算结果: