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)<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


你可能感兴趣的:(MATLAB遗传算法之 无放回式随机余数选择算子(remainder stochastic sampling with replacement)最新版)