?? cross.m
字號:
%對染色體進行交叉運算
function NewW=cross(NewW,gc,gm)
%交叉取值率
Pc=0.1;
%計算交叉次數(shù)
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -