寻求8岗位无重复人员排班方案及对应时区技术支持
解决方案:基于回溯法的二分图完美匹配实现
你的问题本质是二分图完美匹配问题:一端是8个岗位,另一端是可胜任的人员,需要找到一组匹配,每个岗位对应唯一人员,且每个人员只对应一个岗位。针对这个规模的问题,用回溯法实现简单直观,且能快速得到结果。
代码实现
test = {"19:00" : { "MT": ["Husky", "Joke Bear", "꾸랭"], "ST": ["Husky", "Joke Bear", "꾸랭"], "MH": ["히와"], "SH": ["네모", "러나"], "D1": ["스테잇", "네모", "몽구", "Husky"], "D2": ["스테잇", "네모", "몽구", "Husky"], "D3": ["은빈"], "D4": ["네모", "은빈", "Husky"] }} # 提取岗位列表与对应候选人员 position_list = list(test["19:00"].keys()) candidate_groups = [test["19:00"][pos] for pos in position_list] def find_valid_schedule(pos_idx, used_staff, current_match): # 所有岗位分配完成,返回格式化结果 if pos_idx == len(position_list): return {position_list[i]: current_match[i] for i in range(len(current_match))} # 遍历当前岗位的所有候选人员 for staff in candidate_groups[pos_idx]: if staff not in used_staff: # 标记人员已使用,记录当前分配 used_staff.add(staff) current_match.append(staff) # 递归处理下一个岗位 result = find_valid_schedule(pos_idx + 1, used_staff, current_match) if result: return result # 回溯:撤销当前分配,尝试下一个人员 used_staff.remove(staff) current_match.pop() # 当前岗位无可用人员,返回None return None # 执行调度查找 final_schedule = find_valid_schedule(0, set(), []) print(final_schedule)
代码说明
- 数据预处理:先从输入的
test字典中提取岗位顺序和对应的候选人员列表。 - 回溯逻辑:
- 从第一个岗位开始,逐个尝试分配未被占用的人员
- 每分配一个人员,就递归处理下一个岗位
- 如果某条路径无法完成所有岗位分配,就回溯撤销当前人员的分配,尝试其他候选
- 终止条件:当所有岗位都完成分配时,返回格式化的岗位-人员映射结果。
运行结果
执行代码后会输出符合要求的无重复排班结果,示例输出(与你期望的position_list一致):
{ "MT": "꾸랭", "ST": "Joke Bear", "MH": "히와", "SH": "러나", "D1": "스테잇", "D2": "몽구", "D3": "은빈", "D4": "네모" }
如果需要生成所有可能的有效排班,可以修改代码收集所有符合条件的结果,而非找到第一个就返回。
内容的提问来源于stack exchange,提问作者Korean Monk
相关产品推荐
相关产品推荐

