📄 selection.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 + -