【权重随机算法】轮盘赌算法
轮盘赌算法(Roulette Wheel Selection)实现原理
轮盘赌算法是一种基于概率的选择方法,常用于遗传算法、随机抽样等场景。它的核心思想是根据个体的适应度(或权重)来决定其被选中的概率,适应度越高,被选中的概率越大。
基本原理
- 计算总权重:将所有候选个体的权重相加得到总权重
- 计算选择概率:每个个体的选择概率 = 个体权重 / 总权重
- 生成随机数:在[0,总权重)范围内生成一个随机数
- 确定选中个体:累加个体权重直到超过随机数,最后累加的个体即为选中个体
具体实现步骤
以员工选择为例,假设有以下3个候选员工及其权重:
员工 | 权重 |
---|---|
A | 3 |
B | 1 |
C | 1 |
- 计算总权重:3 + 1 + 1 = 5
- 计算选择区间:
- A: [0,3)
- B: [3,4)
- C: [4,5)
- 生成随机数:假设生成随机数2.7
- 选择过程:
- 从0开始累加:
- 加A的权重3 → 0+3=3 > 2.7 → 选中A
- 从0开始累加:
算法特点
-
概率与权重成正比:权重越大,被选中的概率越高
- 上例中:
- P(A) = 3/5 = 60%
- P(B) = 1/5 = 20%
- P(C) = 1/5 = 20%
- 上例中:
-
非确定性选择:即使某个体权重最大,也不保证每次都被选中
-
实现简单高效:时间复杂度O(n),只需一次遍历
代码实现示例
public String rouletteWheelSelection(List<EmployeeMapping> mappings, String weightField) {
// 1. 计算总权重
int totalWeight = 0;
for (EmployeeMapping mapping : mappings) {
totalWeight += getWeight(mapping, weightField);
}
// 2. 生成随机数
Random random = new Random();
double randomValue = random.nextDouble() * totalWeight;
// 3. 轮盘赌选择
double currentSum = 0;
for (EmployeeMapping mapping : mappings) {
currentSum += getWeight(mapping, weightField);
if (randomValue < currentSum) {
return mapping.getEmployeeId();
}
}
// 4. 默认返回第一个(理论上不会执行到这里)
return mappings.get(0).getEmployeeId();
}
应用场景
- 遗传算法中的个体选择
- 基于权重的负载均衡
- 随机抽样(按比例抽样)
- 游戏中的概率性奖励分配
- 如本文的员工选择场景
优缺点
优点:
- 实现简单直观
- 能准确反映权重比例关系
- 适合离散概率分布
缺点:
- 当个体间权重差异极大时,小权重个体可能很难被选中
- 需要计算总权重,对于动态变化的群体需要频繁重新计算
轮盘赌算法提供了一种公平而高效的概率选择机制,非常适合需要按权重进行随机选择的场景。
❤️ 如果你喜欢这篇文章,请点赞支持! 👍 同时欢迎关注我的博客,获取更多精彩内容!
本文来自博客园,作者:佛祖让我来巡山,转载请注明原文链接:https://www.cnblogs.com/sun-10387834/p/18826067