如何用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
相关产品推荐
相关产品推荐

