JavaScript中Round Robin算法异常问题求助
网球双打赛程生成程序问题修复方案
问题拆解
12支队伍的单循环对阵总数为 C(12,2) = 66 场,按需求每周每队仅赛1次,每周应安排6场比赛,11周即可完成全部赛程。当前问题的核心根源:
- 赛程填充逻辑未最大化每周赛事数量,导致部分周仅4场,最终周数膨胀至15周
- 场地分配未结合
roundData中的时间/场地约束规则,出现分配错误
核心修复步骤
1. 重构赛程生成逻辑,确保每周满负荷安排6场比赛
核心思路是从剩余对阵中精准筛选未参赛队伍,优先匹配形成完整的当周赛程:
- 初始化剩余对阵集合:生成所有队伍两两组合的对阵,存入集合
- 初始化当周参赛队伍集合:用于跟踪当周已安排比赛的队伍
- 循环构建当周赛程:
- 遍历剩余对阵,选取双方均未在当周集合中的对阵
- 将该对阵加入当周赛程,把两队加入当周集合,同时从剩余对阵中移除该组合
- 当周集合包含12支队伍(即6场比赛)时,结束当前周生成,重置当周集合,开启下一周
- 重复直到剩余对阵为空
2. 修正场地分配逻辑
结合roundData中的场地和时间信息,实现无冲突的场地分配:
// 示例:为当周赛程分配符合时间要求的场地 function assignFields(weeklyMatches, roundData) { // 复制可用场地列表,避免修改原数据 const availableFields = [...roundData.fields]; return weeklyMatches.map(match => { // 筛选当前比赛时间可用的场地 const suitableField = availableFields.find(field => field.availableTimeSlots.includes(match.timeSlot) ); if (!suitableField) { throw new Error(`比赛${match.id}无符合时间要求的可用场地`); } // 移除已分配的场地,避免重复分配 const fieldIndex = availableFields.indexOf(suitableField); availableFields.splice(fieldIndex, 1); return {...match, assignedField: suitableField.id}; }); }
3. 强制约束周数为11周
通过上述满负荷生成逻辑,每周固定6场比赛,66场正好对应11周,彻底解决周数超标的问题。
关键校验点
- 每次生成对阵后,必须从剩余对阵集合中移除该组合,确保任意两队仅对阵一次的需求
- 当周参赛队伍集合需严格控制为12支,保证每支队伍每周仅参赛一次
- 场地分配前需校验
roundData中的场地可用性,避免分配冲突
内容的提问来源于stack exchange,提问作者Kristoffer Andersson
相关产品推荐
相关产品推荐

