一、根據適應度函數選擇
遺傳演算法是一種基於自然選擇和基因重組的搜索演算法。在遺傳演算法中,適應度函數是一種衡量個體適應程度的方法。在選擇操作的過程中,適應度函數是一個非常重要的參考因素。在選擇操作中,可以根據適應度得分來計算每個個體的選擇概率,從而選擇優秀的個體進行進一步的遺傳操作。
def selection(population, fitness_values):
"""
通過輪盤賭選擇演算法進行選擇
:param population: 種群
:param fitness_values: 適應度函數值
:return: 返回被選擇的個體
"""
population_size = len(population)
selected = []
sum_of_fitness_values = sum(fitness_values)
probabilities = [fitness / sum_of_fitness_values for fitness in fitness_values]
cumulative_probabilities = [sum(probabilities[:i+1]) for i in range(population_size)]
for i in range(population_size):
r = random.random()
for j in range(population_size):
if r <= cumulative_probabilities[j]:
selected.append(population[j])
break
return selected
二、輪盤賭選擇演算法
輪盤賭演算法是一個常用的基於選擇概率進行選擇的演算法。它的選擇原則是,每一個個體都按照其適應度值,被賦予一定的選擇概率。這些選擇概率按照大小關係,被放置在一個輪盤上。根據該輪盤上的概率來進行選擇。
def roulette_wheel_selection(population, fitness_values):
"""
通過輪盤賭選擇演算法進行選擇
:param population: 種群
:param fitness_values: 適應度函數值
:return: 返回被選擇的個體
"""
population_size = len(population)
selected = []
sum_of_fitness_values = sum(fitness_values)
probabilities = [fitness / sum_of_fitness_values for fitness in fitness_values]
cumulative_probabilities = [sum(probabilities[:i+1]) for i in range(population_size)]
for i in range(population_size):
r = random.random()
for j in range(population_size):
if r <= cumulative_probabilities[j]:
selected.append(population[j])
break
return selected
三、競標賽選擇演算法
競標賽選擇演算法是一種簡單有效的遺傳演算法選擇操作方法。它的核心思想是,在所有的個體中,任選幾個個體進行比較,選出適應度值最高的個體,用於遺傳操作。這樣,經過若干輪選擇,能夠有效地保留優秀個體。
def tournament_selection(population, fitness_values, tournament_size):
"""
使用競標賽選擇演算法進行選擇
:param population: 種群
:param fitness_values: 適應度函數值
:param tournament_size: 競標賽的大小
:return: 返回被選擇的個體
"""
population_size = len(population)
selected = []
for i in range(population_size):
competitors = random.sample(range(population_size), tournament_size)
competitors_fitnesses = [fitness_values[j] for j in competitors]
winner = max(competitors_fitnesses)
index = competitors[competitors_fitnesses.index(winner)]
selected.append(population[index])
return selected
四、隨機選擇演算法
隨機選擇演算法是一種簡單的選擇演算法。它的核心思想是,隨機選擇種群中的一個個體,來進行遺傳操作。雖然這種選擇演算法不會對個體進行適應程度的評估和篩選,但是通過適當的控制,可以有效地避免出現早熟現象。
def random_selection(population):
"""
使用隨機選擇演算法進行選擇
:param population: 種群
:return: 返回隨機選擇的個體
"""
population_size = len(population)
index = random.randint(0, population_size - 1)
return population[index]
五、Elitist選擇演算法
Elitist選擇演算法是一種選擇演算法,它的核心思想是,保留種群中適應度最好的若干個個體,不參與遺傳操作,以便能夠保持種群的優良性,避免過早的收斂。
def elitist_selection(population, fitness_values, elite_size):
"""
使用Elitist選擇演算法進行選擇,保留適應度最好的若干個個體
:param population: 種群
:param fitness_values: 適應度函數值
:param elite_size: 保留的個體數量
:return: 返回被選擇的個體
"""
population_size = len(population)
indices = sorted(range(population_size), key=lambda i: fitness_values[i], reverse=True)[:elite_size]
selected = [population[i] for i in indices]
return selected
原創文章,作者:XYTOQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332473.html
微信掃一掃
支付寶掃一掃