车辆路径优化问题变体及数学模型
车辆路径优化问题(Vehicle Routing Problem,VRP)是一种非常常见的优化问题,在给定一组客户点、车辆容量、车辆数量、起始点和终点,目标是找到使得所有客户点都被访问一次的最短路径方案。VRP有很多变体:
- 旅行商问题(Travelling salesman problem,TSP) the classic routing problem in which there is just one vehicle.
- 车辆路径问题(Vehicle Routing Problem,VRP), a generalisation of the TSP with multiple vehicles.
- VRP with capacity constraints, in which vehicles have maximum capacities for the items they can carry.
- 带时间窗的车辆路径规划问题(VRP with time windows,VRPTW),where the vehicles must visit the locations in specified time intervals.
- VRP with resource constraints, such as space or personnel to load and unload vehicles at the depot (the starting point for the routes).
- VRP with dropped visits, where the vehicles aren’t required to visit all locations, but must pay a penalty for each visit that is dropped.
一、旅行商问题(Travelling salesman problem,TSP)
最经典的的车辆路径优化问题是旅行商问题(Travelling salesman problem,TSP),给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。
TSP问题数学模型
刘兴禄 -《运筹优化常用模型、算法及案例实战:Python+Java实现》总结了TSP问题共有3种数学模型:
- Dantzig-Fulkerson-Johnson model,DFJ模型(本文采用)
- Miller-Tucker-Zemlin model,MTZ模型
- 1-tree模型
DFJ模型,也是最常见的模型如下:
min ∑ i ∈ V ∑ j ∈ V d i j x i j subject to ∑ j ∈ V x i j = 1 , ∀ i ∈ V , i ≠ j ∑ i ∈ V x i j = 1 , ∀ j ∈ V , i ≠ j ∑ i ∈ S ∑ j ∈ S x i j ≤ ∣ S ∣ − 1 , 2 ≤ ∣ S ∣ ≤ N − 1 , S ⊂ V x i j ∈ { 0 , 1 } , ∀ i , j ∈ V \begin{align} \min \quad & \sum_{i \in V}{}\sum_{j \in V} d_{ij}x_{ij}\\ \text{subject to} \quad &\sum_{j \in V} x_{ij} = 1, \quad \forall i \in V,i \neq j \\ &\sum_{i \in V}{x_{ij}} =1,\quad \forall j \in V ,i \neq j\\ & \textcolor{red}{\sum_{i\in S}\sum_{j \in S}{x_{ij}} \leq |S|-1,\quad 2\leq |S| \leq N-1, S \subset V}\\ &x_{ij} \in \{0,1\}, \quad \forall i,j \in V \end{align} minsubject toi∈V∑j∈V∑dijxijj∈V∑xij=1,∀i∈V,i=ji∈V∑xij=1,∀j∈V,i=ji∈S∑j∈S∑xij≤∣S∣−1,2≤∣S∣≤N−1,S⊂Vxij∈{0,1},∀i,j∈V
这个subtour-elimination的约束,是一个枚举的约束,我们不能在建模的时候就直接全枚举,这样的话有复杂度的情况。等到把这些约束枚举完,黄花菜都凉了。 啰嗦几句,subtour-elimination的思路就是相当于cutting plane。在原来前两个约束的基础上,加上这个约束。但是如果你要在求解步骤model.optimize()之前就想全枚举,把subtour-elimination所有可能的
个约束全加上去,其他的不论,就只是加约束所耗费的时间,别人TSP早都解完去写Paper了,你这边约束还没加完。得不偿失,因此不能硬钢去枚举。
那怎么办呢?业内一般采用Gurobi或者CPLEX求解器中提供的callback(回调函数)的方法来动态的添加subtour-elimination约束。总的来讲,就是在branch and bound tree迭代的过程中,根据当前结点的松弛后的线性规划模型(relaxed LP)的解,来检查该解是否有存在子环路 subtour,如果有,我们就把执行subtour-elimination时候产生的破圈约束加到正在求解的模型中去; 如果没有,我们就直接接着迭代算法。
TSP问题求解
- TSP中两种不同消除子环路的方法及callback实现
- 基于蚁群算法的TSP问题建模求解(Python)
- 基于模拟退火算法的TSP问题建模求解(Python)
- 基于自适应遗传算法的TSP问题建模求解(Java)
- 基于禁忌搜索的TSP问题建模求解(Java)
二、车辆路径问题(Vehicle Routing Problem,VRP)
基本车辆路径问题(Vehicle Routing Problem,VRP)的数学模型可以使用整数线性规划(Integer Linear Programming,ILP)来表示。
参数
- V \mathcal{V} V:车辆集合, V = { 0 , 1 , ⋯ , V } \mathcal{V}=\{0,1,\cdots, V\} V={0,1,⋯,V};
- C \mathcal{C} C:客户集合, C = { 0 , 1 , ⋯ , n } \mathcal{C}=\{0,1,\cdots, n\} C={0,1,⋯,n};
- N \mathcal{N} N:节点集合, N = { 0 , 1 , 2 , ⋯ , n , n + 1 } \mathcal{N}=\{0,1,2,\cdots,n,n+1\} N={0,1,2,⋯,n,n+1};
- c i j c_{ij} cij:从 i i i到 j j j的行驶距离;
- d i d_i di:每一个客户点 i i i都有需要被满足的需求量;
- Q Q Q:车辆容量;
- t i j t_{ij} tij:从 i i i点到 j j j点的行驶时间,以及服务 i i i点的时间之和;
- [ a i , b i ] [a_i,b_i] [ai,bi]:访问 i i i点的时间窗;
- M i j M_{ij} Mij:足够大的正数。
决策变量
- x i j k x_{ijk} xijk:车辆路径决策变量, x i j k = 1 x_{ijk}=1 xijk=1,车辆 k k k经过弧 ( i , j ) (i,j) (i,j)。
- s i k s_{ik} sik:车辆 k k k服务 i i i点的开始时刻;
模型构建
min ∑ k ∈ V ∑ i ∈ N ∑ j ∈ N c i j x i j k subject to ∑ k ∈ V ∑ j ∈ N x i j k = 1 , ∀ i ∈ C ∑ j ∈ N x 0 j k = 1 , ∀ k ∈ V , ∑ i ∈ N x i h k − ∑ j ∈ N x h j k = 0 , ∀ h ∈ C , ∀ k ∈ V , ∑ i ∈ N x i , n + 1 , k = 1 ∀ k ∈ V , s i k + t i j − M i j ( 1 − x i j k ) ⩽ s j k , ∀ i , j ∈ N , ∀ k ∈ V , a i ⩽ s i k ⩽ b i , ∀ i ∈ N , ∀ k ∈ V , x i j k ∈ { 0 , 1 } , ∀ i , j ∈ N , ∀ k ∈ V s i k ≥ 0 , ∀ i ∈ N , ∀ k ∈ V \begin{align} \min \quad &\sum_{k \in \mathcal{V}} \sum_{i \in \mathcal{N}} \sum_{j \in \mathcal{N}} c_{i j} x_{i j k} \tag{1}\\ \text {subject to} \quad &\sum_{k \in \mathcal{V}} \sum_{j \in \mathcal{N}} x_{i j k}=1, \quad \forall i \in \mathcal{C} \tag{2}\\ &\sum_{j \in \mathcal{N}} x_{0 j k}=1, \quad \forall k \in \mathcal{V}, \tag{3}\\ &\sum_{i \in \mathcal{N}} x_{i h k}-\sum_{j \in \mathcal{N}} x_{h j k}=0 , \quad \forall h \in \mathcal{C}, \forall k \in \mathcal{V}, \tag{4}\\ &\sum_{i \in \mathcal{N}} x_{i, n+1, k}=1 \quad \forall k \in \mathcal{V}, \tag{5}\\ &s_{i k}+t_{i j}-M_{i j}\left(1-x_{i j k}\right) \leqslant s_{j k}, \quad \forall i, j \in \mathcal{N}, \forall k \in \mathcal{V}, \tag{6}\\ &a_{i} \leqslant s_{i k} \leqslant b_{i} , \quad \forall i \in \mathcal{N}, \forall k \in \mathcal{V} \text {, } \tag{7}\\ &x_{i j k} \in\{0,1\}, \quad \forall i, j \in \mathcal{N}, \forall k \in \mathcal{V} \tag{8}\\ &s_{i k} \geq 0, \quad \forall i \in \mathcal{N}, \forall k \in \mathcal{V} \tag{9}\\ \end{align} minsubject tok∈V∑i∈N∑j∈N∑cijxijkk∈V∑j∈N∑xijk=1,∀i∈Cj∈N∑x0jk=1,∀k∈V,i∈N∑xihk−j∈N∑xhjk=0,∀h∈C,∀k∈V,i∈N∑xi,n+1,k=1∀k∈V,sik+tij−Mij(1−xijk)⩽sjk,∀i,j∈N,∀k∈V,ai⩽sik⩽bi,∀i∈N,∀k∈V, xijk∈{0,1},∀i,j∈N,∀k∈Vsik≥0,∀i∈N,∀k∈V(1)(2)(3)(4)(5)(6)(7)(8)(9)
下面是各个约束的具体含义:
- 目标函数(1)最小化总体行驶距离;
- 约束(2)保证了每个客户点都被访问了一次;
- 约束(3-5)分别保证了每辆车必须从始发站出发,到达并离开每个客户点,并最终回到终点站;
- 约束(6)规定了车辆k开始服务点j的时刻 s j k s_{jk} sjk,不能早于开始服务点 i i i的时刻 s i k s_{ik} sik+从点 i i i到点 j j j的行驶时间以及服务点 i i i的时间之和 t i j t_{ij} tij,其中 M i j M_{ij} Mij的取值下界为 b i j + t i j − a j b_{ij}+t_{ij}-a_j bij+tij−aj;
- 约束(7)使得开始服务点的时刻是在规定的时间窗范围内;
- 约束(8-9)是对于决策变量的约束。
三、带容量约束的车辆路径优化问题(Capacitated Vehicle Routing Problem,CVRP)
带容量约束的车辆路径优化问题,CVRP,对一系列装卸货点进行适当的路径规划,在满足约束条件(客户需求、车辆载重和容积、车型、车辆行驶里程、配送中心数量等限制)和目标最优化(路程最短、成本最低、使用车辆数最少、配送时间最快等)下,将客户的配送需求从配送中心送达客户点,或从客户点送回配送中心。
场景:
单向:纯取货 / 纯送货;
单配送中心:只有一个配送中心/车场;
单车型:只考虑一种车型,
需求不可拆分:客户需求只能有一辆车满足;
车辆封闭:完成配送任务的车辆需回到配送中心;
车辆充足:不限制车辆数量,即配送车辆需求均能满足;
非满载:任意客户点的需求量小于车辆最大载重;
要求:
优化目标:最小化车辆启动成本和车辆行驶成本之和;
约束条件:车辆行驶距离约束,重量约束;
算法输入:配送中心位置、客户点位置、客户点需求、车辆最大载重、车辆最大行驶距离、车辆启动成本、车辆单位距离行驶成本;
算法输出:每辆车的行驶路径,经过的客户点,以及总成本。


CVRP问题求解
四、带时间窗车辆路径优化问题(Vehicle Routing Problem with Time Window,VRPTW)
问题描述
VRPTW问题定义在一队车辆
V
\mathcal{V}
V、一组客户
C
\mathcal{C}
C和一个有向图
G
\mathcal{G}
G上。图由
∣
C
∣
+
2
|\mathcal{C}|+2
∣C∣+2个点组成,其中客户由
1
,
2
,
⋯
,
n
1,2,\cdots,n
1,2,⋯,n表示,车站由
0
0
0(始发站)和
n
+
1
n+1
n+1(终点站)表示。所有节点的集合可表示为
N
=
{
0
,
1
,
2
,
⋯
,
n
,
n
+
1
}
\mathcal{N}=\{0,1,2,\cdots,n,n+1\}
N={0,1,2,⋯,n,n+1}。所有边的集合
A
\mathcal{A}
A表示了车站与客户之间,以及客户之间的有向连接。其中没有边从
0
0
0点终止或者从
n
+
1
n+1
n+1点开始。每一条弧
(
i
,
j
)
,
i
≠
j
(i,j),i\neq j
(i,j),i=j都对应一个成本
c
i
j
c_{ij}
cij和时间
t
i
j
t_{ij}
tij,时间可以包括在弧上
(
i
,
j
)
(i,j)
(i,j)的行驶时间和在
i
i
i点的服务时间。所有车辆通常是同质化的,每辆车都存在容量上限
Q
Q
Q,每一个客户点
i
i
i都有需要被满足的需求
d
i
d_i
di,并且需要在时间窗
[
a
i
,
b
i
]
[a_i,b_i]
[ai,bi]之内被服务[1]。待优化的问题即为,如何决策车辆访问客户的路径,使得在满足一定约束的条件下,实现最小化总成本的目标。
模型构建
参数
- V \mathcal{V} V:车辆集合, V = { 0 , 1 , ⋯ , V } \mathcal{V}=\{0,1,\cdots, V\} V={0,1,⋯,V};
- C \mathcal{C} C:客户集合, C = { 0 , 1 , ⋯ , n } \mathcal{C}=\{0,1,\cdots, n\} C={0,1,⋯,n};
- N \mathcal{N} N:节点集合, N = { 0 , 1 , 2 , ⋯ , n , n + 1 } \mathcal{N}=\{0,1,2,\cdots,n,n+1\} N={0,1,2,⋯,n,n+1};
- c i j c_{ij} cij:从 i i i到 j j j的行驶距离;
- d i d_i di:每一个客户点 i i i都有需要被满足的需求量;
- Q Q Q:车辆容量;
- t i j t_{ij} tij:从 i i i点到 j j j点的行驶时间,以及服务 i i i点的时间之和;
- [ a i , b i ] [a_i,b_i] [ai,bi]:访问 i i i点的时间窗;
- M i j M_{ij} Mij:足够大的正数。
决策变量
- x i j k x_{ijk} xijk:车辆路径决策变量, x i j k = 1 x_{ijk}=1 xijk=1,车辆 k k k经过弧 ( i , j ) (i,j) (i,j)。
- s i k s_{ik} sik:车辆 k k k服务 i i i点的开始时刻;
混合整数规划模型
min ∑ k ∈ V ∑ i ∈ N ∑ j ∈ N c i j x i j k subject to ∑ i ∈ C d i ∑ j ∈ N x i j k ⩽ Q , ∀ k ∈ V , ∑ k ∈ V ∑ j ∈ N x i j k = 1 , ∀ i ∈ C ∑ j ∈ N x 0 j k = 1 , ∀ k ∈ V , ∑ i ∈ N x i h k − ∑ j ∈ N x h j k = 0 , ∀ h ∈ C , ∀ k ∈ V , ∑ i ∈ N x i , n + 1 , k = 1 ∀ k ∈ V , s i k + t i j − M i j ( 1 − x i j k ) ⩽ s j k , ∀ i , j ∈ N , ∀ k ∈ V , a i ⩽ s i k ⩽ b i , ∀ i ∈ N , ∀ k ∈ V , x i j k ∈ { 0 , 1 } , ∀ i , j ∈ N , ∀ k ∈ V s i k ≥ 0 , ∀ i ∈ N , ∀ k ∈ V \begin{align} \min \quad &\sum_{k \in \mathcal{V}} \sum_{i \in \mathcal{N}} \sum_{j \in \mathcal{N}} c_{i j} x_{i j k} \tag{1}\\ \text {subject to} \quad &\sum_{i \in \mathcal{C}} d_{i} \sum_{j \in \mathcal{N}} x_{i j k} \leqslant Q, \quad \forall k \in \mathcal{V}, \tag{2}\\ &\sum_{k \in \mathcal{V}} \sum_{j \in \mathcal{N}} x_{i j k}=1, \quad \forall i \in \mathcal{C} \tag{3}\\ &\sum_{j \in \mathcal{N}} x_{0 j k}=1, \quad \forall k \in \mathcal{V}, \tag{4}\\ &\sum_{i \in \mathcal{N}} x_{i h k}-\sum_{j \in \mathcal{N}} x_{h j k}=0 , \quad \forall h \in \mathcal{C}, \forall k \in \mathcal{V}, \tag{5}\\ &\sum_{i \in \mathcal{N}} x_{i, n+1, k}=1 \quad \forall k \in \mathcal{V}, \\ &s_{i k}+t_{i j}-M_{i j}\left(1-x_{i j k}\right) \leqslant s_{j k}, \quad \forall i, j \in \mathcal{N}, \forall k \in \mathcal{V}, \\ &a_{i} \leqslant s_{i k} \leqslant b_{i} , \quad \forall i \in \mathcal{N}, \forall k \in \mathcal{V} \text {, } \\ &x_{i j k} \in\{0,1\}, \quad \forall i, j \in \mathcal{N}, \forall k \in \mathcal{V} \\ &s_{i k} \geq 0, \quad \forall i \in \mathcal{N}, \forall k \in \mathcal{V} \\ \end{align} minsubject tok∈V∑i∈N∑j∈N∑cijxijki∈C∑dij∈N∑xijk⩽Q,∀k∈V,k∈V∑j∈N∑xijk=1,∀i∈Cj∈N∑x0jk=1,∀k∈V,i∈N∑xihk−j∈N∑xhjk=0,∀h∈C,∀k∈V,i∈N∑xi,n+1,k=1∀k∈V,sik+tij−Mij(1−xijk)⩽sjk,∀i,j∈N,∀k∈V,ai⩽sik⩽bi,∀i∈N,∀k∈V, xijk∈{0,1},∀i,j∈N,∀k∈Vsik≥0,∀i∈N,∀k∈V(1)(2)(3)(4)(5)
下面是各个约束的具体含义:
- 目标函数(1)最小化总体行驶距离;
- 约束(2)说明车辆的载重量不能超过其容量上限;
- 约束(3)保证了每个客户点都被访问了一次;
- 约束(4-6)分别保证了每辆车必须从配送中心出发,到达并离开每个客户点,并最终回到配送中心;
- 约束(7)规定了车辆k开始服务点j的时刻 s j k s_{jk} sjk,不能早于开始服务点 i i i的时刻 s i k s_{ik} sik,加上从点 i i i到点 j j j的行驶时间以及服务点 i i i的时间之和 t i j t_{ij} tij,其中 M i j M_{ij} Mij的取值下界为 b i j + t i j − a j b_{ij}+t_{ij}-a_j bij+tij−aj;
- 约束(8)使得开始服务点的时刻是在规定的时间窗范围内;
- 约束(9-10)是对于决策变量的约束。
VRPTW问题求解
- 考虑随机性的车辆路径规划问题详解(Stochastic VRP) 数据魔术师
- 使用Java调用Cplex求解带时间窗的车辆路径问题
- 蚁群算法求解VPRTW:https://blog.csdn.net/qq_43276566/article/details/147447603?spm=1011.2415.3001.10575&sharefrom=mp_manage_link
- 遗传算法求解VRPTW:https://blog.csdn.net/qq_43276566/article/details/147729037?spm=1011.2415.3001.10575&sharefrom=mp_manage_link
五、取送货问题数学模型(Homogeneous Multi vehicle pickup and delivery problem formulations)
数学模型
https://blog.csdn.net/qq_43276566/article/details/136423081
PDPTW问题求解
PDPTW数据集地址
https://www.sintef.no/projectweb/top/pdptw/li-lim-benchmark/