计划是通过本文的撰写,捋清楚TSP和VRP的本质不同。(什么是本质❔)
对比 | TSP(旅行商问题) | VRP(车辆路径问题) |
---|---|---|
描述 | 给定一个城市列表以及每对城市之间的距离,访问每个城市一次并返回出发城市的最短路线是什么 | 车队需要向给定的一组客户家中取货,需要遍历的最佳路线集是什么? |
输入 | 城市数量,距离矩阵 | 城市数量,距离矩阵,任务量,卡车容量 |
约束 | 每个城市仅访问一次 | 每个城市仅访问一次,满足容量要求 |
目标 | 最小化总旅行距离 | 最小化总旅行距离 |
输出 | 一个旅行商访问城市的顺序 | 多个车辆的行驶路线 |
空间 | 城市序列: ( n − 1 ) ! (n-1)! (n−1)! | 城市序列加上车辆任务分配: n ! < S < P ( n , m ) k n! < S < P(n,m)^k n!<S<P(n,m)k |
以 n = 13 , m = 5 , k = 3 n=13,m=5,k=3 n=13,m=5,k=3为例,对比解空间:
旅行商问题(英语:Travelling salesman problem, TSP)在1930年被首次提出,是优化领域研究最深入的问题之一。问题的表述是:“给定一个城市列表以及每对城市之间的距离,访问每个城市一次并返回出发城市的最短路线是什么?”
每个城市只访问一次:
∑ j = 1 , j ≠ i n x i j = 1 ∀ i = 1 , 2 , … , n \sum_{j=1, j \neq i}^{n} x_{ij} = 1 \quad \forall i = 1, 2, \ldots, n j=1,j=i∑nxij=1∀i=1,2,…,n
∑ i = 1 , i ≠ j n x i j = 1 ∀ j = 1 , 2 , … , n \sum_{i=1, i \neq j}^{n} x_{ij} = 1 \quad \forall j = 1, 2, \ldots, n i=1,i=j∑nxij=1∀j=1,2,…,n
$$
\sum_{j=1, j \neq i}^{n} x_{ij} = 1 \quad \forall i = 1, 2, \ldots, n
$$
$$
\sum_{i=1, i \neq j}^{n} x_{ij} = 1 \quad \forall j = 1, 2, \ldots, n
$$
最小化总旅行距离或成本:
min ∑ i = 1 n ∑ j = 1 , j ≠ i n c i j x i j \min \sum_{i=1}^{n}\sum_{j=1, j \neq i}^{n} c_{ij} x_{ij} mini=1∑nj=1,j=i∑ncijxij
$$
\min \sum_{i=1}^{n}\sum_{j=1, j \neq i}^{n} c_{ij} x_{ij}
$$
旅行商问题的解空间是指所有可能的路径组合数量。
因此,TSP 的解空间大小为所有可能路径的数量,计算公式为:
( n − 1 ) ! (n - 1)! (n−1)!
其中, ( n − 1 ) ! (n - 1)! (n−1)! 表示 ( n − 1 ) (n - 1) (n−1) 的阶乘,即 1 × 2 × 3 × … × ( n − 2 ) × ( n − 1 ) 1 \times 2 \times 3 \times \ldots \times (n - 2) \times (n - 1) 1×2×3×…×(n−2)×(n−1)。
旅行商可以从任何城市开始,但是不同的起点并不会影响各城市在解中的相对顺序。每个路径都可以通过循环移位变换为从特定城市(比如第一个城市)开始的路径,所以实际上只需考虑从一个固定城市出发的路径。
车辆路径问题(英语:Vehicle Routing Problem,VRP)在1959年被首次提出,是TSP的泛化形式,包含TSP问题。问题描述:车队需要向给定的一组客户家中取货或是送货,需要遍历的最佳路线集是什么?
值得一提的是,在1959年被提出时,论文名称是’The truck dispatching problem’,并没有使用Vehicle Routing Problem的表述。在随后十多年的相关研究中,也一直没有直接使用VRP这一名词的论文。直到Christofides, N.的论文’The vehicle routing problem’于1976年发表后,后续研究普遍采用了VRP的表述。
我们把TSP问题或一个场景表述为一辆空载的卡车从车库或是车场(出发城市)出发需要到多位客户的家中(其它城市)取货物,待取完所有货物后需要返回车库。这里有一个潜在的假定,不管所有客户家中的货物累加和究竟有多大,这一辆卡车总能全部纳入到自己的车厢中并继续正常行驶。也就是,车辆的运输能力 C C C 大于等于所有的货物量:
C ≥ ∑ i q i C \ge \sum\limits_i {{q_i}} C≥i∑qi
其中 q i q_i qi 表述第 i i i 个客户家中的货物量。
但是,当面临一辆卡车完不成所有的任务量时,也就是:
C < ∑ i q i C < \sum\limits_i {{q_i}} C<i∑qi
就需要多辆车去完成,或者是一辆车多次往返。
按照论文The truck dispatching problem. Management science 6, 80–91 (1959)里面的介绍,把该条件描述为:
C ≪ ∑ i q i C \ll \sum\limits_i {{q_i}} C≪i∑qi
并且,文章提出假定一辆车最多只能访问 m m m 个点,只有当 m m m 比较大时,有研究意义,否则的话,求解比较容易,如下:
If m m m is small, optimal sets of m m m points may often be determined by inspection of a map which contains the points and the arcs connecting them. One would look for “clusters of points” and determine by trial and error the order in which they should be traversed, taking care that no loop crosses itself. However, when clusters are not present in sufficient numbers or when m m m is large, this procedure becomes inapplicable. In this case near-best solutions may be obtained by the algorithm in this paper.
如果 m m m 很小,最优的 m m m 个点的集合通常可以通过检查包含这些点和连接它们的弧的地图来确定。人们会寻找"点的簇集",并通过试验和错误来确定它们应该按照什么顺序遍历,确保没有回路交叉。然而,当簇集数量不足或者 m m m 很大时,这种方法就不适用了。在这种情况下,可以通过本文中的算法获得近似最优解。
$$\sum_{i=1}^{n} q_i x_{ij} \le C \quad \forall j = 1, 2, \ldots, n$$
最小化总行驶距离 D D D:
min D = ∑ i , j = 0 n d i j x i j \min D = \sum_{i,j=0}^n d_{ij} x_{ij} minD=i,j=0∑ndijxij
$$\min D = \sum_{i,j=0}^n d_{ij} x_{ij}$$
在车辆路径问题(VRP)中,我们考虑除起点和终点外的所有车辆行驶路线。这些路线可以排列成一个由 n n n 个点组成的一维序列 S S S,拥有 n ! n! n! 种可能性。
假设 n n n 是 m m m 的整数倍,且每辆车必须经过 m m m 个点才能返回车库。此时,序列 S S S 只需平均分配给各车辆,解空间仍为 n ! n! n! 种。
如果每辆车经过的点数在 1 到 m m m 之间,解空间的计算变得复杂。
目前尚没有发现计算精确解空间大小的文献, AI 也无法给出确切数字,下面是一个粗略的估算方法。
因此,解空间的上限估算为 P ( n , m ) k P(n,m)^k P(n,m)k。
对比条目 | TSP(旅行商问题) | VRP(车辆路径问题) |
---|---|---|
问题描述 | 给定一个城市列表以及每对城市之间的距离,访问每个城市一次并返回出发城市的最短路线是什么 | 车队需要向给定的一组客户家中取货,需要遍历的最佳路线集是什么? |
问题输入 | 城市数量,距离矩阵 | 城市数量,距离矩阵,任务量,卡车容量 |
约束条件 | 每个城市仅访问一次 | 每个城市仅访问一次,满足容量要求 |
优化目标 | 最小化总旅行距离 | 最小化总旅行距离 |
问题输出 | 一个旅行商访问城市的顺序 | 多个车辆的行驶路线 |
求解空间 | 城市序列: ( n − 1 ) ! (n-1)! (n−1)! | 城市序列加上车辆任务分配: n ! < S < P ( n , m ) k n! < S < P(n,m)^k n!<S<P(n,m)k |
以n=13,m=5,k=3为例