五月份好久都没写博客了。我辈工科生当自强,好好学习技术。
言归正传,本学期我是选了一门matlab的选修课的。最近使用matlab,应用遗传算法求解目标函数的最大值。私以为这个算法还是很牛逼的,所以在这里分享给大家。
代码:
%用遗传算法求函数f(x1,x2)=100(x1^2-x2)^2+(1-x1)^2的最大值,-2.048<=x1,x2<=2.048
Umax=2.048;Umin=-2.048;
N=80;%种群规模
T=100;%迭代到第几代
Pc=0.8;%交叉概率
Pm=0.05;%变异概率
L=10;%编码长度
bval=round(rand(N,2*L));%随机产生初始种群的80个个体
obj=zeros(1,N);%种群每个个体对应的函数f(x1,x2)的值
for ii=1:T
for i=1:N
y1=0;y2=0;
for j=1:L
y1=y1+bval(i,L-j+1)*2^(j-1);
end
for j=1:L
y2=y2+bval(i,2*L-j+1)*2^(j-1);
end
%把种群中个体解码为对应的x1和x2
x1=(Umax-Umin)*y1/(2^L-1)+Umin;%把编码左边L位解码为x1
x2=(Umax-Umin)*y2/(2^L-1)+Umin;%把编码右边L位解码为x2
obj(i)=100*(x1*x1-x2).^2+(1-x1).^2;%计算x1和x2对应的函数f(x1,x2)的值,即每个个体的适应度
xx(i,:)=[x1,x2];
end
func=obj;%适应度函数
%fsum=sum(func);
p=func/sum(func);%求每个个体的选择概率
q=cumsum(p);%求累加概率
[fmax,indmax]=max(func);%求最佳个体
bestv=-inf;
if fmax>=bestv
bestv=fmax;
bvalxx=bval(indmax,:);
optxx=xx(indmax,:);
end
for i=1:N-1
r=rand;%相当于rand(1)
tmp=find(r<=q);%设置一个下限
newbval(i,:)=bval(tmp(1),:);%79行的矩阵
end
newbval(N,:)=bvalxx;%最优个体保留
bval=newbval;%更新bval的矩阵
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
%变异
cm=rand;
if cm<Pm
point=ceil(rand*(2*L-1));%取一个1到2L-1的整数,作为变异点
bval(i,point)=~bval(i,point);%point 是一个点
end
end
end
bestv,optxx
%绘图,观察函数图象,确定最大值点的位置
[x,y]=meshgrid(-2.05:0.01:2.05);
z=100*(x.*x-y).^2+(1-x).^2;
mesh(x,y,z);
x1=2.048,y1=2.048,
z1=100*(x1.*x1-y1).^2+(1-x1).^2
x2=2.048,y2=-2.048
z2=100*(x2.*x2-y2).^2+(1-x2).^2,
x3=-2.048,y3=2.048,
z3=100*(x3.*x3-y3).^2+(1-x3).^2,
x4=-2.048,y4=-2.048,
z4=100*(x4.*x4-y4).^2+(1-x4).^2
%axis([-2.048,2.048,-2.048,2.048,-4000,4000]);
代码中求得的最优值在bestv以及最优值所对应的最优解存储在optxx中。
代码跑完之后绘制出的图形:
我总是觉得,matlab画的图看着还是很舒服的。继续努力学习为了画更漂亮的图。
代码跑完之后的命令窗口:
最终我们借助遗传算法,计算出了该函数的最优值(最大值),以及最优解。