一、根據適應度函數選擇
遺傳演算法是一種基於自然選擇和基因重組的搜索演算法。在遺傳演算法中,適應度函數是一種衡量個體適應程度的方法。在選擇操作的過程中,適應度函數是一個非常重要的參考因素。在選擇操作中,可以根據適應度得分來計算每個個體的選擇概率,從而選擇優秀的個體進行進一步的遺傳操作。
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