PyVRP,一个专门解决车辆路径问题的Python开源库

PyVRP是一个Python库,用于解决容量约束车辆路径问题(VRP)。VRP是一种经典的组合优化问题,它需要在给定数量的车辆和客户需求图中规划车辆路径,以最小化总行驶距离、最小化车辆数量、最小化运输成本等。

本文介绍PyVRP的基础使用方法。

安装

pip install pyvrp

使用举例

先给出一个简单的解决VRP问题的代码:

from pyvrp import Model
import matplotlib.pyplot as plt
from pyvrp.plotting import plot_coordinates
from pyvrp.stop import MaxRuntime
COORDS = [
    (456, 320),  # location 0 
    (228, 0),    # location 1
    (912, 0),    # location 2
    (0, 80),     # location 3
    (114, 80),   # location 4
    (570, 160),  # location 5
    (798, 160),  # location 6
    (342, 240),  # location 7
    (684, 240),  # location 8
    (570, 400),  # location 9
    (912, 400),  # location 10
    (114, 480),  # location 11
    (228, 480),  # location 12
    (342, 560),  # location 13
    (684, 560),  # location 14
    (0, 640),    # location 15
    (798, 640),  # location 16
]
DEMANDS = [0, 1, 1, 2, 4, 2, 4, 8, 8, 1, 2, 1, 2, 4, 4, 8, 8]
m = Model()
m.add_vehicle_type(num_available=4,
                   capacity=15,
                   fixed_cost=100,
                   tw_early=0,
                   tw_late = 100000)
depot = m.add_depot(x=COORDS[0][0], y=COORDS[0][1])
clients = [
    m.add_client(x=COORDS[idx][0], y=COORDS[idx][1], demand=DEMANDS[idx])
    for idx in range(1, len(COORDS))
]

locations = [depot, *clients]
for frm in locations:##使用曼哈顿距离。计算距离矩阵
    for to in locations:
        distance = abs(frm.x - to.x) + abs(frm.y - to.y) 
        m.add_edge(frm, to, distance=distance)
##画图
_, ax = plt.subplots(figsize=(8, 8))
plot_coordinates(m.data(), ax=ax)##
res = m.solve(stop=MaxRuntime(5))  # 模型求解,程序运行时间设置成5秒,
print(res)

输出结果:

这里面有已经封装好了的一个重要函数add_vehicle_type

该函数可以设置使用车辆数、车辆装载容量、该车辆的价格、车辆最早及最晚的运输时间等参数,如果了解VRP问题的朋友,知道这些参数或约束非常重要,这些设定好了才是VRP问题的灵魂。(还有其他自定义函数,就不在此一一介绍)

画图展示

pyvrp封装了画图函数,可以对最后的路径结果直接实现画图可视化,使用起来非常方便。

###画出最后的路径图
from pyvrp.plotting import plot_solution

_, ax = plt.subplots(figsize=(8, 8))
plot_solution(res.best, m.data(), ax=ax)

搜索参数设置

pyvrp首先默认了一些寻找最优解的搜索参数,但也可以自己设定或修改参数。

pyvrp也封装了2-opt还有多种exchange的方法。

整体而言,pyvrp是一个比较完整,易于使用的解决vrp问题的一个封装库。

使用何种方法求解

这个可能是大家比较关心的,该vrp库到底采用何种方法求解,封装了哪种算法。

从官网介绍来看,他们采用了混合遗传搜索(HGS)算法。可简单理解成遗传算法+邻域搜索的结合。

如果想详细了解求解原理,可参阅两篇科研文章,文章地址放在下面。

https://www.sciencedirect.com/science/article/abs/pii/S0305054812001645

https://www.sciencedirect.com/science/article/abs/pii/S030505482100349X

请使用浏览器的分享功能分享到微信等