技术实践
技术实践:均衡分班怎么做?蛇形分配与男女反向蛇形
「各班平均分尽量接近、男女比例尽量均衡」,这句话落在代码里比听起来麻烦得多。云帆轻工具的智能分班用一套策略路由加两种蛇形分配解决。这篇把实现思路拆开讲,关键取舍也一并交代。
输入:一行一个人,先预检再分
名单按行粘贴,格式 姓名,学号,性别,总分,性别写「男 / 女」,总分是数字。分班前先跑一遍预检:解析出总人数、男女人数、平均分,缺成绩或缺性别都能识别出来——这决定后面走哪条策略。
四条策略,按数据情况路由
| 数据情况 | 策略 | 说明 |
|---|---|---|
| 有性别 + 有成绩 | 蛇形 + 反向蛇形 | 男生正向蛇形、女生反向蛇形后合并 |
| 只有性别 | 平均分配 | 男生女生各自均分到各班 |
| 只有成绩 | 成绩降序蛇形 | 只按分数 S 形走位 |
| 都没有 | 随机打散均分 | 洗牌后轮流分配 |
路由逻辑一句话:能均衡什么就均衡什么。数据里有什么字段,就启用对应的均衡策略;字段缺失自动降级,不会因为没填成绩就报错。
蛇形分配:S 形走位
名单按成绩降序排好后,指针从 1 班出发:第 1 名进 1 班、第 2 名进 2 班……走到末班折返,再一路走回 1 班。高分低分交替进入每个班,各班总分自然拉近。实现上就是一个指针加一个方向变量:idx += dir,触底 dir = -1,触顶再翻回来。
为什么女生要「反向蛇形」
如果男女都从 1 班开始正向蛇形,会出现 1 班同时拿走男生最高分和女生最高分,末班全收低分。反向蛇形让女生从末班起步:高分女生落在高分男生少的班级,两端互相补齐。这是整个算法里最容易忽略、又最影响均衡效果的一步。
合并与兜底
男女两份结果按班级合并,班内再按成绩降序重排。没填性别的人单独打散,轮流补进各班,人数不是班级数整数倍时的尾巴也靠这一轮兜平。结果落库成历史批次,每次分班都能回看。
