轮盘赌在遗传算法中应用的很多,效果也不错,而且它的思想很简单直观 —— 物竞天择、适者生存 —— 越强获得的资源越多 —— 在一个圆中,扇形的面积越大,圆中的点落在该扇形的概率越大。
其主要步骤是:
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)
##
参考: