轮盘赌算法

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

其主要步骤是:

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