如何实现按每队最少参赛场次配置的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
相关产品推荐
相关产品推荐

