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

如何从NumPy数组生成无重复配对矩阵(联赛赛程场景)

联赛赛程编排的NumPy数组实现

已知NumPy数组:

A = np.arange(1,11)

需生成数组B,满足以下要求:

  • B包含 n = len(A)-1 个元素(对应n轮比赛)
  • 每个元素由 m = len(A)/2 个配对组成(每轮的对阵组合)
  • B中任意两个不同元素内的配对完全唯一,无重复对阵

小规模示例验证

当输入 A = np.array([1,2,3,4]) 时,输出应为:

B = np.array([[[1,2],[3,4]],
              [[1,3],[2,4]],
              [[1,4],[2,3]]])

解决方案代码

import numpy as np

def generate_league_schedule(players):
    num_players = len(players)
    # 仅处理偶数人数场景(符合题目需求)
    assert num_players % 2 == 0, "参赛人数需为偶数"
    
    num_rounds = num_players - 1
    num_matches_per_round = num_players // 2
    schedule = []
    
    # 固定第一个选手,其余选手按规则轮转
    fixed_player = players[0]
    rotating_players = players[1:].tolist()
    
    for _ in range(num_rounds):
        # 生成当前轮对阵:固定选手配对轮转列表首元素,首尾依次配对剩余选手
        current_round = [[fixed_player, rotating_players[0]]]
        for i in range(1, num_matches_per_round):
            current_round.append([rotating_players[i], rotating_players[-i]])
        schedule.append(current_round)
        
        # 轮转操作:将最后一名选手移到第二位,为下一轮做准备
        rotating_players.insert(1, rotating_players.pop())
    
    return np.array(schedule)

# 测试小规模输入
A_small = np.array([1,2,3,4])
B_small = generate_league_schedule(A_small)
print("小规模示例输出:")
print(B_small)

# 测试10人参赛场景
A = np.arange(1,11)
B = generate_league_schedule(A)
print("\n10人赛程输出:")
print(B)

逻辑说明

核心采用固定轮转法实现单循环赛制编排:

  1. 固定一名选手,其余选手按规则轮转,确保每一轮的对阵组合无重复
  2. 每轮配对时,固定选手与轮转列表首元素配对,剩余选手从首尾依次取数配对,保证每轮凑齐规定数量的对阵
  3. 每轮结束后调整轮转列表顺序,生成下一轮的对阵基础,最终恰好生成 len(A)-1 轮完整赛程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:22:37