⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ga.m.m

📁 遗传算法的小程序
💻 M
📖 第 1 页 / 共 2 页
字号:
                crossfitness(nocross(s))=selectfitness(matchrand(nocross(s)));
                crossfitness(popsize+1-nocross(s))=selectfitness(matchrand(popsize+1-nocross(s)));
            end
        else                                                           %此时不交叉、双性交叉、单性交叉三种情况均有   
            for s=1:length(nocross)
                crossset(nocross(s),:)=selectset(matchrand(nocross(s)),:);
                crossset(popsize+1-nocross(s),:)=selectset(matchrand(popsize+1-nocross(s)),:);
                crossfitness(nocross(s))=selectfitness(matchrand(nocross(s)));
                crossfitness(popsize+1-nocross(s))=selectfitness(matchrand(popsize+1-nocross(s)));
            end
            for s=1:ceil(0.5*length(yescross))                        %此部分采用双性交叉
                 crossset(yescross(s),:)=selectset(matchrand(yescross(s)),:);
                 crossset(popsize+1-yescross(s),:)=selectset(matchrand(popsize+1-yescross(s)),:);
                 elementrand=randperm(L);                           %生成随机数,定义前后交叉点
                 x1=min(elementrand(1:2));                               
                 x2=max(elementrand(1:2));
                 A=crossset(yescross(s),x1:x2);                                    %将染色体分别赋给A,B
                 B=crossset(popsize+1-yescross(s),x1:x2);
                 binarycross;
                 crossset(yescross(s),x1:x2)=A;
                 crossset(popsize+1-yescross(s),x1:x2)=B;
                 crossfitness(yescross(s))=decomyque(crossset(yescross(s),:),M,pt);
                 crossfitness(popsize+1-yescross(s))=decomyque(crossset(popsize+1-yescross(s),:),M,pt);
             end
             for s=ceil(0.5*length(yescross))+1:length(yescross)        %此部分采用单性交叉
                 crossset(yescross(s),:)=selectset(matchrand(yescross(s)),:);
                 crossset(popsize+1-yescross(s),:)=selectset(matchrand(popsize+1-yescross(s)),:);
                 r_1=randperm(L);
                 r_2=randperm(L);
                 r_1(5:L)=[];
                 r_2(5:L)=[];
                 for s_1=1:3
                    for s_2=(1+s_1):4
                       if r_1(s_1)>r_1(s_2)
                          temp=r_1(s_1);
                          r_1(s_1)=r_1(s_2);
                          r_1(s_2)=temp;
                       end
                    end
                end
                for s_1=1:3
                   for s_2=(1+s_1):4
                      if r_2(s_1)>r_2(s_2)
                         temp=r_2(s_1);
                         r_2(s_1)=r_2(s_2);
                         r_2(s_2)=temp;
                      end
                   end
                end
                tempset_1=crossset(yescross(s),r_1(1):r_1(2));
            if  r_1(3)-r_1(2)==1
                crossset(yescross(s),r_1(1):(r_1(1)+r_1(4)-r_1(3)))=crossset(yescross(s),r_1(3):r_1(4));
                crossset(yescross(s),r_1(1)+r_1(4)-r_1(3)+1:r_1(4))=tempset_1;
            else
                tempset_2=crossset(yescross(s),r_1(2)+1:r_1(3)-1);
                crossset(yescross(s),r_1(1):(r_1(1)+r_1(4)-r_1(3)))=crossset(yescross(s),r_1(3):r_1(4));
                crossset(yescross(s),(r_1(1)+r_1(4)-r_1(3)+1):(r_1(1)+r_1(4)-r_1(2)-1))=tempset_2;
                crossset(yescross(s),(r_1(1)+r_1(4)-r_1(2)):r_1(4))=tempset_1;
            end
            tempset_1=crossset(popsize+1-yescross(s),r_2(1):r_2(2));
            if r_2(3)-r_2(2)==1
                crossset(popsize+1-yescross(s),r_2(1):(r_2(1)+r_2(4)-r_2(3)))=crossset(popsize+1-yescross(s),r_2(3):r_2(4));
                crossset(popsize+1-yescross(s),(r_2(1)+r_2(4)-r_2(3)+1):r_2(4))=tempset_1;
            else
                tempset_2=crossset(popsize+1-yescross(s),r_2(2)+1:r_2(3)-1);
                crossset(popsize+1-yescross(s),r_2(1):(r_2(1)+r_2(4)-r_2(3)))=crossset(popsize+1-yescross(s),r_2(3):r_2(4));
                crossset(popsize+1-yescross(s),(r_2(1)+r_2(4)-r_2(3)+1):(r_2(1)+r_2(4)-r_2(2)-1))=tempset_2;
                crossset(popsize+1-yescross(s),(r_2(1)+r_2(4)-r_2(2)):r_2(4))=tempset_1;
            end
            crossfitness(yescross(s))=decomyque(crossset(yescross(s),:),M,pt);
            crossfitness(popsize+1-yescross(s))=decomyque(crossset(popsize+1-yescross(s),:),M,pt);
        end
    end
  end
else                                                        %最后1/3次迭代中将要全部采用单性交叉
    crossrand=rand(1,popsize);                                   %生成popsize个随机数,决定是否交叉
    for s=1:popsize
        if crossrand(s)>=poscross
            crossset(s,:)=selectset(s,:);
            crossfitness(s)=selectfitness(s);
        else
            crossset(s,:)=selectset(s,:);
            r_1=randperm(L);
            r_1(5:L)=[];
            for s_1=1:3
                for s_2=(1+s_1):4
                    if r_1(s_1)>r_1(s_2)
                        temp=r_1(s_1);
                        r_1(s_1)=r_1(s_2);
                        r_1(s_2)=temp;
                    end
                end
            end
            tempset_1=crossset(s,r_1(1):r_1(2));
            if r_1(3)-r_1(2)==1
                crossset(s,r_1(1):(r_1(1)+r_1(4)-r_1(3)))=crossset(s,r_1(3):r_1(4));
                crossset(s,r_1(1)+r_1(4)-r_1(3)+1:r_1(4))=tempset_1;
            else
                tempset_2=crossset(s,r_1(2)+1:r_1(3)-1);
                crossset(s,r_1(1):(r_1(1)+r_1(4)-r_1(3)))=crossset(s,r_1(3):r_1(4));
                crossset(s,(r_1(1)+r_1(4)-r_1(3)+1):(r_1(1)+r_1(4)-r_1(2)-1))=tempset_2;
                crossset(s,(r_1(1)+r_1(4)-r_1(2)):r_1(4))=tempset_1;
            end
            crossfitness(s)=decomyque(crossset(s,:),M,pt);
        end
    end
end
if bestfitness<max(crossfitness)
    bestfitness=max(crossfitness);
    s=find(crossfitness==max(crossfitness));
    best_solution=crossset(min(s),:);
else
    randnumber=ceil(rand*popsize);
    crossset(randnumber,:)=best_solution;
    crossfitness(randnumber)=bestfitness;
end


% 以下为变异操作
    average_fitness=sum(crossfitness)/popsize;
    diversity=sum((crossfitness-average_fitness).^2)/(popsize-1);
    mutationset=zeros(popsize,L);                   % 定义变异后的染色体种群为mutationset
    mutationfitness=zeros(1,popsize);
    if diversity>2500
        posmutation=0.01;
    else
        posmutation=0.2-0.19*diversity/400;
    end
    for s=1:popsize
       randnumber=rand;                              % 生成随机数
       if randnumber>=posmutation                    % 若随机数比变异概率大,则不产生变异,直接将染色体放入mutationset中
          mutationset(s,:)=crossset(s,:);
          mutationfitness(s)=crossfitness(s);
       else                                          % 若随机数比变异概率小,则进行变异,本方案采用三种变异方式:交换、逆序、插入
           tempsolution=repmat(crossset(s,:),3,1);
           tempfitness=zeros(1,3);
           r=randperm(L);                                  %变异方式之一:交换
           tempset=tempsolution(1,r(1));
           tempsolution(1,r(1))=tempsolution(1,r(2));
           tempsolution(1,r(2))=tempset;
           
           r=randperm(L);                                   %变异方式之一:逆序
           x1=min(r(1),r(2));
           x2=max(r(1),r(2));
           tempsetA=tempsolution(2,x1:x2);
           tempsetB=zeros(1,length(tempsetA));
           for s_1=1:length(tempsetA)
               tempsetB(length(tempsetA)+1-s_1)=tempsetA(s_1);
           end
           tempsolution(2,x1:x2)=tempsetB;
           
           r=randperm(L);                                   %变异方式之一:插入
           x1=min(r(1),r(2));
           x2=max(r(1),r(2));
           tempset=tempsolution(3,x1+1:x2-1);
           tempsolution(3,x2-1)=tempsolution(3,x1);
           tempsolution(3,x1:x2-2)=tempset;
           for s_1=1:3
               tempfitness(s_1)=decomyque(tempsolution(s_1,:),M,pt);
           end
           if posmutation==0.2
              s_1=find(tempfitness==min(tempfitness));
              mutationset(s,:)=tempsolution(min(s_1),:);
              mutationfitness(s)=min(tempfitness);
           else
              s_1=find(tempfitness==max(tempfitness));
              mutationset(s,:)=tempsolution(min(s_1),:);
              mutationfitness(s)=max(tempfitness);
           end
       end
    end
    if bestfitness<max(mutationfitness)
    bestfitness=max(mutationfitness);
    s=find(mutationfitness==max(mutationfitness));
    best_solution=mutationset(min(s),:);
    else
    randnumber=ceil(rand*popsize);
    mutationset(randnumber,:)=best_solution;
    mutationfitness(randnumber)=bestfitness;
    end
   

    % 以下为保优操作
    lastset=zeros(popsize,L);
    lastfitness=zeros(1,popsize);
    for s=1:popsize/2                                 % 从permset中选出popsize/2个最好的染色体作为下一代种群
       s_1=find(mutationfitness==max(mutationfitness));                % s_1为mutationperm数组中最大值的下标
       lastset(s,:)=mutationset(min(s_1),:);               % 为防止同时存在几个相同的最大值,取min(s_1)对应的染色体放入laseset中
       lastfitness(s)=max(mutationfitness);
       mutationfitness(min(s_1))=[];
    end
    for s=1:popsize/2                                 % 从上一代种群chrompop中选出popsize/2个最好的染色体作为下一代种群
       s_1=find(fitness==max(fitness));
       lastset(popsize/2+s,:)=chrompop(min(s_1),:);
       lastfitness(popsize/2+s)=max(fitness);
       fitness(min(s_1))=[];
    end
    
    
    % 以下将得到的染色体种群lastset赋给chrompop,重新进行新的迭代
    chrompop=lastset;
    fitness=lastfitness;
end
bestvalue=-log(bestfitness/const_a)/const_b;
K=1:iteration;
plot(K,MAKESPAN)
toc

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -