跳转至

车辆路径问题(VRP)及相关⚓︎

约 1304 个字 预计阅读时间 4 分钟

建模篇⚓︎

Naive Formulation⚓︎

VRP⚓︎

Notations Meanings
\(i , j, h\) 节点索引
\(k\) 车辆索引
\(0,n + 1\) depot,终点depot索引
\(x_{ijk}\) 决策变量,0-1binary, \(k\) 车是否经过边\((i,j), i \neq j\) ,
\(c_{ij}\) 车辆 \(k\) 经过边 \((i,j)\) 的成本
\(\mu_{ij}\) MTZ 约束的辅助变量
\(V\) 节点集合
\(A\) 所有边的集合
\(K\) 所有车辆的集合
\(C\) 所有客户点的集合
\[\min \sum \limits_{k \in K} \sum \limits_{i \in V} \sum \limits_{j \in V} c_{ij} x_{ijk}\]
\[\text{s.t.} \begin{aligned}
\begin{cases}
\begin{align}
\sum \limits_{k \in K} \sum_{j \in V} x_{ijk}  & =  1 ,\quad \forall i \in C  \quad \\
\sum \limits_{k \in K} x_{0jk}  & = 1, \quad \forall k \in K \quad \\
\sum \limits_{i \in V} x_{i (n+1) k}  & = 1, \quad \forall k \in K \quad \\
\sum \limits_{i \in V} x_{ihk} - \sum \limits_{j \in V} x_{hjk} &  = 0, \quad \forall h \in C, \forall k \in K \quad \\
\mu_{ik} - \mu_{jk} + N x_{ijk} &  \leq N - 1, \quad \forall i \in V / \{n+1\}, \quad \forall j \in V / \{0\} , \forall k \in K \quad \\
x_{ijk} \in \{0, 1\}, &  \quad \forall (i, j) \in A, \forall k \in K \quad \\
\end{align}
\end{cases}
\end{aligned}\]

CVRP⚓︎

Notations Meanings
\(i , j, h\) 节点索引
\(k\) 车辆索引
\(0,n + 1\) depot,终点depot索引
\(x_{ijk}\) 决策变量,0-1binary, \(k\) 车是否经过边\((i,j), i \neq j\) ,
\(c_{ij}\) 车辆 \(k\) 经过边 \((i,j)\) 的成本
\(\mu_{ij}\) MTZ 约束的辅助变量
\(V\) 节点集合
\(A\) 所有边的集合
\(K\) 所有车辆的集合
\(C\) 所有客户点的集合
\(q_i\) (new added!) 客户 \(i\) 处的需求
\(Q\) (new added!) 车容量
\[\min \sum \limits_{k \in K} \sum \limits_{i \in V} \sum \limits_{j \in V} c_{ij} x_{ijk}\]
\[\text{s.t.} \begin{aligned}
\begin{cases}
\begin{align}
\sum \limits_{k \in K} \sum_{j \in V} x_{ijk}  & =  1 ,\quad \forall i \in C  \quad \\
\sum \limits_{k \in K} x_{0jk}  & = 1, \quad \forall k \in K \quad \\
\sum \limits_{i \in V} x_{i (n+1) k}  & = 1, \quad \forall k \in K \quad \\
\sum \limits_{i \in V} x_{ihk} - \sum \limits_{j \in V} x_{hjk} &  = 0, \quad \forall h \in C, \forall k \in K \quad \\
\mu_{ik} - \mu_{jk} + N x_{ijk} &  \leq N - 1, \quad \forall i \in V / \{n+1\}, \quad \forall j \in V / \{0\} , \forall k \in K \quad \\
\sum \limits_{i \in C} \sum \limits_{j \in V} q_i x_{ijk} & \leq Q, \quad \forall k \in K \quad {\color{red}\text{Capacity Constr!}}\\
x_{ijk} \in \{0, 1\}, &  \quad \forall (i, j) \in A, \forall k \in K \quad \\
\end{align}
\end{cases}
\end{aligned}\]

CVRPTW⚓︎

Notations Meanings
\(i , j, h\) 节点索引
\(k\) 车辆索引
\(0,n + 1\) depot,终点depot索引
\(x_{ijk}\) 决策变量,0-1binary, \(k\) 车是否经过边\((i,j), i \neq j\) ,
\(c_{ij}\) 车辆 \(k\) 经过边 \((i,j)\) 的成本
\(V\) 节点集合
\(A\) 所有边的集合
\(K\) 所有车辆的集合
\(C\) 所有客户点的集合
\(q_i\) 客户 \(i\) 处的需求
\(Q\) 车容量
\(s_{ik}\) (new added!) 时间戳辅助变量,非负
\(e_i, l_i\) (new added!) \(i\) 节点的时间窗下/上界
\(t_{ij}\) (new added!) 经过边 \((i,j)\) 所花的时间
\(M\) (new added!) 一个极大值,下界为 \(\max \{ l_i - e_j + t_{ij}\}\)
\[\min \sum \limits_{k \in K} \sum \limits_{i \in V} \sum \limits_{j \in V} c_{ij} x_{ijk}\]
\[\text{s.t.} \begin{aligned}
\begin{cases}
\begin{align}
\sum \limits_{k \in K} \sum_{j \in V} x_{ijk}  & =  1 ,\quad \forall i \in C  \quad \\
\sum \limits_{k \in K} x_{0jk}  & = 1, \quad \forall k \in K \quad \\
\sum \limits_{i \in V} x_{i (n+1) k}  & = 1, \quad \forall k \in K \quad \\
\sum \limits_{i \in V} x_{ihk} - \sum \limits_{j \in V} x_{hjk} &  = 0, \quad \forall h \in C, \forall k \in K \quad \\
s_{tk} + t_{ij} - M (1 - x_{ijk}) & \leq s_{jk} \quad \forall (i,j) \in A, \forall k \in K \quad  {\color{red}\text{TW Constr!}}\\
e_i \leq s_{ik} & \leq l_i \quad \forall i \in C, \forall k \in K \quad  {\color{red}\text{TW Constr!}}\\
\sum \limits_{i \in C} \sum \limits_{j \in V} q_i x_{ijk} & \leq Q, \quad \forall k \in K \quad \\
x_{ijk} \in \{0, 1\}, &  \quad \forall (i, j) \in A, \forall k \in K \quad \\
\end{align}
\end{cases}
\end{aligned}\]

注意在时间窗约束的情况下,不需要考虑去子环了,因为时间窗本来就带有去子环的效果,卡车经过的每一个节点都被赋予一个时间变量。这个变量随着车的运行会严格递增。因此首尾相接的情况必定不会存在。

Set partitioning formulation⚓︎

  • \(\mathcal{R}\) 表示所有可行的路径的下标集合。

  • \(a_{i \ell}\) 是一个 0-1 Binary的系数,如果第 \(i \in V\) 个节点属于第 \(\ell \in \mathcal{R}\) 个路径。

  • 每个路径 \(\ell \in \mathcal{R}\) 有一个对应的成本 \(c_{\ell}\)

  • \(\xi_{\ell}\) 是 0-1 Binary, 如果路径 \(\ell \in \mathcal{R}\) 在最终解中。

由此可以构建基于集合分割的建模方式。

\[\begin{aligned}
\min & \quad \sum_{\ell \in \mathcal{R}} c_{\ell} \xi_{\ell} \\
\text{s.t.} & \quad 
\begin{cases}
\begin{align}
\sum_{\ell \in \mathcal{R}} a_{i\ell} \xi_{\ell} = 1, \quad \forall i \in \mathcal{V}_c \quad \\
\sum_{\ell \in \mathcal{R}} \xi_{\ell} = M \quad \\
\xi_{\ell} \in \{0,1\}, \quad \forall \ell \in \mathcal{R} \quad
\end{align}
\end{cases}
\end{aligned}\]

注意了,为什么这里没有去子环约束,是因为最开始的“可行路径的下标集合”已经约束了这个路径一定要是可行的(从depot到depot)。

这个建模的方法,很适合“分枝定价”去精确地求解车辆路径问题。这个解法的子问题就是生成一些可行的路径,加入到所有的可行路径中。而这个子问题本身是在求一个“资源限制情况下的最短路问题”。