www.gusucode.com > matlab编程遗传算法计算匹配电路源码程序 > code1/code/MATLAB源代码/recombin_structure.m

    function NewChrom = recombin_structure(OldChrom,num_integer,num_parameter,SUBPOP)
%recombin_structure 离散重组,对结构进行重组,电气参数随着结构一起移动
%   num_integer为结构的总数,num_parameter为每个结构所含的电气参数的数量
[Nind,Lind]=size(OldChrom);
NewChrom=zeros(Nind,Lind);
Xops = floor(Nind/2);             %用于重组的父母的对数
Mask1 = (rand(Xops,num_integer)<0.5);     %子代1的掩码
Mask2 = (rand(Xops,num_integer)<0.5);     %子代2的掩码
%Mask = (rand(Nind/SUBPOP,num_integer)<0.5);     %子代的掩码

odd = 1:2:Nind-1;        %奇数行
even= 2:2:Nind;          %偶数行
i=1:num_parameter:(num_parameter*num_integer);     %用于电气参数的移动

%[x,y]=sort(rand(Nind/SUBPOP,Nind/SUBPOP));
%for order_subpop=0:SUBPOP-1;
%子代的结构重组
%NewChrom(order_subpop*(Nind/SUBPOP)+1:(order_subpop+1)*Nind/SUBPOP,1:num_integer)=OldChrom(order_subpop*SUBPOP+y(:,1),1:num_integer).*Mask+OldChrom(order_subpop*SUBPOP+y(:,2),1:num_integer).*(~Mask);
%子代的电气参数重组
%for k=0:num_parameter-1;
%       NewChrom(order_subpop*(Nind/SUBPOP)+1:(order_subpop+1)*Nind/SUBPOP,num_integer+i+k)=OldChrom(order_subpop*SUBPOP+y(:,1),num_integer+i+k).*Mask+OldChrom(order_subpop*SUBPOP+y(:,2),num_integer+i+k).*(~Mask);
%end
%end
NewChrom(odd,1:num_integer)  = (OldChrom(odd,1:num_integer).* Mask1) + (OldChrom(even,1:num_integer).*(~Mask1));    %子代1的结构重组
NewChrom(even,1:num_integer) = (OldChrom(odd,1:num_integer).* Mask2) + (OldChrom(even,1:num_integer).*(~Mask2));    %子代2的结构重组
for k=0:num_parameter-1;
      NewChrom(odd,num_integer+i+k)  = (OldChrom(odd,num_integer+i+k).* Mask1) + (OldChrom(even,num_integer+i+k).*(~Mask1));       %电气参数移动
      NewChrom(even,num_integer+i+k)  = (OldChrom(odd,num_integer+i+k).* Mask2) + (OldChrom(even,num_integer+i+k).*(~Mask2));       %电气参数移动
end

if rem(Nind,2)                %如果个体的数目为奇数,则最后一个个体不进行重组,直接复制到新的种群中
  NewChrom(Nind,:)=OldChrom(Nind,:); 
end
end