You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:28:14