Method: projects.optimizeTours

傳送包含 ShipmentModelOptimizeToursRequest,並傳回包含 ShipmentRouteOptimizeToursResponse,這些 ShipmentRoute 是車輛要執行的路線組合,可將整體成本降至最低。

ShipmentModel 模型主要由需要執行的 Shipment 和可用於運送 ShipmentVehicle 組成。ShipmentRoute 會將 Shipment 指派給 Vehicle。具體來說,他們會為每輛車輛指派一系列 Visit,其中 Visit 對應至 VisitRequest,也就是 Shipment 的取貨或送貨。

目標是將 ShipmentRoute 指派給 Vehicle,盡量降低總成本,而成本有許多在 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)

如果設定這個逾時時間,伺服器會在逾時時間經過前或達到同步要求的伺服器期限前傳回回應 (以較早者為準)。

如果是非同步要求,伺服器會在逾時前產生解決方案 (如有可能)。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「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

如果已設定此值,要求的最長期限為 60 分鐘 (請參閱 https://grpc.io/blog/deadlines)。否則,最長期限僅為 30 分鐘。請注意,長時間執行的要求中斷的風險較高 (但仍很小)。

useGeodesicDistances

boolean

如果為 true,系統會使用測地距離 (而非 Google 地圖距離) 計算移動距離,並使用測地距離和 geodesicMetersPerSecond 定義的速度計算移動時間。

label

string

可用於識別這項要求的標籤,會回報至 OptimizeToursResponse.request_label

geodesicMetersPerSecond

number

如果 useGeodesicDistances 為 true,則必須設定這個欄位,並定義用於計算行程時間的速度。值不得小於 1.0 公尺/秒。

maxValidationErrors

integer

截斷傳回的驗證錯誤數量。除非 solvingMode=VALIDATE_ONLY,否則這些錯誤通常會以 BadRequest 錯誤詳細資料 (https://cloud.google.com/apis/design/errors#error_details) 附加至 INVALID_ARGUMENT 錯誤酬載:請參閱 OptimizeToursResponse.validation_errors 欄位。預設值為 100,上限為 10,000。

回應主體

如果成功,回應主體會包含 OptimizeToursResponse 的執行例項。

授權範圍

需要下列 OAuth 範圍:

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

IAM 權限

需要 parent 資源的下列 IAM 權限:

  • routeoptimization.locations.use

詳情請參閱 IAM 說明文件