解读响应

Route Optimization API 会在相应请求中返回车辆的路线。运单会分配给车辆,也可以跳过,具体取决于请求的属性。

OptimizeToursResponse 消息(RESTgRPC)有两个主要的顶级属性:

  • routes[] 是具有已分配货运的每辆车的路线。每个 Route 都包含反映该单个路由的属性的指标。
  • metrics 是涵盖所有车辆和路线方案的整个响应的汇总指标。顶级指标包含与每条路线的指标相同的属性,包括所有路线的汇总值。

根据优化结果,系统未必总能填充某些属性:

  1. skippedShipments[] 用于列出并非由任何车辆执行的运单。如果无法在指定约束范围内执行某个运单或执行该运单的费用超出其罚款费用,则可以跳过该运单。例如,如果货物的提货或送餐服务 timeWindow 非常窄,车辆可能无法在要求的时间范围内执行访问,或者成本效益可能不高。
  2. validationErrors[] 指定当请求的 solvingMode 设置为 VALIDATE_ONLY 时,这些错误会导致请求无效或无法解决。在普通 DEFAULT_SOLVE 模式下,验证错误将显示在错误消息而不是响应正文中。请注意,VALIDATE_ONLY 解析模式可以一次报告多个错误,这对于快速调试请求非常有用。

路由属性

每个 routes[] 条目都是一条 ShipmentRoute 消息(RESTgRPC)。每个 ShipmentRoute 代表请求中特定车辆的路线分配。与其对应的 Vehicle 相关的重要 ShipmentRoute 属性包括:

  • vehicleIndex 是相应请求消息中 Vehicle 的索引(从零开始)。如果值为零,则 REST 响应会忽略此属性。
  • vehicleStartTime 是车辆必须开始其路线的时间。
  • vehicleEndTime 是车辆预计结束其路线的时间。

在响应中,routes 将如下所示:

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T00:00:00Z",
      "vehicleEndTime": "2024-02-13T00:38:42Z",
      "visits": [
        ...
      ],
      "transitions": [
        ...
      ],
      "metrics": {
        ...
      },
      ...
    }
  ],
  ...
}

每个 ShipmentRoute 都包含车辆将要完成的 visits 的有序列表。每个 VisitRESTgRPC)代表相应请求中的一个 VisitRequestRESTgRPC)。重要的 Visit 属性包括:

  • shipmentIndex 是本次访问在对应请求中所属的运单的从零开始的索引。
  • 如果访问是取货,则 isPickup 为 true,如果访问是送餐,则为 false。如果值为 false,REST 响应会忽略此属性。
  • visitRequestIndexVisit 所代表的相应请求中的 Shipment.pickupsShipment.deliveries 中的 VisitRequest 的索引(从零开始)。如果值为零,则 REST 响应会忽略此属性。
  • startTime 是访问预计开始的时间。
  • loadDemands 将加载类型映射到完成 Visit 所需的加载量。对于送餐服务,负载为负数,表示从车辆中移除的负载。

Visit 示例如下所示:

{
  "routes": [
    {
      ...
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T00:00:00Z",
          "detour": "0s"
        },
        ...
      ],
    },
    ...
  ],
  ...
}

每个 ShipmentRoute 都包含一个有序的 transitions 列表,表示给定车辆的 visits 之间的行程。重要的 Transition 消息(RESTgRPC)属性包括:

  • startTime 是车辆开始执行转换的时间。
  • travelDuration 是完成转换所需的车辆时长。
  • travelDistanceMeters 是完成过渡所需行驶的距离(以米为单位)。
  • trafficInfoUnavailable 指示流量数据是否可用于转换。
  • waitDuration 表示车辆在启动下一个 Visit 之前花费的空闲时间。这可能是由于以下 Visitstart_time 而导致的。
  • totalDuration 是转换的总时长,包括行程、等待、中断和延迟时间。
  • vehicleLoads 将负载类型映射到车辆在此过渡期间携带的负载量。

Transition 示例如下所示:

{
  "routes": [
    {
      ...
      "transitions": [
        ...
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        ...
      ],
      ...
    }
  ],
  ...
}

取货和送货停止订单优化以及 ShipmentRoute 参考文档(RESTgRPC)中介绍了 viststransitions 之间的关系。

指标属性

Metrics 消息(RESTgRPC)总结了整个解决方案。一些重要的 Metrics 属性包括:

  • totalCost 是完成这些路由所产生的总费用。如需详细了解费用,请参阅费用模型参数
  • usedVehicleCount 是解决方案中使用的车辆总数。当优化器确定不需要使用车辆时,车辆的路线可能为空。
  • skippedMandatoryShipmentCount 是“必须”跳过的运单数量。强制性运单未指定运单时所产生的 penaltyCost。如果强制装运在特定约束下性能不可行,仍可跳过。如需详细了解费用,请参阅费用模型参数

其他指标在报告中显示为 AggregatedMetrics 消息(RESTgRPC)。AggregatedMetrics 消息类型用于 Metrics.aggregatedRouteMetrics 属性,ShipmentRoute.metrics 媒体资源Metrics.aggregatedRouteMetrics包含OptimizeToursResponse中所有ShipmentRoute汇总的指标。每个 ShipmentRoute.metrics 属性都包含该特定 ShipmentRoute 的指标。

重要的 AggregatedMetrics 属性包括:

  • performedShipmentCount 是车辆在其整个路线上执行的装运次数。
  • travelDuration 是车辆在完成路线时在公交中花费的总时间。
  • waitDuration 是车辆在完成路线时等待的总时间。
  • delayDuration 是车辆的总延迟时间。除非在请求中使用了 TransitionAttributes,否则此值通常为零。
  • breakDuration 是车辆完成路线时在间歇停留的总时间。
  • visitDuration 是车辆在完成路线时为执行到访而花费的总时间。这实际上是 VisitRequest(与分配给适用车辆的 Visit 相对应)的所有 VisitRequest.duration 值的总和。
  • totalDuration 是完成车辆路线所需的总时长。
  • travelDistanceMeters 是车辆在完成路线时行驶的总距离。
  • maxLoads 会将各种负载映射到车辆在路线上的任意点承载的最大负载。

Metrics 消息示例如下所示:

{
  "routes": [
    ...
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 1,
      "travelDuration": "2322s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "0s",
      "totalDuration": "2322s",
      "travelDistanceMeters": 18603
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2024-02-13T00:00:00Z",
    "latestVehicleEndTime": "2024-02-13T00:38:42Z",
    "totalCost": 18.603,
    "costs": {
      "model.vehicles.cost_per_kilometer": 18.603
    }
  }
}

完整示例

构造请求中的请求的完整示例响应如下所示:

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T00:00:00Z",
      "vehicleEndTime": "2024-02-13T00:38:42Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T00:00:00Z",
          "detour": "0s"
        },
        {
          "startTime": "2024-02-13T00:19:31Z",
          "detour": "0s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        {
          "travelDuration": "1151s",
          "travelDistanceMeters": 9599,
          "waitDuration": "0s",
          "totalDuration": "1151s",
          "startTime": "2024-02-13T00:19:31Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 1,
        "travelDuration": "2322s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "0s",
        "totalDuration": "2322s",
        "travelDistanceMeters": 18603
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 18.603
      },
      "routeTotalCost": 18.603
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 1,
      "travelDuration": "2322s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "0s",
      "totalDuration": "2322s",
      "travelDistanceMeters": 18603
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2024-02-13T00:00:00Z",
    "latestVehicleEndTime": "2024-02-13T00:38:42Z",
    "totalCost": 18.603,
    "costs": {
      "model.vehicles.cost_per_kilometer": 18.603
    }
  }
}