轮盘赌算法及matlab实现代码

轮盘赌算法的基本思想是:各个个体被选中的概率与其适应度函数值大小成正比,它是为了防止适应度数值较小的个体被直接淘汰而提出的。
为了弄清轮盘赌算法,我搜集了相关的文献和教材,发现很多文章都喜欢把轮盘赌算法与遗传算法、蚁群算法、蜂群算法等混入一起来解释,这样轮盘赌算法中就会冒出什么染色体、遗传下一代、信息正反馈、信息素、雇佣蜂等词语,看起来“高大上”,这样也使得简单实用的轮盘赌算法在理解和实现上都变得复杂。话说,轮盘赌算法是可以应用到遗传算法、蚁群算法中去,但其算法的机理和遗传算法、蚁群算法是相互独立的,它的实现机理和遗传算法、蚁群算法、蜂群算法等没有任何关系,也没有什么染色体、遗传下一代、信息正反馈等高大上的词汇。
轮盘赌算法的核心在于两个概率和个体选择策略:
(1)个体选择概率
(2)累积概率
(3)如何选择某个个体
1、个体个体选择概率比较好理解,适应度数值越高,它被选中的概率就越大,使用以下公式来表示。

其中,xi为某个个体。
2、累积概率把各个个体的概率使用不同长度的线段来表示,这些线段组合成一条直线,直线的长度为1(各个个体概率之和),这样在该直线中,某段的线段最长,就代表该个体被选中的概率越大。它的机理为:
(一)任意选择所有个体的一个排列序列(这个序列可以随便排,因为是某线段之间的长度为代表某个体的选择概率)
(二)任意个体的累积概率为该个体对应的前几项数据的累加和。
某个个体的累加概率公式如下:

这样,如果某个个体的适应度数值高,它所对应的个体选择概率就会越大,通过累积概率转换后对应的线段会越长。
在这里插入图片描述
3、选择某个个体策略为在区间[0 1]中随机产生一个数,看看该数字落在那个区间,很明显,对于适应度值较大的个体,对应的线段长度会长,这样随机产生的数字落在此区间的概率就大,该个体被选中的概率也大。同时,对于适应度较小的个体,线段长度会相对较短,随机数字在该区间的概率相对较小,但是也有被选中的可能,避免了适应度数值较小的个体被直接淘汰的问题。
综上,轮盘赌算法的实现步骤为
(i)初始化各个个体的适应度值(适应度值就是某个数值,什么数据都可以,只是对于不同的问题,这个适应度值代表的意义不一样)
(ii)根据公式计算各个个体的个体选择概率和累积概率
(iii)在区间[0 1]之间随机生成一个数,判断该数落在哪个区间内,如果落在某个区间,则该区间被选中。
例子:使用轮盘赌算法根据各个个体被选中的概率与其适应度函数值大小成正比原理,使用了[0.23 0.65 0.38 0.96 0.14 0.76 0.99 0.76 0.56 0.77];%10个模拟适应度值做了实验,计算了3次,每次循环100次。根据算法思想应该为适应度值越大,该个体被选择的概率也就越大,也就是说这100次中该个体被选中的次数应该越多。
第一次: 3 8 8 16 3 17 19 9 3 14
第二次: 2 10 8 15 1 8 18 12 11 15
第三次: 4 15 3 19 6 8 14 13 9 9
可以看到,对于适应度值为0.14的个体,这3次中选中的次数分别为:3、1、6,而对于适应度为0.99的个体,这3次中选中的次数分别为:19,18,14。基本满足了轮盘赌算法的原理。轮盘赌算法matlab实现的代码如下,由于每次的判断数都是随机的,大家使用的该算法得到的测试结果肯定和上面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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值