python 实现的简单的轮盘赌

前言
之前写过很多次,后面再用老是要重新写,mark一下

轮盘赌算法原理

轮盘赌选择法(roulette wheel selection)是最简单也是最常用的选择方法,在该方法中,各个个体的选择概率和其适应度值成比例,适应度越大,选中概率也越大。但实际在进行轮盘赌选择时个体的选择往往不是依据个体的选择概率,而是根据**“累积概率”**来进行选择。

轮盘赌选择法的过程如下:

(1)计算每个个体的被选中概率p(xi)
(2)计算每个部分的累积概率q(xi)
(3)随机生成一个数组m,数组中的元素取值范围在0和1之间,并将其按从小到大的方式进行排序。若累积概率q(xi)大于数组中的元素m[i],则个体x(i)被选中,若小于m[i],则比较下一个个体x(i+1)直至选出一个个体为止。
(4)若需要转中N个个体,则将步骤(3)重复N次即可。

代码

import random
def roulette(select_list):
    sum_val = sum(select_list)
    random_val = random.random()
    probability = 0#累计概率
    for i in range(len(select_list)):
        probability += select_list[i] / sum_val#加上该个体的选中概率
        if probability >= random_val:
            return i#返回被选中的下标
        else:
            continue


if __name__ == '__main__':
    select_list = [10,10,10,10,10,10]
    for i in range(50):
        re = roulette(select_list)
        select_list[re] -= 1#被选中的下标的值减1
        print(select_list)

说明:
我这里是每次从一个list中选择一个数,希望list中各个列能够相对均匀的被选择,不会出现有些列最后剩特别多。

执行结果:
均匀的减少

后言(与主题无关,只是测试)

如果不采用轮盘赌,每次随机选一个数,有些时候有些值就会减少的很快,测试代码如下

import random
if __name__ == '__main__':
    select_list = [10,10,10,10,10,10]
    for i in range(50):
        # re = roulette(select_list)
        re = np.random.randint(0, high=len(select_list), size=None)
        select_list[re] -= 1
        print(select_list)

执行的结果:
在这里插入图片描述
这表明采用轮盘赌还是能够增大数量多的个体的选择性,保证整体减少均匀。

遗传算法的轮盘选择法是一种基于概率的选择算法,常用于遗传算法中的选择操作。它的基本思想是将每个个体的适应度值转化为一个概率值,然后按照这个概率值进行选择。具体来说,假设有N个个体,每个个体的适应度值为Fi,总适应度值为F,那么第i个个体被选中的概率为Fi/F。这样,适应度较高的个体被选中的概率较大,从而增加了它们被选择的机会。轮盘选择法的实现方式是通过随机旋转一个轮盘,最终指针指向的扇形即为所选个体。这种选择方法可以有效地保留适应度较高的个体,并适应性地探索解空间,从而提高遗传算法的性能。\[2\]\[3\] #### 引用[.reference_title] - *1* [遗传算法——轮盘选](https://blog.csdn.net/u012732168/article/details/117417505)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [加入轮盘的遗传算法](https://blog.csdn.net/bobo123355566/article/details/130927455)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值