用遗传算法求函数的最大值MATLAB程序
2 MATLAB
利用遗传算法求解 f(x) = x ,0≤ x≤ 31的最大值。 程序如下:
clear
clc
total=1; %总的进化代数
Num=0;
MaN1=0;
MaN2=0;
flag=0;
N1=initialize();
N2=initialize();
N3=initialize();
N4=initialize();
%复制-reproduction
while 1
while 1
DecN1=BinToDec(N1);%计算适配度
DecN2=BinToDec(N2);
DecN3=BinToDec(N3);
DecN4=BinToDec(N4);
f1=DecN1^2;
f2=DecN2^2;
f3=DecN3^2;
f4=DecN4^2;
ttt=[f1,f2,f3,f4];
if flag==0
MaN1=max(ttt);
else
MaN2=max(ttt);
end
if MaN1==MaN2
Num=Num+1;
else
Num=0;
end
sum=f1+f2+f3+f4;
aver=sum/4;
n1=round(f1/aver); %实际得到的复制个数
n2=round(f2/aver);
n3=round(f3/aver);
n4=round(f4/aver);
N=n1+n2+n3+n4; %总的复制个数
if N~=4 %引入N:保持原种群大小不变
N1=initialize();
N2=initialize();
N3=initialize();
N4=initialize();
total=1;
Num=0;
MaN1=0;
MaN2=0;
flag=0;
continue;
else
break;
end
end
temp1=cal(N1,n1);
temp2=cal(N2,n2);
temp3=cal(N3,n3);
temp4=cal(N4,n4);
M=[temp1;temp2;temp3;temp4];
N1=M(1,:);
N2=M(2,:);
N3=M(3,:);
N4=M(4,:);
%交叉-crossover
while 1
p=floor(1000*rand);
if p>1
break;
else
continue;
end
end
k=mod(p,3);
switch k
case0
[N1,N2,N3,N4,ps]=crossover(N1,N2,N3,N4);
case1
[N1,N3,N2,N4,ps]=crossover(N1,N3,N2,N4);
case2
[N1,N4,N2,N3,ps]=crossover(N1,N4,N2,N3);
end
%变异-mutation
U=[N1,N2,N3,N4];
pos=mod(floor(1000*rand),20)+1;
if U(1,pos)==0
U(1,pos)=1;
else
U(1,pos)=0;
end
N1=U(1,1:5);
N2=U(1,6:10);
N3=U(1,11:15);
N4=U(1,16:20);
%遗传算法结束条件:连续10代最大值均保持一致
if Num==10
disp('进化代