类似旅行商问题的特征分组与城市分区最优分配方法咨询
特征分组/城市分区最优算法方案
问题本质
这个需求本质是带组内平均关联度阈值约束的最小集合覆盖问题,目标是用最少的种子节点覆盖全部对象,同时满足每组的平均关联度不低于预设要求。
落地算法推荐
方案1:贪心图聚类算法(实现成本最低,适配绝大多数场景)
实现步骤:
- 先整理所有对象的两两关联值为邻接矩阵,提前设定好要求的组内平均关联度最低阈值
- 计算每个节点的加权度(该节点和其余所有节点的关联值总和),优先选择加权度最高的节点作为第一个种子
- 遍历当前种子的所有关联节点,把所有加入后仍能让组内平均关联度达标的节点划入当前种子的分组
- 将已完成分组的节点从待分配池中移除,重复上述选种子、划分组的步骤,直到待分配池为空
- 最终剩余的无匹配节点直接作为自身分组的种子
样例计算逻辑(匹配你给出的示例数据):
// 关联数据片段 A-B:70, A-C:78, A-G:93, B-C:96, 预设平均关联度阈值为85 1. 计算各节点加权度:A的加权度为70+78+93=241,B为70+96=166,C为78+96=174,优先选A作为种子 2. 筛选A的关联节点:G与A关联93,加入后组平均93≥85,划入A组;D与A关联98,加入后平均(93+98)/2=95.5≥85,划入A组 3. 移除A、D、G后,剩余节点中加权度最高的是B,选B作为种子 4. 筛选B的关联节点:C与B关联96,加入后平均96≥85;F与B关联85,加入后平均(96+85)/2=90.5≥85;E与B关联79,加入后平均(96+85+79)/3=86.6≥85,全部划入B组 5. 剩余H无符合要求的关联节点,单独作为种子
该方案的优势是计算速度极快,结果天然满足最少种子的要求,适合对象数量在1000以内的所有场景。
方案2:带约束的K-medoids聚类(适合高稳定性要求场景)
如果对象数量更大、或者需要分组结果的波动更小,可以选择该方案:
- 第一步同样构建关联邻接矩阵,设定组内平均关联度阈值
- 初始化聚类数量K为1,尝试将所有节点聚为1组,校验所有组的平均关联度是否达标
- 若不达标则K值+1,重新执行K-medoids聚类,聚类中心即为你的种子节点/办公选址
- 直到所有组的平均关联度都满足阈值要求,此时的K就是最少的种子/区域经理数量
该方案的优势是分组的组内关联度整体更均衡,适合对分组质量要求更高的场景。
核心判断逻辑代码参考
# 校验加入新节点后组内平均关联度是否达标 def check_group_valid(seed, group_members, adj_matrix, threshold): total_corr = 0 for member in group_members: total_corr += adj_matrix[seed][member] avg_corr = total_corr / len(group_members) return avg_corr >= threshold
内容的提问来源于stack exchange,提问作者asmgx
相关产品推荐
相关产品推荐

