利用matlab无放回取样,MATLAB遗传算法之 无放回式随机余数选择算子(remainder stochastic sampling with replacement)最新版...

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)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值