📄 crossover.m
字号:
function popnew=crossover(pop,pcro,popsize,ncity)
%交叉函数
%pcro为交叉概率
n=1;
i=0;
while (n<=popsize)
rk=rand();
if rk<pcro
b(i+1)=n;
i=i+1;
end
n=n+1;
if i==2
pos1=fix(rand()*ncity)+1; %随机产生交叉点
pos2=fix(rand()*ncity)+1;
if pos1>pos2
temp=pos1;
pos1=pos2;
pos2=temp;
end
if pos1~=pos2
s(1,:)=pop(b(1),:);
s(2,:)=pop(b(2),:);
j=1;
for k=pos1+1:pos2-1 %保存交叉位置
w(1,j)=pop(b(2),k);
w(2,j)=pop(b(1),k);
j=j+1;
end
for k=1:2 %将原序列逆序
for i=1:ncity-pos2+1
c=s(k,ncity);
for j=ncity:-1:2
s(k,j)=s(k,j-1);
end
s(k,1)=c;
end
end
for k=1:2 %在逆序中去掉交叉中的点
for j=1:pos2-pos1-1
for i=1:ncity
if s(k,i)==w(k,j)
for l=i:ncity-1
s(k,l)=s(k,l+1);
end
end
end
end
end
for k=1:2 %产生交叉结果
for i=1:pos1
newpop(k,i)=s(k,ncity-pos2+1+i);
end
l=1;
for i=pos1+1:pos2-1
newpop(k,i)=w(k,l);
l=l+1;
end
m=1;
for i=pos2:ncity
newpop(k,i)=s(k,m);
m=m+1;
end
end
pop(b(1),:)=newpop(1,:); %保存交叉结果
pop(b(2),:)=newpop(2,:);
end
i=0;
end
end
popnew=pop;
clear i;
clear j;
clear c;
clear temp;
clear l;
clear m;
clear l;
clear pos1;
clear pos2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -