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

网球赛事选手配对方案扩展:适配百余人及奇数人数的优化咨询

网球赛事配对方案扩展问题

我有一份网球赛事的选手名单,赛事每周举办一次,要求每位选手每周都能匹配到新对手,直至所有可能的配对都完成。

我编写了生成所有两人组合的代码:

from itertools import combinations 

names = ['ben',
         'josh',
         'jessy',
         'natalia']

result = [[a + '-' + b] for a, b in combinations(names, 2)]

运行结果:

[['ben - josh'],
 ['ben - jessy'],
 ['ben - natalia'],
 ['josh - jessy'],
 ['josh - natalia'],
 ['jessy - natalia']] 

为实现选手每次匹配未对战过的对手,我写了以下代码:

for i, j in zip(range(int(len(result)/2)), (reversed(range(int(len(result) /2),len(result))))):

    print(result[i], result[j])

运行结果:

['ben - josh'] ['jessy - natalia']

['ben - jessy'] ['josh - natalia']

['ben - natalia'] ['josh - jessy']

请问如何将此方案扩展到100人以上的选手名单?是否有更优的实现方法?另外,若选手人数为奇数时该如何处理?


解决方案

1. 扩展到100+选手的核心思路

你当前的方法依赖预先生成所有组合再拆分周次,但100人时总组合数为C(100,2)=4950,每周最多50场比赛,共需99周。预生成所有组合会占用不必要的内存(人数再扩大时内存压力会急剧上升),且拆分逻辑效率低下。

更合理的方式是按周动态生成配对,无需预存全部对战组合,每次仅生成当周有效配对,彻底避免内存浪费。

2. 更优实现:单循环赛制配对算法

标准单循环赛制(每位选手与其他选手恰好对战一次)有成熟的配对算法,能高效生成每周配对,完全适配你的需求:

偶数人数实现

固定一位选手,将其余选手分组后每周轮换位置,生成无重复的配对:

def generate_round_robin_pairings(players):
    n = len(players)
    # 先处理奇数情况,后续单独说明
    if n % 2 != 0:
        players = players + ['轮空']
    fixed_player = players[0]
    rotating_players = players[1:]
    num_rounds = len(players) - 1

    for round_num in range(num_rounds):
        pairings = []
        # 固定选手与旋转组中间选手配对
        pairings.append((fixed_player, rotating_players[len(rotating_players)//2]))
        # 旋转组左右两端选手依次配对
        for i in range(len(rotating_players)//2):
            pairings.append((rotating_players[i], rotating_players[-i-1]))
        
        # 输出当周配对
        print(f"第{round_num+1}周配对:")
        for p1, p2 in pairings:
            print(f"{p1} vs {p2}")
        
        # 旋转选手列表:将最后一位移到第二位,其余后移
        rotating_players = rotating_players[:1] + rotating_players[-1:] + rotating_players[1:-1]
        print()

# 测试4人场景
players = ['ben', 'josh', 'jessy', 'natalia']
generate_round_robin_pairings(players)

该算法优势:

  • 时间复杂度O(N²),无需预生成所有组合,内存占用极低,适配100+甚至更大规模选手
  • 直接按周生成配对,逻辑贴合赛事每周举办的需求
  • 严格保证每位选手每周对手不重复

3. 奇数人数的处理

当选手人数为奇数时,每周必然有一位选手轮空,处理方式如下:

  • 在选手列表中临时添加「轮空」标识,按偶数人数算法生成配对
  • 每周轮空的选手自动跳过当周比赛,后续周次继续参与配对
  • 确保每位选手轮空次数相同(N个奇数选手,每人轮空1次,共N周比赛)

测试5人场景:

players = ['a', 'b', 'c', 'd', 'e']
generate_round_robin_pairings(players)

运行后每周会有1位选手轮空,所有选手均会轮空1次,且完成全部对战组合。

100+选手的适配说明

对于100+选手,该算法完全适用:

  • 100人时每周50场比赛,共99周,算法会依次生成每一周的所有配对
  • 若需存储所有周次配对,可将每周的pairings存入大列表,内存占用远低于预生成所有组合的方式
  • 可轻松扩展到几百甚至上千人规模,性能无明显下降

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:33:12