轮盘赌算法概述
轮盘赌算法算是应用比较广泛的一种算法,在很多算法模型都可以看到该算法的身影。而它本身也的确比较简单,只不过与其它算法结合在一起时,就不是很容易看得出轮盘赌算法了。
算法本质
该算法本质就是转盘,看转盘停下时停在转盘的哪个区域。而转盘停在哪个区域与转盘的区域面积正相关。
对于上面的转盘,当我们转动时,指针停在绿色区域概率就是0.6,蓝色是0.1,橙色是0.3。
在实际应用中,我们得到根据各个解的概率去选择一个解,就相当于轮盘赌。兔兔介绍两种实现方法。
实现方法
(1)使用choice函数
在numpy.random中有一个choice函数,它可以根据各个标签对应的概率选标签,概率越大,被选概率越大。如果只选1个,就相当于转一次轮盘得到结果;选n个,就相当于转n次转盘,得到n个结果。
import numpy as np
x=np.random.choice(a=[1,2,3,4],size=1,replace=True,p=[0.1,0.2,0.3,0.4])
print(x)
其中size就是选的解的个数,这里size=1就是转一次盘得到的一个结果。p就是选a里面各个对应值的对应概率。p需要在0~1之间,并且各个概率和一定是1,p的个数与a里面值的个数一致。
(2)轮盘赌算法实现。
把各个概率累加,这样就得到长度为1的线段,每一段长度代表相应值的概率,概率越大,该线段占整个现电的比例越大。然后随机选取0~1之间的一个数,插入整个线段中。落入哪一段就选那个值。并且落入哪一段的概率与该段的长度(概率)成正相关,这样就相当于转轮盘选数了。
label=["a","b","c"<'d'] #需要选的值
p=[0,1,0.2,0.3,0.4] #上面选的值对应概率
cumsum_p=np.cumsum(p) #进行累加,每一个位置的值是前面所有值的和
cumsum_p=cumsum_p-np.random.rand() #相当于随机插入0~1之间的值
index=list(cumsum_p>0).index(True) #选择插入那段区间对应的位置
print(label[index]) #结果
上面算法把选择了把数进行累加的方法,然后与随机数0~1相减,变成小于零与大于零两部分,然后找第一个大于零的位置就是选的值的索引了。
总结
以上两种方法都可以实现轮盘赌的方法,实际应用用感觉调用choice更方便。不过有很多文章还是直接用算法实现的方法,同学们在看一些其它算法(如遗传算法、蚁群算法等)的代码时也需要认得该部分。