一个用开源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站点i和j之间有连接无连接。
目标函数为:
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=1∑nj̸=i,j=1∑ncijxij,i,j∈V(1)
c i j c_{ij} cij 是节点间的距离,depot的集合为空。
约束为:
0 ≤ x i j ≤ 1 ( 2 ) 0 \leq x_{ij} \leq 1 \quad (2) 0≤xij≤1(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,j∈V(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̸=j∑nxij=1,j∈V(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̸=i∑nxij=1,i∈V(5),到任意节点的路线,只从其他节点中的一个出发
u i ∈ Z , i ∈ V ( 6 ) u_i \in \mathbf Z,\quad i \in \mathbf{V} \quad (6) ui∈Z,i∈V(6)
u i − u j + n x i j ≤ n − 1 ( 7 ) u_i - u_j + nx_{ij} \leq n-1 \quad (7) ui−uj+nxij≤n−1(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) 0≤ui,uj≤n−