clear;
clc;
%设定参数
psize=50;%种群规模
d=50;%迭代次数
cod=15 ;%染色体基因位数
pmate=0.7;%交叉概率
pvary=0.05;%变异概率
xmin1=-10;
xmin2=-10;
xmin3=-10;
xmax1=10;
xmax2=10;
xmax3=10;
% 随机产生初始编码
E=round(rand(psize,3*cod)); % 随机产生初始代码
%main
gbestf=1000;%初始全局最大适应值
for t=1:1:d;
t=t;
for i=1:1:psize
m=E(i,:);
m1=m(1:1:cod);
m2=m(cod+1:1:2*cod);
m3=m(2*cod+1:1:3*cod);
a1=0;a2=0;a3=0;
%**********基因位大小为左向右依次增大
for j=1:1:cod
a1=a1+m1(j)*2^(j-1);
a2=a2+m2(j)*2^(j-1);
a3=a3+m3(j)*2^(j-1);
end
x1=xmin1+a1*(xmax1-xmin1)/(2^cod-1);
x2=xmin2+a2*(xmax2-xmin2)/(2^cod-1);
x3=xmin3+a3*(xmax3-xmin3)/(2^cod-1);
f(i)=x1^2+x2^2+x3^2;
end
clear i;clear j;clear a1;clear a2;clear a3;clear m1;clear m2;clear m3;
clear x1;clear x2;clear x3;clear m;
%****** Step 1 :最大适应值比较 ******
[Oderf,Indexf]=sort(f); % 从小到大排列
BestS=E(Indexf(1),:); % 最小适应值对应的变量编码
bestf(t)=min(f); % 每一代的最大适应值
if bestf(t)<gbestf
gbestf=bestf(t); % 保留全局最好个体适应值
gbests=BestS; % 保留最后的全局最好个体
end
gbestfstep(t)=gbestf; % 保留每一代的全局最好个体
% ########step2#######用轮盘赌法来选择##########
%****************计算每个个体概率***********
sum=sum(f);
for j=1:1:psize
p(j)=f(j)/sum;
end
clear sum;clear j;clear f;
%**************计算每个个体概率累加区间****************
sum=0;
for j=1:1:psize
sum=sum+p(j);
v(j)=sum;
end
clear sum;clear j;clear p;
vr=rand(1,psize);%%随机产生轮盘选择概率
for i=1:1:psize
for j=1:1:psize
if j==1
if vr(i)<=v(j)
Enew(i,:)=E(j,:);
end
else
if ((vr(i)>v(j-1))&(vr(i)<=v(j)))
Enew(i,:)=E(j,:);
end
end
end
end
clear vr;clear v;clear i;clear j;
% 选择后的编码数据随机重新排列
a=randperm(psize);
for i=1:psize
Enewr(i,:)=Enew(a(:,i),:);
end
clear a;clear Enew;clear i;
%***********新群体进行交叉选择*************
s=0;k=0;
p1=rand(1,psize);
for i=1:psize
if p1(1,i)<pmate
mat(k+1,:)=Enewr(i,:);
k=k+1;
else
lef(s+1,:)=Enewr(i,:);
s=s+1;
end
end
clear i;clear j;clear s;clear k;
% 如果筛选出来的是奇数,随机选出单亲遗传的一组mat1,交叉配对的为mat2
[a,b]=size(mat);
if mod(a,2)==1 %mod为取余函数如果为奇数则继续
num=randperm(a);%对a组数据进行重新排列
for i=1:a
mat0(i,:)=mat(num(:,i),:);
end
%*****************当个体为单数时随机选出单亲遗传的和交叉的个体********%
for j=1:a
if j<a
mat2(j,:)=mat0(j,:);
else
mat1(1,:)=mat0(a,:);
m1=ceil(3*cod*rand); %产生基因交换算子
m2=ceil(3*cod*rand);
aa=mat1(1,m1);%单基因遗传
mat1(1,m1)=mat2(1,m2);
mat2(1,m2)=aa;
end
end
else
mat2=mat;%当选出的个体为偶数时
end
clear i;clear j;clear num;clear mat0;clear b;clear m1;clear m2;
clear aa;
%**********************选择交叉点***********************************%
n1=ceil(3*cod*rand);
n2=ceil(3*cod*rand);
%**********************选择交叉对象***********************************%
[a1,b1]=size(mat2);
for i=1:2:a1
for j=n1:1:n2
tt=mat2(i,j);
mat2(i,j)=mat2(i+1,j);
mat2(i+1,j)=tt;
end
end
clear a1;clear b1;clear tt;clear i;clear j;clear n1;clear n2;
%************************组成交叉后的新的种群************************************%
[a2,b2]=size(mat2);
Enewj=rand(10,45);
if a2==psize
Enewj=mat2;
else
if a2==a
Enewj(1:a2,:)=mat2;
Enewj(a2+1:psize,:)=lef(1:psize-a2,:);
else
Enewj(1:a2,:)=mat2;
Enewj(a2+1:psize-1,:)=lef(1:psize-1-a2,:);
Enewj(psize,:)=mat1;
end
end
clear a2;clear b2;clear a;clear lef;
%************************基因变异*********************************%
for i=1:1:psize
for j=1:1:3*cod
a=rand;
if a<pvary
if Enewj(i,j)==0
Enewj(i,j)=1;
else
Enewj(i,j)=0;
end
end
end
end
clear a;clear i;clear j;
E=Enewj;
%pause
end;
min=gbestf;
figure(1);
plot(1:d,gbestfstep,'--r',1:d,bestf,'-.b');
xlabel('times');ylabel('gbestf');