彼之此间 2022-07-16 10:55 采纳率: 33.3%
浏览 17
已结题

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

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

% 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

  • 写回答

1条回答 默认 最新

  • 鹅毛在路上了 Matlab领域优质创作者 2022-07-16 13:34
    关注

    注释加在代码片里了:

    % 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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月25日
  • 已采纳回答 7月17日
  • 创建了问题 7月16日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改