轮盘赌选择法

轮盘赌选择原理

轮盘赌选择法(roulette wheel selection)是最简单也是最常用的选择方法,在该方法中,各个个体的选择概率和其适应度值成比例,适应度越大,选中概率也越大。
轮盘赌选择法
从图中可以看出一等奖、二等奖、三等奖和四等奖的概率分别为10%、20%、30%、40%,和为100%。

个体0123
概率0.10.20.30.4

python代码实现如下:

import numpy as np

# 轮盘赌选择,list1为 list []
def roulette1(list1):
    # 产生 [0, 1) 的随机数
    r = np.random.rand()
    s = 0
    for i, v in enumerate(list1):
        s += v
        if s > r:
        	# 返回个体索引{0,1,2,3}
            return i
    return len(list1) - 1

我们测试一下roulette1,测试代码如下:

from unittest import TestCase

class Test(TestCase):
    def test_roulette1(self):
        l1 = [0.1, 0.2, 0.3, 0.4]
        result1 = [0, 0, 0, 0]
        # 执行1000次,记录每个个体的选择结果
        for i in range(1000):
            index = roulette1(l1)
            result1[index] += 1
        print('result1 =', result1)
result1 = [109, 198, 304, 389]

可以看出比例接近{0.1,0.2,0.3,0.4}。

但是对于和不为100%的情况该怎么办呢?可以将每个个体的概率进行归一化处理,即每个个体的概率除以概率之和。这样做其实比较麻烦。

也可以采用另一种方法。即在取随机数的时候不取 [0,1)的随机数,而是取 [0, s) 的随机数,s为所有个体概率之和,比如每个个体概率如下表所示:

个体0123
概率0.050.010.150.2

所有个体概率之和为0.5,在计算时只需要取[0,0.5)的随机数即可。
python代码如下:

import numpy as np

def roulette2(list1):
    # 产生 [0, sum(list1)) 的随机数
    r = np.random.uniform(0, np.sum(list1))
    s = 0
    for i, v in enumerate(list1):
        s += v
        if s > r:
            return i
    return len(list1) - 1

同样的,测试一下:

from unittest import TestCase

class Test(TestCase):
	def test_roulette2(self):
        l2 = [0.05, 0.1, 0.15, 0.2]
        result2 = [0, 0, 0, 0]
        # 执行1000次,记录每个个体的选择结果
        for i in range(1000):
            index = roulette2(l2)
            result2[index] += 1
        print('result2 =', result2)
result2 = [105, 201, 296, 398]

可以看出比例接近{0.1,0.2,0.3,0.4}。

那么个体的排列顺序对概率是否有影响呢?没有影响。我们可以测试一下。

from unittest import TestCase

class Test(TestCase):
    def test_roulette3(self):
    	# 将个体顺序调换
        l3 = [0.15, 0.2, 0.05, 0.1]
        result3 = [0, 0, 0, 0]
        for i in range(1000):
            index = roulette2(l3)
            result3[index] += 1
        print('result3 =', result3)
result3 = [300, 406, 101, 193]

可以看出结果接近{0.3,0.4,0.1,0.2}。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值