MATLAB遗传算法之 无放回式随机余数选择算子(remainder stochastic sampling with replacement)最新版
function pop = SelectionFunction(pop,fitness_value,ObjV) [n,m]=size(pop); num_expectation = zeros(n,1); for i=1:1:n num_expectation(i)=n*fitness_value(i)/sum(fitness_value);%计算群体中每个个体在下一代群体中的生存期望数目。 end fitness_value_new = zeros(n,1);%存放新的适应度举矩阵 num_expectation_int = floor(num_expectation); %取生存期望数目整数部分作为对应个体在下一代群体中的生存数目。sum(num_expectation_int)可以确定出下一代群体的个数 for i=1:1:n fitness_value_new(i)=fitness_value(i) - num_expectation_int(i)*sum(num_expectation_int)/n; %确定下一代中还未确定的的 n - sum(num_expectation_int)个个体的新适应度 end pop_new = zeros(n,m);%用于存放新的个体。 a=zeros(1,m);%用于标识群体中一行,即一个个体。 s=0;%计数,用于标记新的群体中个数。 %以下方法为按照生存期望选择的个体。 for i=1:1:n if num_expectation_int(i)~=0 for j=1:1:num_expectation_int(i) if j==1 a=pop(i,:); else a=[a;pop(i,:)]; end end pop_new(s+1:s+num_expectation_int(i),:)=a; s=s+num_expectation_int(i); end end %按照生成期望选择个体结束 %以下为按照轮盘赌选择剩余的个体。 %Tips:当V为全零向量时,该算法无效,将随机选择个体;否则算法将从重要性指标不为0的个体中选择。 %index 选的m个体的位置索引 m = n - s ;%计算剩下的需要轮盘赌的个数 if m~=0 [pop_size,chromo_size] = size(pop); fitness_table = zeros(pop_size,1); for i=1:pop_size if i==1 fitness_table(i) = fitness_table(i) + fitness_value_new(i); else fitness_table(i) = fitness_table(i-1) + fitness_value_new(i); end end for i=s+1:pop_size r = rand * fitness_table(pop_size); first = 1; last = pop_size; mid = round((last+first)/2); idx = -1; while (first <= last) && (idx == -1) if r > fitness_table(mid) first = mid; elseif r < fitness_table(mid) last = mid; else idx = mid; break; end mid = round((last+first)/2); if (last - first) == 1 idx = last; break; end end pop_new(i,:)=pop(idx,:); end end
MATLAB遗传算法之 无放回式随机余数选择算子(remainder stochastic sampling with replacement)效率不高,以过期!
%选择操作: %无放回式随机余数选择 function selection() global pop; global fitness_value; [n,m]=size(pop); num_expectation = zeros(n,1); for i=1:1:n num_expectation(i)=n*fitness_value(i)/sum(fitness_value);%计算群体中每个个体在下一代群体中的生存期望数目。 end fitness_value_new = zeros(n,1);%存放新的适应度举矩阵 num_expectation_int = floor(num_expectation); %取生存期望数目整数部分作为对应个体在下一代群体中的生存数目。sum(num_expectation_int)可以确定出下一代群体的个数 for i=1:1:n fitness_value_new(i)=fitness_value(i) - num_expectation_int(i)*sum(num_expectation_int)/n; %确定下一代中还未确定的的 n - sum(num_expectation_int)个个体的新适应度 end pop_new = zeros(n,m);%用于存放新的个体。 a=zeros(1,m);%用于标识群体中一行,即一个个体。 s=0;%计数,用于标记新的群体中个数。 %以下方法为按照生存期望选择的个体。 for i=1:1:n if num_expectation_int(i)~=0 for j=1:1:num_expectation_int(i) if j==1 a=pop(i,:); else a=[a;pop(i,:)]; end end pop_new(s+1:s+num_expectation_int(i),:)=a; s=s+num_expectation_int(i); end end %按照生成期望选择个体结束 %以下为按照轮盘赌选择剩余的个体。 %Tips:当V为全零向量时,该算法无效,将随机选择个体;否则算法将从重要性指标不为0的个体中选择。 %index 选的m个体的位置索引 m = n - s ;%计算剩下的需要轮盘赌的个数 if(m ~= 0)%当为0时不进行轮盘赌选择操作 n=size(fitness_value_new);%待挑选的个体数 if max(fitness_value_new)==0&min(fitness_value_new)==0%如果V是全零向量,随机选择 index=ceil(rand(1,m)*n); else %将适应度为0的个体驱逐出待选择范围 temindex=find(fitness_value_new~=0); n=length(temindex);%待挑选的个体数目降低 fitness_value_new=fitness_value_new(temindex); index=zeros(1,m); %[V,I]=sort(V,'descend'); fitness_value_new=cumsum(fitness_value_new)/sum(fitness_value_new); pp=rand(1,m); for i=1:m, for j=1:n, if pp(i)<fitness_value_new(j) index(i)=j; break end end end index=temindex(index);%最终index中的值为原fitness_value_new数组中的位置。 end for i = 1:m pop_new = [pop_new;pop(index(i),:)]; end end for i=1:m for j=1:chromo_size pop(i,j) = pop_new(i,j); end end