轮盘赌算法以及matlab的实现

轮盘赌算法其实是一种选择算法。原理其实很简单,通常运用于遗传算法与蚁群退火算法等。如遗传算法中的个体的选择。总之,用处很大。

下面介绍,轮盘赌的基本原理。运用的情景:一个公司进行考核淘汰员工,有员工四位,其为公司创造的价值分别是900,200,80,100.公司老板突发奇想不想进行末位淘汰,而是想要产生随机数进行统计,通过产生1000次的随机数,来看看,那位员工被淘汰。

首先,我们应知道个体的选择概率,即一员工一为例子,其个体选择概率是900/(900+200+80+100),为0.7031.

然后依次计算。

员工二为0.1563,员工三为0.0625,员工四为0.0781

所以当个体的概率越大其被选中的概率就会越大,我们想像一个圆盘,如个体选择的概率越大,则其占的面积越大。越容易被选中。

那我们如何进行编码表示呢?即将圆盘映射为为一个【0,1】的线段,个体概率越大,其占的长度越长。

如本例子,是分为四个区间,区间1的范围时是0到0.7031。区间2的范围是0.7031到0.9194.区间三的范围是0.09194到0.9819.区间四的范围是0.9819到1。

matlab代码如下;

%轮盘赌算法
A=[900;200;80;100]
C=A./sum(A)
z=zeros(4,1)
B(1,1)=C(1,1)
for i=2:4
    B(i,1)=B(i-1,1)+C(i,1)
end

for i=1:1000
    r=rand()
   for j=1:3
       if r>B(j)&&r<B(j+1)
           z(j+1)=z(j+1)+1
           break
       elseif r==B(j)
           z(j)=z(j)+1
           break
       elseif r<=B(1)
           z(1)=z(1)+1
           break
       end
    end
end

 添加:一个更精简的实现方式

tar=[0.01,0.2,0.4,0.09];%假设这是目标矩阵,需要对其进行选择
value_sum=sum(c);
cc=tar./d;
tar=find(pc>=r);
pc=cumsum(cc,2);%求累加和
r=rand(1);
chose_next=tar(1);%会返回多个大于随机数的元素,但我们只取第一个元素
发布了50 篇原创文章 · 获赞 13 · 访问量 8823

猜你喜欢

转载自blog.csdn.net/weixin_43770577/article/details/98783458