📄 yichuansuanfa1.m
字号:
a=zeros(20,9); %存染色体20个
aby=zeros(20,9); %起缓冲作用
x=0.25:0.25:5; %存x
xb=floor(511/5*x); %存变换后的x
%产生第一代染色体
for i=1:20
for j=9:-1:1
a(i,j)=mod(xb(i),2);
xb(i)=floor(xb(i)/2);
end
end
%产生后代
for k=1:1000
fsum =0; %适值之和
for i=1:20
xb(i)=2^8*a(i,1)+2^7*a(i,2)+2^6*a(i,3)+2^5*a(i,4)+2^4*a(i,5)+2^3*a(i,6)+2^2*a(i,7)+2*a(i,8)+a(i,9);
x(i)=5/511*xb(i);
f(i)=x(i)^3; %适值
fsum=fsum+f(i);
end
count=0;
nsum=0;
for i=1:20
n(i)=round(f(i)/fsum*20) ; %根据适值计算第i个染色体的后代数
if n(i)<0.7
n(i)=0;
end
nsum=nsum+n(i);
end
if nsum==20
for i=1:20
if n(i)>0
for m=(count+1):(count+n(i))
for j=1:9
aby(m,j)=a(i,j);
end
end
end
count=count+n(i);
end
elseif nsum<20
while nsum<20
z=ceil(rand()*20);
while n(z)==0
z=ceil(rand()*20);
end
n(z)=n(z)+1;
nsum=nsum+1;
end
for i=1:20
if n(i)>0
for m=(count+1):(count+n(i))
for j=1:9
aby(m,j)=a(i,j);
end
end
end
count=count+n(i);
end
elseif nsum>20
while nsum>20
z=ceil(rand()*20);
while n(z)<1
z=ceil(rand()*20);
end
n(z)=n(z)-1;
nsum=nsum-1;
end
for i=1:20
if n(i)>0
for m=(count+1):(count+n(i))
for j=1:9
aby(m,j)=a(i,j);
end
end
end
count=count+n(i);
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)*9);
%进行交换
jh=0;
for j=ihl(1):9
jh=a(ihh(1),j);
a(ihh(1),j)=a(ihh(2),j);
a(ihh(2),j)=jh;
end
for j=ihl(2):9
jh=a(ihh(3),j);
a(ihh(3),j)=a(ihh(4),j);
a(ihh(4),j)=jh;
end
%进行变异
l=ceil(rand()*100);
if l==1 % 1%的概率变异
byh=ceil(rand()*20);
byl=ceil(rand()*9);
if a(byh,byl)==1
a(byh,byl)=0;
else
a(byh,byl)=1;
end
end
end
for i=1:20
xb(i)=2^8*a(i,1)+2^7*a(i,2)+2^6*a(i,3)+2^5*a(i,4)+2^4*a(i,5)+2^3*a(i,6)+2^2*a(i,7)+2*a(i,8)+a(i,9);
x(i)=5/511*xb(i);
f(i)=x(i)^3;
end
fmax=f(1);
xmax=x(1);
for i=2:20
if f(i)>fmax
fmax=f(i);
xmax=x(i);
end
end
fmax=round(fmax*10)/10; %保留小数点后一位
xmax=round(xmax*10)/10; %保留小数点后一位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -