交互式图论学习
交互式图论学习
Guest User
Using app without sign in
带容量车辆路径求解器
在严格遵守各个卡车容量的情况下计算最佳交付路线。
选择算法并生成步骤以开始可视化
带容量约束的车辆路径问题(CVRP)为每辆车增加载重上限:规划路线时,每条路线的总需求绝不能超过车辆容量。这一约束使问题比普通路由更贴近现实、也更困难。
Clarke-Wright 节约启发式仍是标准起点,只在合并后需求不超过容量时才合并路线。扫描算法围绕车场旋转一条射线以形成满足容量的簇,再把每个簇作为 TSP 路由。精确的分支切割定价求解器可处理至多数百个客户,而混合遗传搜索等现代元启发式为数千个客户给出接近最优的解。
CVRP 支配配送中的卡车装载规划、饮料与生鲜配送、燃油罐车调度以及货车容量成为瓶颈的电商最后一公里履约。更优路由带来的百分之几成本节省,在车队规模上意味着巨额金额。
CVRP 就是给每辆车加上载重上限的 VRP。仅这一条约束就改变了哪些分组在根本上是可行的,因而也改变了整个搜索的结构。
CVRP(仓库, 客户集, 容量 Q):
// Clarke-Wright 节约法构造
先让每个客户各自成为一条路线
对每一对 (i, j):
节约[i][j] = d(仓,i) + d(仓,j) - d(i,j)
把各对按节约值递减排序
按该顺序处理每一对 (i, j):
若 i 与 j 位于不同路线
且两者都是各自路线的端点
且 需求(路线_i) + 需求(路线_j) <= Q:
合并这两条路线
// 之后:路线内做 2-opt、路线间做移动,
// 并始终拒绝任何违反容量的操作节约值衡量的是把 i 与 j 放在同一条路线上服务,相比分两趟往返能省下多少。容量检查正是 CVRP 区别于 VRP 之处:某次合并可能在距离上极为划算,却根本不被允许。之后所有的局部搜索都必须在每一步移动时重复这项检查,因为一次能改善距离的跨路线交换,可能会让某条路线变得不可行。
用一辆容量为 10 的车服务五个客户,看看载重约束如何否决掉最划算的那次合并。
示例图: 仓库加五个客户,需求分别为 C1 等于 4、C2 等于 4、C3 等于 3、C4 等于 3、C5 等于 2。每辆车可运载 10 个单位。
该解使用两辆车,载重分别为 8 和 8,尽管距离上最诱人的那次合并本应是把 C3 加进第一条路线。这次否决正是 VRP 与 CVRP 的全部差别:在纯粹的 VRP 中那次合并会被接受,解会更短却不可行。另外还要注意,总需求为 16 而单车容量为 10,因此两辆车已是最少;无论优化得多好,都不存在只用一辆车的解。
时间: NP 困难;Clarke-Wright 为 O(n^2 log n) · 空间: O(n^2)
Clarke-Wright 节约法要为 O(n 的平方) 个点对各算一个节约值并排序,这主导了代价,为 O(n 的平方乘以 log n)。只要维护好相应的数据结构,每次合并尝试都是对载重与路线端点的常数时间检查。之后的局部搜索每轮为 O(n 的平方)。问题本身是 NP 困难的,因为它包含 TSP,而加上容量之后它变得更难,因为可行解空间被不规则地切割开来。基于列生成的精确方法能求解约百来个客户的基准算例;超出之后就要用元启发式。一个既有用又免费的下界是总需求除以容量再向上取整,它给出所需车辆数的最小值。
每增加一条约束,就定义出一个自成体系的变体,各有其文献与求解器。
| 替代算法 | 以下情况更合适 | 代价 |
|---|---|---|
| 无容量的 VRP | 车辆没有实质性的载重上限。搜索空间更简单。 | NP 困难 |
| Clarke-Wright 节约法 | 你想要一个又快又好、且在构造上就满足容量的初始解。 | O(n^2 log n) |
| VRPTW | 除容量之外还有配送时间窗。约束强得多。 | NP 困难 |
| 异构车队 | 各车辆的容量与成本互不相同,因此除了排线之外分配也很重要。 | NP 困难 |
| 装箱问题 | 你只关心需要多少辆车而不关心路线。CVRP 的下界正是由此而来。 | NP 困难,有良好的近似算法 |
阅读完整文章: The Vehicle Routing Problem
相关算法: 车队调度 (mTSP), 旅行商问题, 设施选址