解讀回應

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 排序清單。每個 Visit (RESTgRPC) 都代表對應要求中的 VisitRequest (RESTgRPC)。重要的 Visit 屬性包括:

  • shipmentIndex 是這次造訪在對應要求中所屬運送作業的零基索引。
  • 如果是上門取貨,isPickup 會設為 true,如果是上門送貨,則設為 false。如果值為 false,REST 回應會略過這個屬性。
  • visitRequestIndexVisit 所代表的對應要求中 Shipment.pickupsShipment.deliveriesVisitRequest 的零基索引。如果值為零,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"
        },
        ...
      ],
      ...
    }
  ],
  ...
}

如要進一步瞭解 viststransitions 之間的關係,請參閱「Pickup and Delivery Stop Order Optimization」和 ShipmentRoute 參考說明文件 (RESTgRPC)。如要進一步瞭解 Transition 訊息的 routePolylinerouteToken 屬性,請參閱「轉場多邊形和路線符記」。

指標屬性

Metrics 訊息 (RESTgRPC) 會總結整個解決方案。以下是 Metrics 的部分重要屬性:

  • totalCost 是完成路線時產生的總費用。如要進一步瞭解費用,請參閱「費用模型參數」。
  • usedVehicleCount 是解決方案中使用的車輛總數。當最佳化工具判斷不需使用路線時,車輛可能會出現空白路線。
  • skippedMandatoryShipmentCount 是「強制」略過的出貨量數量。強制出貨作業不會指定 penaltyCost,因此如果略過出貨作業,系統不會產生 penaltyCost。如果在指定限制下,強制運送作業無法執行,仍可略過。如要進一步瞭解費用,請參閱「成本模型參數」。

其他指標會以 AggregatedMetrics 訊息回報 (RESTgRPC)。AggregatedMetrics 訊息類型用於 Metrics.aggregatedRouteMetrics 屬性,而 ShipmentRoute.metrics 屬性 Metrics.aggregatedRouteMetrics 則包含 OptimizeToursResponse 中所有 ShipmentRoute 匯總的指標。每個 ShipmentRoute.metrics 屬性都包含該特定 ShipmentRoute 的指標。

重要的 AggregatedMetrics 屬性包括:

  • performedShipmentCount 是車輛在整個路線中運送的貨物數量。
  • travelDuration 是車輛在完成路線時花費的總時間。
  • waitDuration 是車輛在完成路線時等待的總時間。
  • delayDuration 是車輛的總延遲時間。除非在要求中使用 TransitionAttributes,否則這個值通常為零。
  • breakDuration 是車輛在完成路線時休息的總時間。
  • visitDuration 是車輛在完成路線時,進行拜訪所花費的總時間。這實際上是所有 VisitRequest.duration 值的總和,這些值對應至指派給適用車輛的 VisitVisitRequest
  • 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
    }
  }
}

完整範例

以下是「Construct a Request」要求的完整回應範例:

{
  "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
    }
  }
}