遗传算法中的轮盘赌选择法(Roulette Wheel Selection)

一、核心思想

  1. 每个个体适应度越高,分到的选择概率越大
  2. 把所有个体适应度拼成一个轮盘
  3. 随机转轮盘,指针落到哪个区间,就选中哪个个体;
  4. 概率 = 个体适应度 / 种群总适应度。

二、数学公式

设种群有 (N) 个个体,第 (i) 个个体适应度为 (f_i)

  1. 种群总适应度:
    [
    F = \sum_{i=1}^N f_i
    ]

  2. 第 (i) 个个体被选中的概率:
    [
    p_i = \frac{f_i}{F}
    ]

  3. 累积概率(构造轮盘区间):
    [
    P_i = \sum_{k=1}^i p_k
    ]


三、实现步骤(一步步流程)

  1. 计算种群每个个体适应度 (f_i)
  2. 总适应度 (F)
  3. 算每个个体选择概率 (p_i)
  4. 计算累积概率 (P_i),形成分段区间
  5. 生成一个 0~1 随机数 r
  6. 判断 r 落在哪个累积概率区间,对应个体被选中
  7. 重复多次,选出新种群

四、举个极简例子

种群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 完整可运行代码实现

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)

六、关键特点 & 缺点

✅ 优点:

  • 完全按适应度概率分配,优胜劣汰直观
  • 实现简单、经典易懂

❌ 缺点:

  • 容易早熟收敛:超级优秀个体霸占轮盘,很快垄断种群
  • 适应度接近时,选择差异不大

👉 改进:排序选择、锦标赛选择(教学里常用轮盘赌作为基础原理)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛魔小丸子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值