当前位置: 首页 > ai >正文

调度算法中的轮盘赌与锦标赛选择算子:优势对比与选择策略

在进化算法、遗传算法或群体智能算法中,选择算子(Selection Operator)是决定种群中哪些个体能够被保留到下一代的核心机制。轮盘赌(Roulette Wheel Selection)和锦标赛(Tournament Selection)是两种经典的选择算子,它们各有优势和适用场景。

一、轮盘赌选择(Roulette Wheel Selection)

原理

轮盘赌选择是一种比例选择(Proportional Selection)方法。每个个体的适应度值被归一化为一个概率,适应度越高的个体被选中的概率越大。具体步骤如下:

  1. 计算群体中所有个体的适应度总和。
  2. 将每个个体的适应度除以总和,得到其被选中的概率。
  3. 构建累积概率分布(如轮盘上的切片)。
  4. 生成随机数并根据累积概率选择个体。

优点

  • 简单易实现:逻辑直观,适合初学者。
  • 适应度高的个体被优先保留,有利于快速收敛。
  • 适合适应度分布较均匀的场景

缺点

  • 过早收敛风险:若某些个体适应度极高,可能主导种群,导致多样性下降。
  • 对适应度分布敏感:若适应度差异过大(如指数级增长),低适应度个体几乎无法被选中。

C++ 伪代码

#include <vector>
#include <random>
#include <algorithm>// 假设 Individual 是自定义的类,包含适应度值
std::vector<Individual> rouletteWheelSelection(const std::vector<Individual>& population) {std::vector<Individual> selected;std::random_device rd;std::mt19937 gen(rd());std::uniform_real_distribution<> dis(0.0, 1.0);double totalFitness = 0.0;for (const auto& ind : population) {totalFitness += ind.fitness;}// 计算累积概率std::vector<double> cumulativeProbabilities;double cumulative = 0.0;for (const auto& ind : population) {cumulative += ind.fitness / totalFitness;cumulativeProbabilities.push_back(cumulative);}for (size_t i = 0; i < population.size(); ++i) {double r = dis(gen); // [0,1) 随机数for (size_t j = 0; j < cumulativeProbabilities.size(); ++j) {if (r <= cumulativeProbabilities[j]) {selected.push_back(population[j]);break;}}}return selected;
}

二、锦标赛选择(Tournament Selection)

原理

锦标赛选择从种群中随机选择 k 个个体(称为“参赛者”),从中保留适应度最高的个体作为胜者。重复此过程直到选出所需数量的个体。关键参数是参赛规模 k

  • k=2:最小规模,选择压力最低。
  • k=n(种群规模):最大规模,选择压力最高。

优点

  • 平衡探索与开发:通过调整 k 的大小,灵活控制选择压力。
  • 对适应度分布不敏感:即使适应度差异大,也能保留多样性。
  • 避免过早收敛:较小的 k 可防止适应度极高的个体垄断选择。

缺点

  • 实现复杂度略高:需要随机选择参赛者并比较适应度。
  • 依赖参数 k:需根据问题调整 k 的值。

C++ 伪代码

#include <vector>
#include <random>
#include <algorithm>// 假设 Individual 是自定义的类,包含适应度值
std::vector<Individual> tournamentSelection(const std::vector<Individual>& population, int tournamentSize) {std::vector<Individual> selected;std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dist(0, population.size() - 1);for (size_t i = 0; i < population.size(); ++i) {// 随机选择 tournamentSize 个个体std::vector<int> competitors;while (competitors.size() < tournamentSize) {int idx = dist(gen);if (std::find(competitors.begin(), competitors.end(), idx) == competitors.end()) {competitors.push_back(idx);}}// 找出参赛者中的最优个体int bestIdx = competitors[0];for (int idx : competitors) {if (population[idx].fitness > population[bestIdx].fitness) {bestIdx = idx;}}selected.push_back(population[bestIdx]);}return selected;
}

三、轮盘赌 vs 锦标赛:如何选择?

特性轮盘赌锦标赛
实现难度简单中等
适应度敏感性高(依赖概率分布)低(直接比较)
多样性控制难(可能过早收敛)易(通过 k调整选择压力)
适用场景适应度分布均匀、需快速收敛适应度分布不均、需维持多样性
计算开销高(需累积概率计算)低(仅比较 k 个个体)

选择策略

  1. 优先选择轮盘赌

    • 问题适应度分布较均匀。
    • 需要快速收敛且对多样性要求不高。
    • 初级实验或教学场景。
  2. 优先选择锦标赛

    • 适应度差异大(如存在“超级个体”)。
    • 需要长期维持种群多样性。
    • 动态优化问题或复杂搜索空间。
  3. 混合使用

    • 在算法初期使用轮盘赌加速收敛,后期切换到锦标赛维持多样性。

 

四、总结

轮盘赌和锦标赛选择算子各有优劣,选择时需结合问题特性、适应度分布和算法目标。轮盘赌适合快速收敛,而锦标赛更适合复杂场景下的平衡优化。通过合理调整参数(如锦标赛的 k 值),开发者可以灵活控制算法的探索与开发能力,从而提升整体性能。

http://www.xdnf.cn/news/9047.html

相关文章:

  • 创建一个简易的风扇动画界面:基于 WPF 和 XAML 的实现教程
  • 第Y1周打卡——调用官方权重进行检测
  • 每日算法 -【Swift 算法】字符串转整数算法题详解:myAtoi 实现与正则表达式对比
  • 直线参数方程何时必须化为标准形式 |新高考已删
  • golang channel 的特点、原理及使用场景
  • 人工智能 - Magentic-UI与Browser Use 技术选型
  • C++基础算法————递推
  • Neural Blind Deconvolution Using Deep Priors论文阅读
  • 【Dify系列教程重置精品版】第十章:Dify与RAG
  • Guard Trace 值得吗?
  • 3.python操作mysql数据库
  • 切换目录大全
  • Voice Conversion语音转换
  • PHP:赋能Web开发的经典语言与未来演进
  • XSS跨站脚本攻击的原理、危害与防御
  • 基于PDF流式渲染的Word文档在线预览技术
  • 用MMdetection框架训练自己的数据集(全流程实战)
  • GitAny - 無需登入的 GitHub 最新倉庫檢索工具
  • AbMole| Erastin(571203-78-6,M2679,铁死亡诱导剂)
  • 基于MATLAB的大规模MIMO信道仿真
  • 系统架构中的限流算法(一)
  • 两个Ubuntu机器,设置共享目录实时同步
  • React的单向数据绑定
  • 力扣热题-有向图中最大颜色值
  • 二十八、面向对象底层逻辑-SpringMVC九大组件之ViewResolver接口设计
  • ASCII码对应表
  • call的作用是什么,为什么要使用它?
  • AI工具使用的最佳实践,如何通过AI工具提高创作与工作效率
  • react基础知识(下)
  • A-9 OpenCasCade读取STEP文件中的NURBS曲面