轮盘赌算法的实现

轮盘赌算法的实现

(1)基本原理

​ 占比越大被选中的可能性就越大;各个个体被选中的概率与其适应度函数值大小成正比,它是为了防止适应度数值较小的个体被直接淘汰而提出的。

①个体选择概率:

​ 适应度数值越高,它被选中的概率就越大。P=f/Σf

②累积概率:

​ 把各个个体的概率使用不同长度的线段来表示,这些线段组合成一条直线,直线的长度为1。

(2)保留精英的轮盘赌策略

​ 因为轮盘赌算法可能会失去上一代中的最优个体,通过复制最佳个体直接进入新一代种群,以防止通过遗传操作而导致种群中的最优个体消失。

​ 轮盘赌选择并不要求对个体先按适应度值从大到小或者从小到大排列。

(3)实例1

function index=RouletteWheelSelection(V,m)
%用Roulette Wheel Selection法选择m个个体
% Input:
%   V      -----待挑选种群中每个个体的重要性指标(如适应度等)
%   m      -----选择的个体数
% Output:
%   index    -----挑选的m个体的位置索引

%Tips:当V为全零向量时,该算法无效,将随机选择个体;否则算法将从重要性指标不为0的个体中选择。

n=size(V,2);%待挑选的个体数
  if max(V)==0&min(V)==0%如果V是全零向量,随机选择
    index=ceil(rand(1,m)*n);
  else
    %将适应度为0的个体驱逐出待选择范围
    temindex=find(V~=0);
    n=length(temindex);%待挑选的个体数目降低
    V=V(temindex);

    index=zeros(1,m);
    %[V,I]=sort(V,'descend');
    V=cumsum(V)/sum(V);

    pp=rand(1,m);
    for i=1:m,
      for j=1:n,
        if pp(i)<V(j)
          index(i)=j;
          break
        end
      end
    end
    index=temindex(index);
  end

(4)实例2

c=[900,80,200,100];%假设这是目标矩阵,需要对其进行选择
value_sum=sum(c);
cc=c./value_sum;
r=rand(1);
pc=cumsum(cc,2);%求累加和
tar=find(pc>=r);%返回pc中大于r的位置索引
chose_next=tar(1);%会返回多个大于r的元素的位置,但我们只取第一个元素

(5)实例3

clc;
clear all;
syd=[0.23 0.65 0.38 0.96 0.14 0.76 0.99 0.76 0.56 0.77];%模拟适应度值,数量为10个
%计算个体概率P
P=[];%个体概率按顺序存入数组P中
for i=1:length(syd)
    P=[P syd(i)/sum(syd)];
end
%对P中各个个体做计算累加概率Q
%Q对应模拟各个体概率的一条直线,在直线上根据个体概率分成了10个段,段的宽度越长,随机被选中的概率就越大
Q=[];
Q(1)=P(1);
for j=2:length(P)
    Q(j)=P(j)+Q(j-1);
end
%在[0,1]内产生一个均匀分布的随机数r
%若r≤Q(1),则第一个适应度值对应的个体被选中
%否则 若r满足Q(k-1)<=r<Q(k),则适应度值对应的个体j被选中
flage=1;%循环标志
count=1;%循环100次,判断各个个体被选中的次数
z1=0;%个体1统计变量
z2=0;%个体2统计变量
z3=0;%个体3统计变量
z4=0;%个体4统计变量
z5=0;%个体5统计变量
z6=0;%个体6统计变量
z7=0;%个体7统计变量
z8=0;%个体8统计变量
z9=0;%个体9统计变量
z10=0;%个体10统计变量
while(flage)
    r=rand();%在[0 1]之间产生随机一个数
    %判断该数字所在的区间
    if r<=Q(1)
        z1=z1+1;
      
    else if r<=Q(2)
            z2=z2+1;
           
        else if r<=Q(3)
                z3=z3+1;
                
            else if r<=Q(4)
                    z4=z4+1;
                    
                else if r<=Q(5)
                        z5=z5+1;
                        
                    else if r<=Q(6)
                            z6=z6+1;
                            
                        else if r<=Q(7)
                                z7=z7+1;
                                
                            else if r<=Q(8)
                                    z8=z8+1;
                                    
                                else if r<=Q(9)
                                        z9=z9+1;
                                        
                                    else if r<=Q(10)
                                            z10=z10+1;
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
    end
    if count==100
        flage=0;
    end
    count=count+1;
end
num=[z1 z2 z3 z4 z5 z6 z7 z8 z9 z10]; %方便统计
num

(6)实例4

D = 5;
P = [1, 1, 1, 1, 1]./D; %占比概率(等概率矩阵)用来选择1~5
m = length(P);
num = 10000; %运行一万次
Select = zeros(1, num);
r = rand(1, num);
for i=1:num
    sumP = 0;
    j = ceil(m*rand); %产生1~m之间的随机整数
    while sumP < r(i)
        sumP = sumP + P(mod(j-1, m)+1);
        j = j+1;
    end
    Select(i) = mod(j-2, m)+1;
end
average_S = mean(Select)
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值