首页 > 编程语言 > 详细

轮盘赌算法

时间:2020-04-17 11:21:02      阅读:71      评论:0      收藏:0      [点我收藏+]

轮盘赌在遗传算法中应用的很多,效果也不错,而且它的思想很简单直观 —— 物竞天择、适者生存 —— 越强获得的资源越多 —— 在一个圆中,扇形的面积越大,圆中的点落在该扇形的概率越大。

其主要步骤是:

1. 计算每个个体被选中的概率p(在遗传算法中,先通过适应度函数计算适应度,然后根据适应度计算选择概率),假设有n个个体;

2. 计算个体的累积概率 cum_p;

3. 通过产生[0,1]间的伪随机数random_value,与累积概率进行比较,若:random_value<cum_p[i],本次则选择个体 i,i=1,2,3...n;

示例如下:

技术分享图片

 

Python代码:

import random
import pandas as pd

def format_data(data_list):
    data_v = set(data_list)
    data_dict = {}
    for ii in list(data_v):
        data_dict[ii] = 0
    for jj in data_list:
        data_dict[jj] = data_dict[jj] + 1
    
    return data_dict.keys(), data_dict.values()

def choice_sample(data_frame, random_value):
    for ss in range(len(data_frame)):
        if data_frame[cum_p][ss] > random_value:
            choice_ind = ss
            break
    return data_frame[words][choice_ind]
    
if __name__ == __main__:
    data_list = [南京,北京,西安,上海,西安,上海,上海,北京,上海,苏州] #可以换成其他的数据列表
    columns = [words]
    data_frame = pd.DataFrame(columns = columns)  #建立空的DataFrame
    
    keys_d, values_d = format_data(data_list)
    
    # 建数据
    data_frame[words] = list(keys_d)
    data_frame[frequency] = list(values_d)
    
    # 求比例
    data_frame[p] = data_frame[frequency]/sum(data_frame[frequency])
    
    #累积分布
    data_frame[cum_p] = data_frame[p].cumsum()
    print(data_frame)
    
    # 选择
    random_value = random.uniform(0,1)  #随机值
    print(随机值为:,random_value)
    choice_data = choice_sample(data_frame, random_value)
    print(选择个体为:,choice_data)

技术分享图片

##

参考:

https://zhuanlan.zhihu.com/p/62666777

https://www.cnblogs.com/adelaide/articles/5679475.html

轮盘赌算法

原文:https://www.cnblogs.com/qi-yuan-008/p/12718129.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!