本页面介绍了使用 Route Optimization API 的路线规划生命周期,从确定路线需求开始,到在系统中集成路线规划结束。
按照路线规划的各个阶段,您可以实现以下目标:
- 映射车队运营:将您的实体车队、复杂限制和业务目标转换为 API 代码。
- 为您的业务优化路线规划:了解如何优化路线规划,使其能够满足您的目标并改进日常运营。
- 部署到生产环境:将路线规划纳入日常运营中,从而实施路线规划。
下图展示了路线方案的生命周期。
路线规划的实施阶段发生在您首次集成 API 时,或在您的业务需求发生重大变化时。它涵盖第 1 阶段到第 5 阶段。
日常运营阶段更轻量,只需进行极少的优化。 它涵盖第 2 阶段到第 4 阶段。
路线的生命周期阶段如下:
- 确定问题范围:在开始使用 API 之前,确定并整理您的目标、资源、任务和限制条件,以便全面了解您的运营情况。
- 映射数据:将您的业务实际情况转换为 API 参数,以便路线规划反映您需要车队如何运营。
- 创建请求并获取路线规划:将数据输入 API,获取优化后的路线规划。
- 优化路线规划:测试路线规划,并通过调整约束条件和目标进行迭代,确保其满足您的所有需求。
- 集成路线规划:将路线规划与现有系统连接,以提供切实可行的导航。
确定问题范围
在使用该 API 之前,您需要将日常运营的详细信息整理成清晰的数据类别。这样,您就可以在开始实施流程时清楚地了解当前的资源和任务、限制因素以及您希望通过舰队实现的目标。
确定资源和任务
规划路线方案时,一个重要步骤是确定资源和任务,即车辆和配送。
| 车辆 | 配送 |
|---|---|
|
|
确定限制条件
约束条件是指对车辆使用方式和货物处理方式的限制。它们决定了您的大部分运营,在创建优化路线规划时至关重要。
限制条件通常分为两类:
| 硬性限制 | 软性限制条件 |
|---|---|
| 这些是无法突破的限制。例如,卡车不能超载,司机不能在商店关门后取货。 | 这些是在必要时可以违反的偏好设置,通常会产生惩罚费用。例如,您可能希望卡车仅装载 80% 的容量,或在目标时间之前送达,但您愿意超出这些限制以获得更好的路线。 |
常见限制条件包括:
- 容量限制:车辆可承载的最大重量、体积或物品数量。
- 时间窗口:地点开放供访问的具体时间段,或司机的具体轮班时间。
- 费用:运行车辆或跳过配送的费用。该 API 的主要目标之一是生成具有成本效益的路线规划。
- 司机休息时间:劳动法通常要求司机在工作一定小时数后休息。
确立业务目标
确定资源、任务及其限制后,接下来就要确定哪些指标对您的业务最重要。这些目标与限制条件相辅相成,可帮助您在规划路线时确定最重要的因素。
以下是一些业务目标示例:
| 车队规模 | 距离 | 时间 | 费用 |
|---|---|---|---|
| 您是希望尽可能减少使用的车辆数量,还是希望使用整个车队来提前完成当天的工作? | 您是希望选择最短路径以节省燃油,还是更倾向于选择可能因使用高速公路而路程更长但速度更快的路线? | 您是希望尽可能减少总工作时长,还是优先考虑在特定时间到达(这可能会延长路线上的时间)? | 您是希望最大限度地减少工资和燃料等运营费用,还是愿意接受更高的成本以满足严格的截止日期? |
映射您的数据
收集完数据后,请将其映射到 API 的属性。这样,优化器就可以获得所有信息,从而返回一个考虑了业务实际情况的路线规划。
使用下表中的参数来映射您在确定问题范围部分中映射的资源、任务、限制条件和目标。
变量映射
| 真实世界概念 | API 参数 | 说明 |
|---|---|---|
| 司机或车辆 | model.vehicles[] |
表示车队中的一辆车。 |
| 仓库位置 |
vehicles[].startWaypointvehicles[].endWaypoint
|
车辆路线的起点和终点。 |
| 您的营业时间 |
model.globalStartTimemodel.globalEndTime
|
整个车队运营的最早开始时间和最晚结束时间。 |
| 任务或软件包 | model.shipments[] |
代表一个作业。可以是 pickup 和/或 delivery。 |
| 任务地点 |
pickups[].arrivalWaypointdeliveries[].arrivalWaypoint
|
作业发生的地理位置。 |
| 服务时间 |
pickups[].durationdeliveries[].duration
|
在相应地点完成任务(例如卸货)所花费的时间,不包括行程时间。 |
限制条件映射
| 现实约束 | API 参数 | 说明 |
|---|---|---|
| 车辆容量 | vehicles[].loadLimits |
设置车辆容量的硬性或软性限制。如果配送的 loadDemand 超过剩余限制,则不会分配。 |
| 资源包大小 | shipments[].loadDemands |
一单配送消耗的车辆容量。 |
| 车辆限制 | shipments[].allowedVehicleIndices |
限制运单,使其只能由特定车辆或司机取件或送货。 |
| 营业时间 | shipments[].pickups[].timeWindows 或 shipments[].deliveries[].timeWindows |
设置可访问某个位置的时间。如果车辆无法在此时间范围内到达,系统会跳过该配送。 |
| 班次时长限制 | vehicles[].routeDurationLimit |
为特定司机的工作时长设置硬性或软性上限(例如,最多 8 小时),而不考虑全局结束时间。 |
| 司机休息 | vehicles[].breakRule |
强制执行特定的休息规则,例如在工作一定小时数后强制休息。 |
| 道路限制 | vehicles[].travelMode |
指定出行方式(例如 DRIVE 或 BICYCLE)。这会将路线限制为合法道路,并决定用于计算行程时间的速度。 |
目标映射
| 实际目标 | API 参数 | 说明 |
|---|---|---|
| 尽量减少车队规模 | vehicles[].fixedCost |
应用使用车辆的一次性费用。高固定费用会迫使路线优先考虑使用更少的车辆,而不是增加总距离或工作时间。 |
| 尽量缩短距离 | vehicles[].costPerKilometer |
对每行驶一公里收取费用。优先选择较短的路线,以节省燃油并减少磨损。 |
| 尽量缩短总时长 | vehicles[].costPerHour |
对车辆处于活跃状态(包括行驶和等待时间)的每小时应用费用。优先保障更快完成升级。 |
| 尽量缩短驾车时长 | vehicles[].costPerTraveledHour |
专门针对移动所花费的时间应用成本。这可以区分堵车(费用较高)和在站点等待(费用可能较低)。 |
| 优先处理某些任务 | shipments[].penaltyCost |
如果跳过特定配送,则会产生费用。将此值设为较高值可确保关键任务优先于可选任务。 |
创建请求并获取响应
使用 Route Optimization API 生成路线规划涉及以下步骤:
- 配置环境:设置 Google Cloud 云项目、启用 API 并配置身份验证。如需查看相关说明,请参阅使用入门。 您只需执行此步骤一次。
- 发送请求:使用上一部分中定义的数据映射构建请求正文。如需了解端点、标头和请求格式,请参阅发出 API 请求。
- 了解响应:从 API 获得响应后,了解路线规划和每个参数的含义。请参阅解读回答。
优化路线规划
将现实世界的物流转化为 API 成本和限制是一项复杂的任务。您的初始路线规划可能不符合您的业务目标或司机预期。优化路线规划是一个迭代过程,需要测试返回的路线并调整参数,直到找到能实现目标的设置为止。
调整目标和限制条件
如果生成的路线方案不符合您的需求,您可以修改某些参数以获得不同的结果。收紧或放宽参数会改变路线规划中冲突目标的解决方式,而放宽参数是发现导致路线规划中出现错误的参数的有效方法。
下表列出了常见的路由问题以及您可以调整以解决这些问题的参数。
| 场景 | 参数 | 调整 | 说明 |
|---|---|---|---|
| 跳过了重要配送 | shipments[].penaltyCost |
提高其价值,或为其他配送添加惩罚费用 | 如果运单是可选的,请提高其惩罚费用,以提高其优先级。如果配送是强制性的(没有罚金),请为其他不太重要的配送添加罚金。这样一来,这些配送就变成了可选配送,从而为重要配送释放了车辆时间和容量。 |
| 由于时间原因,已跳过递送 | softStartTime/softEndTime |
添加软时间窗口 | 硬性时间窗口会丢弃即使迟到一分钟的任务。软时间窗允许司机在稍有延误的情况下到达,但需要支付一定的“费用”,而不是直接导致分配失败。 |
| 因重量原因跳过递送 | loadLimits[].softMaxLoad和costPerUnitAbove |
添加软负载需求 | 允许车辆略微超出其理想容量(会受到惩罚),而不是留下包裹。 |
| 因车队超载而跳过配送 | model.vehicles[] 或 shipments[].timeWindows |
添加车辆或放宽时间窗口 | 如果当前车队的配送任务过多(尤其是在高峰时段),请增加车辆数量或延长配送时间范围,以分摊工作负载。 |
| 路线过长或效率低下 | vehicles[].costPerKilometer/costPerHour |
添加费用或提高其价值 | 告知 API 行程成本高昂,促使其舍弃偏远、孤立的停靠点,为车队规划更紧凑的路线。 |
| 司机轮班时间过长 | vehicles[].routeDurationLimit 或 model.vehicles[] |
添加时长限制,或添加车辆和限制 | 对司机在路上的总时间设置硬性上限(例如 8 小时)。仅添加车辆不会缩短路线,除非您还应用时长限制,强制求解器在更大的车队中分配工作负载。 |
更新路线方案
您通常需要更新路线规划,同时保持基础路线不变,例如向在途司机的行程中添加一个取件点。为此,请使用注入参数,这些参数会根据您之前的解决方案为 API 提供一个起点,使其能够修改现有方案,而不是从头开始计算新方案。
您可以通过以下不同方式使用注入参数更新路线方案:
- 将上一个响应中的路线传递到新请求的
injectedFirstSolutionRoutes字段中。这可以加快优化搜索速度,并且有助于在日常运营开始之前重新规划,例如整合最后一刻的配送。 - 使用
injectedSolutionConstraint字段控制变化程度。当操作已在进行中时,此功能非常有用,可让您保留司机的当前顺序或修复已执行的计划部分。 - 通过将
interpretInjectedSolutionsUsingLabels设置为true,确保更新后的路线仍分配给正确的车辆。在添加或移除运单和车辆时,这在实验中非常有用,因为它使用标签而不是索引来匹配路线。这要求所有车辆和配送标签都具有唯一性。
整合路线规划
最终确定的路线方案是一个数据对象,表示在遵循约束条件和目标的前提下,对资源和任务进行优化管理。 将此路线规划集成到您的系统中,以便在日常运营中使用。 这通常涉及为车队经理直观呈现路线规划,以及向司机发送精细导航说明。
可视化
为了让车队经理能够验证和监控您的路线方案,您可以通过以下方式直观呈现路线方案:
为了让车队管理员能够验证和监控您的路线规划,您可以在信息中心地图上显示该路线规划。根据您当前的开发阶段,您可以通过以下方式直观呈现路线规划:
- 无需编写代码即可探索:您可以使用开源路线优化应用,了解该 API 如何将您的数据转换为地图上的实际路径。此 Web 应用是一个探索工具,可让您在编写任何代码之前构建场景、调整约束参数并直观呈现生成的路线规划。
- 显示访问顺序:您可以在地图上将访问顺序显示为带编号的点,以便在自己的系统中评估优化和调度方案。为此,请在 API 响应的每条路线中找到
visits数组。此数组中的项会严格按照驱动程序应执行的顺序进行排序。您可以遍历此列表,使用shipmentIndex检索每个停靠点的位置坐标,并使用地图绘制库根据停靠点在列表中的顺序在地图上呈现带编号的标记。 - 绘制实际路线:您可以在地图上直观呈现确切的规划路径,了解优化工具为何选择特定顺序。此多段线表示用于规划和评估的预期路径,而不是司机采用的实时路线。在请求中设置
populatePolylines: true,以获取每条路线的encodedPolyline字段,并使用 Maps JavaScript API 中的google.maps.geometry.encoding.decodePath()方法对其进行解码。
派单给司机
您可以使用 Navigation SDK 将精细导航功能集成到司机应用中,也可以提供指向 Google 地图消费者应用的深层链接。
- Navigation SDK:如果您有自定义司机应用,则可以集成 Navigation SDK for Android 或 iOS,以提供应用内精细导航。您可以将 API 响应中的任务信息集成到您的系统中,并使用 SDK 进行导航。如需将路线从 API 响应传递到 SDK,请在请求中设置
populateTransitionPolylines: true。这会为响应中的每个转换生成一个routeToken。 - Fleet Engine:对于高级车队管理,您可以将 API 生成的路线规划导入 Fleet Engine,以实时监控路线执行情况。虽然该 API 会提供预期路径的多段线以供评估,但 Fleet Engine 会将您计划的访问顺序与实时车辆跟踪配对。