遺傳算法-選擇算子


選擇算子很多,本文先做個簡單匯總,等應用時再自行研究 

輪盤賭選擇(roulette wheel selection)

錦標賽選擇(tournament selection)

隨機遍歷抽樣(stochastic universal selection)

局部選擇(local selection)

截斷選擇(truncation selection)

 

輪盤賭選擇

個體適應度越高,被選擇的概率越大;    【沒特點】

在該策略下,

最優個體不一定被遺傳到下一代,但這不是缺點,因為這同時避免了超級個體的影響;

最差個體可能被遺傳到下一代,這個不提倡,但也不是說不可以,說不定最差個體交叉變異后很牛逼;

 

 

錦標賽選擇

每次隨機選擇若干個體,挑選適應度最好的保留下來,迭代 N 次生成新種群;   【特點是最差個體一定被淘汰】 

在該策略下,最差個體一定會被淘汰;最優個體不一定保留

 

隨機競爭選擇

每次按輪盤賭選擇一對個體,然后讓這兩個個體進行競爭,適應度高的被選中,如此反復,直到選滿為止  【特點是最差個體一定被淘汰】

 

精英保留策略

依某種策略生成新種群后,用當代最優個體隨機替換新種群的某個體,或者直接替換最差個體;  【特點是最優個體一定被保留】

 

示例代碼

import random
import numpy as np


class GeneticAlgorithm(object):
    def __init__(self):
        pass

    def select_lunpandu(self, fitness, pop_size):
        '''
        選擇算子:輪盤賭選擇
        '''
        new_pop_index = np.random.choice(range(pop_size), size=pop_size, replace=True, p=fitness / fitness.sum())
        return new_pop_index

    def select_jingying(self, fitness, pop_size):
        '''
        選擇算子:精英保留策略
        '''
        ### 首先按輪盤賭選擇
        new_pop_index = np.random.choice(range(pop_size), size=pop_size, replace=True, p=fitness / fitness.sum())
        print('temp', new_pop_index)
        new_fitness = fitness[new_pop_index]    # 新種群
        max_fit_index = np.argmax(fitness)      # 當代最優個體
        min_fit_index = np.argmin(new_fitness)  # 新種群中最差個體
        new_pop_index[min_fit_index] = max_fit_index    # 替換
        return new_pop_index


if __name__ == '__main__':
    ##### test GeneticAlgorithm
    ga = GeneticAlgorithm()

    ### test select_lunpandu
    fitness = np.array([1, 3, 8, 4])
    print(ga.select_lunpandu(fitness, 4))

    ### test select_jingying
    fitness = np.array([1, 3, 5, 4])
    print(ga.select_jingying(fitness, 4))

 

其他

  • 無回放隨機選擇(也叫期望值選擇Excepted Value Selection):根據每個個體在下一代群體中的生存期望來進行隨機選擇運算。方法如下:

    (1) 計算群體中每個個體在下一代群體中的生存期望數目N。

    (2) 若某一個體被選中參與交叉運算,則它在下一代中的生存期望數目減去0.5,若某一個體未 被選中參與交叉運算,則它在下一代中的生存期望數目減去1.0。

    (3) 隨着選擇過程的進行,若某一個體的生存期望數目小於0時,則該個體就不再有機會被選中。

  • 確定式選擇:按照一種確定的方式來進行選擇操作。具體操作過程如下:

    (1) 計算群體中各個個體在下一代群體中的期望生存數目N。

    (2) 用N的整數部分確定各個對應個體在下一代群體中的生存數目。

    (3) 用N的小數部分對個體進行降序排列,順序取前M個個體加入到下一代群體中。至此可完全確定出下一代群體中M個個體。

  • 無回放余數隨機選擇:可確保適應度比平均適應度大的一些個體能夠被遺傳到下一代群體中,因而選擇誤差比較小。

  • 均勻排序:對群體中的所有個體按期適應度大小進行排序,基於這個排序來分配各個個體被選中的概率。

  • 隨機聯賽選擇:每次選取幾個個體中適應度最高的一個個體遺傳到下一代群體中。

  • 排擠選擇:新生成的子代將代替或排擠相似的舊父代個體,提高群體的多樣性

 

參考資料:

https://zhuanlan.zhihu.com/p/29474851  遺傳算法中幾種不同選擇算子

https://www.jianshu.com/p/ae5157c26af9


免責聲明!

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



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