首页 > 编程语言 >车辆路径问题——CVPR的Python实现

车辆路径问题——CVPR的Python实现

时间:2023-05-11 23:36:41浏览次数:54  
标签:配送 Python sum 路径 CVPR 客户 车辆 points

车辆路径问题通常被定义为装运一系列点或接收点,通过他们组织车辆适当途径有序。在一定的约束条件,如对商品的需求,交货数量,交付的交付时间,车辆容量限制,行驶里程限制,时间限制,以实现某些目标。如果最短距离,最低的成本,尽可能少的时间,尽量少使用车辆。在物流和运输,因为运输点,更多的客户,商品种类繁多,区域交通网络等诸多影响因素的不均匀分布在城市的运输路线,运输服务的复杂性。同时也满足约束条件,如时间窗等客户提出的要求,使得如何安排最佳路线,如何使有效的运输路线,并配备了物流配送已成为困难。合理的解决车辆路径问题,不仅可以简化流通过程,缩短交货时间,降低负载率运载工具,以降低物流成本提高经济效率,加快响应客户需求的速度,提高服务质量,提升客户满意的物流环节。因此,物流配送车辆调度问题是在这个过程中的一个关键问题。

一、车辆路径问题的分类

车辆路径问题(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\) 车辆的最大载重

\[x_{ijk}= \begin{cases} 1, & 表示车辆k从客户点i行驶到客户点j \\ 0, & 其他\end{cases}\]

目标函数:

\[\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. 配送中心约束: 所有车辆均由配送中心出发, 完成所有的配送任务 后返回配送中心:

\[\sum_{k=1}^K \sum_{j=1}^N x_{0 j k}=\sum_{k=1}^K \sum_{j=1}^N x_{j 0 k}=K \]

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(含容量约束的车辆最短路径)问题

标签:配送,Python,sum,路径,CVPR,客户,车辆,points
From: https://www.cnblogs.com/haohai9309/p/17392446.html

相关文章

  • python内置模块——logging
    内置模块-loggingloging模块是python提供的内置模块,用来做日志处理。日志等级:等级释义级别数值CRITICAL(fatal)致命错误,程序根本跑不起来50ERROR运行错误,程序运行发生错误的地方时就会退出程序40WARNING运行警告,程序运行发生警告的地方时会显示警告提示,但是......
  • Python学习之二:不同数据库相同表是否相同的比较方法
    摘要昨天学习了使用python进行数据库主键异常的查看.当时想我们有跨数据库的数据同步场景.对应的我可以对不同数据库的相同表的核心字段进行对比.这样的话能够极大的提高工作效率.我之前写过很长时间的shell.昨天跟着同事开始学python.感觉的确用python能够节约大量的时间.......
  • python读取txt文本匹配excel内容
    别人的需求,一个小脚本、代码如下:importopenpyxl#打开Excel文件path=r'D:\Paper\data_late.xlsx'workbook=openpyxl.load_workbook(path)#获取第一个工作表worksheet=workbook.active#获取字符串列的值,并将其转换为列表strings=[cell.valueforcelli......
  • python中的内置异常
    1关于异常代码中遇到错误时会引发异常,python中有许多内置的异常类来表示某种具体异常,当然也可以自定义异常类,当异常未被捕获或处理时,代码会在引发异常处终止,并将异常信息显示在回溯信息中(tarceback)如下上面可在traceback中看到一些关于异常的具体信息,由于改异常未被捕获或处......
  • Python try...catch All In One
    Pythontry...catchAllInOnePython异常处理try...exceptwhileTrue:try:x=int(input("Pleaseenteranumber:"))breakexceptValueError:print("Oops!Thatwasnovalidnumber.Tryagain...")excep......
  • Python复制文件的9种方法
    以下是演示“如何在Python中复制文件”的九种方法。1.shutilcopyfile()方法2.shutilcopy()方法3.shutilcopyfileobj()方法4.shutilcopy2()方法5.ospopen方法6.os系统()方法7.Thread()方法8.子进程调用()方法9.子进程check_output()方法1.......
  • 第二节:编程语言与Python介绍
    一引子基于上一节所学,有了计算机硬件,再在硬件之上安装好操作系统,我们就有了一个应用程序的运行平台,我们接下来的任务就是学习如何使用某款编程语言来开发应用程序。本章的主题是先带大家了解下编程语言,然后重点介绍Python这门编程语言二编程语言分类:2.1机器语言机器语言......
  • Why are Python strings immutable? 字符串是否可以改变
    实践1、pythons="abc"s+="34" #OK print(s)s[0]="k" # TypeError:'str'objectdoesnotsupportitemassignment   golang  s:="abc"  s+="456"  fmt.Println(s)  s[0]="......
  • python环境的安装与设置和oneforall的安装与使用
    下载python:https://www.python.org/downloads/windows/安装python如果不需要修改路径,下面两个√打开后,点击上面的installnow也可以可以选择修改安装路径下载OneForALL:在github上边下载安装OneForALL复制你安装OneForALL的路径,比如我的是C:Windows\OneForAll-master回到桌面,按win......
  • 使用Open3D进行PCD拟合平面的Python代码示例
    使用Open3D进行PCD拟合平面的Python代码示例 importopen3daso3dimportnumpyasnp#读取点云数据pcd=o3d.io.read_point_cloud("2023042501.pcd")#创建PCD图pcd_graph=o3d.geometry.PointCloudGraph(pcd)#选择要拟合的平面plane_cent......