Package google.maps.routeoptimization.v1

索引

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

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

分批為一或多則 OptimizeToursRequest 訊息最佳化車輛導覽。

這個方法屬於長時間執行的作業 (LRO)。最佳化的輸入 (OptimizeToursRequest 訊息) 和輸出內容 (OptimizeToursResponse 訊息) 是以使用者指定的格式,從 Cloud Storage 讀取/寫入。和 OptimizeTours 方法一樣,每個 OptimizeToursRequest 都包含 ShipmentModel,並會傳回包含 ShipmentRouteOptimizeToursResponse,這些也是車輛能將整體成本降至最低的一組路線。

授權範圍

需要下列 OAuth 範圍:

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

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

傳送包含 ShipmentModelOptimizeToursRequest,並傳回內含 ShipmentRouteOptimizeToursResponse,也就是車輛將總成本降至最低的一組路線。

ShipmentModel 模型主要包含需要執行的 Shipment,以及用於傳輸 ShipmentVehicleShipmentRoute 會將 Shipment 指派給 Vehicle。具體來說,這些物件會為每個車輛指派一系列的 Visit,而 Visit 對應 VisitRequest (為 Shipment 的自取或外送服務)。

目標是將 ShipmentRoute 指派給 Vehicle,藉此盡可能降低 ShipmentModel 中定義多個元件的總費用。

授權範圍

需要下列 OAuth 範圍:

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

AggregatedMetrics

ShipmentRoute (針對所有 Transition 和/或 Visit (針對所有 ShipmentRoute 元素) 的 OptimizeToursResponse 匯總指標。

欄位
performed_shipment_count

int32

執行的出貨數量。請注意,自取和外送服務組合只會計算一次。

travel_duration

Duration

路線或解決方案的總交通時間。

wait_duration

Duration

路線或解決方案的總等待時間。

delay_duration

Duration

路線或解決方案的總延遲時間。

break_duration

Duration

路線或解決方案的總中斷時長。

visit_duration

Duration

路線或解決方案的總造訪持續時間。

total_duration

Duration

總時間長度應該等於上述所有時間長度的總和。針對路徑,這個符號也對應下列項目:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

路線或解決方案的總移動距離。

max_loads

map<string, VehicleLoad>

整條路線 (回應解決方案) 上達到的最大負載量,是這個路線 (回應解決方案) 上每個數量的負載上限,計算依據為所有 Transition.vehicle_loads (回應)ShipmentRoute.metrics.max_loads

BatchOptimizeToursMetadata

這個類型沒有任何欄位。

BatchOptimizeToursRequest 呼叫的作業中繼資料。

BatchOptimizeToursRequest

要求以非同步作業的方式批次最佳化導覽。每個輸入檔案都應包含一個 OptimizeToursRequest,而每個輸出檔案都會包含一個 OptimizeToursResponse。要求中包含讀取/寫入和剖析檔案的資訊。所有輸入和輸出檔案都應該位於同一個專案之下。

欄位
parent

string

必要欄位。指定專案和位置即可撥打電話。

格式:* projects/{project-id} * projects/{project-id}/locations/{location-id}

如未指定位置,系統會自動選擇區域。

model_configs[]

AsyncModelConfig

必要欄位。每個購買模型的輸入/輸出資訊,例如檔案路徑和資料格式。

AsyncModelConfig

以非同步方式解決一個最佳化模型的資訊。

欄位
display_name

string

選用設定。使用者定義的模型名稱;使用者可以透過這個名稱當做別名,持續追蹤模型。

input_config

InputConfig

必要欄位。輸入模型的相關資訊。

output_config

OutputConfig

必要欄位。所需的輸出位置資訊。

BatchOptimizeToursResponse

這個類型沒有任何欄位。

BatchOptimizeToursRequest 的回應。作業完成後,這個訂閱項目會在「長期執行的作業」中傳回。

BreakRule

產生車輛休息時間 (例如午休時間) 的規則。休息時間是指車輛在目前位置保持閒置狀態,且無法進行任何巡訪。下列情形可能會發生中斷:

  • 或是車輛啟動時 (車輛不得在休息中發動),在這種情況下,並不會影響車輛開始時間。
  • 或在車輛結束 (坐下與車輛結束時間) 後。
欄位
break_requests[]

BreakRequest

廣告插播序列。請參閱 BreakRequest 訊息。

frequency_constraints[]

FrequencyConstraint

但可能有幾個FrequencyConstraint。他們必須滿足這個 BreakRuleBreakRequest。詳情請參閱 FrequencyConstraint

BreakRequest

您必須事先得知每輛車的休息順序 (即數量和順序)。重複的 BreakRequest 會定義該序列的出現順序。客戶的時間範圍 (earliest_start_time / latest_start_time) 可能會重疊,但必須與訂單相容 (已勾選)。

欄位
earliest_start_time

Timestamp

必要欄位。廣告插播開始時的下限 (含)。

latest_start_time

Timestamp

必要欄位。廣告插播開始時的限制上限 (含)。

min_duration

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

Duration

必要欄位。這項限制的最短廣告插播長度。正數。請參閱 FrequencyConstraint 的說明。

max_inter_break_duration

Duration

必要欄位。路線中任何時間間隔的上限,至少不包含部分 duration >= min_break_duration 的中斷。必須為正數。

DataFormat

輸入和輸出檔案的資料格式。

列舉
DATA_FORMAT_UNSPECIFIED 值無效,格式不得為 UNSPECIFIED。
JSON JavaScript 物件標記法。
PROTO_TEXT 通訊協定緩衝區文字格式。詳情請參閱 https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

用於定義可行駛距離上限。挑戰可以是困難或輕微。

如果已定義軟性限制,則必須定義 soft_max_meterscost_per_kilometer_above_soft_max,且不得為負數。

欄位
max_meters

int64

硬性限制將距離限制最多為 max_meters。限制值不得為負數。

soft_max_meters

int64

非強制規定的距離上限並未強制執行,不過一旦違反,成本就會加起來,等於模型中定義的其他費用,且單位相同。

定義的 soft_max_meters 必須小於 max_meters,且不得為負數。

cost_per_kilometer_above_soft_max

double

如果距離超過 soft_max_meters 限制,則每公里產生的費用。如果距離小於限制,額外費用會是 0,否則用於計算費用的公式如下:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

費用必須為正數。

GcsDestination

要寫入輸出檔案的 Google Cloud Storage 位置。

欄位
uri

string

必要欄位。Google Cloud Storage URI。

GcsSource

要讀取輸入檔案的 Google Cloud Storage 位置。

欄位
uri

string

必要欄位。Google Cloud Storage 物件的 URI,格式為 gs://bucket/path/to/object

InjectedSolutionConstraint

已在請求中插入的解決方案,包括哪些造訪設有限制以及限制方式。

欄位
routes[]

ShipmentRoute

插入解決方案的路徑。原始解決方案可能會省略部分路線。路線和略過運送作業必須符合 injected_first_solution_routes 所列的基本有效性假設。

skipped_shipments[]

SkippedShipment

略過解決方案的出貨作業。原始解決方案可能省略部分程式碼。請參閱 routes 欄位。

constraint_relaxations[]

ConstraintRelaxation

針對零或多個車輛群組,指定放寬限制條件的時機和程度。如果這個欄位空白,所有非空白的車輛路線都會完全受到限制。

ConstraintRelaxation

針對一組車輛,指定特定門檻限制的行駛限制和指示等級。skipped_shipment欄位中列出的出貨商品僅限略過。也就是無法執行

欄位
relaxations[]

Relaxation

所有造訪限制放寬會套用至vehicle_indices境內有車輛路線的造訪限制。

vehicle_indices[]

int32

指定要套用造訪限制 relaxations 的車輛索引。如果為空白,系統會視為預設值,而 relaxations 適用於未在其他 constraint_relaxations 中指定的所有車輛。最多只能有一個預設值,也就是說,最多只能有一個限制放寬欄位的空白 vehicle_indices。一個車輛指數只能列出一次,即使是在數個 constraint_relaxations 內也一樣。

如果 interpret_injected_solutions_using_labels 為 true,車輛索引會與 ShipmentRoute.vehicle_index 對應 (請參閱 fields 註解)。

休閒場所

如果 relaxations 空白,則 routes 上所有造訪的開始時間和序列都會完全受到限制,這些路線也無法插入或新增造訪記錄。此外,routes 中的車輛開始和結束時間也相當受限,除非車輛是空的 (也就是沒有行駛方向,且模型中的 used_if_route_is_empty 設為 false)。

relaxations(i).level 會指定套用至滿足 #j 的造訪限制放寬等級:

  • route.visits(j).start_time >= relaxations(i).threshold_time
  • j + 1 >= relaxations(i).threshold_visit_count

同樣地,如果符合下列條件,車輛起點會放寬至 relaxations(i).level

  • vehicle_start_time >= relaxations(i).threshold_time
  • 如果滿足以下條件,relaxations(i).threshold_visit_count == 0 和車輛終點會由 relaxations(i).level 放寬:
  • vehicle_end_time >= relaxations(i).threshold_time
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

如要在造訪符合 threshold_visit_count 時套用放寬層級,或是 threshold_time 新增兩個具有相同 levelrelaxations:一個只設定 threshold_visit_count,另一個只設定 threshold_time。如果造訪符合多個 relaxations 的條件,系統會套用最放鬆的層級。因此,從車輛開始行駛到行經路線,到車輛結束,放鬆等級就會變得更加放鬆:也就是說,隨著路線進展,放鬆等級不會下降。

如果路線造訪的時間和順序不符合任何 relaxations 的門檻條件,就會完全受限,沒有任何造訪記錄。此外,如果車輛開始或結束不符合任何放鬆條件,則系統會固定進行該時間,除非車輛無內容。

欄位
level

Level

限制條件的放寬層級:適用於 threshold_time 或之後,且至少符合 threshold_visit_count 的條件。

threshold_time

Timestamp

可套用 level 放鬆的時間或之後的時間。

threshold_visit_count

int32

可以套用放寬 level 或之後的造訪次數。如果 threshold_visit_count 為 0 (或未設定),便可在車輛啟動時直接套用 level

如果為 route.visits_size() + 1,則 level 只能套用至車輛端。如果時間超過 route.visits_size() + 1,則不會為該路線套用 level

層級

表示不同的造訪限制放寬等級,適用於造訪,以及符合門檻條件時會遵循的限制層級。

以下範例是為了增加放鬆的時間。

列舉
LEVEL_UNSPECIFIED

隱含預設的放寬等級:沒有限制,也就是說所有造訪都完全受限。

這個值不得在 level 中明確使用。

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

DataFormat

必要欄位。輸入的資料格式。

聯集欄位 source。必要欄位。source 只能是下列其中一項:
gcs_source

GcsSource

Google Cloud Storage 位置。必須是單一物件 (檔案)。

位置

包含位置 (地理位置和選用標題)。

欄位
lat_lng

LatLng

路線控點的地理座標。

heading

int32

與車流方向相關聯的指南針方向。這個值是用於指定道路的邊,供上車和下車地點使用。標題值可以介於 0 到 360 之間,其中 0 指定代表往北的方向、90 指定往東的方向等。

OptimizeToursRequest

提出要求至導覽最佳化解題工具,該解析器會定義要解決的運送模型和最佳化參數。

欄位
parent

string

必要欄位。指定專案或位置即可撥打電話。

格式:* projects/{project-id} * projects/{project-id}/locations/{location-id}

如未指定位置,系統會自動選擇區域。

timeout

Duration

如果設定了逾時,伺服器會在逾時期限或同步要求的伺服器期限已過 (以較早者為準) 之前傳回回應。

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

model

ShipmentModel

要解決的運送模型。

solving_mode

SolvingMode

根據預設,解析模式為 DEFAULT_SOLVE (0)。

search_mode

SearchMode

用於解決要求的搜尋模式。

injected_first_solution_routes[]

ShipmentRoute

引導最佳化演算法尋找與先前解決方案相似的第一個解決方案。

建構第一個解決方案時,模型會受到限制。任何未依路徑執行的貨物運送,都會在第一個解決方案中默示略過,但也可能會在連續的解決方案中執行。

解決方案必須滿足一些基本的有效性假設:

  • 對於所有路徑,vehicle_index必須位於指定範圍內,且不能複製。
  • 所有造訪的 shipment_indexvisit_request_index 都必須在範圍內。
  • 一項運送資訊只能納入一條路線。
  • 取貨服務配送完成後,請務必安排取貨服務配送訂單。
  • 同一運送的貨品只能有一個取貨替代服務或送貨方式。
  • 而且時間都會增加 (例如vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time)。
  • 您只能在允許的車輛上進行出貨。如果 Shipment.allowed_vehicle_indices 為空,或 Shipment.allowed_vehicle_indices 包含車輛的 vehicle_index,則允許刊登車輛。

如果插入的解決方案不可行,則不一定會傳回驗證錯誤,系統可能會改為傳回不可行的錯誤。

injected_solution_constraint

InjectedSolutionConstraint

限制最佳化演算法,找出類似先前的解決方案的最終解決方案。例如,此標記可用於凍結已完成或完成但不能修改的路徑部分。

如果插入的解決方案不可行,則不一定會傳回驗證錯誤,系統可能會改為傳回不可行的錯誤。

refresh_details_routes[]

ShipmentRoute

如果留空,系統就會重新整理指定路線,而不會修改行程的基礎造訪順序或交通時間:系統只會更新其他詳細資訊。這麼做無法解決模型問題,

自 2020 年 11 月起,這只會填入非空白路線的折線,且 populate_polylines 為 true。

傳入路徑的 route_polyline 欄位可能與路徑 transitions 不一致。

這個欄位不得與 injected_first_solution_routesinjected_solution_constraint 搭配使用。

Shipment.ignoreVehicle.ignore 對行為沒有任何影響。無論是否忽略相關的貨運或車輛,所有非空白路線的造訪點之間,仍會填入折線。

interpret_injected_solutions_using_labels

bool

如果是 true:

這項解釋適用於 injected_first_solution_routesinjected_solution_constraintrefresh_details_routes 欄位。如果要求中的運送或車輛索引在解決方案建立後有所變更,可以使用這項屬性,可能是因為運輸或車輛從要求中移除或新增至要求中。

如為 true,下列類別中的標籤最多只能出現一次:

如果插入的解決方案中的 vehicle_label 不符合要求車輛,系統會將對應的路線和造訪資料從解決方案中移除。如果插入解決方案中的 shipment_label 不符合要求運送要求,系統會將相應的造訪動作從解決方案中移除。如果插入解決方案中的 SkippedShipment.label 不符合要求運送要求,系統會將 SkippedShipment 從解決方案中移除。

從插入解決方案中移除路徑造訪或整條路線,可能會影響隱含的限制,進而影響解決方案、驗證錯誤或無法運作。

注意:呼叫端必須確保每個 Vehicle.label (因應Shipment.label) 可明確識別兩個相關要求中使用的車輛 (彈性運送) 實體:過去產生插入解決方案所用 OptimizeToursResponse 的要求,以及目前包含插入解決方案的要求。上述獨特性檢查不足以保證這項規定。

consider_road_traffic

bool

計算 ShipmentRoute 欄位 Transition.travel_durationVisit.start_timevehicle_end_time 時,請將流量估算納入考量;設定 ShipmentRoute.has_traffic_infeasibilities 欄位,以及計算 OptimizeToursResponse.total_cost 欄位。

populate_polylines

bool

如果為 true,則會在回應 ShipmentRoute 中填入折線。

populate_transition_polylines

bool

如果為 true,則會在回應 ShipmentRoute.transitions 中填入折線。

allow_large_deadline_despite_interruption_risk

bool

如果設定了這個項目,該要求的期限 (請參閱 https://grpc.io/blog/deadlines) 最多可以有 60 分鐘。否則,最長期限為 30 分鐘。請注意,長時間的要求具有極大 (但仍然很小) 的干擾風險。

use_geodesic_distances

bool

如果設為 true,系統會使用測地線距離 (而非 Google 地圖距離) 計算移動距離,並使用 geodesic_meters_per_second 定義的測速距離以測地線距離計算行程時間。

label

string

可能會用來識別這項要求的標籤,並回報於 OptimizeToursResponse.request_label 中。

geodesic_meters_per_second

double

如果 use_geodesic_distances 為 true,就必須設定這個欄位,並定義計算交通時間時要套用的速度。這個值必須至少為 1.0 公尺/秒。

max_validation_errors

int32

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

SearchMode

定義搜尋行為的模式,進行延遲與解決方案品質抵銷。在所有模式中,全域要求期限都是強制執行的。

列舉
SEARCH_MODE_UNSPECIFIED 未指定的搜尋模式,相當於 RETURN_FAST
RETURN_FAST 找到第一個理想的解決方案後,再停止搜尋。
CONSUME_ALL_AVAILABLE_TIME 善用所有可用時間,搜尋更有效的解決方案。

SolvingMode

定義解題工具應如何處理要求。在 VALIDATE_ONLY 以外的所有模式中,如果要求無效,您會收到 INVALID_REQUEST 錯誤。如需限制傳回的錯誤數量,請參閱 max_validation_errors

列舉
DEFAULT_SOLVE 解開模型。
VALIDATE_ONLY 只驗證模型而不解決問題:請盡可能填入最多的 OptimizeToursResponse.validation_errors
DETECT_SOME_INFEASIBLE_SHIPMENTS

只填入 OptimizeToursResponse.validation_errorsOptimizeToursResponse.skipped_shipments,實際無法解決其餘要求 (回應中未設定 statusroutes)。如果偵測到 injected_solution_constraint 路線的不動情況,這些路線就會填入 OptimizeToursResponse.validation_errors 欄位,OptimizeToursResponse.skipped_shipments 則留空。

重要事項:部分無法出貨的商品會退回,只退回預先處理期間偵測到的無法出貨商品。

OptimizeToursResponse

解決導覽最佳化問題後,系統會回應,其中包含每輛車的路線、遭略過的貨物,以及解決方案的總費用。

欄位
routes[]

ShipmentRoute

針對每輛車計算的路線第 2 條路線與型號中的第 i 個車輛對應。

request_label

string

如果要求中已指定標籤,則 OptimizeToursRequest.label 的副本。

skipped_shipments[]

SkippedShipment

略過所有出貨項目的清單。

validation_errors[]

OptimizeToursValidationError

列出可獨立偵測的所有驗證錯誤。查看「多個錯誤」OptimizeToursValidationError 訊息的說明。

metrics

Metrics

這項解決方案的持續時間、距離和用量指標。

指標

所有路徑的匯總整體指標。

欄位
aggregated_route_metrics

AggregatedMetrics

按照路徑匯總。每個指標都是名稱所有 ShipmentRoute.metrics 欄位的總和 (或負載上限)。

skipped_mandatory_shipment_count

int32

略過的必要出貨數量。

used_vehicle_count

int32

使用的車輛數量。注意:如果車輛路徑為空白,且 Vehicle.used_if_route_is_empty 為 true,系統會視為車輛使用。

earliest_vehicle_start_time

Timestamp

二手車的最早開始時間,計算依據為 ShipmentRoute.vehicle_start_time 的所有二手車輛的最小值。

latest_vehicle_end_time

Timestamp

二手車的最新結束時間,計算方式為 ShipmentRoute.vehicle_end_time 中所有二手車的最大值。

costs

map<string, double>

解決方案的費用,按費用相關要求欄位細分。這些鍵是 proto 路徑,相對於輸入的 OptimizeToursRequest,例如:「model.shipments.pickups.cost」和「模型」的值則為對應費用欄位產生的總費用,並匯總為整個解決方案。換句話說,成本 ["model.shipments.pickups.cost"] 是解決方案中所有取貨費用的總和。這裡詳細列出模型中定義的所有費用,但 TransitionAttributes 的相關費用除外。這些費用只以 2022 年 1 月的匯總方式呈現。

total_cost

double

解決方案的總費用。費用對應中所有值的總和。

OptimizeToursValidationError

說明驗證 OptimizeToursRequest 時發生的錯誤。

欄位
code

int32

驗證錯誤是由一律存在的組合 (codedisplay_name) 定義。

其他欄位 (請見下方) 提供更多與錯誤相關的資訊。

多個錯誤:如有多個錯誤,驗證程序會試著輸出數個錯誤。與編譯器類似,這個程序不完美。部分驗證錯誤屬於「嚴重」錯誤,也就是說,這類錯誤會停止整個驗證程序。以上就是 display_name="UNSPECIFIED" 錯誤等等。有些可能會導致驗證程序略過其他錯誤。

STabilitycodedisplay_name 應非常穩定。不過,新的代碼和顯示名稱可能會隨著時間而出現,這可能導致指定的 (無效) 要求產生不同的組合 (codedisplay_name),因為新的錯誤會隱藏舊一組錯誤 (請參閱「MULTIPLE ERRORS」)。

REFERENCE:所有 (代碼、名稱) 組合的清單:

  • 未指定 = 0;
  • VALIDATION_TIMEOUT_ERROR = 10;無法在期限內完成驗證。
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_second = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_second_TOO_SMALL = 1205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_second = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ENABLED_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 2003 年;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004 年;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008 年;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_AFTER_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_AFTER_END_TIME = 2805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_AFTER_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_AFTER_END_TIME = 2814;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_END_TIME = 2815;
    • TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2816;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSITION_ATTRIBUTES_INVALID_COST = 3000;
    • TRANSITION_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001;
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_實際連結網址 = 3006;
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3,305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
  • DISTANCE_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3602;
    • DISTANCE_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3603;
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605;
    • DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_AFTER_SOFT_MAX = 3802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3803;
    • DURATION_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_HOUR = 3807;
    • DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811;
    • DURATION_LIMIT_DIFF_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_USED_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_INVALID_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_MINIMUM_DURATION_LONGER_THAN_DURATION_LIMIT = 4222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
  • PRECEDENCE_ERROR = 46;
  • BREAK_ERROR = 48;
    • BREAK_RULE_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804;= 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805;
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806;
    • BREAK_REQUEST_LATEST_END_TIME_AFTER_GLOBAL_END_TIME = 4807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813;
    • BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4814;
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5601;
display_name

string

錯誤顯示名稱。

fields[]

FieldReference

錯誤內容可能包含 0、1 (大多數時間) 或多個欄位。舉例來說,參照第 4 號車輛和第 2 批第 2 項取貨方式可按照以下方式完成:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

不過請注意,特定錯誤代碼不會變更 fields 的基數。

error_message

string

使用者容易理解的錯誤說明字串。codeerror_message (代碼 !=「UNSPECIFIED」) 之間有 1:1 的對應關係。

STABILITY:不穩定:與指定 code 相關聯的錯誤訊息可能會隨時間改變 (希望釐清情況)。請改用 display_namecode

offending_values

string

可能包含欄位值。您不一定每次都能使用這個代碼。因此,建議您不要仰賴此演算法,並僅用於手動模型偵錯。

FieldReference

指定驗證錯誤的內容。FieldReference 一律會參照這個檔案中的特定欄位,並採用相同的階層結構。舉例來說,您可以透過以下程式碼,指定車輛 #5 的 start_time_windows 元素 #2:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

但我們會省略頂層實體 (例如 OptimizeToursRequestShipmentModel),避免訊息聚集。

欄位
name

string

欄位名稱,例如「車輛」。

sub_field

FieldReference

視需要以遞迴方式建立子欄位。

聯集欄位 index_or_key

index_or_key 只能採用下列其中一種設定:

index

int32

欄位的索引 (如果重複)。

key

string

如果欄位是對應,則傳回 鍵。

OutputConfig

指定 [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours] 結果的目的地。

欄位
data_format

DataFormat

必要欄位。輸出資料格式。

聯集欄位 destination。必要欄位。destination 只能是下列其中一項:
gcs_destination

GcsDestination

要寫入輸出內容的 Google Cloud Storage 位置。

運送地址

運送單一商品 (從任一取件到出貨)每輛車都必須前往其中一個上車地點 (並視情況調降空間) 至貨運地點,才能順利將貨物視為出貨。

欄位
display_name

string

使用者定義的運送顯示名稱。長度上限為 63 個半形字元,可以使用 UTF-8 字元。

pickups[]

VisitRequest

與出貨相關的取貨替代選項組合。如未指定,車輛只需造訪與配送項目對應的地點。

deliveries[]

VisitRequest

與出貨相關的提交替代方案。如未指定,車輛只需造訪與上車地點對應的地點。

load_demands

map<string, Load>

貨物負載 (例如重量、體積、棧板數量等)。圖中的鍵應為用來說明對應負載類型的 ID,最好也包含單位。例如:「weight_kg」、「volume_gallons」、「pallet_count」等。如果指定鍵未顯示在地圖上,則相應的載入項目會視為空值。

allowed_vehicle_indices[]

int32

可能提供這項運送作業的車輛組合。如果留空,所有車輛都可以執行這項作業。車輛會以 ShipmentModelvehicles 清單中的索引提供。

costs_per_vehicle[]

double

指定每輛車出貨時的運費。指定的變數必須包含 EITHER:

  • 等同 costs_per_vehicle_indices 的元素數量。costs_per_vehicle[i] 對應模型的車輛 costs_per_vehicle_indices[i]
  • 與模型中車輛數量相同的元素數量i-th 元素會對應至模型的車輛 #i。

這些費用的單位必須與「penalty_cost」相同,且不得為負數。如果沒有這類費用,請將這個欄位留白。

costs_per_vehicle_indices[]

int32

適用 costs_per_vehicle 的車輛索引。如果為非空白,則元素數量必須與 costs_per_vehicle 相同。車輛索引只能指定一次。如果從costs_per_vehicle_indices中排除車輛,費用為零。

pickup_to_delivery_absolute_detour_limit

Duration

指定從上車到貨運之間的最短路徑等待時間。若有指定,其必須為非負數,且運送必須包含至少一項取貨和送貨服務。

舉例來說,如果從選定的取貨替代服務直接改為配送至所選配送方式,最早需要多久時間才能處理完畢。接著設定 pickup_to_delivery_absolute_detour_limit 會強制執行:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

如果同一運送屬性同時指定了相對和絕對限制,則每個取貨/外送組合使用的限制越多。截至 2017 年 10 月 10 日為止,只有交通時間不需乘車時,系統才會支援繞道時間。

pickup_to_delivery_time_limit

Duration

指定從開始取貨到出貨到貨之間的最長時間。若有指定,其必須為非負數,且運送必須包含至少一項取貨和送貨服務。這不會影響取貨方式,或選擇取貨和送貨的替代地點,以及車輛速度。您可以與最大繞道限制一起指定這項設定:解決方案將遵循這兩種規格。

shipment_type

string

指定「類型」的非空白字串。這項功能可用於定義 shipment_types 之間的不相容或需求 (請參閱 ShipmentModel 中的 shipment_type_incompatibilitiesshipment_type_requirements)。

與單次造訪指定的 visit_types 不同:同一運送的所有取貨/配送都共用相同的 shipment_type

label

string

指定此貨品的標籤。這個標籤會在對應 ShipmentRoute.Visitshipment_label 中回報。

ignore

bool

如果為 true,請略過此出貨作業,但不套用 penalty_cost

如果模型中沒有任何 shipment_type_requirements,則忽略運送會導致驗證錯誤。

我們允許忽略在 injected_first_solution_routesinjected_solution_constraint 執行的運送;解析器會從作業路徑中移除相關的上車/外送造訪記錄。如果 precedence_rules 參照遭到忽略的運送,也會遭到忽略。

penalty_cost

double

如果貨運未完成,則罰金會計入路線總額。如果消費者造訪指定的取件和外送替代品,系統會將出貨視為已完成。費用可用與模型中所有其他費用相關欄位相同的單位表示,且必須為正數。

重要事項:如未指明這項處分,將視為無限期,也就是必須完成出貨。

pickup_to_delivery_relative_detour_limit

double

指定從自取到貨品送達的最短路徑出發時間的最長相對繞路時間。若有指定,其必須為非負數,且運送必須包含至少一項取貨和送貨服務。

舉例來說,如果從選定的取貨替代服務直接改為配送至所選配送方式,最早需要多久時間才能處理完畢。接著設定 pickup_to_delivery_relative_detour_limit 會強制執行:

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

如果同一運送屬性同時指定了相對和絕對限制,則每個取貨/外送組合使用的限制越多。截至 2017 年 10 月 10 日為止,只有交通時間不需乘車時,系統才會支援繞道時間。

載入

開車時,如果車輛是自行取餐,系統可能會將預先定義的金額計入車資中;如果為外送車輛,則資訊會扣除。此訊息定義了這類金額。詳情請參閱《load_demands》。

欄位
amount

int64

執行相應造訪記錄的車輛負載量有所不同。由於為整數,建議使用者選擇適當的單位,以免喪失精確度。必須大於 0。

VisitRequest

可要求搭乘由車輛完成的造訪要求:有地理位置 (或兩個如下所示)、以時間範圍表示的開業和打烊時間,以及服務持續時間 (車輛抵達上車或下車後花費的時間)。

欄位
arrival_location

LatLng

執行這個 VisitRequest 時,車輛抵達的地理位置。如果運送模型包含持續時間距離矩陣,則不得指定 arrival_location

arrival_waypoint

Waypoint

執行這個 VisitRequest 時,車輛抵達的路線點。如果運送模型包含持續時間距離矩陣,則不得指定 arrival_waypoint

departure_location

LatLng

完成這個 VisitRequest 後車輛出發的地理位置。如果與 arrival_location 相同,則可省略。如果運送模型包含持續時間距離矩陣,則不得指定 departure_location

departure_waypoint

Waypoint

完成這個 VisitRequest 後車輛出發的路線點。如果與 arrival_waypoint 相同,則可省略。如果運送模型包含持續時間距離矩陣,則不得指定 departure_waypoint

tags[]

string

指定造訪要求中附加的標記。字串不得留空或重複。

time_windows[]

TimeWindow

限製造訪時的抵達時間的時間範圍。請注意,車輛可能會於抵達時間之外出發,也就是說,抵達時間 + 所需時間不一定要在時間範圍之內。如果車輛在 TimeWindow.start_time前抵達,就需要等待時間。

如果缺少 TimeWindow,表示車輛可隨時執行這項造訪。

時段不得不連貫,也就是說,時間範圍不得與其他時段重疊或相鄰,而且必須依遞增順序排列。

只有單一時段才能設定 cost_per_hour_after_soft_end_timesoft_end_time

duration

Duration

造訪所需時間,例如車輛抵達和離開之間經過的時間 (可計入可能的等待時間;請參閱 time_windows)。

cost

double

針對車輛路線提出造訪要求的費用。這可以用來針對每次取貨或配送的替代品項支付不同的費用。這個費用的單位必須與「Shipment.penalty_cost」相同,且不得為負數。

load_demands

map<string, Load>

這項造訪要求的載入要求。這與 Shipment.load_demands 欄位類似,差別在於其只會套用至這個 VisitRequest,而非整個 Shipment。這裡列出的要求已納入 Shipment.load_demands 中列出的需求。

visit_types[]

string

指定造訪的類型,這可分配車輛完成這項造訪所需的時間 (請參閱 Vehicle.extra_visit_duration_for_visit_type)。

一個類型只能出現一次。

label

string

指定這個「VisitRequest」的標籤。在回覆中,這個標籤會在對應的 ShipmentRoute.Visit 中回報為 visit_label

ShipmentModel

運送模型包含一組必須由一組車輛行駛的貨運,並盡可能降低整體成本,亦即以下各項的總和:

  • 車輛路線的費用 (所有車輛的總交通時間、平均交通時間、固定費用)。
  • 導致貨物延遲情形
  • 運送作業全球作業期間的成本
欄位
shipments[]

Shipment

必須在模型中執行的一組貨運組合。

vehicles[]

Vehicle

可用來進行造訪的車輛組合。

global_start_time

Timestamp

模型的全球開始時間和結束時間:超出範圍的時間一律視為有效。

模型的時間範圍必須少於一年,即 global_end_timeglobal_start_time 彼此不得超過 31536000 秒。

使用 cost_per_*hour 欄位時,建議您將這個時間範圍設為較短的間隔,藉此提升成效 (例如,如果為一天建立作業,請將全域時間限制設為該日)。如未設定,1970 年 1 月 1 日 00:00:00 (世界標準時間) 將預設為 0,nanos: 0。

global_end_time

Timestamp

如未設定,1971 年 1 月 1 日世界標準時間 00:00:00 (也就是秒數:31536000,nanos: 0) 會做為預設值。

global_duration_cost_per_hour

double

「全球時間長度」是指所有車輛最早生效開始時間與最晚有效結束時間之間的差距。舉例來說,使用者可以為該數量設定每小時費用,以針對最快完成的工作進行最佳化。這個費用的單位必須與 Shipment.penalty_cost 相同。

duration_distance_matrices[]

DurationDistanceMatrix

指定模型中使用的持續時間和距離矩陣。如果這個欄位空白,系統會根據 use_geodesic_distances 欄位的值,改用 Google 地圖或測地距離。如果留空,use_geodesic_distances 不得為 true,duration_distance_matrix_src_tagsduration_distance_matrix_dst_tags 都不得留空。

使用範例:

  • 其中有兩個位置:locA 和 locB。
  • 1 輛車從 locA 開始行駛,並於 locA 結束。
  • 1 個位於 locB 的取件造訪要求。
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • 其中有三個位置:locA、locB 和 locC。
  • 1 輛車透過「快速」矩陣,從 locA 開始行駛路線,並於 locB 結束。
  • 1 輛車以 locB 開始路線,並於 locB 結束,使用矩陣「慢速」。
  • 1 輛車以 locB 起點開始路線,並使用「快速」矩陣於 locB 結束。
  • 1 個位於 locC 的取貨要求。
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

定義時間長度和距離矩陣來源的標記;duration_distance_matrices(i).rows(j) 會在矩陣 i 中,定義從代碼 duration_distance_matrix_src_tags(j) 到其他造訪地點的持續時間和距離。

標記會對應至 VisitRequest.tagsVehicle.start_tags。指定的 VisitRequestVehicle 必須與這個欄位中的一個標記完全相符。請注意,Vehicle 的來源、目的地和矩陣標記可能相同;VisitRequest 的來源和目的地標記也可能相同。所有標記都必須不同,且不得為空白字串。如果這個欄位非空白,則 duration_distance_matrices 不得留空。

duration_distance_matrix_dst_tags[]

string

定義時間長度和距離矩陣目的地的標記;duration_distance_matrices(i).rows(j).durations(k) (回覆duration_distance_matrices(i).rows(j).meters(k)) 矩陣 i. 使用標記 duration_distance_matrix_src_tags(j),以標記 duration_distance_matrix_dst_tags(k) 的方式,指出行程從造訪到造訪的持續時間 (以距離為準)。

標記會對應至 VisitRequest.tagsVehicle.start_tags。指定的 VisitRequestVehicle 必須與這個欄位中的一個標記完全相符。請注意,Vehicle 的來源、目的地和矩陣標記可能相同;VisitRequest 的來源和目的地標記也可能相同。所有標記都必須不同,且不得為空白字串。如果這個欄位非空白,則 duration_distance_matrices 不得留空。

transition_attributes[]

TransitionAttributes

已新增至模型的轉場屬性。

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

不相容的 shipping_types 組合 (請參閱 ShipmentTypeIncompatibility)。

shipment_type_requirements[]

ShipmentTypeRequirement

一組 shipment_type 要求 (請參閱 ShipmentTypeRequirement)。

precedence_rules[]

PrecedenceRule

必須在模型中強制執行的優先順序規則組合。

max_active_vehicles

int32

限制可運作的車輛數量上限。如果路線至少執行一次貨運,表示車輛正在行駛中。當車隊少於車輛,且車隊屬於異質時,這項功能可用來限制路線數量。最佳化功能會選擇最適合使用的車輛組合。必須是正數。

DurationDistanceMatrix

指定從造訪、車輛起點位置和車輛終點位置之間的時間長度和距離矩陣。

欄位
rows[]

Row

指定時間長度和距離矩陣的資料列。必須包含與 ShipmentModel.duration_distance_matrix_src_tags 一樣的元素數量。

vehicle_start_tag

string

定義這個持續時間和距離矩陣適用的車輛的標記。如果為空白,表示適用於所有車輛,且只能有一個矩陣。

每輛車起點都必須與一個矩陣相符,也就是說,只有其中一個 start_tags 欄位必須與矩陣的 vehicle_start_tag (且僅限該矩陣) 相符。

所有矩陣都必須有不同的 vehicle_start_tag

指定時間長度和距離矩陣的資料列。

欄位
durations[]

Duration

指定資料列的持續時間值。必須包含與 ShipmentModel.duration_distance_matrix_dst_tags 一樣的元素數量。

meters[]

double

特定資料列的距離值。如果沒有費用或限制是指模型中的距離,則可留空;否則,其元素數量必須與 durations 一樣多。

PrecedenceRule

兩個事件之間的優先順序規則 (每個事件均為取貨或貨件交付):「第二個」事件的開始日期至少要在「第一個」後 offset_duration已開始。

不過,有些優先順序可代表相同 (或相關) 事件,例如:「商品到貨後取貨」和「C 從 取件 B 發生時取貨」。

此外,只有在兩項運送作業都發生時,優先順序才會套用,其他作業則遭到忽略。

欄位
first_is_delivery

bool

表示是否為「第一個」就是一項外送服務

second_is_delivery

bool

表示是否為「秒」就是一項外送服務

offset_duration

Duration

「第一個」值之間的偏移和「second」活動。可以是負值。

first_index

int32

「第一個」的運送索引活動。必須指定此欄位。

second_index

int32

「第二」的運送索引活動。必須指定此欄位。

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。

放大,以下是 TransitionVisit 期間會發生的情況:

---+-------------------------------------+-----------------------------+-->
   |           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

最後,以下是旅客在過渡期間安排旅遊行程、休息時間、誤點和等待時間的方法。

  • 不會重疊。
  • 延遲是獨一無二的,且必須在下次造訪或車輛終點之前的連續一段時間。因此,您可以從中瞭解延遲時間的開始和結束時間。
  • 中斷期間是連續、不重疊的時間。回應會指定每個廣告插播的開始時間和持續時間。
  • 「旅遊」和「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

int32

執行路線的車輛,由來源 ShipmentModel 中的索引識別。

vehicle_label

string

執行這條路線的車輛標籤,等於 ShipmentModel.vehicles(vehicle_index).label (如有指定)。

vehicle_start_time

Timestamp

車輛開始行駛的時間。

vehicle_end_time

Timestamp

車輛完成路線的時間。

visits[]

Visit

代表路線的已排序造訪序列。Visit [i] 是路線中的第 i 次造訪。如果這個欄位空白,系統會將車輛視為未使用。

transitions[]

Transition

路線的轉換已排序清單。

has_traffic_infeasibilities

bool

如果將 OptimizeToursRequest.consider_road_traffic 設為 true,這個欄位表示路線時間不一致,是根據路況估算的交通時間來預測。無論是第一次造訪前後、首次造訪前或上次造訪後,時間都可能不足以完成按照車流量調整的交通、延誤和休息時間,但這仍會滿足親臨門市需求和車輛的時效。例如:

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

因為路況的關係,預估的交通時間增加 travel_duration(previous_visit, next_visit),因此抵達 next_visit 的機率可能會晚於目前的時間範圍。此外,交通時間預估值和造訪/休息時間限制都增加,可能因而迫使休息時間與造訪地點重疊。

route_polyline

EncodedPolyline

路線的編碼折線表示法。只有在 OptimizeToursRequest.populate_polylines 設為 True 時,系統才會填入這個欄位。

breaks[]

Break

為行駛這條路線的車輛安排了休息時間。breaks 序列代表時間間隔,每個時間間隔從對應的 start_time 開始,持續 duration 秒。

metrics

AggregatedMetrics

這條路線的時長、距離和載入指標。系統會根據結構定義,為所有 ShipmentRoute.transitionsShipmentRoute.visits 欄位加總 AggregatedMetrics 的欄位。

route_costs

map<string, double>

路線費用,按照費用相關要求欄位細分。這些鍵是 proto 路徑,相對於輸入的 OptimizeToursRequest,例如:「model.shipments.pickups.cost」和「模型」的值則為相對應費用欄位產生的總費用,並匯總在整條路線上。換句話說,成本 ["model.shipments.pickups.cost"] 是路線上所有取貨費用的總和。這裡詳細列出模型中定義的所有費用,但 TransitionAttributes 的相關費用除外。這些費用只以 2022 年 1 月的匯總方式呈現。

route_total_cost

double

路線的總費用。費用對應中所有費用的總和。

休息時間

代表廣告插播執行的資料。

欄位
start_time

Timestamp

休息的開始時間。

duration

Duration

休息時間長度。

EncodedPolyline

折線的編碼表示法。如要進一步瞭解折線編碼,請前往:https://developers.google.com/maps/documentation/utilities/polylinealgorithmhttps://developers.google.com/maps/documentation/javascript/reference/geometry#encoding

欄位
points

string

代表折線已編碼點的字串。

轉移

路線上的兩個事件之間轉換。請參閱 ShipmentRoute 的說明。

如果車輛沒有 start_location 和/或 end_location,則相應的旅遊指標為 0。

欄位
travel_duration

Duration

轉換期間的交通時間。

travel_distance_meters

double

在過渡期間移動的距離。

traffic_info_unavailable

bool

如果透過 OptimizeToursRequest.consider_road_traffic 要求流量,且無法擷取 Transition 的流量資訊,該布林值會設為 true。這可能是暫時性的 (在即時流量伺服器中短暫出現),也可能是永久 (沒有這個地點的資料)。

delay_duration

Duration

套用至這個轉換作業的延遲時間長度總和。如有這種情況,延遲時間剛好是發生下一個事件 (造訪或車輛結束) 的 delay_duration 秒前。查看《TransitionAttributes.delay》。

break_duration

Duration

本次移轉期間的廣告插播時間長度總和 (如果有的話)。每個休息時間的開始時間和時間長度詳細資料會儲存在 ShipmentRoute.breaks 中。

wait_duration

Duration

轉換期間的等待時間。等待時間長度對應至閒置時間,且不包含休息時間。另請注意,這個等待時間可能會分成幾個不連續的間隔。

total_duration

Duration

轉換總時間 (為了方便起見)。等於:

  • 下一次造訪 start_time (若這是最後一站轉換,則為 vehicle_end_time) - 此轉場效果的 start_time
  • 如果 ShipmentRoute.has_traffic_infeasibilities 為 false,則還有以下考量項目:`total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`。
start_time

Timestamp

這項轉換作業的開始時間。

route_polyline

EncodedPolyline

轉換期間路徑的編碼折線表示法。只有在 populate_transition_polylines 設為 True 時,系統才會填入這個欄位。

vehicle_loads

map<string, VehicleLoad>

在此轉場期間,車輛會載入該車輛 Vehicle.load_limits 中顯示的每種類型,或是在這條路線上的部分貨運設有非零 Shipment.load_demands

第一個轉場期間的載入是車輛路線的起始載入。接著,視該次造訪是自取或外送,每次造訪後,都會將造訪的 load_demands 相加或減去,以獲得下次轉換的載入。

VehicleLoad

回報特定類型在路線沿途某個點的實際負載 (請參閱 Transition.vehicle_loads)。

欄位
amount

int64

車輛在特定類型的負載量。載入單位通常以類型表示。詳情請參閱《Transition.vehicle_loads》。

前往

在航線中進行造訪。本次造訪對應的是取貨或送貨 Shipment

欄位
shipment_index

int32

來源 ShipmentModel 中的 shipments 欄位索引。

is_pickup

bool

如果造訪為 true,則造訪對應至 Shipment 的取貨。否則對應項目會對應提交內容。

visit_request_index

int32

Shipment 的自取或外送欄位中的 VisitRequest 索引 (請參閱 is_pickup)。

start_time

Timestamp

造訪開始的時間。請注意,車輛可能會在造訪地點之前抵達。時間與 ShipmentModel 一致。

load_demands

map<string, Load>

總造訪載入需求是出貨總和與造訪要求 load_demands。如果造訪是運送,這個值會是負值。系統會針對與 Transition.loads 相同的類型回報要求 (請參見這個欄位)。

detour

Duration

由於商家抵達前路線上的貨物運送,且所需時間會因此導致的可能等待時間,因此需要額外的往返時間。如果是外送服務,則系統會根據對應的上車地點計算行程,並等於:

start_time(delivery) - start_time(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

否則,它是從車輛 start_location 計算而得,等於:

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

對應的 Shipment.label 副本 (如果在 Shipment 中指定)。

visit_label

string

對應的 VisitRequest.label 副本 (如果在 VisitRequest 中指定)。

ShipmentTypeIncompatibility

根據 shipping_type,指定運送項目間的不相容問題。系統會依據不相容模式,限制同一條路線上不相容的運送方式。

欄位
types[]

string

不相容類型的清單。兩件出貨各有不同的 shipment_types 為「不相容」。

incompatibility_mode

IncompatibilityMode

模式套用至不相容。

IncompatibilityMode

定義同一條路線上不相容貨運外觀的限制方式。

列舉
INCOMPATIBILITY_MODE_UNSPECIFIED 未指定相容模式。請一律不要使用這個值。
NOT_PERFORMED_BY_SAME_VEHICLE 在此模式下,如果兩件不相容的運送類型不相容,就無法同一輛車共用。
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

針對兩種不相容的類型隨附 NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY 不相容模式:

  • 如果兩者均為「只能自取 (無法外送) 或外送」(不提供取貨服務),就無法共乘同一輛車。
  • 如果其中一項貨品已出貨,另一個則由使用者自行取件,只要雙方先出貨再收到第二件貨品,雙方就可以共乘。

ShipmentTypeRequirement

依據運送_type 指定貨品之間的相關規定。規定的具體細節是由要求模式所定義。

欄位
required_shipment_type_alternatives[]

string

dependent_shipment_types 要求的替代運送類型清單。

dependent_shipment_types[]

string

凡是 dependent_shipment_types 欄位中具有類型的運送商品,都必須在同一條路線上運送至少一項 required_shipment_type_alternatives 類型的貨品。

注意:系統不允許 shipment_type 依附於自身的需求鏈結。

requirement_mode

RequirementMode

為需求套用的模式。

RequirementMode

定義路線上相依運送方式的模式。

列舉
REQUIREMENT_MODE_UNSPECIFIED 未指定需求模式。請一律不要使用這個值。
PERFORMED_BY_SAME_VEHICLE 在這個模式下,所有「相依」貨運項目必須至少與一項「必要」同一輛車共用出貨。
IN_SAME_VEHICLE_AT_PICKUP_TIME

使用 IN_SAME_VEHICLE_AT_PICKUP_TIME 模式時,所有「相依」出貨商品至少須有一項「必填」屬性商品於取貨時出貨。

一個「相依」因此,貨運公司必須符合下列條件:

  • 「必填」僅供遞送出貨後送達交貨地址,或
  • 「必要」優先配送服務,若「必填」貨品已出貨,且此貨品交付必須在「相依」之後執行送貨到店取貨。
IN_SAME_VEHICLE_AT_DELIVERY_TIME 與以往相同,但「相依」運送項目必須具備「必填」屬性商品在交貨時出貨。

SkippedShipment

指定解決方案中未執行出貨作業的詳細資料。如果是常見情況,且/或如果能夠找出造成略過的原因,我們就會在這裡回報原因。

欄位
index

int32

這個索引對應到來源 ShipmentModel 中的運送索引。

label

string

對應的 Shipment.label 副本 (如果在 Shipment 中指定)。

reasons[]

Reason

說明略過出貨的原因。請參閱 Reason 上方的註解。

原因

如果我們可以說明略過出貨的原因,即可在此處列出原因。如果所有車輛的原因都不相同,則 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 輛車 (含第 1 輛車),但至少要有一輛車的「梨子」將超出上限 (包括車輛 3),且至少將超出一輛車的距離限制 (包括車輛 1)。

欄位
code

Code

請參閱程式碼的註解。

example_exceeded_capacity_type

string

如果原因代碼為 DEMAND_EXCEEDS_VEHICLE_CAPACITY,表示已超過一種容量類型。

example_vehicle_index

int32

如果原因與貨運車輛不相容,這個欄位會提供一輛相關車輛的索引。

程式碼

指出原因類型的代碼。這裡的順序沒有任何意義。請特別注意,如果兩個條件都符合,標準無法判斷解決方案中的某個原因是否會顯示在另一個解決方案的前面。

列舉
CODE_UNSPECIFIED 請一律不要使用這個值。如果我們無法確定略過貨品的原因,只會傳回一組空白的原因。
NO_VEHICLE 這個模特兒沒有車輛導致所有商品無法運送。
DEMAND_EXCEEDS_VEHICLE_CAPACITY 運送需求超過車輛對某些容量類型的上限,例如 example_exceeded_capacity_type
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

執行這項出貨作業所需的最短距離,亦即從車輛的 start_location 到貨運的上車和/或送貨地點,以及車輛終點位置超過車輛的 route_distance_limit

請注意,我們進行這項運算時會使用測地距離。

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

執行這項送貨作業所需的最短時間,包括交通時間、等待時間和服務時間超過車輛的 route_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 欄位不是空的,且該車輛不屬於此車輛。

TimeWindow

時間範圍會限制事件的時間,例如造訪時的抵達時間,或是車輛的開始和結束時間。

硬時間範圍邊界 (start_timeend_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_timeend_timesoft_start_timesoft_end_time 應在全球時間限制內 (請參閱 ShipmentModel.global_start_timeShipmentModel.global_end_time),並應遵守下列規定:

  0 <= `start_time` <= `soft_start_time` <= `end_time` and
  0 <= `start_time` <= `soft_end_time` <= `end_time`.
欄位
start_time

Timestamp

硬性時間範圍開始時間。如果未指定,則會設為 ShipmentModel.global_start_time

end_time

Timestamp

硬性時間範圍結束時間。如果未指定,則會設為 ShipmentModel.global_end_time

soft_start_time

Timestamp

時間範圍的正規開始時間。

soft_end_time

Timestamp

時間範圍的虛假結束時間。

cost_per_hour_before_soft_start_time

double

如果事件發生在 soft_start_time 之前,會增加模型中其他費用的每小時費用,計算方式如下:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

費用必須為正數,而且必須先設定 soft_start_time,才能設定這個欄位。

cost_per_hour_after_soft_end_time

double

如果事件發生在 soft_end_time 之後,則模型中其他費用的每小時費用,計算方式如下:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

費用必須為正數,且只有在已設定 soft_end_time 的情況下才能設定這個欄位。

TransitionAttributes

指定路線上兩次連續造訪之間的轉換屬性。同一轉換可能有幾個 TransitionAttributes:在這種情況下,所有額外費用都會增加,且須遵守最嚴格的限製或限制 (遵循自然「AND」語意)。

欄位
src_tag

string

定義一組 (src->dst) 轉場效果的標記,會套用至這些屬性。

如果 VisitRequest.tagsVehicle.start_tags 包含 src_tag 或不含 excluded_src_tag (視這兩個欄位中的哪一個非空白),即可視為來源造訪或車輛起點相符。

excluded_src_tag

string

詳情請參閱 src_tagsrc_tagexcluded_src_tag 中不得空白。

dst_tag

string

如果目的地或車輛的 VisitRequest.tagsVehicle.end_tags 包含 dst_tag 或不含 excluded_dst_tag (視這兩個欄位中的哪一個非空白),就會符合目的地或車輛終點。

excluded_dst_tag

string

詳情請參閱 dst_tagdst_tagexcluded_dst_tag 中不得空白。

cost

double

指定執行這項轉換作業的費用。這與模型中的所有其他費用相同,不得為負數。此額度適用於所有其他現有費用。

cost_per_kilometer

double

指定執行這個轉場時,每公里的移動距離。加總在車輛上指定的 Vehicle.cost_per_kilometer 最多。

distance_limit

DistanceLimit

指定執行這次轉換時的移動距離上限。

自 2021 年 6 月起,系統僅支援非強制性限制。

delay

Duration

指定執行這項轉換作業時會產生的延遲。

這類延遲是指在完成來源造訪「之後」,以及開始目的地造訪「之前」

車輛

模擬運送問題中的車輛。解決運送問題時,系統會建立從 start_location開始到 end_location 這輛車的路線。路線是指一連串的造訪記錄 (請參閱 ShipmentRoute)。

欄位
display_name

string

使用者定義的車輛顯示名稱。長度上限為 63 個半形字元,可以使用 UTF-8 字元。

travel_mode

TravelMode

交通方式會影響車輛可使用的道路和速度。另請參閱 travel_duration_multiple

start_location

LatLng

車輛在接受任何貨物前開始的地理位置。如未指定,車輛會在第一次上車時開始。如果運送模型包含時間長度和距離矩陣,則不得指定 start_location

start_waypoint

Waypoint

路線點代表車輛在接受任何貨物前開始的地理位置。如果未指定 start_waypointstart_location,車輛會在首次上車時開始。如果運送模型包含時間長度和距離矩陣,則不得指定 start_waypoint

end_location

LatLng

車輛在最後一次完成 VisitRequest 後結束的地理位置。如未指定,車輛的 ShipmentRoute 會在車輛完成最後一個 VisitRequest 時立即結束。如果運送模型包含時間長度和距離矩陣,則不得指定 end_location

end_waypoint

Waypoint

路線點代表車輛在最後一次完成 VisitRequest 後結束的地理位置。如果未指定 end_waypointend_location,車輛的 ShipmentRoute 會在最後一次完成 VisitRequest 時立即結束。如果運送模型包含時間長度和距離矩陣,則不得指定 end_waypoint

start_tags[]

string

指定車輛路線起點所附加的標記。

字串不得留空或重複。

end_tags[]

string

指定車輛路線終點的標記。

字串不得留空或重複。

start_time_windows[]

TimeWindow

車輛可能駛離起點的時間範圍。必須在全球時間限制內 (請參閱 ShipmentModel.global_* 欄位)。如果未指定,則除了全域時間限制以外,其他時間限制也沒有限制。

屬於相同重複欄位的時間範圍必須不連貫,也就是說,時間範圍不得與其他時段重疊或相鄰,而且必須依時間順序排列。

只有單一時段才能設定 cost_per_hour_after_soft_end_timesoft_end_time

end_time_windows[]

TimeWindow

車輛可能抵達終點的時間範圍。必須在全球時間限制內 (請參閱 ShipmentModel.global_* 欄位)。如果未指定,則除了全域時間限制以外,其他時間限制也沒有限制。

屬於相同重複欄位的時間範圍必須不連貫,也就是說,時間範圍不得與其他時段重疊或相鄰,而且必須依時間順序排列。

只有單一時段才能設定 cost_per_hour_after_soft_end_timesoft_end_time

unloading_policy

UnloadingPolicy

已對車輛強制執行卸載政策。

load_limits

map<string, LoadLimit>

車輛容量 (例如重量、體積、棧板數量)。對應中的鍵是載入類型的 ID,與 Shipment.load_demands 欄位的鍵一致。如果這張對應中沒有指定索引鍵,相應的容量會視為無限制。

cost_per_hour

double

車輛費用:所有費用都會加總,且必須與 Shipment.penalty_cost 位於同一單位。

車輛路線的每小時費用。這筆費用適用於該路線總共花費的時間,而且包含交通時間、等待時間和造訪時間。使用 cost_per_hour 而非僅使用 cost_per_traveled_hour 可能會產生額外的延遲時間。

cost_per_traveled_hour

double

車輛路線的每行駛時數。這筆費用僅適用於該路線 (也就是在 ShipmentRoute.transitions 回報) 行經的交通時間,且不包含等待時間和造訪時間。

cost_per_kilometer

double

車輛路線的每公里費用。這筆費用適用於 ShipmentRoute.transitions 中回報的距離,不適用於從 arrival_location 間接行駛到單一 VisitRequestdeparture_location 的任何距離。

fixed_cost

double

使用此車輛處理貨物時須支付的固定費用。

used_if_route_is_empty

bool

這個欄位僅適用於車輛路線不提供任何貨運時。用於說明車輛是否應視為「二手」或在這個案例中否。

如果設為 true,即使車輛不提供任何貨物,車輛也會從起點移動到終點 -->

否則,它不會從起點行駛至終點,且這輛車沒有 break_rule 或誤點 (從 TransitionAttributes) 的時程。在這種情況下,車輛的 ShipmentRoute 不含任何車輛索引和標籤以外的任何資訊。

route_duration_limit

DurationLimit

這個限制適用於車輛路線的總行車時間。在指定的 OptimizeToursResponse 中,車輛的路徑持續時間是指 vehicle_end_timevehicle_start_time 之間的時間差。

travel_duration_limit

DurationLimit

這個限制適用於車輛路線的交通時間。在指定的 OptimizeToursResponse 中,路線行駛時間是所有 transitions.travel_duration 的總和。

route_distance_limit

DistanceLimit

限制適用於車輛路線的總距離。在指定的 OptimizeToursResponse 中,路線距離是其所有 transitions.travel_distance_meters 的總和。

extra_visit_duration_for_visit_type

map<string, Duration>

指定 Visit_types 字串到時間長度的對應。時間長度除了 VisitRequest.duration 以外,還達到指定 visit_types 時所需的時間長度。若指定 cost_per_hour,延長造訪時間會使費用增加。金鑰 (即 visit_types) 不得為空白字串。

如果造訪要求包含多個類型,地圖中會為每個類型加入持續時間。

break_rule

BreakRule

說明這輛車要強制執行的休息時間表。如果留空,這輛車就不會安排休息時間。

label

string

指定這輛車的標籤。在回覆中會回報這個標籤為對應 ShipmentRoutevehicle_label

ignore

bool

如果設為 true,used_if_route_is_empty 就必須為 false,且這輛車不會使用。

如果 injected_first_solution_routes 中遭忽略的車輛執行了運送,第一個解決方案會略過該貨品,但在回應中可免費執行。

如果貨物在 injected_solution_constraint 中受忽略的車輛執行,且任何相關上車/配送服務限制在車上 (也就是非寬鬆到第 RELAX_ALL_AFTER_THRESHOLD 級),回應中會略過該車輛。如果運送的 allowed_vehicle_indices 欄位為非空白,且系統忽略所有允許的車輛,系統就會在回應中略過該商品。

travel_duration_multiple

double

指定乘數,可用來增加或減少這輛車的交通時間。舉例來說,如果將這個項目設定為 2.0,就代表這輛車的行駛速度較慢,而且交通時間是一般車輛的兩倍。(多次不會影響造訪時間長度)。如果指定 cost_per_hourcost_per_traveled_hour,費用就會受到影響。必須介於 [0.001, 1000.0] 之間。如未設定,車輛為標準車輛,系統會將此倍數視為 1.0。

警告:套用這個數倍數後,交通時間會四捨五入至最接近的秒數,但在執行任何數值運算之前,整數值可能會導致精確度降低。

另請參閱下方的 extra_visit_duration_for_visit_type

DurationLimit

用來定義車輛路線最長行駛時間的限制。挑戰可以是困難或輕微。

定義軟性上限欄位後,必須同時定義非強制性上限及相關費用。

欄位
max_duration

Duration

硬性限制會將時間長度限制在 max_duration 內。

soft_max_duration

Duration

非強制執行時間限制並未強制執行時間長度上限,而違反時路徑會產生費用。這筆費用會與模型中定義的其他費用相加,且單位相同。

如果已定義,soft_max_duration 必須為非負數。如果一併定義 max_duration,soft_max_duration 必須小於 max_duration。

quadratic_soft_max_duration

Duration

非強制執行的持續時間上限並未強制執行時間上限,但如果違反,路徑會在這段時間內產生二次費用。這筆費用會與模型中定義的其他費用相加,且單位相同。

如果已定義,quadratic_soft_max_duration 必須為非負數。如果也定義了 max_duration,則 quadratic_soft_max_duration 必須小於 max_duration,且差值不得超過一天:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

違反 soft_max_duration 門檻會產生的每小時費用。如果時間長度低於門檻,則額外費用為 0,否則費用取決於持續時間,方法如下:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

費用必須為正數。

cost_per_square_hour_after_quadratic_soft_max

double

違反 quadratic_soft_max_duration 門檻時產生的每平方小時費用。

如果時間長度低於門檻,則額外費用為 0,否則費用取決於持續時間,方法如下:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

費用必須為正數。

LoadLimit

定義套用至車輛的負載限制,例如「這輛卡車只能承載 3500 公斤」。詳情請參閱《load_limits》。

欄位
soft_max_load

int64

對負載的輕微限制。詳情請參閱《cost_per_unit_above_soft_max》。

cost_per_unit_above_soft_max

double

如果車輛沿途的負載量超過 soft_max_load,須支付以下的罰金 (每輛車一次):(載入 - soft_max_load) * cost_per_unit_above_soft_max。所有費用都會增加,且必須與 Shipment.penalty_cost 位於相同的單位。

start_load_interval

Interval

路線起點的可接受的負載間隔。

end_load_interval

Interval

路線終點的車輛可接受的負載間隔。

max_load

int64

可接受的負載量上限。

時間間隔

可接受的負載量的時間間隔。

欄位
min

int64

可接受的最低負載。必須大於 0。如果同時指定兩者,min 值必須 ≤ max

max

int64

可接受的負載上限。必須大於 0。如果未指定,則此訊息不會限制載入量上限。如果同時指定兩者,min 值必須 ≤ max

TravelMode

車輛可使用的交通方式。

這些應屬於 Google 地圖平台路徑首選 API 交通模式的子集,詳情請參閱:https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode

列舉
TRAVEL_MODE_UNSPECIFIED 未指定交通方式,相當於 DRIVING
DRIVING 與行車路線 (汽車、...) 對應的交通模式。
WALKING 與步行路線對應的交通模式。

UnloadingPolicy

車輛卸載方式相關政策。僅適用於提供自取和外送的出貨商品。

其他商品在路線上的任何地點皆可自由運送,與 unloading_policy 無關。

列舉
UNLOADING_POLICY_UNSPECIFIED 未指定卸載政策;配送服務只能安排在相應的上車地點後完成。
LAST_IN_FIRST_OUT 貨品必須按取貨順序反向排序
FIRST_IN_FIRST_OUT 配送訂單的訂單必須與取貨地點相同

途經點

封裝路線控點。路線控點會標示 VisitRequests 的抵達和出發地點,以及車輛的起點和終點。

欄位
side_of_road

bool

選用設定。表示這個路線控點的位置是用來指定車輛在特定側面停靠的位置。設定這個值後,路線就會通過位置,這樣車輛就能在道路側停靠,該位置是從道路中心偏離位置。這個選項不適用於「WALKING」交通方式。

聯集欄位 location_type。以不同方式表示地點。location_type 只能是下列其中一項:
location

Location

使用地理座標指定的點,包含選擇性的方向。

place_id

string

與路線控點相關聯的搜尋點地點 ID。