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

📄 selection.m

📁 一个遗传规划的源程序
💻 M
字号:
function selm = selection(popu,fitness,gap,pc,pm,tsels);
% 选择操作

popun = popu.size;
selm = zeros(popun,3);    % popu.size如果是3则产生的selm是 3*3 全 0 矩阵  

% Fitness values and sort
% % fit = zeros(1,popun);     % fit 返回的是 1*3 列的矩阵
% for i = 1:popun,          % popun 的值是种群个体的大小值(3)
%     fit(i) = popu.chrom{i}.fitness;
% end                       % fit最后返回一个 1行3列 的向量存储一代种群中的各个体的适应度

fit = fitness;

if ~isempty(find(fit<0)),         %如果不能找到适应值是大于0的话
  error('Every fitness must be > 0');
end

[fitsort,sortix] = sort(fit);  % 排序 按照 -fit 值的大小升序排列 fitsort 就是排好的序列,sortix 是序列的索引
fitsort = fitsort./sum(fitsort);   % 返回适应值的概率 从大到小排列的比率值(正数)
fitsum = cumsum(fitsort);            % 累积求和 累积的最后结果是 1
fitsum(end) = 1;                     

i = floor((1-gap)*popun);            % (1-0.8) * 3 = 0.6 再下取整为  0

if i>=1 & i<=popun,                  % 当 i 大于 1 并且小于等于 3 时
  selm(1:i,1) = sortix(1:i)';        % i=1的时候selm为[0 0]',i=2时为[0]',i=3的时候为[0 0 0]'  
  i = i+1;
else
  i = 1;
end
nn = i-1;

% %%%%%%%%%%%%%%%%%%%%%%%%%%%  Create the New individuals  %%%%%%%%%%%%%%%%%%%%%%%%%%
while nn<popun,       % 因为在此 tsels = 2 竞赛选择
  if tsels > 0,                      % 当tsels大于0的时候使用竞赛选择算法
    j1 = tournament(fit,tsels);
  else                               % tsels=0的时候为轮盘选择算法
    j1 = roulette(fitsum,sortix);
  end
  % %%%%%%%%%%%%%%%%%%%%%%%      选择遗传算子     %%%%%%%%%%%%%%%%%%%%%%%
  r = rand;
  if r<pc,                           % 当r小于交叉概率的时候
    % Crossover 交叉算子
    if tsels > 0,
      j2 = tournament(fit,tsels);    % 当tsels大于0的时候使用竞赛选择算法
    else
      j2 = roulette(fitsum,sortix);  % tsels=0的时候为轮盘选择算法
    end
    selm(i,1) = j1;
    selm(i,2) = j2;
    selm(i,3) = 1;
    i = i+1;
    nn = nn+2;
  elseif r<pc+pm,
    % Mutation 变异算子
    selm(i,1) = j1;
    selm(i,3) = 2;
    i = i+1;
    nn = nn+1;
  else
    % 如果随机生成数不满足交叉、变异概率条件则直接把以前的个体保留下来
    selm(i,1) = j1;
    selm(i,3) = 0;
    i = i+1;
    nn = nn+1;
  end
end
selm = selm(1:i-1,:);
return

%--------------------------------------------------------------
function j = tournament(fit,tsels);         %比赛排序(竞赛选择)

n = length(fit);
jj = floor(rand(tsels,1)*n)+1;
[fitmax,maxix] = max(fit(jj));
j = jj(maxix);
return
%--------------------------------------------------------------
function j = roulette(fitsum,sortix);        %轮盘选择算法

v = find(fitsum >= rand(1,1));
j = sortix(v(1));
return

⌨️ 快捷键说明

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