传算法(英语:genetic algorithm (GA))是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。
clc;clear;
%Rosenbrock函数的极大值0-1编码的GA算法
%初始参数
tic;
Size=80;
G=100;
CodeL=10;
umax=5.12;
umin=-5.12;
E=round(rand(Size,3*CodeL)); %生成初始种群
%主程序
for k=1:1:G
time(k)=k;
for s=1:1:Size
m=E(s,:);
y1=0;y2=0; y3=0;
%解码方法
m1=m(1:1:CodeL);
for i=1:1:CodeL
y1=y1+m1(i)*2^(i-1);
end
x1=(umax-umin)*y1/1023+umin;
m2=m(CodeL+1:1:2*CodeL);
for i=1:1:CodeL
y2=y2+m2(i)*2^(i-1);
end
x2=(umax-umin)*y2/1023+umin;
m3=m(2*CodeL+1:1:end);
for i=1:1:CodeL
y3=y3+m3(i)*2^(i-1);
end
x3=(umax-umin)*y3/1023+umin;
F(s)=x1^2+x2^2+x3^3;
end
%****** Step 1 : 选择最优个体 ******
BestJ(k)=min(F); %记录每一代中最大个体的函数值
fi=F; %适应度函数
[Oderfi,Indexfi]=sort(fi); %按照适应度大小排序
Bestfi=Oderfi(1); %Oderfi中最后一个即是最大的适应度
BestS=E(Indexfi(1),:); %记录每一代中最优个体的0-1编码
bfi(k)=Bestfi; %记录每一代中最优个体的适应度
%****** Step 2 : 选择与复制操作******
fi_sum=sum(fi);
fi_Size=(Oderfi/fi_sum)*Size; %计算个体相对适应度
fi_S=floor(fi_Size); %对80个个体依据相对适应度进行划分等级
kk=1;
for i=1:1:Size
for j=1:1:fi_S(i) %选择等级高的个体,等级越高被选次数越多
TempE(kk,:)=E(Indexfi(i),:);
kk=kk+1; %选择进入下一代个体的个数,显然不够80个个体
end
end
%************ Step 3 : 交叉操作 ************
pc=0.60;
n=ceil(20*rand);
for i=1:2:(Size-1)
temp=rand;
if pc>temp %交叉条件
TempE(i,n:end)=E(i+1,n:end);
TempE(i+1,n:end)=E(i,n:end);
end
end
TempE(Size,:)=BestS; %最优个体保留
E=TempE; %种群替换
%************ Step 4: 变异操作 **************
%pm=0.001;
%pm=0.001-[1:1:Size]*(0.001)/Size; %自适应变异概率
%pm=0.0; %没有变异
pm=0.1; %较大的变异概率
for i=1:1:Size
for j=1:1:2*CodeL
temp=rand;
if pm>temp %变异条件
if TempE(i,j)==0
TempE(i,j)=1;
else
TempE(i,j)=0;
end
end
end
end
TempE(Size,:)=BestS; %保留当代最优个体
E=TempE; %种群替换
end
%*************** 结果输出 *****************
Max_Value=Bestfi
BestS
x1
x2
figure(1);
plot(time,BestJ);
xlabel('Times');ylabel('Best J');
figure(2);
plot(time,bfi);
xlabel('times');ylabel('Best F');
toc;