索引
RouteOptimization(介面)AggregatedMetrics(訊息)BatchOptimizeToursMetadata(訊息)BatchOptimizeToursRequest(訊息)BatchOptimizeToursRequest.AsyncModelConfig(訊息)BatchOptimizeToursResponse(訊息)BreakRule(訊息)BreakRule.BreakRequest(訊息)BreakRule.FrequencyConstraint(訊息)DataFormat(列舉)DistanceLimit(訊息)GcsDestination(訊息)GcsSource(訊息)InjectedSolutionConstraint(訊息)InjectedSolutionConstraint.ConstraintRelaxation(訊息)InjectedSolutionConstraint.ConstraintRelaxation.Relaxation(訊息)InjectedSolutionConstraint.ConstraintRelaxation.Relaxation.Level(列舉)InputConfig(訊息)Location(訊息)OptimizeToursLongRunningMetadata(訊息)OptimizeToursRequest(訊息)OptimizeToursRequest.SearchMode(列舉)OptimizeToursRequest.SolvingMode(列舉)OptimizeToursResponse(訊息)OptimizeToursResponse.Metrics(訊息)OptimizeToursUriMetadata(訊息)OptimizeToursUriRequest(訊息)OptimizeToursUriResponse(訊息)OptimizeToursValidationError(訊息)OptimizeToursValidationError.FieldReference(訊息)OutputConfig(訊息)RouteModifiers(訊息)Shipment(訊息)Shipment.Load(訊息)Shipment.VisitRequest(訊息)ShipmentModel(訊息)ShipmentModel.DurationDistanceMatrix(訊息)ShipmentModel.DurationDistanceMatrix.Row(訊息)ShipmentModel.Objective(訊息)ShipmentModel.Objective.Type(列舉)ShipmentModel.PrecedenceRule(訊息)ShipmentRoute(訊息)ShipmentRoute.Break(訊息)ShipmentRoute.EncodedPolyline(訊息)ShipmentRoute.Transition(訊息)ShipmentRoute.VehicleLoad(訊息)ShipmentRoute.Visit(訊息)ShipmentRoute.Visit.VisitType(列舉)ShipmentTypeIncompatibility(訊息)ShipmentTypeIncompatibility.IncompatibilityMode(列舉)ShipmentTypeRequirement(訊息)ShipmentTypeRequirement.RequirementMode(列舉)SkippedShipment(訊息)SkippedShipment.Reason(訊息)SkippedShipment.Reason.Code(列舉)TimeWindow(訊息)TransitionAttributes(訊息)Uri(訊息)Vehicle(訊息)Vehicle.DurationLimit(訊息)Vehicle.LoadLimit(訊息)Vehicle.LoadLimit.Interval(訊息)Vehicle.LoadLimit.LoadCost(訊息)Vehicle.TravelMode(列舉)Vehicle.UnloadingPolicy(列舉)VehicleFullness(訊息)Waypoint(訊息)
RouteOptimization
用於最佳化車輛導覽的服務。
特定類型欄位的有效性:
google.protobuf.Timestamp- 時間以 Unix 時間表示:自 1970-01-01T00:00:00+00:00 起算的秒數。
- 秒數必須介於 [0, 253402300799] 之間,也就是 [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00] 之間。
- nanos 必須取消設定或設為 0。
google.protobuf.Duration- 秒數必須介於 [0, 253402300799] 之間,也就是 [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00] 之間。
- nanos 必須取消設定或設為 0。
google.type.LatLng- 緯度必須介於 [-90.0, 90.0] 之間。
- 經度必須介於 [-180.0, 180.0] 之間。
- 緯度和經度至少有一項不得為零。
| BatchOptimizeTours |
|---|
|
以批次方式為一或多則 這個方法是長時間執行的作業 (LRO)。最佳化輸入內容 ( 使用者可以輪詢 如果 LRO 如果 LRO 的
|
| OptimizeTours |
|---|
|
傳送包含
目標是將
|
| OptimizeToursLongRunning |
|---|
|
這是 傳回的
|
| OptimizeToursUri |
|---|
|
這是 用戶端會指定儲存在 Google Cloud Storage 中的 如果最佳化作業需要幾分鐘以上,且輸入/輸出大小超過 8 MB,建議優先使用這個方法,而非 傳回的
|
AggregatedMetrics
所有 Transition 和/或 Visit (或所有 ShipmentRoute) 元素的 ShipmentRoute (或 OptimizeToursResponse) 匯總指標。
| 欄位 | |
|---|---|
performed_shipment_count |
運送次數。請注意,一組取貨和送貨地點只會計入一次。 |
travel_duration |
路線或解決方案的總行程時間。 |
wait_duration |
路線或解決方案的總等待時間。 |
delay_duration |
路線或解決方案的總延遲時間長度。 |
break_duration |
路線或解決方案的總休息時間。 |
visit_duration |
路線或解決方案的總造訪時間長度。 |
total_duration |
總時間長度應等於上述所有時間長度的總和。如果是路徑,則也對應到: |
travel_distance_meters |
路線或解決方案的總移動距離。 |
max_loads |
整條路線 (或解決方案) 達到的最大負載,針對這條路線 (或解決方案) 的每個數量,計算方式為所有 |
performed_mandatory_shipment_count |
必須執行的運送作業數量。 實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
performed_shipment_penalty_cost_sum |
已執行運送作業的 實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
BatchOptimizeToursMetadata
這個類型沒有任何欄位。
BatchOptimizeToursRequest 呼叫的作業中繼資料。
BatchOptimizeToursRequest
要求以非同步作業的形式批次最佳化導覽。每個輸入檔案應包含一個 OptimizeToursRequest,每個輸出檔案則會包含一個 OptimizeToursResponse。要求包含讀取/寫入及剖析檔案的資訊。所有輸入和輸出檔案都應位於同一個專案。
| 欄位 | |
|---|---|
parent |
必填。要發出呼叫的目標專案和位置。 格式:
不支援區域 |
model_configs[] |
必填。每個購買模型的輸入/輸出資訊,例如檔案路徑和資料格式。 |
AsyncModelConfig
以非同步方式解決一個最佳化模型的資訊。
| 欄位 | |
|---|---|
display_name |
(選用步驟) 使用者定義的模型名稱,可做為別名,方便使用者追蹤模型。 |
input_config |
必填。輸入模型的相關資訊。 |
output_config |
必填。所需的輸出位置資訊。 |
BatchOptimizeToursResponse
這個類型沒有任何欄位。
對BatchOptimizeToursRequest的回應。作業完成後,系統會在長時間執行的作業中傳回這項資訊。
BreakRule
為車輛產生休息時間 (例如午休) 的規則。休息時間是指車輛在目前位置保持閒置,且無法執行任何造訪的連續時間。中斷可能發生在:
- 在兩次造訪之間的行程期間 (包括造訪前後的時間,但不包括造訪期間),在這種情況下,系統會延長造訪之間的相應運送時間,
- 或在車輛啟動前 (車輛不得在休息期間啟動),在這種情況下,休息時間不會影響車輛啟動時間。
- 或車輛結束後 (同上,使用車輛結束時間)。
| 欄位 | |
|---|---|
break_requests[] |
廣告插播順序。請參閱 |
frequency_constraints[] |
可能適用多個 |
BreakRequest
您必須事先知道每輛車適用的休息時間序列 (即休息時間的數量和順序)。重複的 BreakRequest 會定義該序列,並按照必須發生的順序排列。時間範圍 (earliest_start_time / latest_start_time) 可能會重疊,但必須與訂單相容 (系統會檢查)。
| 欄位 | |
|---|---|
earliest_start_time |
必填。休息時間開始的下限 (含)。 |
latest_start_time |
必填。休息時間開始時間的上限 (含)。 |
min_duration |
必填。廣告插播時間長度下限。必須為正數。 |
FrequencyConstraint
您可以強制規定最短休息頻率,進一步限制上述休息時間的頻率和時長,例如「每 12 小時必須休息至少 1 小時」。假設這可以解讀為「在任何 12 小時的滑動時間範圍內,必須至少有一次至少一小時的休息時間」,則該範例會轉譯為以下 FrequencyConstraint:
{
min_break_duration { seconds: 3600 } # 1 hour.
max_inter_break_duration { seconds: 39600 } # 11 hours (12 - 1 = 11).
}
除了 BreakRequest 中已指定的時段和最短時間長度外,解決方案中的休息時間和時間長度也會遵守所有這類限制。
FrequencyConstraint 實際上可能適用於非連續休息時間。舉例來說,下列排程符合「每 12 小時 1 小時」的範例:
04:00 vehicle start
.. performing travel and visits ..
09:00 1 hour break
10:00 end of the break
.. performing travel and visits ..
12:00 20-min lunch break
12:20 end of the break
.. performing travel and visits ..
21:00 1 hour break
22:00 end of the break
.. performing travel and visits ..
23:59 vehicle end
| 欄位 | |
|---|---|
min_break_duration |
必填。這項限制的最短休息時間。非負值。查看 |
max_inter_break_duration |
必填。路線中任何時間間隔的最大允許範圍,不包含至少部分 |
DataFormat
輸入和輸出檔案的資料格式。
| 列舉 | |
|---|---|
DATA_FORMAT_UNSPECIFIED |
值無效,格式不得為 UNSPECIFIED。 |
JSON |
JavaScript 物件標記法。 |
PROTO_TEXT |
通訊協定緩衝區文字格式。請參閱 https://protobuf.dev/reference/protobuf/textformat-spec/ |
DistanceLimit
定義可移動的最大距離。可以是硬體或軟體權杖。
如果定義了軟性限制,則必須同時定義 soft_max_meters 和 cost_per_kilometer_above_soft_max,且兩者皆須為非負值。
| 欄位 | |
|---|---|
max_meters |
硬性限制,距離最多為 max_meters。限制不得為負數。 |
soft_max_meters |
軟性限制不會強制執行最大距離限制,但如果違反,則會產生費用,並與模型中定義的其他費用相加,單位相同。 如果定義了 soft_max_meters,則必須小於 max_meters,且不得為負值。 |
cost_per_kilometer_below_soft_max |
每公里產生的費用,最高可達
|
cost_per_kilometer_above_soft_max |
如果距離超過 費用不得為負值。 |
GcsDestination
輸出檔案的寫入目標 Google Cloud Storage 位置。
| 欄位 | |
|---|---|
uri |
必填。Google Cloud Storage URI。 |
GcsSource
要讀取輸入檔案的 Google Cloud Storage 位置。
| 欄位 | |
|---|---|
uri |
必填。Google Cloud Storage 物件的 URI,格式為 |
InjectedSolutionConstraint
要求中插入的解決方案,包括哪些造訪必須受到限制,以及如何限制。
| 欄位 | |
|---|---|
routes[] |
要注入的溶液路徑。原始解決方案可能會省略部分路線。路線和略過的運送作業必須符合 |
skipped_shipments[] |
已略過要注入的解決方案運送作業。原始解決方案可能省略了部分內容。請參閱 |
constraint_relaxations[] |
針對零或多組車輛,指定放寬限制的時間和程度。如果這個欄位留空,所有非空白車輛路線都會受到完整限制。 |
ConstraintRelaxation
針對一組車輛,指定放寬停靠點限制的門檻和程度。skipped_shipment 欄位中列出的運送作業會強制略過,也就是無法執行。
| 欄位 | |
|---|---|
relaxations[] |
所有造訪限制放寬條件,將套用至 |
vehicle_indices[] |
指定要套用造訪限制 如果 |
休閒場所
如果 relaxations 為空白,則 routes 上所有造訪的開始時間和順序都會受到完全限制,且無法在這些路線中插入或新增造訪。此外,車輛在 routes 中的開始和結束時間會受到完全限制,除非車輛是空的 (即沒有停靠點,且在模型中將 used_if_route_is_empty 設為 false)。
relaxations(i).level 指定套用至造訪 #j 的限制放寬等級,且符合以下條件:
route.visits(j).start_time >= relaxations(i).threshold_timeANDj + 1 >= relaxations(i).threshold_visit_count
同樣地,如果車輛出發時間符合下列條件,則會放寬至 relaxations(i).level:
vehicle_start_time >= relaxations(i).threshold_timeAND- 如果符合下列條件,
relaxations(i).threshold_visit_count == 0和車輛結束時間會放寬至relaxations(i).level: vehicle_end_time >= relaxations(i).threshold_timeANDroute.visits_size() + 1 >= relaxations(i).threshold_visit_count
如要在造訪符合 threshold_visit_count 或 threshold_time 時套用放寬等級,請新增兩個具有相同 level 的 relaxations:一個僅設定 threshold_visit_count,另一個僅設定 threshold_time。如果某次造訪符合多個relaxations的條件,系統會套用最寬鬆的層級。因此,從車輛起點到車輛終點,放寬程度會越來越寬鬆,也就是說,放寬程度會隨著路線進度而增加。
如果路線造訪的時間和順序不符合任何 relaxations 的門檻條件,則會受到完全限制,且無法在這些順序中插入任何造訪。此外,如果車輛開始或結束時間不符合任何放寬條件,則時間會固定,除非車輛是空的。
| 欄位 | |
|---|---|
level |
在 |
threshold_time |
可套用放寬條件 |
threshold_visit_count |
達到或超過這個造訪次數後,系統可能會套用放寬條件 如果是 |
等級
表示不同的限制放寬等級,適用於符合門檻條件的造訪和後續造訪。
下列列舉項目是依放寬程度遞增排序。
| 列舉 | |
|---|---|
LEVEL_UNSPECIFIED |
隱含預設放寬等級:不放寬任何限制,也就是所有造訪都受到完整限制。 請勿在 |
RELAX_VISIT_TIMES_AFTER_THRESHOLD |
造訪開始時間和車輛開始/結束時間會放寬,但每次造訪仍會繫結至同一輛車,且必須遵守造訪順序:不得在這些造訪之間或之前插入任何造訪。 |
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD |
與 RELAX_VISIT_TIMES_AFTER_THRESHOLD 相同,但造訪順序也放寬:造訪只能由這輛車執行,但可能不會執行。 |
RELAX_ALL_AFTER_THRESHOLD |
與 RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD 相同,但車輛也處於寬鬆狀態:在門檻時間或之後,造訪完全免費,且可能不會執行。 |
InputConfig
請指定 [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours] 的輸入內容。
| 欄位 | |
|---|---|
data_format |
必填。輸入資料格式。 |
聯集欄位 source。必填。source 只能是下列其中一項: |
|
gcs_source |
Google Cloud Storage 位置。這必須是單一物件 (檔案)。 |
位置
封裝位置 (地理位置點和選用標題)。
| 欄位 | |
|---|---|
lat_lng |
路線控點的地理座標。 |
heading |
與車流方向相關聯的指南針方向。這個值用於指定上車和下車地點的道路側。航向值介於 0 到 360 之間,其中 0 代表正北,90 代表正東,依此類推。 |
OptimizeToursLongRunningMetadata
這個類型沒有任何欄位。
OptimizeToursLongRunning 呼叫的作業中繼資料。
OptimizeToursRequest
要提供給導覽最佳化求解器的要求,用於定義要解決的運送模型和最佳化參數。
| 欄位 | |
|---|---|
parent |
必填。要呼叫的目標專案或位置。 格式:
不支援區域 |
timeout |
如果設定這個逾時時間,伺服器會在逾時時間或同步要求的伺服器期限 (以較早者為準) 之前傳回回應。 對於非同步要求,伺服器會在逾時前產生解決方案 (如果可能)。 |
model |
要解決的出貨模型。 |
solving_mode |
預設的求解模式為 |
search_mode |
用於解決要求的搜尋模式。 |
injected_first_solution_routes[] |
引導最佳化演算法,找出與先前解決方案類似的第一個解決方案。 建立第一個解決方案時,模型會受到限制。在第一個解決方案中,任何未在路線上執行的運送作業都會隱含略過,但可能會在後續解決方案中執行。 解決方案必須符合一些基本有效性假設:
如果插入的解決方案不可行,系統不一定會傳回驗證錯誤,而是可能傳回表示不可行的錯誤。 |
injected_solution_constraint |
限制最佳化演算法,找出與先前解決方案類似的最終解決方案。舉例來說,這項功能可用於凍結已完成或即將完成但不得修改的路徑部分。 如果插入的解決方案不可行,系統不一定會傳回驗證錯誤,而是可能傳回表示不可行的錯誤。 |
refresh_details_routes[] |
如果非空白,系統會重新整理指定路線,但不會修改基礎造訪順序或行程時間,只會更新其他詳細資料。這不會求解模型。 自 2020 年 11 月起,這項設定只會填入非空白路線的折線,且 傳入路徑的 這個欄位不得與
|
interpret_injected_solutions_using_labels |
如果為 true:
這項解讀適用於 如果為 true,下列類別中的標籤在所屬類別中最多只能出現一次:
如果插入解決方案中的 從插入的解決方案中移除路線造訪或整條路線,可能會影響隱含限制,導致解決方案變更、驗證錯誤或無法執行。 注意:呼叫端必須確保每個 |
consider_road_traffic |
計算 |
populate_polylines |
如果設為 True,系統會在 |
populate_transition_polylines |
如果設為 True,系統會在回應 |
allow_large_deadline_despite_interruption_risk |
如果設定這個值,要求的期限 (請參閱 https://grpc.io/blog/deadlines) 最多可達 60 分鐘。否則,最長期限只有 30 分鐘。請注意,長時間執行的要求中斷風險會大幅提高 (但仍偏低)。 |
use_geodesic_distances |
如果設為 true,系統會使用測地線距離 (而非 Google 地圖距離) 計算移動距離,並使用測地線距離和 |
label |
可用來識別這項要求的標籤,會在 |
geodesic_meters_per_second |
如果 |
max_validation_errors |
截斷傳回的驗證錯誤數量。這類錯誤通常會附加至 INVALID_ARGUMENT 錯誤酬載,做為 BadRequest 錯誤詳細資料 (https://cloud.google.com/apis/design/errors#error_details)),除非 solving_mode=VALIDATE_ONLY:請參閱 |
SearchMode
定義搜尋行為的模式,在延遲時間和解決方案品質之間取得平衡。在所有模式中,系統都會強制執行全域要求期限。
| 列舉 | |
|---|---|
SEARCH_MODE_UNSPECIFIED |
未指定搜尋模式,等同於 RETURN_FAST。 |
RETURN_FAST |
找到第一個合適的解決方案後,就停止搜尋。 |
CONSUME_ALL_AVAILABLE_TIME |
花費所有可用時間尋找更好的解決方案。 |
SolvingMode
定義求解器應如何處理要求。在 VALIDATE_ONLY 以外的所有模式中,如果要求無效,系統會傳回 INVALID_REQUEST 錯誤。請參閱 max_validation_errors,瞭解如何限制傳回的錯誤數量。
| 列舉 | |
|---|---|
DEFAULT_SOLVE |
求解模型。系統可能會在 [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors] 中發出警告。 |
VALIDATE_ONLY |
僅驗證模型,不求解:盡可能填入 OptimizeToursResponse.validation_errors。 |
DETECT_SOME_INFEASIBLE_SHIPMENTS |
只填入 重要事項:系統不會在此傳回所有不可行的運送,只會傳回在預先處理期間偵測為不可行的運送。 |
TRANSFORM_AND_RETURN_REQUEST |
只有在 實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request。 |
OptimizeToursResponse
解決行程最佳化問題後的回應,包含每輛車行經的路線、略過的運送作業,以及解決方案的整體費用。
| 欄位 | |
|---|---|
routes[] |
為每輛車計算的路徑;第 i 個路徑對應模型中的第 i 輛車。 |
request_label |
|
skipped_shipments[] |
略過的所有運送清單。 |
validation_errors[] |
列出我們能獨立偵測到的所有驗證錯誤。請參閱「多項錯誤」說明,瞭解 |
processed_request |
在某些情況下,我們會在解決傳入的要求前修改要求,例如增加費用。如果 solving_mode == TRANSFORM_AND_RETURN_REQUEST,系統會在這裡傳回修改後的要求。 實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request。 |
metrics |
這項解決方案的時長、距離和用量指標。 |
指標
整體指標,匯總所有路徑。
| 欄位 | |
|---|---|
aggregated_route_metrics |
匯總所有路徑。每個指標都是所有同名 |
skipped_mandatory_shipment_count |
略過的必要出貨次數。 |
used_vehicle_count |
使用的車輛數量。注意:如果車輛路線空白且 |
earliest_vehicle_start_time |
已使用車輛的最早開始時間,計算方式為所有已使用車輛的 |
latest_vehicle_end_time |
二手車輛的最晚結束時間,計算方式為所有二手車輛 |
costs |
解決方案的費用,依費用相關要求欄位細分。鍵是相對於輸入 OptimizeToursRequest 的 proto 路徑,例如「model.shipments.pickups.cost」,值則是相應費用欄位產生的總費用,在整個解決方案中匯總。換句話說,costs["model.shipments.pickups.cost"] 是解決方案中所有取貨費用的總和。模型中定義的所有費用都會在此詳細列出,但與 TransitionAttributes 相關的費用除外,這類費用自 2022 年 1 月起僅以匯總方式列出。 |
total_cost |
解決方案的總費用。費用對應中所有值的總和。 |
OptimizeToursUriMetadata
這個類型沒有任何欄位。
OptimizeToursUri 呼叫的作業中繼資料。
OptimizeToursUriRequest
OptimizeToursUri 方法使用的要求。
| 欄位 | |
|---|---|
parent |
必填。要呼叫的目標專案或位置。 格式:
不支援區域 |
input |
必填。Cloud Storage 物件的 URI,其中包含 |
output |
必填。Cloud Storage 物件的 URI,該物件將包含 |
OptimizeToursUriResponse
OptimizeToursUri 方法傳回的回應。
| 欄位 | |
|---|---|
output |
(選用步驟) Cloud Storage 物件的 URI,其中包含編碼為 JSON 或 textproto 的 資源的 |
OptimizeToursValidationError
說明驗證 OptimizeToursRequest 時發生的錯誤或警告。
| 欄位 | |
|---|---|
code |
驗證錯誤是由一組一律存在的 ( 本節後方的欄位會提供更多錯誤相關背景資訊。 多項錯誤:如果有多項錯誤,驗證程序會嘗試輸出其中幾項。就像編譯器一樣,這個過程並不完美。部分驗證錯誤屬於「嚴重」錯誤,會導致整個驗證程序停止。 穩定性: |
display_name |
錯誤顯示名稱。 |
fields[] |
錯誤情境可能涉及 0、1 (大多數情況) 或多個欄位。舉例來說,如要參照車輛 #4 和貨件 #2 的第一個取貨點,可以按照下列方式操作: 不過請注意, |
error_message |
人類可讀的錯誤說明字串。 穩定性:不穩定:與特定 |
offending_values |
可能包含欄位的值。這項功能不一定可用。請勿依賴這項功能,僅限用於手動偵錯模型。 |
FieldReference
指定驗證錯誤的背景資訊。FieldReference 一律參照這個檔案中的特定欄位,並遵循相同的階層結構。舉例來說,我們可以使用下列程式碼,指定車輛 #5 的 start_time_windows 元素 #2:
name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }
不過,我們會省略 OptimizeToursRequest 或 ShipmentModel 等頂層實體,以免訊息過於擁擠。
| 欄位 | |
|---|---|
name |
欄位名稱,例如「vehicles」。 |
sub_field |
遞迴巢狀子欄位 (如有需要)。 |
聯集欄位
|
|
index |
欄位索引 (如果重複)。 |
key |
如果欄位是對應項,則為鍵。 |
OutputConfig
指定 [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours] 結果的目的地。
| 欄位 | |
|---|---|
data_format |
必填。輸出資料格式。 |
聯集欄位 destination。必填。destination 只能是下列其中一項: |
|
gcs_destination |
要寫入輸出的 Google Cloud Storage 位置。 |
RouteModifiers
封裝一組選用條件,在計算車輛路線時必須滿足這些條件。這與 Google Maps Platform Routes Preferred API 中的 RouteModifiers 類似,詳情請參閱:https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers。
| 欄位 | |
|---|---|
avoid_tolls |
指定是否在合理情況下避開收費路段。系統會優先選擇不含收費路段的路線。僅適用於機動交通工具。 |
avoid_highways |
指定是否盡可能避開高速公路。系統會優先選擇不含高速公路的路線。僅適用於機動交通工具。 |
avoid_ferries |
指定是否盡可能避開渡輪。系統會優先選擇不含渡輪行程的路線。僅適用於機動交通工具。 |
avoid_indoor |
(選用步驟) 指定是否盡可能避免室內導航。系統會優先選擇不含室內導航的路徑。僅適用於 |
運送地址
單一商品的運送,從其中一個取貨點到其中一個送貨點。如要將運送視為已執行,不重複車輛必須造訪其中一個取貨地點 (並據此減少備用容量),然後造訪其中一個送貨地點 (並據此重新增加備用容量)。
| 欄位 | |
|---|---|
display_name |
使用者定義的運送顯示名稱。長度上限為 63 個字元,可使用 UTF-8 字元。 |
pickups[] |
與運送方式相關聯的替代取貨方式。如未指定,車輛只需造訪與運送作業對應的地點。 |
deliveries[] |
與運送相關聯的一組替代運送方式。如未指定,車輛只需前往與取件地點對應的位置。 |
load_demands |
運送貨物的裝載需求 (例如重量、體積、棧板數量等)。對應中的鍵應為描述對應負載類型的 ID,最好也包含單位。例如:「weight_kg」、「volume_gallons」、「pallet_count」等。如果地圖中未顯示指定鍵,則對應的負載會視為空值。 |
allowed_vehicle_indices[] |
可能執行這項運送作業的一組車輛。如果留空,所有車輛都可以執行。車輛會依 |
costs_per_vehicle[] |
指定每輛車運送這批貨物時產生的費用。如果指定,則必須符合下列其中一項條件:
這些費用的單位必須與 |
costs_per_vehicle_indices[] |
|
pickup_to_delivery_absolute_detour_limit |
指定相較於從取貨到送達的最短路徑,絕對繞道時間上限。如要指定,則必須為非負值,且運送作業必須至少包含一次取貨和一次送貨。 舉例來說,假設 t 是從所選替代取貨點直接前往所選替代送貨點的最短時間。接著, 如果同一筆運送作業同時指定相對和絕對限制,系統會對每個可能的取貨/送貨組合,採用較嚴格的限制。自 2017 年 10 月起,只有在行程時間不取決於車輛時,才支援繞道。 |
pickup_to_delivery_time_limit |
指定從開始取貨到開始運送貨物的最長持續時間。如要指定,則必須為非負值,且運送作業必須至少包含一次取貨和一次送貨。這與取貨和送貨的替代方案或車輛速度無關。這項限制可與最大繞道限制一併指定,解決方案會同時遵守這兩項規格。 |
shipment_type |
指定這筆運送訂單「類型」的非空白字串。這項功能可用於定義 與針對單次造訪指定的 |
label |
指定這筆運送訂單的標籤。系統會在回應中,於對應 |
ignore |
如果為 true,則略過這項運送作業,但不套用 如果模型中有任何 系統允許忽略在 |
penalty_cost |
如果未完成運送,這項罰則會加到路線的整體費用中。只要造訪其中一個取貨和送貨替代方案,即視為完成運送。費用可使用與模型中所有其他費用相關欄位相同的單位表示,且必須為正數。 重要事項:如未指定這項罰則,系統會視為無限,也就是必須完成運送。 |
pickup_to_delivery_relative_detour_limit |
指定相較於從取貨到送貨的最短路徑,相對繞道時間上限。如要指定,則必須為非負值,且運送作業必須至少包含一次取貨和一次送貨。 舉例來說,假設 t 是從所選替代取貨點直接前往所選替代送貨點的最短時間。接著, 如果同一筆運送作業同時指定相對和絕對限制,系統會對每個可能的取貨/送貨組合,採用較嚴格的限制。自 2017 年 10 月起,只有在行程時間不取決於車輛時,才支援繞道。 |
載入
執行造訪時,如果是取貨,車輛載重可能會增加預先定義的數量;如果是送貨,則會減少。這則訊息會定義這類金額。詳情請參閱《load_demands》。
| 欄位 | |
|---|---|
amount |
執行相應造訪的車輛載重量變化量。由於這是整數,建議使用者選擇適當的單位,以免失去精確度。必須 ≥ 0。 |
VisitRequest
要求車輛造訪:具有地理位置 (或兩個,請參閱下文)、以時間範圍表示的開放和關閉時間,以及服務持續時間 (車輛抵達後取貨或送貨所花費的時間)。
| 欄位 | |
|---|---|
arrival_location |
執行這項 |
arrival_waypoint |
車輛執行這項 |
departure_location |
車輛完成這項 |
departure_waypoint |
車輛完成這項 |
tags[] |
指定附加至造訪要求的標記。不得輸入空白或重複的字串。 |
time_windows[] |
限制造訪抵達時間的時間範圍。請注意,車輛可能會在抵達時間範圍外離開,也就是說,抵達時間 + 持續時間不一定要在時間範圍內。如果車輛在 如果沒有 時間範圍不得重疊,也就是說,任何時間範圍都不得與其他時間範圍重疊或相鄰,且必須遞增排序。 只有在單一時間範圍內,才能設定 |
duration |
造訪時間長度,即車輛在抵達和離開之間花費的時間 (會加到可能的等待時間,請參閱 |
cost |
在車輛路線上服務這項造訪要求的成本。你可以使用這項屬性,為每種替代取貨或運送方式設定不同的費用。這項費用的單位必須與 |
load_demands |
這項造訪要求的負載需求。這與 |
visit_types[] |
指定造訪類型。這項屬性可用於分配車輛完成這項造訪所需的額外時間 (請參閱 一個類型只能出現一次。 |
label |
指定這個 |
avoid_u_turns |
指定這個地點的行車路線是否應避免迴轉。系統會盡可能避免迴轉,但不保證完全不會迴轉。這項功能仍在實驗階段,行為可能會有異動。 實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request。 |
ShipmentModel
運送模型包含一組運送作業,必須由一組車輛執行,同時盡可能降低整體成本,也就是下列各項的總和:
- 車輛路線規劃費用 (所有車輛的總時間費用、行程時間費用和固定費用總和)。
- 未履行運送的罰則。
- 運送時間的全球費用
| 欄位 | |
|---|---|
shipments[] |
必須在模型中執行的運送作業組合。 |
vehicles[] |
可用來執行造訪的一組車輛。 |
objectives[] |
這個模型的目標組合,我們會將其轉換為費用。如果不是空白,輸入模型必須是免費。如要取得修改後的要求,請使用 實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request。 |
global_start_time |
模型的全域開始和結束時間:超出這個範圍的時間都視為無效。 模型的時間範圍必須小於一年,也就是說, 使用 |
global_end_time |
如未設定,系統會預設為世界標準時間 1971 年 1 月 1 日 00:00:00 (即秒數:31536000,奈秒:0)。 |
global_duration_cost_per_hour |
整體計畫的「全域時間長度」是指所有車輛最早有效開始時間和最晚有效結束時間之間的差距。使用者可以為該數量指定每小時費用,嘗試盡早完成工作。這項費用的單位必須與 |
duration_distance_matrices[] |
指定模型中使用的時間長度和距離矩陣。如果這個欄位留空,系統會根據 使用範例:
|
duration_distance_matrix_src_tags[] |
定義時間長度和距離矩陣來源的標記; 標記對應於 |
duration_distance_matrix_dst_tags[] |
定義時間長度和距離矩陣目的地的標記; 標記對應於 |
transition_attributes[] |
轉換屬性已新增至模型。 |
shipment_type_incompatibilities[] |
不相容的 shipment_types 組合 (請參閱 |
shipment_type_requirements[] |
|
precedence_rules[] |
必須在模型中強制執行的優先順序規則集。 重要事項:使用優先順序規則會限制可最佳化的問題大小。如果優先順序規則包含多筆運送資料,系統可能會拒絕要求。 |
max_active_vehicles |
限制使用中車輛的數量上限。如果車輛的路線至少執行一次運送,則該車輛為使用中。如果司機人數少於車輛數,且車隊車輛不盡相同,則可使用這項功能限制路線數量。最佳化作業會選出最適合使用的車輛子集。必須為正數。 |
DurationDistanceMatrix
指定從造訪和車輛起點到造訪和車輛終點的時間長度和距離矩陣。
| 欄位 | |
|---|---|
rows[] |
指定時間長度和距離矩陣的資料列。元素數量必須與 |
vehicle_start_tag |
這個標記定義了時間長度和距離矩陣適用的車輛。如果留空,則會套用至所有車輛,且只能有一個矩陣。 每輛車的起點都必須與一個矩陣完全相符,也就是說,車輛的 所有矩陣都必須有不同的 |
資料列
指定時間長度和距離矩陣的資料列。
| 欄位 | |
|---|---|
durations[] |
指定資料列的持續時間值。元素數量必須與 |
meters[] |
指定資料列的距離值。如果模型中沒有任何費用或限制參照距離,則可留空;否則,元素數量必須與 |
目標
目標會完全取代成本模型,因此與現有成本不相容。每個目標都會對應至多個預先定義的成本,例如車輛、運送或轉換屬性。
實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request。
| 欄位 | |
|---|---|
type |
目標類型。 |
weight |
這個目標相對於其他目標的比重。這可以是任何非負數,權重總和不一定要等於 1。權重預設為 1.0。 |
類型
要對應至一組費用的目標類型。
| 列舉 | |
|---|---|
DEFAULT |
系統會使用一組預設成本,確保解決方案合理。注意:這個目標可以單獨使用,但如果使用者指定的目標中尚未包含這個目標,系統一律會將這個目標新增至使用者指定的目標,並將權重設為 1.0,做為基準。 |
MIN_DISTANCE |
「MIN」目標。盡可能縮短總行經距離。 |
MIN_WORKING_TIME |
盡量縮短所有車輛的總工作時間。 |
MIN_TRAVEL_TIME |
與上述相同,但只著重於行程時間。 |
MIN_NUM_VEHICLES |
盡可能減少使用的車輛數量。 |
PrecedenceRule
兩個事件之間的優先順序規則 (每個事件都是貨件的取件或送件):「第二個」事件必須在「第一個」事件開始後至少 offset_duration 才能開始。
多個優先順序可以參照相同 (或相關) 事件,例如「在 A 交付後取件 B」和「在取件 B 後取件 C」。
此外,只有在執行兩項運送作業時,優先順序才會生效,否則會遭到忽略。
| 欄位 | |
|---|---|
first_is_delivery |
指出「第一個」事件是否為送達。 |
second_is_delivery |
指出「第二個」事件是否為傳送。 |
offset_duration |
「第一個」和「第二個」事件之間的偏移量。可以是負數。 |
first_index |
「第一個」事件的貨件索引。必須指定這個欄位。 |
second_index |
「第二個」事件的貨件索引。必須指定這個欄位。 |
ShipmentRoute
車輛的路線可以沿著時間軸分解,如下所示 (假設有 n 次造訪):
| | | | | T[2], | | |
| Transition | Visit #0 | | | V[2], | | |
| #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
| aka T[0] | V[0] | | | V[n-2],| | |
| | | | | T[n-1] | | |
^ ^ ^ ^ ^ ^ ^ ^
vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
start (arrival) (departure) start end start end end
請注意,我們區分了以下兩者:
- 「準時事件」,例如車輛開始和結束,以及每次造訪的開始和結束 (也就是抵達和離開)。會在特定秒數發生。
- 「時間間隔」,例如造訪本身,以及造訪之間的轉換。雖然時間間隔有時可能為零,也就是在同一秒開始和結束,但通常會大於零。
不變量:
- 如果有 n 次造訪,就會有 n+1 次轉換。
- 造訪前後一律會有轉場 (索引相同) 和轉場 (索引 + 1)。
- 車輛啟動後,一律會接著執行轉運 #0。
- 車輛結束前一律會先進行轉換 #n。
Transition 和 Visit 期間會發生以下情況:
---+-------------------------------------+-----------------------------+-->
| TRANSITION[i] | VISIT[i] |
| | |
| * TRAVEL: the vehicle moves from | PERFORM the visit: |
| VISIT[i-1].departure_location to | |
| VISIT[i].arrival_location, which | * Spend some time: |
| takes a given travel duration | the "visit duration". |
| and distance | |
| | * Load or unload |
| * BREAKS: the driver may have | some quantities from the |
| breaks (e.g. lunch break). | vehicle: the "demand". |
| | |
| * WAIT: the driver/vehicle does | |
| nothing. This can happen for | |
| many reasons, for example when | |
| the vehicle reaches the next | |
| event's destination before the | |
| start of its time window | |
| | |
| * DELAY: *right before* the next | |
| arrival. E.g. the vehicle and/or | |
| driver spends time unloading. | |
| | |
---+-------------------------------------+-----------------------------+-->
^ ^ ^
V[i-1].end V[i].start V[i].end
最後,以下說明如何在轉場期間安排 TRAVEL、BREAKS、DELAY 和 WAIT。
- 兩者不會重疊。
- DELAY 具有唯一性,且必須是緊接在下次造訪 (或車輛結束) 之前的連續時間。因此,只要知道延遲時間長度,就能知道開始和結束時間。
- BREAKS 是連續且不重疊的時間。回應會指定每個廣告插播的開始時間和持續時間。
- TRAVEL 和 WAIT 是「可先占」狀態:在轉換期間,這兩種狀態可以中斷多次。用戶端可以假設行程會「盡快」進行,而「等待」會填滿剩餘時間。
(複雜) 範例:
TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
|| | | | | | | ||
|| T | B | T | | B | | D ||
|| r | r | r | W | r | W | e ||
|| a | e | a | a | e | a | l ||
|| v | a | v | i | a | i | a ||
|| e | k | e | t | k | t | y ||
|| l | | l | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
| 欄位 | |
|---|---|
vehicle_index |
執行路線的車輛,由來源 |
vehicle_label |
執行這條路線的車輛標籤,如果已指定,則等於 |
vehicle_start_time |
車輛開始行駛路線的時間。 |
vehicle_end_time |
車輛完成路線的時間。 |
visits[] |
代表路線的造訪順序。visits[i] 是路線中的第 i 次造訪。如果這個欄位留空,系統會將車輛視為未使用。 |
transitions[] |
路徑轉場效果的排序清單。 |
has_traffic_infeasibilities |
如果 由於交通狀況導致預估行程時間增加 |
route_polyline |
路線的編碼折線表示法。只有在 |
breaks[] |
為行駛這條路線的車輛安排的休息時間。 |
metrics |
這條路線的時間長度、距離和負荷指標。 |
vehicle_fullness |
實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
route_costs |
路線費用,依費用相關要求欄位細分。鍵是相對於輸入 OptimizeToursRequest 的 proto 路徑,例如「model.shipments.pickups.cost」,值則是相應費用欄位產生的總費用,並匯總整條路線。換句話說,costs["model.shipments.pickups.cost"] 是路線上所有取貨費用的總和。模型中定義的所有費用都會在此詳細列出,但與 TransitionAttributes 相關的費用除外,這類費用自 2022 年 1 月起僅以匯總方式列出。 |
route_total_cost |
路線總費用。費用對應表中所有費用的總和。 |
休息時間
代表廣告插播執行作業的資料。
| 欄位 | |
|---|---|
start_time |
廣告插播的開始時間。 |
duration |
休息時間長度。 |
EncodedPolyline
折線的編碼表示法。如要進一步瞭解折線編碼,請參閱:https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding。
| 欄位 | |
|---|---|
points |
代表折線編碼點的字串。 |
轉移
路線上兩個事件之間的轉換。請參閱 ShipmentRoute 的說明。
如果車輛沒有 start_location 和/或 end_location,對應的行程指標會是 0。
| 欄位 | |
|---|---|
travel_duration |
這段轉換期間的行程時間長度。 |
travel_distance_meters |
轉換期間移動的距離。 |
traffic_info_unavailable |
如果透過 |
delay_duration |
套用至這項轉換作業的延遲時間總和。如有延遲,則會在下一個事件 (造訪或車輛結束) 前 |
break_duration |
這段轉換期間內發生的廣告插播總長度 (如有)。每個廣告插播的開始時間和時間長度詳細資料會儲存在 |
wait_duration |
這段轉換期間的等待時間。等待時間長度相當於閒置時間,不含休息時間。此外,這段等待時間可能會分成多個不連續的間隔。 |
total_duration |
轉場效果的總時間長度,僅供參考。計算公式如下:
|
start_time |
這項轉換的開始時間。 |
route_polyline |
轉場期間所遵循路線的編碼折線表示法。只有在 |
route_token |
僅供輸出。不透明權杖,可傳遞至 Navigation SDK,在導航期間重建路線,並在重新規劃路線時,遵循建立路線時的原始意圖。請將這個權杖視為不透明 blob。請勿比較不同要求的路徑權杖值,因為即使服務傳回完全相同的路線,這個值也可能改變。只有在 |
vehicle_loads |
這段轉換期間的車輛載重,適用於出現在這輛車 第一次轉換期間的載重量,是車輛路線的起始載重量。接著,在每次造訪後,系統會根據造訪是取貨還是送貨,加上或減去造訪的 |
VehicleLoad
回報車輛在路線上某個時間點的實際載重 (適用於特定類型,請參閱 Transition.vehicle_loads)。
| 欄位 | |
|---|---|
amount |
指定類型的車輛載重量。負載單位通常會依類型標示。詳情請參閱《 |
前往
在路線中執行的造訪。這趟行程對應到Shipment的取貨或送貨。
| 欄位 | |
|---|---|
shipment_index |
來源 |
is_pickup |
如果為 true,則造訪對應至 |
visit_request_index |
|
start_time |
造訪開始時間。請注意,車輛可能會提早抵達造訪地點。時間與 |
load_demands |
總造訪負載需求,即運送和造訪要求 |
detour |
因造訪前在路線上造訪的運送作業,以及時間範圍可能造成的等待時間,而產生的額外繞道時間。如果造訪是送貨,則繞道會從對應的取貨造訪計算,且等於: 否則,系統會根據車輛 |
shipment_label |
如果在 |
visit_label |
如果在 |
visit_type |
(選用步驟) 指定造訪類型。覆寫 |
injected_solution_location_token |
不透明權杖,代表造訪地點的相關資訊。 如果這趟造訪的 實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request。 |
VisitType
指出造訪是取貨、送貨,還是造訪Stop。只有在啟用多模式最佳化時,系統才會使用停靠站造訪。
| 列舉 | |
|---|---|
VISIT_TYPE_UNSPECIFIED |
未指定造訪類型。 |
PICKUP_SHIPMENT |
造訪對應至貨件取件。 |
DELIVER_SHIPMENT |
造訪對應至運送作業。 |
ShipmentTypeIncompatibility
根據運送類型,指定運送作業之間的不相容性。系統會根據不相容模式,限制不相容運送在同一路線上的出現情形。
| 欄位 | |
|---|---|
types[] |
不相容類型清單。如果兩筆運送資訊的 |
incompatibility_mode |
不相容問題適用的模式。 |
IncompatibilityMode
定義如何限制不相容貨件出現在同一路線上的模式。
| 列舉 | |
|---|---|
INCOMPATIBILITY_MODE_UNSPECIFIED |
未指定不相容模式。請一律不要使用這個值。 |
NOT_PERFORMED_BY_SAME_VEHICLE |
在這種模式下,不相容類型的兩筆運送作業絕不會共用同一輛車。 |
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY |
在這個模式下,兩筆不相容類型的運送作業絕不會同時由同一輛車運送:
|
ShipmentTypeRequirement
根據 shipment_type 指定運送作業之間的需求。具體規定由模式定義。
| 欄位 | |
|---|---|
required_shipment_type_alternatives[] |
|
dependent_shipment_types[] |
如果貨件在 注意:不允許 |
requirement_mode |
套用至規定的模式。 |
RequirementMode
定義路線上依附運送作業外觀的模式。
| 列舉 | |
|---|---|
REQUIREMENT_MODE_UNSPECIFIED |
未指定需求模式。請一律不要使用這個值。 |
PERFORMED_BY_SAME_VEHICLE |
在這種模式下,所有「依附」運送作業必須與至少一項「必要」運送作業共用同一輛車。 |
IN_SAME_VEHICLE_AT_PICKUP_TIME |
在 因此,「依附」運送貨件取貨必須具備下列其中一項:
|
IN_SAME_VEHICLE_AT_DELIVERY_TIME |
與先前相同,但「依附」運送作業在送達時,車輛上必須有「必要」運送作業。 |
SkippedShipment
指定解決方案中未執行的運送作業詳細資料。如果是簡單案例,且/或我們能找出略過原因,就會在這裡回報原因。
| 欄位 | |
|---|---|
index |
索引會對應至來源 |
label |
如果在 |
reasons[] |
略過出貨的原因清單。請參閱上方的註解 |
penalty_cost |
這是 實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
estimated_incompatible_vehicle_ratio |
預估無法執行這項運送作業的車輛比率,原因至少包括下列其中一項。注意:只有在原因涉及車輛時,才會填寫這個欄位。 實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
原因
如果我們能解釋略過出貨的原因,就會列在這裡。如果並非所有車輛的原因都相同,reason 會有超過 1 個元素。略過的運送作業不得有重複的原因,也就是除了 example_vehicle_index 以外,所有欄位都相同。範例:
reasons {
code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
example_vehicle_index: 1
example_exceeded_capacity_type: "Apples"
}
reasons {
code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
example_vehicle_index: 3
example_exceeded_capacity_type: "Pears"
}
reasons {
code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
example_vehicle_index: 1
}
略過的運送作業與所有車輛都不相容。所有車輛的原因可能不同,但至少有一輛車的「蘋果」容量會超過 (包括車輛 1)、至少有一輛車的「梨」容量會超過 (包括車輛 3),且至少有一輛車的距離限制會超過 (包括車輛 1)。
| 欄位 | |
|---|---|
code |
請參閱程式碼的註解。 |
example_vehicle_indices[] |
與 實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
example_exceeded_capacity_type |
如果原因代碼為 |
example_vehicle_index |
如果原因與運送車輛不相容有關,這個欄位會提供一輛相關車輛的索引。 |
程式碼
用來識別原因類型的代碼。這裡的順序沒有意義。具體來說,如果兩個原因都適用,則無法判斷哪個原因會先出現在解決方案中。
| 列舉 | |
|---|---|
CODE_UNSPECIFIED |
請勿使用。 |
NO_VEHICLE |
模型中沒有車輛,因此所有運送作業都無法執行。 |
DEMAND_EXCEEDS_VEHICLE_CAPACITY |
運送需求超過車輛的某些容量類型,其中一項是 example_exceeded_capacity_type。 |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT |
執行這項運送作業所需的最短距離 (即從車輛的 請注意,這項計算會使用測地距離。 |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT |
執行這項運送作業所需的最短時間 (包括行程時間、等待時間和服務時間) 超過車輛的 注意:行程時間是以最佳情況計算,即測地線距離 x 36 公尺/秒 (約 130 公里/小時)。 |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT |
同上,但我們只比較最短行程時間和車輛的 travel_duration_limit。 |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS |
如果車輛在最早開始時間出發,即使在最佳情況下 (時間計算方式請參閱 CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT),也無法完成這項運送作業:總時間會導致車輛在最晚結束時間之後結束。 |
VEHICLE_NOT_ALLOWED |
運送的 allowed_vehicle_indices 欄位並非空白,且這輛車不屬於該欄位。 |
VEHICLE_IGNORED |
車輛的 實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
SHIPMENT_IGNORED |
運送作業的 實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT |
實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED |
實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
ZERO_PENALTY_COST |
運送作業的罰款費用為零。雖然這項功能可做為進階建模選項,但也可以在事後解釋為何略過某項運送作業。 實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
TimeWindow
時間範圍會限制事件的時間,例如造訪的抵達時間,或車輛的開始和結束時間。
硬性時間範圍界限 start_time 和 end_time 會強制執行事件的最早和最晚時間,例如 start_time <= event_time <=
end_time。軟性時間範圍下限 soft_start_time 表示偏好事件在 soft_start_time 當天或之後發生,產生的費用與事件在 soft_start_time 之前發生的時間長度成正比。軟時間範圍上限 soft_end_time 表示偏好事件在 soft_end_time 當天或之前發生,產生的費用與事件在 soft_end_time 之後發生的時間長度成正比。start_time、end_time、soft_start_time 和 soft_end_time 應在全域時間限制內 (請參閱 ShipmentModel.global_start_time 和 ShipmentModel.global_end_time),並應遵循:
0 <= `start_time` <= `end_time` and
0 <= `start_time` <= `soft_start_time` and
0 <= `soft_end_time` <= `end_time`.
| 欄位 | |
|---|---|
start_time |
硬性時間範圍的開始時間。如未指定,則會設為 |
end_time |
硬性時間範圍結束時間。如未指定,則會設為 |
soft_start_time |
時間範圍的軟式開始時間。 |
soft_end_time |
時間範圍的軟性結束時間。 |
cost_per_hour_before_soft_start_time |
如果事件發生在 soft_start_time 之前,則會將每小時費用加到模型中的其他費用,計算方式如下: 這個費用必須為正數,且只有在設定 soft_start_time 後,才能設定這個欄位。 |
cost_per_hour_after_soft_end_time |
如果事件發生在 這項費用必須為正數,且只有在設定 |
TransitionAttributes
指定路線上兩次連續造訪之間的轉換屬性。多個 TransitionAttributes 可能適用於同一轉換:在這種情況下,所有額外費用都會累加,並套用最嚴格的限制或限制 (遵循自然「AND」語意)。
| 欄位 | |
|---|---|
src_tag |
定義這組屬性適用的一組 (src->dst) 轉換。 來源造訪或車輛起點的 |
excluded_src_tag |
請參閱 |
dst_tag |
目的地造訪或車輛結束作業的 |
excluded_dst_tag |
請參閱 |
cost |
指定執行這項轉換的費用。這個值的單位與模型中所有其他費用相同,且不得為負值。這項費用會加在所有其他現有費用之上。 |
cost_per_kilometer |
指定執行這項轉換時,每公里移動距離的費用。這項費用會加到車輛指定的任何 |
distance_limit |
指定執行這項轉場時的移動距離限制。 截至 2021 年 6 月,僅支援軟性限制。 |
delay |
指定執行這項轉換時產生的延遲時間。 這項延遲一律發生在來源造訪結束後,以及目的地造訪開始前。 |
URI
指向資源的通用資源識別碼,可由 Route Optimization API 讀取及寫入。
| 欄位 | |
|---|---|
uri |
資源的 URI。資源可能尚未建立。 資源內容會編碼為 JSON 或 textproto。僅支援 Google Cloud Storage 資源。如果資源是以 JSON 編碼,資源名稱必須加上 |
車輛
在運送問題中建立車輛模型。解決運送問題後,系統會為這輛車建立從start_location出發、end_location結束的路線。路線是一連串的造訪 (請參閱 ShipmentRoute)。
| 欄位 | |
|---|---|
display_name |
使用者定義的車輛顯示名稱。長度上限為 63 個字元,可使用 UTF-8 字元。 |
travel_mode |
旅行模式會影響車輛可使用的道路和速度。另請參閱 |
route_modifiers |
一組必須滿足的條件,會影響指定車輛的路線計算方式。 |
start_location |
車輛在收取任何貨件前的起始地理位置。如未指定,車輛會從第一個取貨點出發。如果運送模型含有時間長度和距離矩陣,則不得指定 |
start_waypoint |
代表車輛在取貨前出發的地理位置路線控點。如果未指定 |
end_location |
車輛完成最後一個 |
end_waypoint |
代表車輛完成最後一個 |
start_tags[] |
指定附加至車輛路線起點的標記。 不得輸入空白或重複的字串。 |
end_tags[] |
指定附加至車輛路線結尾的標記。 不得輸入空白或重複的字串。 |
start_time_windows[] |
車輛可從起始位置出發的時間範圍。必須在全域時間限制內 (請參閱 屬於同一個重複欄位的時間範圍不得重疊,也就是說,時間範圍不得與其他時間範圍重疊或相鄰,且必須按照時間順序排列。 只有在單一時間範圍內,才能設定 |
end_time_windows[] |
車輛可能抵達終點位置的時間範圍。必須在全域時間限制內 (請參閱 屬於同一個重複欄位的時間範圍不得重疊,也就是說,時間範圍不得與其他時間範圍重疊或相鄰,且必須按照時間順序排列。 只有在單一時間範圍內,才能設定 |
unloading_policy |
車輛強制執行的卸載政策。 |
load_limits |
車輛容量 (例如重量、體積、棧板數量)。對應中的鍵是負載類型的 ID,與 |
cost_per_hour |
車輛費用:所有費用加總,且必須與 車輛路線的每小時費用。這項費用會計入路線總耗時,包括行程時間、等待時間和造訪時間。使用 |
cost_per_traveled_hour |
車輛路線每小時行駛費用。這項費用僅適用於路線的行程時間 (即 |
cost_per_kilometer |
車輛路線每公里的費用。這項費用會套用至 |
fixed_cost |
如果使用這輛車輛處理運送作業,則會套用固定費用。 |
used_if_route_is_empty |
這個欄位僅適用於路線不提供任何運送服務的車輛。指出車輛是否應視為二手車。 如果設為 true,車輛會從起點前往終點,即使未運送任何貨件也一樣,且系統會考量從起點到終點的時間和距離成本。 否則,車輛不會從起點行駛到終點,也不會為這輛車安排 |
route_duration_limit |
限制適用於車輛路線的總時間長度。在特定 |
travel_duration_limit |
車輛路線行程時間的限制。在特定 |
route_distance_limit |
限制會套用至車輛路線的總距離。在特定 |
extra_visit_duration_for_visit_type |
指定從 visit_types 字串到持續時間的對應。時間長度是指在指定 如果造訪要求有多種類型,地圖會為每種類型新增時間長度。 |
break_rule |
說明這輛車要強制執行的休息時間表。如果留空,系統就不會為這輛車安排休息時間。 |
label |
指定這輛車的標籤。這項標籤會在回應中回報為對應 |
ignore |
如果設為 true, 如果 如果貨件是由 |
travel_duration_multiple |
指定乘法係數,可用於增加或減少這輛車的行程時間。舉例來說,如果將這個值設為 2.0,表示這輛車的速度較慢,行程時間是標準車輛的兩倍。這個倍數不會影響造訪時間長度。如果指定 警告:套用這個倍數後,行程時間會四捨五入至最接近的秒數,然後才執行任何數值運算,因此較小的倍數可能會導致精確度降低。 另請參閱下方的 |
DurationLimit
定義車輛路線時間長度上限的限制。可以是硬體或軟體權杖。
定義軟性限制欄位時,必須一併定義軟性上限門檻和相關費用。
| 欄位 | |
|---|---|
max_duration |
硬性限制,將時間長度限制在 max_duration 以內。 |
soft_max_duration |
軟性限制不會強制執行時間長度上限,但違反時會導致路線產生費用。這項費用會與模型中定義的其他費用相加,單位相同。 如果已定義, |
quadratic_soft_max_duration |
軟性限制不會強制執行時間長度上限,但如果違反,路線會產生費用,費用與時間長度呈二次方關係。這項費用會與模型中定義的其他費用相加,單位相同。 如果設定
|
cost_per_hour_after_soft_max |
如果違反 費用不得為負值。 |
cost_per_square_hour_after_quadratic_soft_max |
違反 如果時間長度低於門檻,則額外費用為 0,否則費用取決於時間長度,如下所示: 費用不得為負值。 |
LoadLimit
定義車輛的載重限制,例如「這輛卡車最多只能載重 3, 500 公斤」。詳情請參閱《load_limits》。
| 欄位 | |
|---|---|
soft_max_load |
負載的軟性限制。詳情請參閱《 |
cost_per_unit_above_soft_max |
如果這輛車的路線負載超過 |
start_load_interval |
車輛在路線起點的可接受載重量區間。 |
end_load_interval |
車輛在路線終點的可接受負載間隔。 |
max_load |
可接受的負載量上限。 |
cost_per_kilometer |
這輛車每公里移動一個單位負載的成本。這項指標可用來代表燃料消耗量:如果負載是重量 (以牛頓為單位),則負載*公里具有能量的維度。 實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request。 |
cost_per_traveled_hour |
這輛車載運一個單位的貨物行駛一小時的費用。 實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request。 |
間隔
可接受的負載量間隔。
| 欄位 | |
|---|---|
min |
|
max |
|
LoadCost
Transition期間移動一個單位負載的成本。特定負載的費用是下列兩部分的總和:
- min(load,
load_threshold) *cost_per_unit_below_threshold - max(0, load -
load_threshold) *cost_per_unit_above_threshold
有了這項費用,解決方案會優先配送高需求,或最後取貨高需求。舉例來說,如果車輛
load_limit {
key: "weight"
value {
cost_per_kilometer {
load_threshold: 15
cost_per_unit_below_threshold: 2.0
cost_per_unit_above_threshold: 10.0
}
}
}
路線為起點、取貨、取貨、送貨、送貨、終點,轉移如下:
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
則這輛LoadCost產生的費用為 (cost_below * load_below * 公里數 + cost_above * load_above * 公里數)
- transition 0: 0.0
- 轉換 1:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- 轉換 2:2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
- 轉換 3:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- transition 4: 0.0
因此,路線的 LoadCost 為 120.0。
不過,如果路線是起點、取貨、送貨、取貨、送貨、終點,且有以下轉移:
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
則這項 LoadCost 產生的費用為
- transition 0: 0.0
- 轉換 1:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- transition 2: 0.0
- 轉換 3:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- transition 4: 0.0
這裡的路線 LoadCost 為 40.0。
LoadCost會使轉換作業負載較重的解決方案成本更高。
實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request。
| 欄位 | |
|---|---|
load_threshold |
當負載量超過這個值,移動一個負載單位的費用會從 cost_per_unit_below_threshold 變更為 cost_per_unit_above_threshold。必須大於或等於 0。 |
cost_per_unit_below_threshold |
移動一個單位負載的費用,適用於 0 到門檻之間的每個單位。必須是有限值,且 >= 0。 |
cost_per_unit_above_threshold |
每超過門檻一個單位,移動一個單位負載的成本。在特殊情況下,門檻 = 0,這是每單位的固定費用。必須是有限值,且 >= 0。 |
TravelMode
車輛可使用的交通工具。
這些應是 Google Maps Platform Routes API 交通方式的子集,請參閱:https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode
注意:WALKING路線目前為 Beta 版,有時可能無法明確提供人行道或行人步道。在應用程式中顯示步行路線時,一律須向使用者顯示這則警告。
| 列舉 | |
|---|---|
TRAVEL_MODE_UNSPECIFIED |
未指定交通方式,等同於 DRIVING。 |
DRIVING |
與行車路線 (汽車、...) 對應的交通方式。 |
WALKING |
步行路線對應的交通方式。 |
UnloadingPolicy
車輛卸貨方式的政策。僅適用於同時有取貨和送貨地點的運送作業。
其他運送作業則可獨立於 unloading_policy,在路線上的任何位置進行。
| 列舉 | |
|---|---|
UNLOADING_POLICY_UNSPECIFIED |
未指定卸貨政策;送貨時間必須晚於對應的取貨時間。 |
LAST_IN_FIRST_OUT |
送貨順序必須與取貨順序相反 |
FIRST_IN_FIRST_OUT |
送達順序必須與取貨順序相同 |
VehicleFullness
VehicleFullness 是用於計算車輛滿載程度的指標。每個 VehicleFullness 欄位的值都介於 0 和 1 之間,計算方式是將有上限的指標欄位 (例如 AggregatedMetrics.travel_distance_meters) 除以相關車輛限制 (例如 Vehicle.route_distance_limit,如有)。否則,飽和度比率會維持未設定狀態。如果限制為 0,欄位會設為 1。注意:如果路線受到交通不可行性的影響,部分原始飽和度比率可能會超過 1.0,例如車輛可能會超過距離限制。在這種情況下,我們會將飽和度值上限設為 1.0。
| 欄位 | |
|---|---|
max_fullness |
這則訊息中所有其他欄位的最大值。 |
distance |
|
travel_duration |
[AggregatedMetrics.travel_duration_seconds][] 與 |
active_duration |
[AggregatedMetrics.total_duration_seconds][] 與 |
max_load |
所有 [AggregatedMetrics.max_load][] 類型與其各自 |
active_span |
特定車輛的比率 (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time)。如果沒有分母,則會改用 ( |
途經點
封裝路線控點。路線控點會標示 VisitRequest 的抵達和出發位置,以及車輛的起點和終點位置。
| 欄位 | |
|---|---|
side_of_road |
(選用步驟) 表示這個路線控點的位置,是為了讓車輛優先停靠在道路的特定一側。設定這個值後,路線會經過該位置,讓車輛可以停在該位置偏向道路中心的那一側。這個選項不適用於「WALKING」交通模式。 |
vehicle_stopover |
表示路線控點是車輛停靠點,目的是接送乘客。這個選項僅適用於「DRIVING」交通模式,且「location_type」為「location」。 實驗性:這個欄位的行為或存在狀態日後可能會有變動。 |
聯集欄位 location_type。表示位置的不同方式。location_type 只能是下列其中一項: |
|
location |
使用地理座標指定的點,包括選用的航向。 |
place_id |
與路線控點相關聯的搜尋點地點 ID。 使用地點 ID 指定 VisitRequest 的抵達或出發地點時,請使用足夠具體的地點 ID,以便判斷導航至該地點的 LatLng 位置。舉例來說,代表建築物的地點 ID 適合,但代表道路的地點 ID 則不建議使用。 |