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

如何实现按每队最少参赛场次配置的Round Robin调度算法?

基于最少参赛场次终止的Round Robin赛程生成实现

要实现按「每队最少参赛场次」终止的Round Robin赛程,核心是跟踪每支球队的参赛次数,每次生成一轮后更新计数,直到所有球队都达标为止。以下是修改后的完整代码和关键逻辑说明:

修改后的代码

import random

def rotate(lst):
    return lst[1:] + lst[:1]

def make_schedule(teams, min_matches_per_team, shuffle=True, seed=None):
    team_count = len(teams)
    
    if team_count < 2:
        return []
    
    # 处理奇数球队:添加轮空(None)
    original_teams = teams.copy()
    if team_count % 2 == 1:
        teams.append(None)
        team_count += 1

    if shuffle:
        random.seed(seed)
        random.shuffle(teams)
    elif seed is not None:
        raise ValueError("Seed参数仅在shuffle=True时生效")
    
    half_team_count = team_count // 2
    schedule = []
    # 初始化各球队参赛场次统计(轮空的None不统计)
    match_count = {team: 0 for team in original_teams}

    while True:
        # 检查是否所有球队都达到最少参赛场次
        all_reached = all(count >= min_matches_per_team for count in match_count.values())
        if all_reached:
            break
        
        round_matches = []
        for key in range(half_team_count):
            team1 = teams[key]
            team2 = teams[key + half_team_count]
            # 主客场交换:按当前已生成的轮数判断奇偶
            matchup = [team1, team2] if len(schedule) % 2 == 0 else [team2, team1]
            round_matches.append(matchup)
            
            # 更新参赛场次:跳过轮空的None
            if team1 is not None:
                match_count[team1] += 1
            if team2 is not None:
                match_count[team2] += 1
        
        schedule.append(round_matches)
        teams = rotate(teams)
    
    return schedule

关键修改说明

  • 参数调整:将原函数的rounds参数替换为min_matches_per_team,作为终止赛程的核心条件
  • 场次跟踪:用字典match_count实时记录每支球队的参赛次数,轮空的虚拟球队(None)不参与统计
  • 循环终止逻辑:每次生成一轮对阵后,检查所有球队的场次是否都满足≥最少要求,满足则立即停止循环
  • 轮空处理:遇到轮空的对阵时,仅统计实际参赛球队的场次,轮空球队场次不增加
  • 主客场逻辑:保留原有的奇偶轮次主客场交换规则,改用当前已生成的赛程轮数判断,适配动态终止的场景

示例用法

# 4支球队,每队最少参赛3场
teams = ["A", "B", "C", "D"]
schedule = make_schedule(teams, min_matches_per_team=3)

# 打印每一轮对阵
for idx, round_matches in enumerate(schedule, 1):
    print(f"第{idx}轮:")
    for match in round_matches:
        print(f"  {match[0]} vs {match[1]}")

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:32:11