本页面介绍了使用 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,确保更新后的路线仍分配给正确的车辆 。这在添加或移除配送和车辆时进行实验非常有用,因为它使用标签而不是索引来匹配路线。这要求所有车辆和配送标签都是唯一的。
集成路线方案
最终确定的路线方案是一个数据对象,表示对资源和任务的优化管理,同时遵循您的限制条件和目标。 通过将此路线方案集成到您的系统中,在日常运营中使用它。 这通常涉及为车队经理直观呈现路线方案,并向驾驶员发送精细(导航)说明。
可视化
为了让车队经理能够验证和监控路线方案,您可以通过以下方式直观呈现路线方案:
为了让车队经理能够验证和监控路线方案,您可以在信息中心地图上显示该方案。根据您当前的开发阶段,您可以通过以下方式直观呈现路线方案:
- 无需代码即可探索: 您可以使用开源 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 会将您计划的访问顺序与实时车辆跟踪配对。