VRP 问题

VRP 问题也叫车辆路径问题,可以看成旅行商问题的推广
有N辆车,都从原点出发,每辆车访问一些点后回到原点,要求所有的点都要被访问到,求最短的车辆行驶距离或最少需要的车辆数

应用领域

快递公司 - 给司机分配送货线路
拼车软件 - 为司机分配接送乘客的路线

常见的限制要求

  • 车辆具有可携带的最大重量或数量
  • 司机需要在指定时间窗口内访问某位置点的访问顺序等

VRP问题的求解

NP Hard问题,即使只有几百个客户节点,也很难在有限时间内找到最优解

研究工作分为两个流派
1)通过运筹学(Operations)
将VRP定义为数学优化问题,通过启发式算法达求近似最优解
2)通过深度学习
比如GCN,计算节点特征,边特征

常见工具

OR-Tools:
Google的运筹学工具,启发式求解器
在可接受的时间内可以求解较大规模的VRP问题
支持的应用场景:
1)VRP(一辆车或多辆车)
2)带有容量约束的VRP
3)带有时间窗口约束的VRP
4)指定拿起放下地点的VRP(pickups and deliveries)

VRP问题的流程

使用RoutingModel进行路径规划管理

  • 1)设置城市个数,车辆数,起点下标
  • 2)设置距离回调函数 distance_callback
  • 3)设置初始可行解算法
PATH_CHEAPEST_ARC,从start节点开始,找到CHEAPEST的路径

返回值情况

0 ROUTING_NOT_SOLVED: Problem not solved yet.
1 ROUTING_SUCCESS: Problem solved successfully.
2 ROUTING_FAIL: No solution found to the problem.
3 ROUTING_FAIL_TIMEOUT: Time limit reached before finding a solution.
4 ROUTING_INVALID: Model, model parameters, or flags are not valid.

优化(使用local search)

search_parameters.local_search_metaheuristic = (
routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH)
#搜索时间限制
search_parameters.time_limit.seconds = 120

项目:指定城市的旅行商问题

实现步骤

  • Step1,数据预处理
1)所有城市的位置(经度、维度)
2)城市之间的距离矩阵
  • Step2,根据指定的城市,计算TSP,得到路径route
  • Step3,可视化交互
1)选择指定的城市
2)画出车辆行驶路径(基于百度地图API)

车辆路径规划 步骤:

  • Step1, 创建参数字典data
  • Step2,创建路线索引管理器
  • Step3,创建路线模型
  • Step4,注册各种限制和约束条件
  • Step5,设置解决方案策略
  • Step6,计算解决方案
  • Step7,输出结果
import pandas as pd
from ortools.constraint_solver import routing_enums_pb2,pywrapcp

class vrp(object):
    # 初始化数据格式
    def get_data(self):
        ...
    
    # 输出结果
    def get_solution(self,manager, routing, solution):
        ...
    
    def fit(self):
        ...


city_names = ['北京', '上海', '广州']
model = vrp(city_names = city_names)
route, route_distance = model.fit()
print(route)
print(route_distance)

总行驶里程: 4754 公里
[0, 1, 2]
4754