轮盘赌算法以及matlab的实现

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

下面介绍,轮盘赌的基本原理。运用的情景:一个公司有员工甲乙丙丁四位,其为公司创造的价值分别是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/

代码段 小部件

  • 15
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值