车间调度遗传算的排序法看一下

基于遗传算法解决柔性车间调度问题代码中的代码解释,对于这个板块

% RANKING.M      (RANK-based fitness assignment)
%
% This function performs ranking of individuals.
%函数的功能是将个体进行排列

%
% Syntax:  FitnV = ranking(ObjV, RFun, SUBPOP)
%
% This function ranks individuals represented by their associated
% cost, to be *minimized*, and returns a column vector FitnV
% containing the corresponding individual fitnesses. For multiple
% subpopulations the ranking is performed separately for each
% subpopulation.
%函数将个体按照最小输出进行排列,返回一个包含相应个体适合度的列向量FitnV。
%对于多个子种群来说,此排列将每个给提分离开
%
% Input parameters:
%    ObjV      - Column vector containing the objective values of the
%                individuals in the current population (cost values).
%            
%    RFun      - (optional) If RFun is a scalar in [1, 2] linear ranking is
%                assumed and the scalar indicates the selective pressure.
%                If RFun is a 2 element vector:
%                RFun(1): SP - scalar indicating the selective pressure
%                RFun(2): RM - ranking method
%                         RM = 0: linear ranking
%                         RM = 1: non-linear ranking
%                If RFun is a vector with length(Rfun) > 2 it contains
%                the fitness to be assigned to each rank.
%                the same length as ObjV. Usually RFun is monotonously
%                increasing.
%                If RFun is omitted or NaN, linear ranking
%                and a selective pressure of 2 are assumed.
%    SUBPOP    - (optional) Number of subpopulations
%                if omitted or NaN, 1 subpopulation is assumed
%
% Output parameters:
%    FitnV     - Column vector containing the fitness values of the
%                individuals in the current population.
%                

% Author:     Hartmut Pohlheim (Carlos Fonseca)
% History:    01.03.94     non-linear ranking
%             10.03.94     multiple populations
% , RFun, SUBPOP
function FitnV = ranking(ObjV)

% Identify the vector size (Nind)
   [Nind,~] = size(ObjV);

   if nargin < 2
       RFun = []; 
   end
   if nargin > 1
       if isnan(RFun)
           RFun = []; 
       end
   end
   if numel(RFun) == 2
      if RFun(2) == 1
          NonLin = 1;
      els eif RFun(2) == 0
          NonLin = 0;
      else
          error('Parameter for ranking method must be 0 or 1'); 
      end
      RFun = RFun(1);
      if isnan(RFun)
          RFun = 2; 
      end
   else if numel(RFun) > 2
      if numel(RFun) ~= Nind
          error('ObjV and RFun disagree'); 
      end
   end

   if nargin < 3
       SUBPOP = 1; 
   end
   if nargin > 2
      if isempty(SUBPOP)
          SUBPOP = 1;
      elseif isnan(SUBPOP)
          SUBPOP = 1;
      elseif length(SUBPOP) ~= 1
          error('SUBPOP must be a scalar');
      end
   end

   if (Nind/SUBPOP) ~= fix(Nind/SUBPOP)
       error('ObjV and SUBPOP disagree'); 
   end
   Nind = Nind/SUBPOP;  % Compute number of individuals per subpopulation
   
% Check ranking function and use default values if necessary
   if isempty(RFun)
      % linear ranking with selective pressure 2
         RFun = 2*(0:Nind-1)/(Nind-1);
   elseif numel(RFun) ==1
      if NonLin ==1
         % non-linear ranking
         if RFun(1)<1
             error('Selective pressure must be greater than 1');
         elseif RFun(1) > Nind-2
             error('Selective pressure too big'); 
         end
         Root1 = roots([RFun(1)-Nind [RFun(1)*ones(1,Nind-1)]]);
         RFun = (abs(Root1(1)) * ones(Nind,1)) .^ [(0:Nind-1)'];
         RFun = RFun / sum(RFun) * Nind;
      else
         % linear ranking with SP between 1 and 2
         if (RFun(1) < 1 | RFun(1) > 2)
            error('Selective pressure for linear ranking must be between 1 and 2');
         end
         RFun = 2-RFun + 2*(RFun-1)*[0:Nind-1]'/(Nind-1);
      end
   end

   FitnV = [];

% loop over all subpopulations
for irun = 1:SUBPOP
   % Copy objective values of actual subpopulation
      ObjVSub = ObjV((irun-1)*Nind+1:irun*Nind);
   % Sort does not handle NaN values as required. So, find those...
      NaNix = isnan(ObjVSub);
      Validix = find(~NaNix);
   % ... and sort only numeric values (smaller is better).
      [ans,ix] = sort(-ObjVSub(Validix));

   % Now build indexing vector assuming NaN are worse than numbers,
   % (including Inf!)...
      ix = [find(NaNix) ; Validix(ix)];
   % ... and obtain a sorted version of ObjV
      Sorted = ObjVSub(ix);

   % Assign fitness according to RFun.
      i = 1;
      FitnVSub = zeros(Nind,1);
      for j = [find(Sorted(1:Nind-1) ~= Sorted(2:Nind)); Nind]'
         FitnVSub(i:j) = sum(RFun(i:j)) * ones(j-i+1,1) / (j-i+1);
         i =j+1;
      end

   % Finally, return unsorted vector.
      [ans,uix] = sort(ix);
      FitnVSub = FitnVSub(uix);

   % Add FitnVSub to FitnV
      FitnV = [FitnV; FitnVSub];
end


% End of function

注释加在代码片里了:

% RANKING.M      (RANK-based fitness assignment)  %基于排列的适应度赋值
%函数的功能是将个体进行排列

% Syntax:  FitnV = ranking(ObjV, RFun, SUBPOP)  %函数名ranking
%输入参数:ObjV, RFun, SUBPOP;返回适应度:FitnV 
%函数将个体按照最小输出进行排列,返回一个包含相应个体适合度的列向量FitnV。
%对于多个子种群来说,此排列将每个给提分离开

% Input parameters:
%    ObjV      - Column vector containing the objective values of the
%                individuals in the current population (cost values).
%    目标参数,包含当前种群中个体目标值的列向量
%    RFun      - (optional) If RFun is a scalar in [1, 2] linear ranking is
%                assumed and the scalar indicates the selective pressure.
%                如果RFun的取值在[1,2]内,则假定为线性排序,并且代表选择权重
%                If RFun is a 2 element vector: 如果RFun是一个包含两个元素的向量
%                RFun(1): SP - scalar indicating the selective pressure 第一个值代表选择权重
%                RFun(2): RM - ranking method 第二个值代表排序方法
%                         RM = 0: linear ranking 第二个值为0时为线性排序
%                         RM = 1: non-linear ranking 第二个值为1时为非线性排序
%                If RFun is a vector with length(Rfun) > 2 it contains 如果RFun是一个长度大于2的向量
%                the fitness to be assigned to each rank. 那么它包含要分配给每组排列的适应度
%                the same length as ObjV. Usually RFun is monotonously
%                increasing. 与ObjV相同长度的RFun通常是单调递增的
%                If RFun is omitted or NaN, linear ranking 如果RFun被忽略或者为Nan,则默认为线性排序
%                and a selective pressure of 2 are assumed. 且默认权重为2
%    SUBPOP    - (optional) Number of subpopulations 子种群数量
%                if omitted or NaN, 1 subpopulation is assumed  如果被忽略或者为Nan,默认值为1
%
% Output parameters:
%    FitnV     - Column vector containing the fitness values of the 返回值是个列向量
%                individuals in the current population. 表示为当前种群中个体的适应度
%                
 
% Author:     Hartmut Pohlheim (Carlos Fonseca)
% History:    01.03.94     non-linear ranking
%             10.03.94     multiple populations
% , RFun, SUBPOP

function FitnV = ranking(ObjV)  %函数声明
 
% Identify the vector size (Nind)  获取向量大小
   [Nind,~] = size(ObjV);
 
   if nargin < 2 
       RFun = [];  %RFun忽略
   end
   if nargin > 1
       if isnan(RFun) %如果RFun为Nan
           RFun = []; %RFun忽略
       end
   end
   if numel(RFun) == 2 %如果RFun中的元素个数为2
      if RFun(2) == 1 %如果RFun中第二个元素为1
          NonLin = 1; %非线性排序
      els eif RFun(2) == 0
          NonLin = 0; %否则线性排序
      else  %参数异常报错
          error('Parameter for ranking method must be 0 or 1'); 
      end
%以下均按照函数摘要声明处的步骤逐一实现,注释工作量过大,免费问答不再逐行赘述
      RFun = RFun(1); 
      if isnan(RFun)
          RFun = 2; 
      end
   else if numel(RFun) > 2
      if numel(RFun) ~= Nind
          error('ObjV and RFun disagree'); 
      end
   end
 
   if nargin < 3
       SUBPOP = 1; 
   end
   if nargin > 2
      if isempty(SUBPOP)
          SUBPOP = 1;
      elseif isnan(SUBPOP)
          SUBPOP = 1;
      elseif length(SUBPOP) ~= 1
          error('SUBPOP must be a scalar');
      end
   end
 
   if (Nind/SUBPOP) ~= fix(Nind/SUBPOP)
       error('ObjV and SUBPOP disagree'); 
   end
   Nind = Nind/SUBPOP;  % Compute number of individuals per subpopulation
   
% Check ranking function and use default values if necessary 检查排序函数,必要时使用默认值
   if isempty(RFun)
      % linear ranking with selective pressure 2
         RFun = 2*(0:Nind-1)/(Nind-1);
   elseif numel(RFun) ==1
      if NonLin ==1
         % non-linear ranking
         if RFun(1)<1
             error('Selective pressure must be greater than 1');
         elseif RFun(1) > Nind-2
             error('Selective pressure too big'); 
         end
         Root1 = roots([RFun(1)-Nind [RFun(1)*ones(1,Nind-1)]]);
         RFun = (abs(Root1(1)) * ones(Nind,1)) .^ [(0:Nind-1)'];
         RFun = RFun / sum(RFun) * Nind;
      else
         % linear ranking with SP between 1 and 2 参数值在[1,2]之间采取线性排序
         if (RFun(1) < 1 | RFun(1) > 2)
            error('Selective pressure for linear ranking must be between 1 and 2');
         end
         RFun = 2-RFun + 2*(RFun-1)*[0:Nind-1]'/(Nind-1);
      end
   end
 
   FitnV = [];
 
% loop over all subpopulations 遍历所有子种群
for irun = 1:SUBPOP
   % Copy objective values of actual subpopulation
      ObjVSub = ObjV((irun-1)*Nind+1:irun*Nind);
   % Sort does not handle NaN values as required. So, find those...
      NaNix = isnan(ObjVSub);
      Validix = find(~NaNix);
   % ... and sort only numeric values (smaller is better).
      [ans,ix] = sort(-ObjVSub(Validix));
 
   % Now build indexing vector assuming NaN are worse than numbers,
   % (including Inf!)...
      ix = [find(NaNix) ; Validix(ix)];
   % ... and obtain a sorted version of ObjV
      Sorted = ObjVSub(ix);
 
   % Assign fitness according to RFun. 根据RFun分配适合度
      i = 1;
      FitnVSub = zeros(Nind,1);
      for j = [find(Sorted(1:Nind-1) ~= Sorted(2:Nind)); Nind]'
         FitnVSub(i:j) = sum(RFun(i:j)) * ones(j-i+1,1) / (j-i+1);
         i =j+1;
      end
 
   % Finally, return unsorted vector.
      [ans,uix] = sort(ix);
      FitnVSub = FitnVSub(uix);
 
   % Add FitnVSub to FitnV
      FitnV = [FitnV; FitnVSub];  %返回适应度
end  %函数终止标志
 
%如对您理解程序有帮助,请点个采纳谢谢!
% End of function