2019-12-25

function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函数完成交叉操作
% pcorss input : 交叉概率
% lenchrom input : 染色体的长度
% chrom input : 染色体群
% sizepop input : 种群规模
% ret output : 交叉后的染色体

for i=1:sizepop

% 随机选择两个染色体进行交叉
pick=rand(1,2);
while prod(pick)==0
    pick=rand(1,2);
end
index=ceil(pick.*sizepop);
% 交叉概率决定是否进行交叉
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;


版权声明:本文为qq_41780397原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。