📄 gaf1.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%遗传算法%%%%%%%%%%%%%%%%%%%%%%%%%
clear
k=0.1;
num=200;
z4=-100;
for e1=1:7
%产生初始种群
%**************************************************************************
t0=round(20000*rand(10));
t1=dec2bin(t0,15);
for i=2:2:100;
t(i/2,:)=[t1(i-1,:) t1(i,:)];
x(i/2,:)=t1(i-1,:);
y(i/2,:)=t1(i,:);
end %参数用二进制编码并两两组合成一个新二进制串
for e=1:num
%复制过程
%**************************************************************************
xd=bin2dec(x);
yd=bin2dec(y);
for i=1:50
if xd(i,:)==10000
xd(i,:)=xd(i,:)+1;
else if yd(i,:)==10000
yd(i,:)=yd(i,:)+1;
end
end
end %防止出现分母为零的情况
xd1=((xd./1000)-10);
yd1=((yd./1000)-10);
z=0.9*exp(((xd1+5).^2+(yd1+5).^2)./(-10))+0.9996*exp(((xd1-5).^2+(yd1-5).^2)./(-20)); %计算目标函数值
z1=[1:50];
z2=[z';z1];
for j=1:49
for i=1:(50-j)
if z2(1,i)>z2(1,(i+1));
z3=z2(:,i);
z2(:,i)=z2(:,(i+1));
z2(:,(i+1))=z3;
end
end
end %排序
for i=1:50
z3(z2(2,i),:)=k*i/50;
end %按照适配值的大小重新计算适配值
s=0;
for i=1:50
s=s+z3(i,:);
end
eq=s/50;
for i=1:50
j(i,:)=z(i,:)/s;
m(i,:)=z(i,:)/eq;
end
m1=round(m); %计算期望的复制个数
s1=0;
for i=1:50
s1=s1+m1(i,:);
end
i1=s1-50;
if i1>0
for i=1:i1
a(i)=round(50*rand);
if a(i)==0
a(i)=a(i)+1;
end
while m1(a(i))==0
a(i)=round(50*rand);
if a(i)==0
a(i)=a(i)+1;
end
end
m1(a(i))=m1(a(i))-1;
end
end %处理复制的个数多于规定的数目的情况
if i1<0
i1=abs(i1);
for i=1:i1
a(i)=round(50*rand);
if a(i)==0
a(i)=a(i)+1;
end
while m1(a(i))==0
a(i)=round(50*rand);
if a(i)==0
a(i)=a(i)+1;
end
end
m1(a(i))=m1(a(i))+1;
end
end %处理复制的个数少于规定的数目的情况
n=1;
for i=1:50
if m1(i,:)==0
continue;
end
for j=1:m1(i,:)
t2(n,:)=t(i,:);
n=n+1;
end
end %复制 t2为复制以后的种群
%交叉过程
%**************************************************************************
t3=t2;
for i=1:50
r=round(rand*50);
while r==0
r=round(rand*50);
end
t3(i,:)=t2(r,:);
t3(r,:)=t2(i,:);
end %随机两两配对 t3为配对后的种群
t4=t3;
for i=1:2:50
r=round(rand*29);
while r==0
r=round(rand*29);
end
t4(i,:)=[t3(i,1:r) t3((i+1),(r+1):30)];
t4(i+1,:)=[t3((i+1),1:r) t3(i,(r+1):30)];
end %交叉 t4为交叉后的种群
%变异过程
%**************************************************************************
for i=1:15
r1=round(rand*29);
r2=round(rand*49);
if r1==0
r1=30;
end
if r2==0
r2=50;
end
if t4(r2,r1)==0
t4(r2,r1)=1;
else t4(r2,r1)=0;
end
end
%**************************************************************************
t=t4;
for i=1:50
x(i,:)=t4(i,1:15);
y(i,:)=t4(i,16:30);
end
if z4<z2(1,50);
z4=z2(1,50);
x4=xd1(z2(2,50),:);
y4=yd1(z2(2,50),:);
fprintf('第')
disp(e1)
fprintf('个随机生成的初始种群中第')
disp(e)
fprintf('代得到')
fprintf('x的值为:')
disp(x4)
fprintf('y的值为:')
disp(y4)
fprintf('z的值为:')
disp(z4)
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -