遗传算法找最优解。
主要思想“物竞天择,适者生存”。
流程:初始化、适应度生成、适应度评估、选择、交叉、变异。
举例:
求最大值。
%f(x,y)= y.*x.*cos(2*pi.*x)+x.*sin(2.*pi.*y),x∈[-2,2],y∈[-1,1]
clc
clear
% 画出函数图像
figure(1);
%给出定义域
lbx = -2;ubx = 2;
lby = -1;uby = 1;
%多元函数使用ezmesh作图,ezmesh('函数',定义域,参数)
ezmesh('y.*x.*cos(2*pi.*x)+x.*sin(2.*pi.*y)',[lbx,ubx,lby,uby],50);
hold on;
%定义遗传算法参数
NIND = 40;%种群大小,通常设为40.
MAXGEN = 500;%最大遗传代数,即循环500次
PRECI = 20;%个体长度设为20,这里是两个自变量,种群个数为2.
GGAP = 0.95;%代沟
px = 0.7;%交叉概率
pm = 0.01;%变异概率
trace = zeros(3,MAXGEN); %追踪记录
FieldD = [PRECI PRECI;lbx lby;ubx uby;1 1;0 0;1 1;1 1];%这里7个参数,转化的格式
%第一个种群长度,因为有2个自变量,所以写两个,多个自变量类比
%第二个左边界值
%第三个右边界值
%编码方式,有0,1,1代表二进制,0为格雷编码,通常为二进制编码
%刻度,有0,1,0为算数刻度,1为对数刻度,通常为算数刻度
%第六个是否包含左边界
%第七个是否包含右边界
Chrom = crtbp(NIND,PRECI*2);%初始化种群
%优化
gen = 0;%计数器
XY = bs2rv(Chrom,FieldD);%转化为十进制,
X=XY(:,1);Y=XY(:,2);
ObjV=Y.*X.*cos(2*pi.*X)+X.*sin(2.*pi.*Y);
while gen<MAXGEN
FitnV = ranking(-ObjV);%分配适应度,这里注意ranking函数是计算最小值并排序,所以这里取负号。
SelCh = select('sus',Chrom,FitnV,GGAP);%选择
SelCh = recombin('xovsp',SelCh,px);%重组
SelCh = mut(SelCh,pm);%变异
XY = bs2rv(SelCh,FieldD);%转十进制
X = XY(:,1);Y = XY(:,2);
ObjVSel = Y.*X.*cos(2*pi.*X)+X.*sin(2.*pi.*Y);
[Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel);%重插入子代到父代;
XY = bs2rv(Chrom,FieldD);
gen = gen+1;
%获取每代的最优解及其序号,Y为最优解,I为个体的序号。
[Y,I] = max(ObjV);
trace(1:2,gen) = XY(I,:);
trace(3,gen) = Y;
end
plot3(trace(1,:),trace(2,:),trace(3,:),'bo');
grid on;
plot3(XY(:,1),XY(:,2),ObjV,'bo');
hold off;
%画进化图
figure(2);
plot(1:MAXGEN,trace(3,:));
grid on
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
bestZ = trace(3,end);
bestX = trace(1,end);
bestY = trace(2,end);
fprintf(['最优解:\nX = ',num2str(bestX),'\nY=',num2str(bestY),'\nZ = ',num2str(bestZ),'\n'])