% GA_zuiyou
clc;clear
x=-1:0.01:2;
y=2+x.*sin(10*pi*x);
plot(x,y,'LineWidth',1.5);
hold on
%初始化参数
T=100;%仿真代数
N=10;% 群体规模
pc=0.8;pm=0.05;%交叉变异概率
umax=2;umin=-1;%参数取值范围
L=12;%单个参数字串长度,总编码长度 L
bval=round(rand(N,L)); %生成初始种群
bestv=-inf;%最优适应度初值 %迭代开始
for ii=1:T
%解码,计算适应度
for i=1:N
y1=0;
for j=1:1:L
y1=y1+bval(i,L-j+1)*2^(j-1);
end
x=(umax-umin)*y1/(2^L-1)+umin; %二进制变十进制
obj(i)=2+x.*sin(10*pi*x);
xx(i,:)=x;
plot(x,obj(i),'k*');
hold on
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
Best(ii)=fmax;
Bfit1(ii)=bestv; % 存储代的最优适应度
%%%%遗传操作开始 %轮盘赌选择
for i=1:N
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*(L-1)); %交叉点数
ch=bval(i,:);
bval(i,point+1:L)=bval(i+1,point+1:L);
bval(i+1,point+1:L)=ch(1,point+1:L);
end
end
% bval(N,:)=bvalxx;%最优保留
%位点变异
for i=1:N
for j=1:(L)
pb=rand;
if(pb<pm)
bval(i,j)=1-bval(i,j);
end
end
end
end %输出
figure(2) ;
plot(Best,'LineWidth',1.5);% 最优适应度进化曲线
hold on
plot(Bfit1,'k','LineWidth',1.5);% 最优适应度进化曲线
hold on
plot(max(y)*ones(1,100),'-.r','LineWidth',1.5);
%bestv; %输出最优适应度值
%optxx; %输出最优参数
axis([1,100,0,4])
max(y)
bestv;
optxx;