【免费下载链接】PyVRPOpen-source, state-of-the-art vehicle routing problem solver in an easy-to-use Python package.项目地址https://gitcode.com/gh_mirrors/py/PyVRP点击查看免费下载PyVRP是一款开源、工业级的车辆路径问题VRP求解器也提供开箱即用的 Python 包pyvrp。本文是一篇面向新手的完整教程教你用 PyVRP 完成装载与容量约束的建模并覆盖多维载重与提货送货pickup delivery场景帮助你快速落地配送、取送、逆向物流等真实业务。快速上手安装并导入 PyVRP先在终端安装pyvrppip install pyvrp然后导入建模与绘图接口import pyvrp import pyvrp.plotting import pyvrp.stopPyVRP 推荐使用高层的Model接口源码位于 pyvrp/Model.py你可以用业务语言直接描述location / client / depot / vehicle_type / edge五类对象。⚠️重要提示PyVRP 会把所有数值输入自动转成整数(x, y) 坐标除外。如果你的数据带小数如重量 1.5 kg要先自行缩放成整数再传入否则会因截断出现意外行为。理解装载loadPyVRP 容量约束的核心概念在 PyVRP 中我们把客户提货与送货量统称为load装载并围绕它建立如下不变式车辆任意时刻的在车装载量 ≤ 该车辆类型的 capacity容量送货delivery货物从仓库出发送达客户车辆装载量逐步减少提货pickup货物从客户处装车运回仓库逆向物流车辆装载量逐步增加。PyVRP 内部通过 LoadSegment 串联路线上的累计装载因此任意时刻不超容是被严格保证的而不是只在起点/终点检查。核心参数速查表建模目标方法常用参数出处客户送货/提货量单维或多维m.add_client(...)delivery,pickupModel.py#L237-L298车辆类型与容量单维或多维m.add_vehicle_type(...)capacity,num_available,fixed_costModel.py#L428-L523提货-送货配对shipmentm.add_shipment(...)pickup_location,delivery_location,amountModel.py#L300-L345起讫点之间的边m.add_edge(...)distance,durationModel.py#L386-L418一、单维容量最经典的 Capacitated VRP先从一个最小可运行的例子开始2 辆车、单车容量 10、2 个客户分别要送 4 与 5。m pyvrp.Model() m.add_vehicle_type(num_available2, capacity10) m.add_depot(locationm.add_location(0, 0)) m.add_client(locationm.add_location(0, 1), delivery4) m.add_client(locationm.add_location(2.5, 0), delivery5) for frm in m.locations: for to in m.locations: if frm ! to: m.add_edge(frm, to, distance1) # 简化单位距离 res m.solve(stoppyvrp.stop.MaxRuntime(1)) # 求解 1 秒由于总需求 459 小于单车容量 10PyVRP 会建议只用一辆车跑完两条边——这就是最典型的 CVRP 装载约束。二、混合提货与送货同一客户同时 demand 和 return现实业务里客户既收货又退货例如以旧换新、上门回收非常常见。PyVRP 中Client同时暴露delivery和pickup两个字段无需切换模型。DELIVERIES [4, 5] PICKUPS [6, 0] m pyvrp.Model() m.add_vehicle_type(num_available2, capacity10) m.add_depot(locationm.add_location(0, 0)) for idx, (d, p) in enumerate(zip(DELIVERIES, PICKUPS), start1): m.add_client( locationm.add_location(idx, idx), deliveryd, pickupp, )直观理解上图的灰色阴影条就是在车装载量随行驶距离的变化——它会先随送货减少、再随提货增加但始终不超过 capacity。三、多维载重同时表达重量、体积与技能约束PyVRP 支持任意维度的载重load dimensions。除了常见的重量 体积你还可以用一个容量为 0的维度来表达兼容性/技能约束若车辆在某维度容量为0则它无法服务任何对该维度有需求的客户若客户在某维度需求为0则必须由具备该维度容量的车辆服务。示例两种车辆——一种普通、一种带特殊技能更贵客户 A 需要特殊技能客户 B 不需要。m pyvrp.Model() m.add_depot(locationm.add_location(0, 0)) # 车辆1: 容量10, 无特殊技能(0) m.add_vehicle_type(1, capacity[10, 0]) # 车辆2: 容量5, 有特殊技能(1), 固定成本更高 m.add_vehicle_type(1, capacity[5, 1], fixed_cost10) m.add_client(locationm.add_location(0, 1), delivery[5, 1]) # 需要技能 m.add_client(locationm.add_location(2.5, 0), delivery[5, 0]) # 不需要技能求解后你会发现客户 1 被分给了更贵的那辆车——这是多维载重表达技能/兼容性约束的直接效果。四、提货送货Shipment配对不经过仓库的取送Client表达客户与仓库之间的取送而Shipmentshipment / 货单表达的是客户 A → 客户 B 的一对一取送货物不经过仓库。这是快递、外卖、出租车调度、点对点搬家等场景的标配。COORDS [ (456, 320), (228, 0), (912, 0), (0, 80), (114, 80), (570, 160), (798, 160), (342, 240), (684, 240), (570, 400), (912, 400), ] # 5 组 (提货点, 送货点) 配对 PICKUP_DELIVERIES [(1, 6), (2, 10), (4, 3), (5, 9), (7, 8)] m pyvrp.Model() for x, y in COORDS: m.add_location(x, y) m.add_depot(locationm.locations[0]) m.add_vehicle_type(num_available4, max_distance3000) for pu, dv in PICKUP_DELIVERIES: m.add_shipment( pickup_locationm.locations[pu], delivery_locationm.locations[dv], # amount... # 可选给该 shipment 增加装载约束 ) for frm in m.locations: for to in m.locations: m.add_edge(frm, to, distanceabs(frm.x - to.x) abs(frm.y - to.y)) res m.solve(stoppyvrp.stop.MaxRuntime(1))读取解的窍门打印res.best时会看到形如L0/U0的符号LidLoad在某地提货UidUnload在某地送货PyVRP保证任何 shipment 的L一定出现在U之前无需你手工校验。amount参数与delivery/pickup相同amount可以是单个整数单维或整数列表多维。若希望 shipment 参与装载约束给它赋值即可。五、Reload重载用回仓补货缓解容量约束当单车容量小于总需求时除了增加车辆你还可以允许车辆在路线中途回到仓库重载——PyVRP 把这个能力叫reload。m pyvrp.Model() depot m.add_depot(locationm.add_location(456, 320)) m.add_vehicle_type( 1, capacity15, reload_depots[depot], # 允许在哪些仓库重载 max_reloads2, # 每次路线最多重载 2 次 ) # ... add clients edges ... res m.solve(stoppyvrp.stop.MaxRuntime(1))典型场景城市末端配送回仓换货、垃圾分类清运回处理场倒空、快递网点多次补货。max_reloads可以精确控制允许回仓几次。六、把结果可视化用 plotting 模块验证你的装载约束PyVRP 提供一组开箱即用的绘图函数模块位于 pyvrp/plotting/非常适合验证装载约束是否被正确建模import pyvrp.plotting # 1) 绘制整体路径解 pyvrp.plotting.plot_solution(res.best, m.data()) # 2) 绘制单条路线的距离-时间-装载综合图 route res.best.routes()[0] pyvrp.plotting.plot_route_schedule(m.data(), route, load_dimension0) # 3) 绘制客户需求量分布按需求升序的柱状图 pyvrp.plotting.plot_demands(m.data(), dimension0)七、常见踩坑与最佳实践清单✅数据先转整数所有delivery/pickup/capacity/amount/distance/duration都会被截断成int带小数的场景先缩放如把 kg 换成 100g。✅容量维度数必须一致一旦启用多维载重Client.delivery/pickup与VehicleType.capacity的维度数要相同否则求解会报错。✅用amount让 shipment 参与装载默认 shipment 只有顺序约束、没有装载约束加上amount后才会占用车辆容量。✅用fixed_cost建模车型成本差异当多维容量用于技能时用fixed_cost表示启用高技能车的额外成本。✅求解参数先设短pyvrp.stop.MaxRuntime(1)用来快速验证模型是否正确正式跑批再换MaxRuntime(600)或NoImprovement(...)。⛔不要跳过 depot每个Model至少要有一个add_depot(...)否则solve()会失败。小结本文带你走完了 PyVRP 建模装载与容量约束的完整闭环单维容量Client.delivery/pickupVehicleType.capacity组成最经典的 CVRP混合取送同一客户可同时有 delivery 和 pickup多维载重[重量, 体积, 技能, ...]任意扩展提货送货配对add_shipment表达 A→B 直连取送保证 L 先于 UReload 重载允许车辆回仓补货突破单车容量瓶颈plotting 验证用plot_solution与plot_route_schedule直观检查装载曲线。掌握以上 6 步你就能用 PyVRP 稳定解决绝大多数装得下 / 送得完 / 取得了的配送业务问题。赞分享【免费下载链接】PyVRPOpen-source, state-of-the-art vehicle routing problem solver in an easy-to-use Python package.项目地址https://gitcode.com/gh_mirrors/py/PyVRP点击查看免费下载相关推荐PyVRP互斥客户组技巧Generalized VRP与多时间窗约束如何优雅建模PyVRP互斥客户组技巧Generalized VRP与多时间窗约束如何优雅建模 PyVRP 是开源的、最先进的车辆路径问题Vehicle RoutingEasegress sbin 运维脚本套件多节点集群的启动、停止与状态巡检实战指南Easegress sbin 运维脚本套件多节点集群的启动、停止与状态巡检实战指南 Easegress 是一个云原生流量编排系统CNCF 项目其集群模式REFramework 完整上手指南一个 dinput8.dll 如何带齐 MOD、脚本与 VR 三大能力REFramework 完整上手指南一个 dinput8.dll 如何带齐 MOD、脚本与 VR 三大能力 REFramework 是一款面向 RE 引擎游戏游戏开发逆向工程插件系统上一篇MkDocs 文档站点报错怎么办7 类常见错误的快速定位方法下一篇从零实现 JavaScript 神经网络矩阵库四矩阵转置 transpose() 的源码级讲解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考