Method: projects.optimizeTours

发送包含 ShipmentModelOptimizeToursRequest,并返回包含 ShipmentRouteOptimizeToursResponseShipmentRoute 是车辆将执行的一组路线,能够最大限度地降低总费用。

ShipmentModel 模型主要由需要执行的 Shipment 和可用于传输 ShipmentVehicle 组成。ShipmentRoute 会将 Shipment 分配给 Vehicle。更具体地说,它们为每辆车分配了一系列 Visit,其中 Visit 对应于 VisitRequest,即 Shipment 的取货或送货服务。

目标是为 Vehicle 分配 ShipmentRoute,从而最大限度地降低总费用,因为 ShipmentModel 中定义了许多组件。

HTTP 请求

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*}:optimizeTours

网址采用 gRPC 转码语法。

路径参数

参数
parent

string

必需。请定位到项目或位置以拨打电话。

格式:* projects/{project-id} * projects/{project-id}/locations/{location-id}

如果未指定位置,系统会自动选择区域。

请求正文

请求正文中包含结构如下的数据:

JSON 表示法
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
字段
timeout

string (Duration format)

如果设置了此超时,服务器将在超时期限已过或同步请求的服务器截止时间之前(以时间较早者为准)返回响应。

对于异步请求,服务器会在超时过去之前生成解决方案(如果可能)。

该时长以秒为单位,最多包含九个小数位,以“s”结尾。示例:"3.5s"

model

object (ShipmentModel)

要解决的配送模式。

solvingMode

enum (SolvingMode)

默认情况下,解析模式为 DEFAULT_SOLVE (0)。

searchMode

enum (SearchMode)

用于解决请求的搜索模式。

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

指导优化算法找到与先前解决方案类似的首个解决方案。

构建第一个解决方案时,模型会受到限制。第一个解决方案中会隐式跳过未在路线上执行的任何运送,但它们可能会在后续解决方案中执行。

此解决方案必须满足一些基本的有效性假设:

  • 对于所有路线,vehicleIndex 必须在范围内且不重复。
  • 对于所有访问,shipmentIndexvisitRequestIndex 必须在范围内。
  • 一个运单只能被同时引用一条航线。
  • 必须在发货前执行自提配送操作。
  • 只能为一件商品提供一种备选自提方式或一种备选方式的配送方式。
  • 所有路线的用时都会增加(即vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime)。
  • 只能在允许的车辆上运送。如果 Shipment.allowed_vehicle_indices 为空或其 vehicleIndex 包含在 Shipment.allowed_vehicle_indices 中,则允许车辆通行。

如果注入的解决方案不可行,不一定会返回验证错误,而是可能会返回指示不可行的错误。

injectedSolutionConstraint

object (InjectedSolutionConstraint)

限制优化算法以找到与先前解决方案类似的最终解决方案。例如,这可用于冻结已完成或即将完成但不得修改的路线部分。

如果注入的解决方案不可行,不一定会返回验证错误,而是可能会返回指示不可行的错误。

refreshDetailsRoutes[]

object (ShipmentRoute)

如果不为空,则将刷新给定路线,而不修改其基本访问顺序或行程时间:仅更新其他详细信息。这无法解决模型问题。

自 2020 年 11 月起,此方法仅会填充非空路线的多段线,并要求 populatePolylines 为 true。

传入路由的 routePolyline 字段可能与路由 transitions 不一致。

此字段不得与 injectedFirstSolutionRoutesinjectedSolutionConstraint 一起使用。

Shipment.ignoreVehicle.ignore 对此行为没有影响。无论相关货运或车辆是否被忽略,所有非空路线中的所有访问之间仍会填充多段线。

interpretInjectedSolutionsUsingLabels

boolean

如果为 true:

这种解释适用于 injectedFirstSolutionRoutesinjectedSolutionConstraintrefreshDetailsRoutes 字段。如果请求中的运单或车辆索引自解决方案创建后发生了变化(可能是因为运单或车辆已从该请求中移除或添加到该请求中),则可以使用此参数。

如果为 true,以下类别中的标签必须在其类别中最多出现一次:

如果注入的解决方案中的 vehicleLabel 与请求车辆不对应,则系统会从解决方案中移除相应的路线及其到访记录。如果注入的解决方案中的 shipmentLabel 与运单请求不相符,系统会从解决方案中移除相应的访问。如果注入的解决方案中的 SkippedShipment.label 与运单请求不对应,系统会从解决方案中移除 SkippedShipment

从注入的解决方案中移除路线访问或整个路线可能会影响隐含的约束条件,这可能会导致解决方案发生变化、验证错误或不可行性。

注意:调用方必须确保每个 Vehicle.label (resp.Shipment.label)可唯一标识下列两个相关请求中使用的车辆(响应运单)实体:生成了注入解决方案中使用的 OptimizeToursResponse 的过往请求,以及包含注入解决方案的当前请求。上述唯一性检查不足以保证此要求。

considerRoadTraffic

boolean

在计算 ShipmentRoute 字段 Transition.travel_durationVisit.start_timevehicleEndTime 时考虑流量估算;设置 ShipmentRoute.has_traffic_infeasibilities 字段,以及计算 OptimizeToursResponse.total_cost 字段。

populatePolylines

boolean

如果为 true,将在响应 ShipmentRoute 中填充多段线。

populateTransitionPolylines

boolean

如果为 true,将在响应 ShipmentRoute.transitions 中填充多段线。

allowLargeDeadlineDespiteInterruptionRisk

boolean

如果设置此属性,则请求的截止时间(请参阅 https://grpc.io/blog/deadlines)最长为 60 分钟。否则,最长期限只有 30 分钟。请注意,长期请求存在的中断风险要大得多(但也很小)。

useGeodesicDistances

boolean

如果为 true,系统将使用测地距离(而非 Google 地图距离)计算行程距离,并使用由 geodesicMetersPerSecond 定义的速度的测地距离计算行程时间。

label

string

可用于识别此请求的标签,会在 OptimizeToursResponse.request_label 中报告。

geodesicMetersPerSecond

number

useGeodesicDistances 为 true 时,必须设置此字段并定义用于计算行程时间的速度。其值必须至少为 1.0 米/秒。

maxValidationErrors

integer

截断返回的验证错误数。这些错误通常作为 BadRequest 错误详情 (https://cloud.google.com/apis/design/errors#error_details) 附加到 INVALID_ARGUMENT 错误载荷中,除非 SolveMode=VALIDATE_ONLY: 请参阅 OptimizeToursResponse.validation_errors 字段。默认值为 100,上限为 10,000。

响应正文

如果成功,则响应正文包含一个 OptimizeToursResponse 实例。

授权范围

需要以下 OAuth 范围:

  • https://www.googleapis.com/auth/cloud-platform