轮盘赌算法其实是一种选择算法。原理其实很简单,通常运用于遗传算法与蚁群退火算法等。如遗传算法中的个体的选择,等等。
下面介绍,轮盘赌的基本原理。运用的情景:一个公司有员工甲乙丙丁四位,其为公司创造的价值分别是900万,200万,80万,100万.年底了,公司老板想要颁发一个“MVE”奖(最有价值的员工奖),按理说应该直接发给甲,但是老板为了照顾其他员工,决定设置一个抽奖系统。他想在保证“按劳分配”的大原则下,再增加点随机性,因为老板认为“运气也是实力的一部分”。初始的想法是产生0~1的随机数决定谁获奖。那么到底如何设计呢?
首先,我们应知道个体的选择概率,即一员工一为例子,其个体选择概率是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
添加:一个更精简的实现方式
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的元素的位置,但我们只取第一个元素
/Dàimǎ duàn xiǎo bùjiàn/
代码段 小部件