%分层加速遗传算法
%*********输入参数***************
clear all;
clc;
popsize=900; %种群个数
num_ceng=30; %分层个数
sub_pop=popsize/num_ceng ; %每层种群的个数
pc=0.80; %杂交概率
pm=0.05; %变异概率
jingquedu=[0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01];
len=len_code(jingquedu);%len_code 返回各指标的编码长度
40
stringlength=sum(len) ; %编码长度
num=length(len); %投影指标的个数
%********编码******************************
x=initialise(popsize,stringlength,len);
count=0;
%**********分层遗传算法****************************
for i=1:num_ceng %i为组数,每组30个个体,30*30=900
while count<30 %迭代的最优值比上次好则循环进行; x(1+(i-1)*sub_pop:sub_pop*i,:)=roulette(x(1+(i-1)*sub_pop:sub_pop*i,:),len);
m=randint(1,1,sub_pop)+1;
n=randint(1,1,sub_pop)+1;
[g z]=crossover (x(m,:),x(n,:),pc,len); %随机找两行数组进行交叉
%将产生的新个体放入x中
x(m,:)=g;
x(n,:)=z;
%随机找一行数据进行变异;
w=round ( rand* (sub_pop-1) )+1+sub_pop*(i-1);
x(w,:)=mutation(x(w,:),pm,len) ;
count=count+1;
end %里面的num_ceng组进行遗传算法选择最优的种群;
l=max(x(1+(i-1)*sub_pop:sub_pop*i,end));
d=zeros(num_ceng,size(x,2));
for j=1+(i-1)*sub_pop:sub_pop*i
if x(j,end)==l
d(i,:)=x(j,:); %将30组群体中的最大适应度的个体组成新的群体进行下一层的遗传算法;
end
end
end
%*********************加速*************************
count=0;
while count<30 %迭代的最优值比上次好则循环进行;
d=roulette(d,len); %数据数据时不用在进行初始化
m=round ( rand* (num_ceng-2))+1;
n=round ( rand* (num_ceng-2))+1;
[g z]=crossover (d(m,:),d(n,:),pc,len); %随机找两行数组进行交叉
d(m,:)=g;
d(n,:)=z;
w=round ( rand* (num_ceng-2))+1;
d(w,:)=mutation(d(w,:),pm,len);%随机找一行数据进行变异,得到最有总群
count=count+1;
end
l=max(d(:,end)) %输出最优函数值;
41
for i=1:num_ceng
if d(i,end)==l
v=d(i,stringlength+1:stringlength+num); %输出最优种群中的最有个体值对的a取值;
end
end
v