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

📄 select.m

📁 完成改进的遗传算法,其中用的是免疫机制.
💻 M
字号:
function Ret=Select(Individuals,SizePop,Opts,localSort)
% In this function,it fulfils a selection among chromosomes
% Individuals input  : set of Individuals
% SizePop     input  : size of population
% Opts        input  : tag for choosing method of selection
% Ret         output : new set of Individuals
%--------------------------------------------------------------------我添加的程序
%用于免疫机制。现在缺少的是种群中个体适应度的高低,现在要排序,然后在后面如果出现数量不足时进行补充
countf=0;
fitness=Individuals.Fitness;
%AfterSort=sort(fitness,'descend');%不知道对不对呢,目的是先将原来的数据结构中的数据进行排序,然后想从前往后去适应度高的那些。
%localSort=zeros(1,SizePop);%重新定义一个矩阵用来存储排好的序列
j=1;
avgf=sum(Individuals.Fitness)/numel(Individuals.Fitness);
SumI=sum(Individuals.Fitness);
%for i=0:SizePop-1
   % if i==SizePop-1
  %      break;
  %  end
  %  d=find(Individuals.Fitness==AfterSort(i+1));%d用来存储所获得的位置号
 %   [m n]=size(d);
 %   for j=1:n
 %      localSort(i+j)=d(j);
  %  end
  %  j=i+n;
%end
%这样就记录了按顺序排列后,各个高位所在的位置了。 
%-------------------------------------------------------------------
switch Opts
    case 'roulette'  % roulette wheel model
        Sumf=Individuals.Fitness/SumI ; %计算适应度,即每个适应度在总适应度中的比值。
        Individuals.Fitness;
        Index=[]; 
            for i=1:SizePop
        fff=Individuals.Fitness;
                if  Individuals.Fitness(i)>avgf    %如果大于随机数就进行下面的操作,并列的为选优操作,即适应度大于上代群体中的平均
                    countf=countf+1;
                   Index=[Index i];    %矩阵合并,记录下一群体中的个体,即适应度大于随即的那些个体。
                   
                end
               
            end
        countf
                if countf<SizePop;   %不足的用原始种群中适应度高的来补充
            fillin=SizePop-countf;
            for j=1:fillin
                Index=[Index localSort(j)];
            end
        end
        %  上面用来将不足的数量补充,这样就可以将总体的数量达到一致。
        Individuals.Chrom=Individuals.Chrom(Index,:);
        Individuals.Fitness=Individuals.Fitness(Index);
        Ret=Individuals;
        %-------------------------------------

case 'tournament'  % tourment model 
    AllIndex=[];    
    for i=1:SizePop
        Pick=rand(1,2);
        while prod(Pick)==0   %含有0元素
             Pick=rand(1,2);
        end
        Index=ceil(Pick.*SizePop);
        if Individuals.Fitness(Index(1))>=Individuals.Fitness(Index(2))
             AllIndex=[AllIndex Index(1)];
        else
             AllIndex=[AllIndex Index(2)];
        end
    end
    Individuals.Chrom=Individuals.Chrom(AllIndex,:);
    Individuals.Fitness=Individuals.Fitness(AllIndex);
    Ret=Individuals;        
end

⌨️ 快捷键说明

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