解讀回應

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 回應會省略這個屬性。
  • visitRequestIndex 是在 Visit 代表的對應要求中,來自 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 之間的關係,請參閱「取貨與交付停止訂單最佳化」,以及 ShipmentRoute 參考說明文件 (RESTgRPC)。

指標屬性

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 是車輛在完成路線上花費的總時間。這實際上是針對指派給適用車輛的 Visit 對應的 VisitRequest,所有 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
    }
  }
}