一、核心思想
- 每个个体适应度越高 ,分到的选择概率越大;
- 把所有个体适应度拼成一个轮盘;
- 随机转轮盘,指针落到哪个区间,就选中哪个个体;
- 概率 = 个体适应度 / 种群总适应度。
二、数学公式
设种群有 (N) 个个体,第 (i) 个个体适应度为 (f_i)
-
种群总适应度:
F = \\sum_{i=1}\^N f_i
-
第 (i) 个个体被选中的概率:
p_i = \\frac{f_i}{F}
-
累积概率(构造轮盘区间):
P_i = \\sum_{k=1}\^i p_k
三、实现步骤(一步步流程)
- 计算种群每个个体适应度 (f_i)
- 求总适应度 (F)
- 算每个个体选择概率 (p_i)
- 计算累积概率 (P_i),形成分段区间
- 生成一个 0~1 随机数 r
- 判断 r 落在哪个累积概率区间,对应个体被选中
- 重复多次,选出新种群
四、举个极简例子
种群4个个体,适应度:
(f_1=5,\ f_2=10,\ f_3=3,\ f_4=12)
总适应度 (F = 30)
概率:
- (p_1 = 5/30 \approx 0.1667)
- (p_2 = 10/30 \approx 0.3333)
- (p_3 = 3/30 = 0.1)
- (p_4 = 12/30 = 0.4)
累积概率:
- (P_1 = 0.1667)
- (P_2 = 0.5)
- (P_3 = 0.6)
- (P_4 = 1.0)
随机数举例:
- 若 (r=0.2):在 (0.1667, 0.5) → 选个体2
- 若 (r=0.7):在 (0.6, 1.0) → 选个体4
适应度越高,占区间越大,被选中概率越高。
五、Python 完整可运行代码实现
python
import random
import numpy as np
# 轮盘赌概率分配选择法
def roulette_selection(population, fitness):
# 1. 总适应度
total_fit = sum(fitness)
# 2. 每个个体选择概率
prob = [f / total_fit for f in fitness]
# 3. 累积概率
cum_prob = np.cumsum(prob)
# 4. 随机0~1,选择个体
r = random.random()
for i in range(len(cum_prob)):
if r <= cum_prob[i]:
return population[i]
# 测试
if __name__ == "__main__":
pop = ['个体1','个体2','个体3','个体4']
fit = [5, 10, 3, 12]
selected = roulette_selection(pop, fit)
print("本次选中个体:", selected)
六、关键特点 & 缺点
✅ 优点:
- 完全按适应度概率分配,优胜劣汰直观
- 实现简单、经典易懂
❌ 缺点:
- 容易早熟收敛:超级优秀个体霸占轮盘,很快垄断种群
- 适应度接近时,选择差异不大
👉 改进:排序选择、锦标赛选择(教学里常用轮盘赌作为基础原理)。