基于Score值优化Client与Manager的唯一组合分配方案问询
客户-经理匹配解决方案(基于分数优先级)
需求说明
现有3位经理、6位客户,需为每位经理分配2位唯一的客户,分配规则如下:
- 按
Score从高到低排序,优先匹配分数最高的组合 - 若某客户已被其他经理匹配,则当前经理需选择该客户的次优分数组合,以此类推,直到每位经理都分到2个唯一客户
原始数据
index Client Manager Score 0 1 1 0.89 1 1 2 0.78 2 1 3 0.65 3 2 1 0.91 4 2 2 0.77 5 2 3 0.97 6 3 1 0.35 7 3 2 0.61 8 3 3 0.81 9 4 1 0.69 10 4 2 0.22 11 4 3 0.93 12 5 1 0.78 13 5 2 0.55 14 5 3 0.44 15 6 1 0.64 16 6 2 0.99 17 6 3 0.22
期望输出
index Client Manager Score 0 1 1 0.89 1 2 3 0.97 2 3 2 0.61 3 4 3 0.93 4 5 1 0.78 5 6 2 0.99
解决方案(Pandas实现)
核心思路是先按分数降序排序,依次筛选符合条件的组合:客户未被分配、对应经理还未凑齐2个名额,直到所有经理都完成分配。
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'Client': [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6], 'Manager': [1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3], 'Score': [0.89,0.78,0.65,0.91,0.77,0.97,0.35,0.61,0.81,0.69,0.22,0.93,0.78,0.55,0.44,0.64,0.99,0.22] }) # 按分数从高到低排序,优先处理高分组合 df_sorted = df.sort_values('Score', ascending=False).reset_index(drop=True) # 初始化跟踪状态:已分配的客户、各经理已分配数量 assigned_clients = set() manager_counts = {1: 0, 2: 0, 3: 0} result_list = [] # 遍历排序后的组合,筛选符合条件的记录 for _, row in df_sorted.iterrows(): client = row['Client'] manager = row['Manager'] # 客户未被占用,且当前经理还能分配 if client not in assigned_clients and manager_counts[manager] < 2: result_list.append(row) assigned_clients.add(client) manager_counts[manager] += 1 # 所有经理都分到2个客户就停止循环 if all(count == 2 for count in manager_counts.values()): break # 整理结果,按客户排序对齐期望输出 result_df = pd.DataFrame(result_list).sort_values('Client').reset_index(drop=True) print(result_df)
运行代码后即可得到与期望一致的输出结果。
内容的提问来源于stack exchange,提问作者Dan Richardson
相关产品推荐
相关产品推荐

