如何为最大化目标函数的遗传算法实现排名选择算子
遗传算法排名选择函数实现方案
核心逻辑梳理
排名选择的核心是基于个体适应度的排名分配选择权重,而非直接使用适应度数值。针对你的最大化目标函数场景:
- 先将所有个体按适应度从低到高排序
- 给排名第k位(从1开始计数,最差个体排第1)的个体分配权重k,所有个体的权重总和为 ( S = \frac{N(N+1)}{2} )(N为种群规模)
- 每个个体的选择概率为 ( \frac{k}{S} ),适应度越高的个体排名越靠前,被选中的概率越大
具体实现代码
假设你的种群是由(x二进制编码, y二进制编码)组成的列表,适应度列表是对应每个个体的适应度计算结果,以下是rank_selection()的实现:
import random def rank_selection(population, fitness_list): # 将个体与对应适应度配对,避免排序后错位 paired_individuals = list(zip(population, fitness_list)) # 按适应度升序排序(最差个体排第1位) sorted_pairs = sorted(paired_individuals, key=lambda x: x[1]) # 计算权重总和(等差数列求和) population_size = len(population) total_weight = population_size * (population_size + 1) // 2 # 生成每个个体的选择概率 selection_probs = [rank / total_weight for rank in range(1, population_size + 1)] # 基于概率选择个体,返回与原种群规模一致的新种群 selected_pop = random.choices([pair[0] for pair in sorted_pairs], weights=selection_probs, k=population_size) return selected_pop
适配你的算法调用
直接传入已生成的种群和get_fitness计算出的适应度列表即可:
# 假设已获取种群population和对应的适应度列表fitness_values new_population = rank_selection(population, fitness_values)
内容的提问来源于stack exchange,提问作者Gabriel Schumacher
相关产品推荐
相关产品推荐

