www.pudn.com > yhzgah_sars.rar > cross.m


%对染色体进行交叉运算 
function NewW=cross(NewW,gc,gm) 
%交叉取值率 
Pc=0.1; 
%计算交叉次数 
m=[size(NewW(1).w1,1),size(NewW(1).w2,1),size(NewW(1).b1,1),size(NewW(1).b2,1)]; 
n=[size(NewW(1).w1,2),size(NewW(1).w2,2),size(NewW(1).b1,2),size(NewW(1).b2,2)]; 
P=length(NewW); 
CrossNum=Pc*m.*n*P; 
for i=1:CrossNum(1) 
    %随机选取两个父代参与交叉操作 
    a1=floor(2+(P-2)*rand+0.5); 
    a2=floor(2+(P-2)*rand+0.5); 
    %随机选取染色体上参与交叉操作的元素 
    b=floor(1+(m(1)-1)*rand+0.5); 
    c=floor(1+(n(1)-1)*rand+0.5); 
    %参与交叉的父代染色体 
    p1=NewW(a1).w1(b,c); 
    p2=NewW(a2).w1(b,c); 
    a=rand; 
    %线性交叉运算 
    p1=p1*a+p2*(1-a); 
    p2=p1*(1-a)+p2*a; 
    %子代替代其父代 
    NewW(a1).w1(b,c)=p1; 
    NewW(a2).w1(b,c)=p2; 
end 
for i=1:CrossNum(2) 
    %随机选取两个父代参与交叉操作 
    a1=floor(2+(P-2)*rand+0.5); 
    a2=floor(2+(P-2)*rand+0.5); 
    %随机选取染色体上参与交叉操作的元素 
    b=floor(1+(m(2)-1)*rand+0.5); 
    c=floor(1+(n(2)-1)*rand+0.5); 
    %参与交叉的父代染色体 
    p1=NewW(a1).w2(b,c); 
    p2=NewW(a2).w2(b,c); 
    a=rand; 
    %线性交叉运算 
    p1=p1*a+p2*(1-a); 
    p2=p1*(1-a)+p2*a; 
    %子代替代其父代 
    NewW(a1)=NewW(a1); 
    NewW(a1).w2(b,c)=p1; 
    NewW(a2).w2(b,c)=p2; 
end 
for i=1:CrossNum(3) 
    %随机选取两个父代参与交叉操作 
    a1=floor(2+(P-2)*rand+0.5); 
    a2=floor(2+(P-2)*rand+0.5); 
    %随机选取染色体上参与交叉操作的元素 
    b=floor(1+(m(3)-1)*rand+0.5); 
    c=floor(1+(n(3)-1)*rand+0.5); 
    %参与交叉的父代染色体 
    p1=NewW(a1).b1(b,c); 
    p2=NewW(a2).b1(b,c); 
    a=rand; 
    %线性交叉运算 
    p1=p1*a+p2*(1-a); 
    p2=p1*(1-a)+p2*a; 
    %子代替代其父代 
    NewW(a1)=NewW(a1); 
    NewW(a1).b1(b,c)=p1; 
    NewW(a2).b1(b,c)=p2; 
end 
for i=1:CrossNum(4) 
    %随机选取两个父代参与交叉操作 
    a1=floor(2+(P-2)*rand+0.5); 
    a2=floor(2+(P-2)*rand+0.5); 
    %随机选取染色体上参与交叉操作的元素 
    b=floor(1+(m(4)-1)*rand+0.5); 
    c=floor(1+(n(4)-1)*rand+0.5); 
    %参与交叉的父代染色体 
    p1=NewW(a1).b2(b,c); 
    p2=NewW(a2).b2(b,c); 
    a=rand; 
    %线性交叉运算 
    p1=p1*a+p2*(1-a); 
    p2=p1*(1-a)+p2*a; 
    %子代替代其父代 
    NewW(a1)=NewW(a1); 
    NewW(a1).b2(b,c)=p1; 
    NewW(a2).b2(b,c)=p2; 
end