您的位置:

遗传算法选择操作

一、根据适应度函数选择

遗传算法是一种基于自然选择和基因重组的搜索算法。在遗传算法中,适应度函数是一种衡量个体适应程度的方法。在选择操作的过程中,适应度函数是一个非常重要的参考因素。在选择操作中,可以根据适应度得分来计算每个个体的选择概率,从而选择优秀的个体进行进一步的遗传操作。

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