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 的上車或外送服務。

我們的目標是提供 ShipmentRouteVehicle,並讓所有 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

產生車輛休息時間 (例如午休時間) 的規則。「休息時間」是指車輛在目前位置保持閒置狀態且無法進行任何造訪的連續時間範圍。可能會發生下列狀況:

  • 在兩次造訪間來回移動的期間 (包括造訪前後的等待時間,但不在造訪中途),此時,您便可延長訪客兩次造訪之間的相應運送時間。
  • 或車輛開始之前 (車輛不得在休息中開始),這樣就不會影響車輛的開始時間。
  • 或車輛結束後 (Ditto,車輛結束時間)。
欄位
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 欄位。如果要求中的貨物或車輛索引在解決方案建立後有所變更,就可使用這個屬性,或許是因為貨物或車輛已從要求中移除或新增。

如果設為「是」,以下類別的標籤最多只能出現一次:

如果插入解決方案中的 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

如果設定了這個值,該要求便會有最多 60 分鐘的期限 (請參閱 https://grpc.io/blog/deadlines)。否則,期限最長只有 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

縮短傳回的驗證錯誤數量。除非 solving_mode=VALIDATE_ONLY:查看 OptimizeToursResponse.validation_errors 欄位,否則這類錯誤通常會以 BadRequest 錯誤詳細資料的形式附加在 INVALID_並進行 錯誤酬載 (https://cloud.google.com/apis/design/errors#error_details)。預設值為 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

為每個車輛計算的路線, i-th 路線對應到模型中的 i-th 交通工具。

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>

解決方案的費用,按照費用相關要求欄位細分。索引鍵是相對於輸入最佳化工具 ToursRequest 的 proto 路徑 (例如「model.shipments.pickups.cost」),值則是對應費用欄位產生的總費用,並匯總到整個解決方案的資料。換句話說,cost["model.shipments.pickups.cost"] 是解決方案的所有取貨費用總和。這裡會列出模型定義的所有費用,但截至 2022 年 1 月為止,僅以匯總方式回報 TransitionAttributes 相關費用的情況除外。

total_cost

double

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

OptimizeToursValidationError

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

欄位
code

int32

驗證錯誤是由一直顯示的組合 (codedisplay_name) 定義。

其他欄位 (下方) 則提供與錯誤相關的更多內容。

多個錯誤:如有多個錯誤,驗證程序會嘗試輸出多個錯誤。與編譯器非常類似,這是不完美的過程。部分驗證錯誤屬於「嚴重」問題,這表示會停止整個驗證程序。這種情況包括 display_name="UNSPECIFIED" 錯誤等。有些錯誤會導致驗證程序略過其他錯誤。

穩定性codedisplay_name 應非常穩定。但新的代碼和顯示名稱可能會隨著時間而出現,這可能會造成指定 (無效) 要求傳回不同的 (codedisplay_name) 組合,這是因為新錯誤會隱藏舊的錯誤 (請參閱「多個錯誤」)。

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

  • UNSPECIFIED = 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_sec_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_DESTINATION_TAGS = 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 = 3305;
    • 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_Repository_HOUR = 3807;
    • DURATION_LIMIT_COST_PER_STORAGE_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 件的第一件取貨:

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

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

error_message

string

使用者容易理解的錯誤說明字串。codeerror_message 之間有 1:1 的對應 (當程式碼 != "UNSPECIFIED 時)。

STABILITY:不穩定:與特定 code 相關聯的錯誤訊息可能會隨時間變動 (希望進一步說明)。請改用 display_namecode

offending_values

string

可能包含欄位的值。但不一定每次都適用。這個 API 僅供手動模型偵錯使用,絕對不然。

FieldReference

指定驗證錯誤的背景資訊。FieldReference 一律是指這個檔案中的特定欄位,並採用相同的階層結構。舉例來說,我們可以使用以下方式指定 start_time_windows 交通工具 #5 的元素 #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

指定每輛車出貨時產生的費用。如有指定,則必須具備以下條件:

  • 元素數量與 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 月起,只有在未以車輛屬性為依據的行程期間,系統才會支援改道活動。

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 月起,只有在未以車輛屬性為依據的行程期間,系統才會支援改道活動。

載入

進行巡訪時,如果為上車地點,系統可能會將預先定義的金額加為自動載客量,如果送貨則會扣除。這類訊息的數量。查看《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 的標籤。這個標籤會在回應中回報為 visit_label,在對應的 ShipmentRoute.Visit 中。

ShipmentModel

貨運模型包含一組由一組車輛運作的貨物,同時將總成本降到最低,亦即下列項目的總和:

  • 車輛路線費用 (所有車輛的每趟航程費用總和、每趟交通時間的費用和固定費用)。
  • 未履行的出貨懲處。
  • 全球貨運作業持續時間的費用
欄位
shipments[]

Shipment

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

vehicles[]

Vehicle

用於進行巡訪的車組。

global_start_time

Timestamp

模型的全域開始和結束時間:如果範圍超出這個範圍,就無法視為有效。

模型的時間範圍必須小於一年,也就是 global_end_timeglobal_start_time 相距不得超過 31536000 秒。

使用 cost_per_*hour 欄位時,建議您縮小時間間隔,藉此提升效能 (例如,如果模擬單一日,則應將全域時間限制設為當天)。如未設定,系統會預設使用世界標準時間 00:00:00 (世界標準時間),1970 年 1 月 1 日 (亦即秒數: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) 定義了持續時間,以及帶有 duration_distance_matrix_src_tags(j) 標記的造訪與矩陣 i 中其他造訪的距離。

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

duration_distance_matrix_dst_tags[]

string

定義持續時間和距離矩陣目的地的代碼;duration_distance_matrices(i).rows(j).durations(k) (resp. 使用 duration_distance_matrix_src_tags(j) 標記 duration_distance_matrix_dst_tags(k) 的造訪,duration_distance_matrices(i).rows(j).meters(k)) 定義從造訪到造訪所經過的時間 (距離距離),矩陣 i 中的標記 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開始。

有多個優先順序可指相同 (或相關的) 事件,例如:「B 點取餐後發生」和「到 A 點上車後進行 C 取貨」。

此外,優先順序只會在這兩件出貨時套用,否則會遭到忽略。

欄位
first_is_delivery

bool

指出「第一個」事件是否為提交事件。

second_is_delivery

bool

表示「second」事件是否為提交。

offset_duration

Duration

「第一個」和「秒」事件之間的偏移值。可以是負數。

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

最後,以下是轉換期間的旅遊、BREAK、延遲和 WAIT 方法。

  • 不會重疊。
  • 延遲是唯一的,而且必須是下次造訪 (或車輛結束) 前的連續時段。如此一來,您就能得知延遲時間的延遲時間和結束時間。
  • BREAKS 是連續且不重疊的時段。回應會指定每個廣告插播的開始時間和持續時間。
  • 旅遊和 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

代表路線的一連串造訪。訪客 [i] 是指路線中的第 1 次造訪。如果這個欄位空白,系統會將車輛視為未使用。

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

這條路線的行車時間、距離和負載指標。視情境而定,AggregatedMetrics 的欄位會在所有 ShipmentRoute.transitionsShipmentRoute.visits 上進行加總。

route_costs

map<string, double>

路線費用,按照費用相關要求欄位細分。索引鍵是相對於輸入最佳化工具 ToursRequest 的 proto 路徑 (例如「model.shipments.pickups.cost」),值則是對應費用欄位產生的總費用,並經過整條路線匯總。換句話說,cost["model.shipments.pickups.cost"] 是航線的所有上車費用總和。這裡會列出模型定義的所有費用,但截至 2022 年 1 月為止,僅以匯總方式回報 TransitionAttributes 相關費用的情況除外。

route_total_cost

double

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

休息一下

代表休息時間執行的資料。

欄位
start_time

Timestamp

休息片刻的開始時間。

duration

Duration

休息的時間長度。

EncodedPolyline

折線的編碼表示法。如要進一步瞭解折線編碼,請參閱:https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://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 中已指定相應 Shipment.label 的副本。

visit_label

string

VisitRequest 中已指定相應 VisitRequest.label 的副本。

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

根據 shipping_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 中已指定相應 Shipment.label 的副本。

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)、至少一部車輛的「梨子」容量超過一個車輛 (包括車輛 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_tag》。src_tagexcluded_src_tag 只能擇一為必填欄位。

dst_tag

string

如果目的地造訪或車輛結束的 VisitRequest.tagsVehicle.end_tags 包含 dst_tag 或不含 excluded_dst_tag (視這兩個欄位的值為非空白),就符合比對目的地或車輛終點。

excluded_dst_tag

string

查看《dst_tag》。dst_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。