📄 yichuansuanfa2.m
字号:
a=zeros(20,33); %存染色体20个
aby=zeros(20,33); %起缓冲作用
aby2=zeros(20,33); %起缓冲作用
x1=-3:0.7947:12.1; %存x1
x2=4.1:0.0894:5.8; %存x2
xb1=round((2^18-1)/15.1*(x1+3)); %存变换后的x1
xb2=round((2^15-1)/1.7*(x2-4.1)); %存变换后的x2
%产生第一代染色体
for i=1:20
for j=18:-1:1
a(i,j)=mod(xb1(i),2);
xb1(i)=floor(xb1(i)/2);
end
for j=33:-1:19
a(i,j)=mod(xb2(i),2);
xb2(i)=floor(xb2(i)/2);
end
end
%产生后代
for k=1:1000
fsum =0; %适值之和
for i=1:20
xb1(i)=2^17*a(i,1)+2^16*a(i,2)+2^15*a(i,3)+2^14*a(i,4)+2^13*a(i,5)+2^12*a(i,6)+2^11*a(i,7)+2^10*a(i,8)+2^9*a(i,9)+2^8*a(i,10)+2^7*a(i,11)+2^6*a(i,12)+2^5*a(i,13)+2^4*a(i,14)+2^3*a(i,15)+2^2*a(i,16)+2*a(i,17)+a(i,18);
xb2(i)=2^14*a(i,19)+2^13*a(i,20)+2^12*a(i,21)+2^11*a(i,22)+2^10*a(i,23)+2^9*a(i,24)+2^8*a(i,25)+2^7*a(i,26)+2^6*a(i,27)+2^5*a(i,28)+2^4*a(i,29)+2^3*a(i,30)+2^2*a(i,31)+2*a(i,32)+a(i,33);
x1(i)=15.1/(2^18-1)*xb1(i)-3;
x2(i)=1.7/(2^15-1)*xb2(i)+4.1;
f(i)=21.5+x1(i)*sin(4*pi*x1(i))+x2(i)*sin(20*pi*x2(i)); %适值
fsum=fsum+f(i);
end
for i=1:20
n(i)=round(f(i)/fsum*20) ; %根据适值计算第i个染色体的后代数
if n(i)<0.7
n(i)=0;
end
if n(i)>1.3 && n(i)<2
n(i)=2;
end
end
count=20;
for i=1:20
if n(i)>0
for m=(count+1):(count+n(i))
for j=1:33
aby(m,j)=a(i,j);
end
end
end
count=count+n(i);
end
for m=1:count
xb1(m)=2^17*aby(m,1)+2^16*aby(m,2)+2^15*aby(m,3)+2^14*aby(m,4)+2^13*aby(m,5)+2^12*aby(m,6)+2^11*aby(m,7)+2^10*aby(m,8)+2^9*aby(m,9)+2^8*aby(m,10)+2^7*aby(m,11)+2^6*aby(m,12)+2^5*aby(m,13)+2^4*aby(m,14)+2^3*aby(m,15)+2^2*aby(m,16)+2*aby(m,17)+aby(m,18);
xb2(m)=2^14*aby(m,19)+2^13*aby(m,20)+2^12*aby(m,21)+2^11*aby(m,22)+2^10*aby(m,23)+2^9*aby(m,24)+2^8*aby(m,25)+2^7*aby(m,26)+2^6*aby(m,27)+2^5*aby(m,28)+2^4*aby(m,29)+2^3*aby(m,30)+2^2*aby(m,31)+2*aby(m,32)+aby(m,33);
x1(m)=15.1/(2^18-1)*xb1(m)-3;
x2(m)=1.7/(2^15-1)*xb2(m)+4.1;
f(m)=21.5+x1(m)*sin(4*pi*x1(m))+x2(m)*sin(20*pi*x2(m));
end
for u=1:count
for v=1:(count-1)
if f(v)<f(v+1)
fjh=f(v);
f(v)=f(v+1);
f(v+1)=fjh;
for j=1:33
abyjh=aby(v,j);
aby(v,j)=aby(v+1,j);
aby(v+1,j)=abyjh;
end
end
end
end
a=aby;
%产生交换,有两组交换
%产生要交换的4组染色体
ihh=ceil(rand(4,1)*20);
while ihh(2)==ihh(1)
ihh(2)=ceil(rand()*20);
end
while ihh(3)==ihh(1)||ihh(3)==ihh(2)
ihh(3)=ceil(rand()*20);
end
while ihh(4)==ihh(1)||ihh(4)==ihh(2)||ihh(4)==ihh(3)
ihh(4)=ceil(rand()*20);
end
%产生从第几个数交换
ihl=ceil(rand(2,1)*33);
%进行交换
jh=0;
for j=ihl(1):33
jh=a(ihh(1),j);
a(ihh(1),j)=a(ihh(2),j);
a(ihh(2),j)=jh;
end
for j=ihl(2):33
jh=a(ihh(3),j);
a(ihh(3),j)=a(ihh(4),j);
a(ihh(4),j)=jh;
end
%进行变异
l=ceil(rand()*50);
if l==1 % 2%的概率变异
byh=ceil(rand()*20);
byl=ceil(rand()*33);
if a(byh,byl)==1
a(byh,byl)=0;
else
a(byh,byl)=1;
end
end
end
for i=1:20
xb1(i)=2^17*a(i,1)+2^16*a(i,2)+2^15*a(i,3)+2^14*a(i,4)+2^13*a(i,5)+2^12*a(i,6)+2^11*a(i,7)+2^10*a(i,8)+2^9*a(i,9)+2^8*a(i,10)+2^7*a(i,11)+2^6*a(i,12)+2^5*a(i,13)+2^4*a(i,14)+2^3*a(i,15)+2^2*a(i,16)+2*a(i,17)+a(i,18);
xb2(i)=2^14*a(i,19)+2^13*a(i,20)+2^12*a(i,21)+2^11*a(i,22)+2^10*a(i,23)+2^9*a(i,24)+2^8*a(i,25)+2^7*a(i,26)+2^6*a(i,27)+2^5*a(i,28)+2^4*a(i,29)+2^3*a(i,30)+2^2*a(i,31)+2*a(i,32)+a(i,33);
x1(i)=15.1/(2^18-1)*xb1(i)-3;
x2(i)=1.7/(2^15-1)*xb2(i)+4.1;
f(i)=21.5+x1(i)*sin(4*pi*x1(i))+x2(i)*sin(20*pi*x2(i)); %适值
end
fmax=f(1);
x1max=x1(1);
x2max=x2(1);
for i=2:20
if f(i)>fmax
fmax=f(i);
x1max=x1(i);
x2max=x2(i);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -