www.pudn.com > ga_cheliangjiaotong.rar > Cross1.m, change:2014-11-20,size:2113b


function ret=Cross1(pcross,lenchrom,chrom,sizepop,bound) 
%本函数完成交叉操作 
% pcorss                input  : 交叉概率 
% lenchrom              input  : 染色体的长度 
% chrom     input  : 染色体群 
% sizepop               input  : 种群规模 
% ret                   output : 交叉后的染色体 
k1 = 0.6;   k2 = 0.7; 
k3 = 0.001;  k4 = 0.01; 
% 计算适应度 
for j=1:sizepop 
    x=chrom(j,:);    % 解码 
    f(j)=fun1(x);     % 染色体的适应度  
end 
fmax = max(f);      % 适应度最大值 
fmin = min(f);      % 适应度最小值 
favg = mean(f);     % 适应度平均值 
 
 for i=1:sizepop  %每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,%但该轮for循环中是否进行交叉操作则由交叉概率决定(continue控制) 
     % 随机选择两个染色体进行交叉 
     pick=rand(1,2);        
     while prod(pick)==0 
         pick=rand(1,2); 
     end 
     index=ceil(pick.*sizepop);   
      
     f1 = fun1( chrom(index(1),:) );  % 个体适应度值 
     f2 = fun1( chrom(index(2),:) );  % 个体适应度值 
     f3 = max(f1,f2);                % 两者中大者 
     if f3>=favg 
         pcross = k1*(fmax - f3)./(fmax-favg); 
     else 
         pcross = k2; 
     end 
      
     % 交叉概率决定是否进行交叉 
     pick=rand; 
     while pick==0 
         pick=rand; 
     end 
     if pick>pcross 
         continue; 
     end 
     flag=0; 
     while flag==0 
         % 随机选择交叉位 
         pick=rand; 
         while pick==0 
             pick=rand; 
         end 
         pos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同 
         pick=rand; %交叉开始 
         v1=chrom(index(1),pos); 
         v2=chrom(index(2),pos); 
         chrom(index(1),pos)=pick*v2+(1-pick)*v1; 
         chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束 
         flag1=test(lenchrom,bound,chrom(index(1),:));  %检验染色体1的可行性 
         flag2=test(lenchrom,bound,chrom(index(2),:));  %检验染色体2的可行性 
         if   flag1*flag2==0 
             flag=0; 
         else flag=1; 
         end    %如果两个染色体不是都可行,则重新交叉 
     end 
 end 
ret=chrom;