輪盤賭算法


輪盤賭在遺傳算法中應用的很多,效果也不錯,而且它的思想很簡單直觀 —— 物競天擇、適者生存 —— 越強獲得的資源越多 —— 在一個圓中,扇形的面積越大,圓中的點落在該扇形的概率越大。

其主要步驟是:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM