📄 cross.asv
字号:
function v=cross(v,L) %V为父代距阵,为一个N x 1的距阵,每一个元素都是一个染色体,L为染色体原始二进制编码长度(编码时先用二进制,然后转化为十进制)
N = size(v,1);
pc = 0.5;
% Crossver
for i=1:N
cindex(i)=i;
end
for i=1:N %产生要配对的父代的序号;经过N次顺序调换,将原有顺序打乱,使相邻两个个体作为交叉的父代
point=unidrnd(N-i+1);
temp=cindex(i);
cindex(i)=cindex(i+point-1);
cindex(i+point-1)=temp;
end
for i=1:2:N
p=rand(1);
if(p<pc)
a=floor(L*rand(1));%0=<a<b<L 产生交叉点
b=floor(L*rand(1));
if(a>b)
temp=a;
a=b;
b=temp;
end
x1=mod(v(i,1),2^(b+1))-mod(v(i,1),2^a); %提取交叉点中的片段
x2=mod(v(i+1),2^(b+1))-mod(v(i+1),2^a);
v(i,1)=v(i,1)/(2^(b+1))*(2^(b-1))+x2+mod(v(i,1),2^a);
v(i+1,1)=v(i+1)/(2^(b+1))*(2^(b-1))+x1+mod(v(i+1),2^a);
end
end
a=1;b=3;
x1=mod(v(i,1),2^(b+1))-mod(v(i,1),2^a); %提取交叉点中的片段
x2=mod(v(i+1),2^(b+1))-mod(v(i+1),2^a);
v(i,1)=v(i,1)/(2^(b+1))*(2^(b-1))+x2+mod(v(i,1),2^a);
v(i+1,1)=v(i+1)/(2^(b+1))*(2^(b-1))+x1+mod(v(i+1),2^a);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -