路线规划生命周期

本页面介绍了使用 Route Optimization API 的路线方案的生命周期,从确定路线需求开始,到在系统中集成路线方案结束。

按照路线方案的各个阶段,您可以实现以下目标:

  • 映射车队运营情况: 将您的实体车队、复杂限制条件和业务目标转换为 API 代码。
  • 优化业务路线方案: 了解如何优化路线方案,使其能够满足您的目标并改进日常运营。
  • 部署到生产环境: 将路线方案纳入日常运营,以实现该方案。

下图展示了路线方案的生命周期。

路线方案生命周期的流程图(在下文中说明)

路线方案的实现阶段 是指您首次集成 API 或业务需求发生重大变化时。它涵盖第 1 到第 5 阶段。

日常运营阶段 较为轻量级,优化程度也较低。它涵盖第 2 到第 4 阶段。

路线方案的生命周期阶段如下:

  1. 确定问题范围: 在开始使用 API 之前,先确定并整理您的目标、资源、任务和限制条件,以便全面了解您的运营情况。
  2. 映射数据: 将您的业务实际情况转换为 API 参数,以便路线方案反映您希望车队如何运营。
  3. 创建请求并获取路线方案: 将数据输入 API 并获取优化后的路线方案。
  4. 优化路线方案: 测试路线方案,并通过调整限制条件和目标来对其进行迭代,确保其满足您的所有需求。
  5. 集成路线方案: 将路线方案连接到现有系统,以提供可操作的导航。

确定问题范围

在使用 API 之前,您需要将日常运营的详细信息整理到清晰的数据类别中。这样,您就可以清楚地了解当前资源和任务、限制条件以及希望车队实现的目标,从而开始实现流程。

确定资源和任务

规划路线方案时,一个重要的步骤是确定资源和任务,即车辆和配送。

车辆 配送
  • 数量: 您有多少辆车?
  • 位置: 车辆的起点和终点在哪里?
  • 时间: 车辆驾驶员的工作时间是什么?
  • 容量: 车辆的限制是什么?
  • 费用: 车队的运营费用是多少?
  • 位置: 取货点和送货点在哪里?
  • 需求: 包裹的重量或尺寸是多少?
  • 限制条件: 是否有特定的送货时间范围?
  • 服务时间: 驾驶员需要停车和卸货多长时间?
  • 要求: 配送是否需要特定类型的车辆或驾驶员?

确定限制条件

限制条件是指您使用车辆的方式以及处理配送的方式的限制。它们决定了您的大部分运营,并且在创建优化后的路线方案时至关重要。

限制条件通常分为两类:

硬性限制条件 软性限制条件
这些是无法打破 的限制。例如,卡车无法承载超过其最大容量的重量,驾驶员无法在商店关门后取货。 这些是在必要时可以违反 的偏好设置,通常会产生罚款。例如,您可能希望卡车仅装载 80% 的容量,或在目标时间之前送货,但您愿意超出这些限制以获得更好的路线。

常见限制条件包括:

  • 容量限制: 车辆可以承载的最大重量、体积或商品数量。
  • 时间范围: 地点开放供访问的特定时间段,或驾驶员的特定工作时间。
  • 费用: 运营车辆或跳过配送的费用。API 的主要目标之一是生成经济高效的路线方案。
  • 驾驶员休息时间: 驾驶员在工作一定时间后通常需要休息,这是劳动法规定的。

确定业务目标

确定资源和任务及其限制条件后,接下来需要确定对您的业务最重要的指标。这些目标与限制条件息息相关,有助于您在规划路线时确定最重要的事项。

以下是一些业务目标示例:

车队规模 距离 时间 费用
您是希望尽可能减少使用的车辆数量,还是希望使用整个车队来提前完成工作日? 您是希望选择最短路径以节省燃油,还是希望选择可能因使用高速公路而较长的更快路线? 您是希望尽可能减少总工作时间,还是希望优先考虑在特定时间到达,这可能会延长路线上的时间? 您是希望尽可能减少工资和燃油等运营费用,还是愿意接受更高的费用以满足严格的截止日期?

映射数据

收集数据后,将其映射以匹配 API 的属性。这样,优化器就可以获得所有信息,从而返回一个考虑了您的业务实际情况的路线方案。

使用下表中的参数来映射您在确定问题范围 部分中映射的资源、任务、限制条件、 和目标。

变量映射

现实概念 API 参数 说明
驾驶员或车辆 model.vehicles[] 表示车队中的一辆车辆。
车库位置 vehicles[].startWaypoint
vehicles[].endWaypoint
车辆路线的起点和终点位置。
您的营业时间 model.globalStartTime
model.globalEndTime
整个车队运营的最早开始时间和最晚结束时间。
任务或包裹 model.shipments[] 表示一项作业。可以是 pickup、delivery 或两者兼有。
任务位置 pickups[].arrivalWaypoint
deliveries[].arrivalWaypoint
作业发生的地理位置。
服务时间 pickups[].duration
deliveries[].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 生成路线方案涉及以下步骤:

  1. 配置环境: 设置 Google Cloud 云项目,启用 API,并配置身份验证。如需查看相关说明,请参阅快速 入门。 您只需执行此步骤一次。
  2. 发送请求: 使用上一部分中定义的数据映射构建请求正文。如需了解端点、标头和 请求格式,请参阅发出 API 请求。
  3. 了解响应: 从 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,确保更新后的路线仍分配给正确的车辆 。这在添加或移除配送和车辆时进行实验非常有用,因为它使用标签而不是索引来匹配路线。这要求所有车辆和配送标签都是唯一的。

集成路线方案

最终确定的路线方案是一个数据对象,表示对资源和任务的优化管理,同时遵循您的限制条件和目标。 通过将此路线方案集成到您的系统中,在日常运营中使用它。 这通常涉及为车队经理直观呈现路线方案,并向驾驶员发送精细(导航)说明。

可视化

为了让车队经理能够验证和监控路线方案,您可以通过以下方式直观呈现路线方案:

为了让车队经理能够验证和监控路线方案,您可以在信息中心地图上显示该方案。根据您当前的开发阶段,您可以通过以下方式直观呈现路线方案:

  • 无需代码即可探索: 您可以使用开源 Route Optimization 应用 来了解 API 如何将您的数据转换为地图上的实际路径。此 Web 应用充当探索工具,可让您构建场景、调整限制条件参数,并在编写任何代码之前以直观方式呈现生成的路线方案。
  • 显示访问顺序: 您可以在地图上将访问顺序显示为带编号的点,以便在自己的系统中评估优化和调度方案。为此,请在 API 响应的每条路线中找到 visits 数组。此数组中的项的顺序与驾驶员应执行的顺序完全相同。您可以遍历此列表,使用 shipmentIndex 检索每个停靠点的地理坐标,并使用映射库根据其在列表中的顺序在地图上呈现带编号的标记。
  • 绘制实际路线: 您可以在地图上直观呈现确切的计划路径,以了解优化器为何选择特定顺序。此多段线表示用于规划和评估的预期路径,而不是驾驶员采取的实时路线。在请求中设置 populatePolylines: true,以 获取每条路线的 encodedPolyline 字段,并使用 google.maps.geometry.encoding.decodePath() 方法从 Maps JavaScript API 对其进行解码。

调度给驾驶员

您可以使用 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 会将您计划的访问顺序与实时车辆跟踪配对。