輪盤賭在遺傳算法中應用的很多,效果也不錯,而且它的思想很簡單直觀 —— 物競天擇、適者生存 —— 越強獲得的資源越多 —— 在一個圓中,扇形的面積越大,圓中的點落在該扇形的概率越大。
其主要步驟是:
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)
##
參考: