function NewChrom=across(Chrom,XOVR,Jm,T)
% 该函数实现了基于部分匹配交叉(PMX)的遗传算法
% 输入参数:
% - Chrom:种群矩阵,每一行代表一个个体
% - XOVR:交叉概率
% - Jm:机器-工件矩阵
% - T:温度参数(未使用)
% 输出参数:
% - NewChrom:经过交叉操作后的新种群矩阵

[NIND,WNumber]=size(Chrom);
WNumber=WNumber/2;
NewChrom=Chrom;%初始化新种群
[PNumber MNumber]=size(Jm);
Number=zeros(1,PNumber);
for i=1:PNumber
    Number(i)=1;
end
%随机选择交叉个体(洗牌交叉)
SelNum=randperm(NIND); 
Num=floor(NIND/2);%交叉个体配对数
for i=1:2:Num
    if XOVR>rand; %随机数<交叉概率就进行交叉操作
        Pos=unidrnd(WNumber);%交叉位置 随机生成1-wnumber的整数
        while Pos==1
            Pos=unidrnd(WNumber);%如果等于1 重新生成 避免在第一个基因上交叉
        end
        %取两交叉的个体
        S1=Chrom(SelNum(i),1:WNumber);
        S2=Chrom(SelNum(i+1),1:WNumber); 
        S11=S2;S22=S1; %初始化新的个体 
        %新个体中间片断的COPY 
        S11(1:Pos)=S1(1:Pos); 
        S22(1:Pos)=S2(1:Pos); 
        %比较S11相对S1,S22相对S2多余和缺失的基因
        S3=S11;S4=S1;
        S5=S22;S6=S2;
        for j=1:WNumber 
            Pos1=find(S4==S3(j),1);
            Pos2=find(S6==S5(j),1);
            if Pos1>0
                S3(j)=0;
                S4(Pos1)=0;
            end 
            if Pos2>0
                S5(j)=0;
                S6(Pos2)=0;
            end
        end
        for j=1:WNumber 
            if S3(j)~=0 %多余的基因 
                Pos1=find(S11==S3(j),1); 
                Pos2=find(S4,1);%查找缺失的基因
                S11(Pos1)=S4(Pos2);%用缺失的基因修补多余的基因
                S4(Pos2)=0; 
            end 
            if S5(j)~=0 
                Pos1=find(S22==S5(j),1); 
                Pos2=find(S6,1); 
                S22(Pos1)=S6(Pos2);
                S6(Pos2)=0; 
            end 
        end 
        % 保存交叉前的机器 基因
        S1=Chrom(SelNum(i),:);
        S2=Chrom(SelNum(i+1),:); 
        for k=1:WNumber 
            Pos1=Find(S11(k),S1); 
            S11(WNumber+k)=S1(WNumber+Pos1);
            S1(Pos1)=0;
            Pos1=Find(S22(k),S2); 
            S22(WNumber+k)=S2(WNumber+Pos1);
            S2(Pos1)=0;
        end
        %生成新的种群
        NewChrom(SelNum(i),:)=S11;
        NewChrom(SelNum(i+1),:)=S22;
    end
end
end
基于部分匹配交叉的遗传算法matlab实现

原文地址: https://www.cveoy.top/t/topic/VYu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录