用Google OR-Tools搭建简单车辆路线规划问题

本文介绍了如何使用Google OR-Tools解决有时间窗、容量限制的车辆路线规划问题(CVRPTW)。通过Python接口,利用OR-Tools进行建模和优化,详细阐述了建模过程、约束条件和代码实现,包括时间窗口、距离、容量和站点数的约束,并探讨了优化结果的展示和后续改进方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个用开源google orTools实现的有时间窗、容量限制、可设置接送对(pickup and delivery pair)、支持多路径和灵活起始地点的路径优化问题(CVRPTW: constraint vehicle routing problem with time windows)。程序使用开源求解器和建模工具,支持excel或txt表格形式的标准化输入和输出。

Google optimization tools不仅用C++语言开发了自己的求解器,而且可以通过接口调用几个常用的商用或开源求解器。项目使用了orTools的python接口,虽然功能上只实现了C++的部分功能,但是仍然可以满足项目要求。

对于CVRP问题来说,orTools的优点在于求解器以外又多了一层封装,使开发人员可以更方便地传入对应的参数,省略了很多约束建模的步骤。而且google求解器的工作方式是通过callback函数,相对于pyomo的AML方式,在描述非线性问题建模时更方便。

业务需求示例

业务每天有n辆车(n位员工)分别从k个集散中心出发,一天内共需要拜访m个客户站点。在一天结束时所有车辆/员工必须回到出发地。

每辆车有固定费用,以及最大容量、最多客户站点数、最大里程数、最高行驶速度的限制。客户有开放时间窗,对客户的拜访必须在允许的时间窗内完成。在各个客户站点有定义不同的工作时长。

每辆车/每位员工和每个集散中心都有工作开始和结束时间限制。对于车辆/员工来说,从集散中心出发和返回的时间必须在工作时间以内;对于集散中心来说,所有车辆的触发和返回必须在集散中心的开放时间以内。

目标是在满足所有约束的情况下,为每辆车安排一天的行程,使当天能够拜访的客户站点数达到最大值,所有车辆的成本总和最小。

车辆路线规划类问题描述

以TSP(travelling salesman problem)为基础,泛化而来的问题是车辆路线规划问题(VRP)。一种常见的VRP问题增加了车辆容量和站点访问时间窗口,是一种特殊的VRP问题,缩写为CVRPTW(constraint vehicle routing problem with time windows)。

TSP的混合整数线性优化描述:

假设集合V有n个站点 v 0 v_0 v0 v n v_n vn。如果有起始地点depot的集合 V d = v 0 , v 1 , … , v d V_d = {v_0, v_1, \dots, v_d} Vd=v0,v1,,vd,则

V ’ = V \ { V d } \mathbf V’ = \mathbf V \backslash \big\{ V_{d} \big\} V=V\{ Vd} 代表客户站点。

站点间的连接为
x i j = { 1 站点i和j之间有连接 0 无连接 x_{ij} = \begin{cases} 1 & \quad \text{站点i和j之间有连接} \\ 0 & \quad \text{无连接} \end{cases} xij={ 10站点ij之间有连接无连接

目标函数为:

m i n i m i z e ∑ i = 1 n ∑ j ≠ i , j = 1 n c i j x i j , i , j ∈ V ( 1 ) minimize \sum_{i=1}^n \sum_{j \neq i,j=1}^n c_{ij}x_{ij}, \quad i,j \in \mathbf V \quad (1) minimizei=1nj̸=i,j=1ncijxij,i,jV(1)
c i j c_{ij} cij 是节点间的距离,depot的集合为空。

约束为:

0 ≤ x i j ≤ 1 ( 2 ) 0 \leq x_{ij} \leq 1 \quad (2) 0xij1(2)

c i j = c j i , i , j ∈ V ( 3 ) c_{ij} = c_{ji}, \quad i, j \in \mathbf V \quad (3) cij=cji,i,jV(3),所有路径上的cost都是对称的,

∑ i = 1 , i ≠ j n x i j = 1 , j ∈ V ( 4 ) \sum_{i=1,i \neq j}^n x_{ij} =1, \quad j \in \mathbf{V} \quad (4) i=1,i̸=jnxij=1,jV(4),从任意节点出发,只连接其他节点中的一个

∑ j = 1 , j ≠ i n x i j = 1 , i ∈ V ( 5 ) \sum_{j=1, j \neq i}^n x_{ij}=1,\quad i \in \mathbf{V} \quad (5) j=1,j̸=inxij=1,iV(5),到任意节点的路线,只从其他节点中的一个出发

u i ∈ Z , i ∈ V ( 6 ) u_i \in \mathbf Z,\quad i \in \mathbf{V} \quad (6) uiZ,iV(6)

u i − u j + n x i j ≤ n − 1 ( 7 ) u_i - u_j + nx_{ij} \leq n-1 \quad (7) uiuj+nxijn1(7)

0 ≤ u i , u j ≤ n − 1 , 2 ≤ i ≠ j ≤ n ( 8 ) 0 \leq u_i, u_j \leq n-1, \quad 2 \leq i \neq j \leq n \quad (8) 0ui,ujn

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值