车辆路径优化问题变体及数学模型
车辆路径优化问题(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] [a