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