如何求解收益优先、耗时最短的多工人旅行商启发式问题?
多工人收益最大化路径规划问题解法思路
这本质是带收益的多车辆路径规划问题(VRPP),属于NP-hard问题,62个节点的规模没法用精确算法求解,得用启发式方法推进,以下是具体落地步骤:
问题明确
你的核心是双目标优化:
- 总收益最大化(选中房屋的
Payment总和) - 总耗时最短(工人移动天数+房屋
Days_needed总和)
需要先明确两个目标的优先级,或者将其加权合并为单目标(比如总收益 - α*总耗时,α是你根据业务设定的时间权重)。
数据梳理
你提供的数据集:
# 房屋任务数据 > glimpse(problem) Rows: 62 Columns: 5 $ Location_x <dbl> 27, 20, 29, 26, 22, 23, 22, 24, 25, 23, 30, 27, 21, 22, 21, 24,… $ Location_y <dbl> 72, 74, 70, 80, 78, 72, 73, 77, 74, 77, 75, 80, 71, 77, 80, 80,… $ house_id <chr> 146, 170, 171, 137, 121, 178, 163, 119, 113, 114, 199, 162, 102… $ Payment <dbl> 5378, 7971, 5831, 3303, 6602, 1268, 5371, 1927, 653, 4583, 839,… $ Days_needed <dbl> 3, 2, 2, 1, 3, 4, 2, 1, 2, 5, 1, 5, 4, 3, 5, 2, 2, 3, 1, 3, 1, … # 工人数据 > glimpse(workers) Rows: 8 Columns: 1 $ Professional <chr> "Joe", "Harry", "Jefferson", "Anie", "Donovan", "Jessica", "Leo…
具体解法步骤
1. 预处理:计算移动时间矩阵
根据房屋的Location_x和Location_y计算任意两点间的欧氏距离,再转化为移动天数(比如假设工人每天能移动10单位距离,移动天数=距离/10),把地理位置信息转化为可量化的时间成本。
2. 初始解生成(贪心算法)
先从单目标入手快速得到可行解:
- 按
Payment/Days_needed(单位时间收益)从高到低排序房屋 - 依次将房屋分配给当前总耗时最少的工人(给空闲工人优先分配高价值任务)
- 每个工人的路径按“最近邻”规则排序,减少移动时间
3. 进阶优化(启发式算法)
贪心解只是可行解,要得到更优解,用以下方法调整:
- 模拟退火:随机交换两个工人的任务,或者调整单个工人的任务顺序,如果新解的目标更优则接受,否则按一定概率接受(避免陷入局部最优)
- 遗传算法:将每个工人的任务序列作为“基因”,通过交叉、变异操作生成新解,筛选出目标更优的后代
- 帕累托最优解:如果不想加权合并目标,可生成帕累托前沿(所有无法同时提升收益和减少时间的解),再根据业务需求选择最适配的解
4. 扩展约束适配
后续加入新约束(比如工人技能匹配、任务时间窗口)时,只需要在解的合法性判断环节加入对应条件:
- 若某任务需要特定技能,分配时只给具备该技能的工人
- 若任务有时间窗口,需确保工人到达时间在窗口范围内
工具推荐(R语言)
TSP包:基础TSP/VRP问题的启发式实现GA包:遗传算法框架,可自定义目标函数和约束vrp包:专门的路径规划工具
内容的提问来源于stack exchange,提问作者Diogo Bichon
相关产品推荐
相关产品推荐

