交互式图论学习
交互式图论学习
Guest User
Using app without sign in
车辆路径问题(VRP)求解器
将图划分为车队并计算交付路线
选择算法并生成步骤以开始可视化
多车辆路径问题(VRP)把旅行商问题扩展到车队:多辆车从车场出发,须共同以最小总成本访问所有客户。它是最具经济重要性的 NP 难问题之一。
经典构造方法包括 Clarke-Wright 节约算法,它从每客户一条路线开始,按节省的距离合并路线;以及先聚类后路由的方法,先按地理位置对客户分组,再为每组求解一个 TSP。改进阶段在路线内和路线间应用 2-opt 和 or-opt 移动,禁忌搜索和大邻域搜索等元启发式则弥合与最优的大部分剩余差距。
VRP 为邮政与快递车队规划包裹投递、校车路线、现场服务技术员排班以及垃圾收集环线。商业路由引擎每天求解 VRP 变体数百万次,使之成为物流与运筹工程师的核心技能。
车辆路径问题把 TSP 推广到一支车队。务实的做法遵循「先分组、后排线」的模式:把客户分配到各车辆,再为每辆车解一个 TSP。
VRP(仓库, 客户集, 车辆数):
// 阶段一:把客户分配到各车辆
分组 = 聚类(客户集, 车辆数)
// 可用扇形角、k-均值或 Clarke-Wright 节约法
// 阶段二:为每辆车排线
对每个分组 g:
路线[g] = 解TSP(仓库 + g)
// 阶段三:跨路线改进
重复直到没有改进:
尝试把某个客户移到另一条路线
尝试在两条路线之间交换客户
对被改动的路线重新做 2-opt 优化阶段三才是平庸解与好解的分水岭。先分组再排线能给出还算合理的路线,但分组之间的边界往往划得不好,把一个客户从超载的路线挪到邻近路线,常常比在单条路线内部做任何再优化都更省。因此跨路线的移动是必需的,而不是收尾时的点缀。
从单一仓库出发把六个客户分给两辆车,看看跨路线改进为何重要。
示例图: 一个位于中心的仓库和分布在四周的六个客户:三个聚在北面、三个聚在南面,但北面其中一个客户离南面那一组明显比离自己组内其余客户更近。
最终的划分在数量上不再均衡,四个客户对两个,但总距离反而更小。这正是 VRP 的要点:按几何来分组会得到看着整齐的组,但目标是总距离而不是对称。任何在分组与排线之后就停手的实现,都会把通常在 10% 到 20% 之间的改进空间白白留在桌上。
时间: NP 困难;启发式为 O(n^2) 到 O(n^3) · 空间: O(n^2)
VRP 把 TSP 作为特例包含在内,即单车辆且无载重限制的情形,因此立刻就是 NP 困难的。除极小规模外精确枚举根本不可想象;基于列生成与分支切割的现代精确方法,能在相当大的计算代价下求解约 100 个客户的算例。生产中用的是启发式:Clarke-Wright 节约法构造为 O(n 的平方乘以 log n),主要开销在对节约值排序;先分组后排线的代价是聚类再加每辆车一个 TSP;跨路线的局部搜索每轮为 O(n 的平方)。仅距离矩阵本身就占 O(n 的平方),在大规模算例中这实际上是主导性的内存约束。
先弄清你真实问题带有哪些约束,因为每一种都会把它推向不同的算法家族。
| 替代算法 | 以下情况更合适 | 代价 |
|---|---|---|
| TSP | 只有一辆车且没有载重限制。最简单的特例。 | 启发式 O(n^2) |
| CVRP | 车辆有载重上限。这是物流中的标准变体。 | NP 困难 |
| VRPTW | 客户只能在特定的时间窗内被服务。 | NP 困难,约束强得多 |
| Clarke-Wright 节约法 | 你想要一个不必先聚类、快速而合理的构造。按节约值递减合并路线。 | O(n^2 log n) |
| 大邻域搜索 | 大规模算例且看重解的质量。反复破坏并修复解的一部分。 | 视情况而定 |
阅读完整文章: The Vehicle Routing Problem
相关算法: 旅行商问题, 带容量限制的车辆路径规划 (CVRP), K-Means 物流聚类