车辆路径问题通常被定义为装运一系列点或接收点,通过他们组织车辆适当途径有序。在一定的约束条件,如对商品的需求,交货数量,交付的交付时间,车辆容量限制,行驶里程限制,时间限制,以实现某些目标。如果最短距离,最低的成本,尽可能少的时间,尽量少使用车辆。在物流和运输,因为运输点,更多的客户,商品种类繁多,区域交通网络等诸多影响因素的不均匀分布在城市的运输路线,运输服务的复杂性。同时也满足约束条件,如时间窗等客户提出的要求,使得如何安排最佳路线,如何使有效的运输路线,并配备了物流配送已成为困难。合理的解决车辆路径问题,不仅可以简化流通过程,缩短交货时间,降低负载率运载工具,以降低物流成本提高经济效率,加快响应客户需求的速度,提高服务质量,提升客户满意的物流环节。因此,物流配送车辆调度问题是在这个过程中的一个关键问题。
一、车辆路径问题的分类
车辆路径问题(VRP)最早是由 Dantzig 和 Ramser 于1959年首次提出,它是指一定数量的客户,各自有不同数量的货物需求,配送中心向客户提供货物,由一个车队负责分送货物,组织适当的行车路线,目标是使得客户的需求得到满足,并能在一定的约束下,达到诸如路程最短、成本最小、耗费时间最少等目的。经典VRP可描述为:对一系列装卸货点进行适当的路径规划,在满足约束条件(客户需求、车辆载重和容积、车型、车辆行驶里程、配送时间窗、配送中心数量等限制)和目标最优化(路程最短、成本最低、使用车辆数最少、配送时间最快等)下,将客户的配送需求从配送中心送达客户点,然后从客户点送回配送中心。
实际应用中,车辆路径问题是由很多条件的限制。例如,首先,车辆容量限制总需求各车辆服务的客户,不得超过车辆的最大负载重量。二,时间窗的限制,每个客户端服务必须在一定的时间范围内。第三,物流公司可能对客户服务的多个配送中心。四,客户可能会返回部分商品的配送中心。第五,客户可以是不同的车辆服务。第六,客户需求和其他随机锻炼路线的数量。第七,服务订单的客户限制之间存在。在研究工作中,常常做出关于限制一些基本假设。如由一个配送中心,一个单一的模型来完成任务分配是商品的集散地混合每个客户的位置,并从配送中心到被称为他们的距离。配送中心有足够的货物交付,并有足够的运输能力,每个客户是汽车服务,也只能是对车辆的每一行需求的汽车服务必须不超过最大负载重量。所有车辆都从配送中心出发,完成任务的客户,最后回到配送中心。实际的分布也可以考虑多中心,多车,时间要求和客户需求的客户服务随机化等。对于一个特定的问题,所有的上述限制可能存在的,有可能是唯一的一个组成部分。
二、CVPR问题的数学模型
车辆路径问题(VRP)有非常多的变形,这里介绍VRP问题中研究最多的基本问题——有容量约束的车辆路径问题(Capacitated Vehicle Routing Problem,CVRP)。在CVRP问题中,要求由一个车队承担将货物从一个仓库运输到其他预先指定的客户点上的任务。其中,车队的车辆都是同质的,且都只能从仓库出发,服务完客户点后,返回仓库。每个客户点也只能被一辆车访问一次。决策对象是车辆的行驶路线,每辆车在不同的路线上的行驶成本不同,最终的目标是要使得完成这个任务的车队的总成本最小。
CVRP问题具有下面特征
单向:纯取货/纯送货;
单配送中心:只有一个配送中心/车场;
单车型:只考虑一种车型;
需求不可拆分:客户需求只能有一辆车满足;
车辆封闭:完成配送任务的车辆需回到配送中心;
车辆充足:不限制车辆数量,即配送车辆需求均能满足;
非满载:任意客户点的需求量小于车辆最大载重。
符号说明
\(C_0\)、\(C_1\) | 表示车辆启动的固定成本、单位距离的行驶成本 |
---|---|
\(N\) | 服务客户点数量 |
\(n\) | 节点集合(\(n=0,1,2,\ldots, N\)),其中0表示配送中心;\(1,2,\ldots, N\)表示客户点 |
\(D\) | 车辆行驶的最大距离 |
\(K\) | 使用的最大车辆数 |
\(m\) | 车辆数量,\(m=1,2,\ldots, K\) |
\(d_{ij}\) | 客户点\(i(x_i,y_i)\)和\(j (x_j,y_j)\) 的欧氏距离 |
\(m_j\) | 第j个客户的需求量 |
\(M\) | 车辆的最大载重 |
目标函数:
\[\operatorname{Min} Z=C_0 K+C_1 \sum_{j=0}^N \sum_{j=0}^N \sum_{k=1}^K d_{ij} x_{ijk} \]约束:
a. 配送中心约束: 所有车辆均由配送中心出发, 完成所有的配送任务 后返回配送中心:
b. 客户点流量平衡:进出车辆数相等
\[\sum_{i=1}^N x_{i j k}=\sum_{i=1}^N x_{j k k}(k \in m, \forall j=1,2, \ldots, N) \]c. 重量约束: 每辆车的装载量不能超过其最大载重量限制
\[\sum_{j=0}^N \sum_{j=0}^N \mathrm{x}_{j m} m_j \leq M(k \in m) \]d. 客户点服务约束: 每个客户点被服务 1 次
\[\sum_{k=1}^\kappa \sum_{i=0}^N x_{y k}=1(j=1,2, \ldots, N) \]e. 车辆行驶距离约束: 每辆车配送不超过最大配送距离
\[\sum_{i=0}^N \sum_{j=0}^N \mathrm{x}_{i j k} d_{i j} \leq \mathrm{D}(k \in m) \]f. 所需车辆数约束:
\[K \geq\left\lceil\frac{\sum_{j=1}^N m_j}{M}\right\rceil\left(K \in N^*\right) \]CVRP问题是TSP问题的拓展,车辆容量无限大的CVRP问题可认为是TSP问题,即一辆车就可以服务所有的客户。CVRP问题的求解与TSP问题的求解类似, CVRP问题的解为一组满足需求节点需求的多个车辆的路径集合。假设某物流网络中共有10个顾客节点,编号为1~10,一个车辆基地,编号为0,在满足车辆容量约束与顾客节点需求约束的条件下,此问题的一个可行解可表示为:[0-1-2-0,0-3-4-5-0,0-6-7-8-0,0-9-10-0],即需要4个车辆来提供服务,车辆的行驶路线分别为0-1-2-0,0-3-4-5-0,0-6-7-8-0,0-9-10-0。由于车辆的容量固定,基地固定,因此可以将上述问题的解先表示为[1-2-3-4-5-6-7-8-9-10]的有序序列,然后根据车辆的容量约束,对序列进行切割得到若干车辆的行驶路线。
三、CVPR的求解
下图中黑色几点表示配送中心,蓝色节点表示送货客户服务点,节点旁边数据表示需完成的送货需求。每辆车的最大容量为15,每格边长为1,车辆可沿着对角线行驶,从0点出发运送货物再回到0点。求完成所有节点需求时的车辆最短运输路线。
from sko.GA import GA_TSP
import matplotlib.pyplot as plt
import numpy as np
# 坐标分布情况,(4,4)为补货地点吗
points_coordinate = np.array([[4,4],[2,8],[8,8],[0,7],[1,7],[5,6],[7,6],[3,5],[6,5],[5,3],[8,3],[1,2],[2,2],[3,1],[6,1],[0,0],[7,0]] )
# 除初始点(4,4)以外,每个地点货物需求量
requirements = [1,1,2,4,2,4,8,8,1,2,1,2,4,4,8,8]
plt.scatter(*list(zip(*points_coordinate)))
plt.show()
# 可以将补货行为理解为多车辆单次VRP,总需求/最大载量,最小需要4次
num_vehicle = 4
max_capacity = 15
num_points = len(points_coordinate)
num_customers = num_points - 1
distance_matrix = np.linalg.norm(points_coordinate[:, None, :] - points_coordinate[None, :, :], axis=-1)
# 计算总行驶距离:初始点(4,4)到第1路径点+第1路径的到第n路径点再回到初始点
# routine中包含初始点,用于计算车辆回到初始点的距离
def obj_func(routine):
num_points, = routine.shape
return distance_matrix[0, routine[0]] \
+ sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)]) \
+ distance_matrix[routine[-1], 0]
# 增加约束,计算所有超出最大载量的累积数值,当作在计算个体fitness的时候的惩罚
def constraint_capacity(routine):
capacity = 0
c = 0
for i in routine:
if i != 0:
c += requirements[i-1]
else:
capacity += max(0, c-max_capacity)
c = 0
capacity = max(c-max_capacity, capacity)
return capacity
ga_tsp = GA_TSP(func=obj_func, n_dim=num_customers, size_pop=200, max_iter=200, prob_mut=1)
# 生产Chrom个体,每个个体代表一个routine
# np.zeros(shape=(ga_tsp.size_pop, num_vehicle-1):为3次回到初始点(首次出发不算在内)
# ga_tsp.Chrom + 1:为剔除初始点的points_coordinate中的index
ga_tsp.Chrom = np.concatenate([np.zeros(shape=(ga_tsp.size_pop, num_vehicle-1), dtype=int), ga_tsp.Chrom + 1],
axis=1)
#添加约束
ga_tsp.has_constraint = True
ga_tsp.constraint_ueq = [constraint_capacity]
best_points, best_distance = ga_tsp.run()
print(best_distance)
fig, ax = plt.subplots(1, 2)
best_points_ = np.concatenate([[0], best_points, [0]])
best_points_coordinate = points_coordinate[best_points_, :]
ax[0].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], 'o-r')
ax[1].plot(ga_tsp.generation_best_Y)
plt.show()
四、总结
车辆路径问题由货物配送中心,客户,车辆,运输网络,优化目标和约束条件和组合物的其他元素车辆路径问题。首先,是商品配送服务的对象。这项服务可以是分销服务还可以收集服务。二,配送中心。在车辆路径问题,配送中心是地方货物每辆车装载路线开始或结束。点也可被称为码或仓库。配送中心包含了一些车辆的客户是负责完成分配或收集服务。第三,顾客。车辆路径问题的客户服务对象送货车辆也可零售门店,经销点,如个别本文统称为客户或客户端指向送货上门。客户有特定属性,诸如用于货物,服务,时间,时间,以及服务和其他服务的优先级的持续时间的需求。第四车辆。货车为客户完成维修工具。车辆的基本属性,包括车辆的停放在顾客服务的位置之前和之后的完成等的类型,车辆的负载,车辆的最大行驶时间或距离,以及车辆。第五,传输网络。运输网络是由节点和赋有圆弧的非负权重。节点可以是一个配送中心或客户的角度弧客户端或客户站点之间的配送中心和道路连接点。弧具有某些属性,包括方向,重量等。取决于道路弧到弧和特征可分为无向弧。每个弧赋予了权重,权重可以按照不同的含义如运输成本,运输时间,运输距离的研究需要被定义。节点之间的双向正确的重量可以相等或不等前者称为对称车辆路径问题后者是不对称的车辆路径问题。第六,优化目标。在实际应用中车辆路径问题可以是一个单目标优化目标可以是多目标。单目标优化,包括最短的运输距离,最短旅行时间,以及车辆和其他间接成本最少的最小数目。需要在解决多目标车辆路径问题需要同时优化多个目标,如车辆的最短距离的最小数目,以完成交货,以满足客户的要求等。德国和分销环境的复杂多样的配送需求。多目标优化已经成为车辆路径问题近期研究的重点。第七,约束。组合优化问题,它有一定的限制。车辆路径问题也不例外。不同类型的VRP问题其约束是不一样的。在VRP系统软件的研究,总重量容量限制的共同制约①任何车辆路径不能超过车辆的承载能力。②时间窗约束范围内指定的时间窗口配送需求,达到客户,包括软,硬时间窗时间窗的限制。③车辆行驶距离的限制最大行驶距离不超过一个预先指定的值。④优先约束根据每个客户的重要性,为客户提供不同的服务优先级。⑤多模型约束。随着时代的不断发展,在物流中车辆路径问题是比较普遍的问题,无论是在服务质量上,还是降低物流成本上都对物流公司具有很大的影响。
参考文献
1.cvrp代码_Python数学规划案例:路径优化CVRP
2.CVRP建模与求解-基于粒子群算法(python实现)
3.基于python下sko.GA的遗产算法解决CVRP(含容量约束的车辆最短路径)问题