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

如何用Python实现人群每周配对分配,确保每对仅会面一次且所有人完成两两配对

多人两两配对调度方案实现

问题本质

你要实现的是经典的循环赛排程模型:偶数个参与者每轮两两配对,无重复无遗漏,每轮所有人都有唯一配对对象,经过n-1轮(n为参与人数)即可完成所有两两组合的匹配。你给出的6人场景共需要5周完成全部配对,刚好覆盖C(6,2)=15组不重复的双人组合。

注意:你给出的示例代码中第二周的配对存在逻辑错误,Henry同时出现在两个配对中,不符合每人每周仅和一个对象见面的要求,下文的实现方案不会出现这类冲突。

实现方法

你不需要依赖额外的第三方库,基于Python标准库结合循环轮转算法即可实现,代码如下:

def generate_pair_schedule(people_list):
    n = len(people_list)
    # 人数为奇数时补轮空位,你场景中6人为偶数,不需要补位
    if n % 2 != 0:
        people_list = people_list.copy()
        people_list.append("轮空")
        n += 1
    total_schedule = []
    # 总共需要n-1轮完成所有配对
    for _ in range(n-1):
        current_week_pairs = []
        # 每轮配对规则:首位和末位配,剩下的首尾依次配对
        for i in range(n//2):
            pair = (people_list[i], people_list[-(i+1)])
            # 过滤包含轮空的配对
            if "轮空" not in pair:
                current_week_pairs.append(pair)
        total_schedule.append(current_week_pairs)
        # 轮转规则:固定第一个人,剩下的所有人向右移动一位
        people_list = [people_list[0]] + [people_list[-1]] + people_list[1:-1]
    return total_schedule

# 代入你的人员列表测试
people = ['Bill','Fred','Henry','Bob','Phil','Tom']
week_schedules = generate_pair_schedule(people)

# 打印所有周的配对结果
for week_num, pairs in enumerate(week_schedules, 1):
    print(f"第{week_num}周配对:{pairs}")

其他可选方案

如果你需要在更复杂的场景下实现类似需求,也可以用第三方库networkx的完美匹配接口生成配对,但简单场景下上述原生实现已经完全够用,不需要额外安装依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 17:15:00