ShipmentModel

運送模型包含一組運送作業,必須由一組車輛執行,同時盡可能降低整體成本,也就是下列各項的總和:

  • 車輛路線規劃費用 (所有車輛的總時間費用、行程時間費用和固定費用總和)。
  • 未履行運送的罰則。
  • 運送時間總長度的費用
JSON 表示法
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "objectives": [
    {
      object (Objective)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
欄位
shipments[]

object (Shipment)

必須在模型中執行的運送作業組合。

vehicles[]

object (Vehicle)

可用來執行造訪的一組車輛。

objectives[]

object (Objective)

這個模型的目標組合,我們會將其轉換為費用。如果不是空白,輸入模型必須是免費。如要取得修改後的要求,請使用 solvingMode = TRANSFORM_AND_RETURN_REQUEST。請注意,在這種情況下,要求不會獲得解決。請參閱對應的說明文件。

實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request。

globalStartTime

string (Timestamp format)

模型的全域開始和結束時間:超出這個範圍的時間都視為無效。

模型的時間範圍必須小於一年,也就是說,globalEndTime 和 globalStartTime 之間的差距必須在 31536000 秒內。

使用 cost_per_*hour 欄位時,建議將這個時間範圍設為較短的間隔,以提升效能 (例如,如果您為單日建立模型,則應將全域時間限制設為該日)。如未設定,系統會預設為世界標準時間 1970 年 1 月 1 日 00:00:00 (即秒數:0,奈秒:0)。

使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例:"2014-10-02T15:01:23Z"、"2014-10-02T15:01:23.045123456Z" 或 "2014-10-02T15:01:23+05:30"。

globalEndTime

string (Timestamp format)

如未設定,系統會預設為世界標準時間 1971 年 1 月 1 日 00:00:00 (即秒數:31536000,奈秒:0)。

使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例:"2014-10-02T15:01:23Z"、"2014-10-02T15:01:23.045123456Z" 或 "2014-10-02T15:01:23+05:30"。

globalDurationCostPerHour

number

整體計畫的「全域時間長度」是指所有車輛最早有效開始時間和最晚有效結束時間之間的差距。使用者可以為該數量指定每小時費用,嘗試盡早完成工作。這項費用的單位必須與 Shipment.penalty_cost 相同。

durationDistanceMatrices[]

object (DurationDistanceMatrix)

指定模型中使用的時間長度和距離矩陣。如果這個欄位留空,系統會根據 useGeodesicDistances 欄位的值,改用 Google 地圖或測地線距離。如果不是空白,useGeodesicDistances 不得為 true,且 durationDistanceMatrixSrcTags 和 durationDistanceMatrixDstTags 都不得為空白。

使用範例:

  • 有兩個位置:locA 和 locB。
  • 1 輛車從 locA 出發,並在 locA 結束路線。
  • locB 有 1 項取貨造訪要求。
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    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 結束路線,使用矩陣「fast」。
  • 1 輛車從 locB 出發,並在 locB 結束路線,使用矩陣「slow」。
  • 1 輛車從 locB 出發,並在 locB 結束路線,使用「fast」矩陣。
  • 1 個 locC 的取件造訪要求。
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "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
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "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
    }
  }
}
durationDistanceMatrixSrcTags[]

string

定義時間長度和距離矩陣來源的標記;durationDistanceMatrices(i).rows(j) 定義從標記為 durationDistanceMatrixSrcTags(j) 的造訪到矩陣 i 中其他造訪的時間長度和距離。

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

durationDistanceMatrixDstTags[]

string

定義時間長度和距離矩陣目的地的標記;durationDistanceMatrices(i).rows(j).durations(k) (resp. durationDistanceMatrices(i).rows(j).meters(k)) 定義從標記為 durationDistanceMatrixSrcTags(j) 的造訪到標記為 durationDistanceMatrixDstTags(k) 的造訪,在矩陣 i 中的行程時間長度 (或距離)。

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

transitionAttributes[]

object (TransitionAttributes)

轉換屬性已新增至模型。

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

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

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

shipmentType 需求條件組合 (請參閱 ShipmentTypeRequirement)。

precedenceRules[]

object (PrecedenceRule)

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

重要事項:使用優先順序規則會限制可最佳化的問題大小。如果要求使用的優先順序規則包含多筆運送資料,可能會遭到拒絕。

maxActiveVehicles

integer

限制使用中車輛的數量上限。如果車輛的路線至少執行一次運送,則該車輛為使用中。如果司機人數少於車輛數,且車隊車輛不盡相同,則可使用這項設定限制路線數量。最佳化作業會選出最適合使用的車輛子集。必須是正數。

運送地址

單一商品的運送作業,從取貨到送達。如要將運送視為已執行,不重複車輛必須造訪其中一個取貨地點 (並據此減少備用容量),然後造訪其中一個送貨地點 (並據此重新增加備用容量)。

JSON 表示法
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
欄位
displayName

string

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

pickups[]

object (VisitRequest)

與運送相關聯的替代取貨方式。如未指定,車輛只需造訪與送貨對應的地點。

deliveries[]

object (VisitRequest)

與運送相關聯的一組替代運送方式。如未指定,車輛只需前往與取貨地點對應的位置。

loadDemands

map (key: string, value: object (Load))

貨件的裝載需求 (例如重量、體積、棧板數量等)。對應中的鍵應為描述對應負載類型的 ID,最好也包含單位。例如:「weight_kg」、「volume_gallons」、「pallet_count」等。如果地圖中未顯示指定鍵,則對應的負載會視為空值。

allowedVehicleIndices[]

integer

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

costsPerVehicle[]

number

指定每輛車運送這筆貨件時產生的費用。如果指定,則必須符合下列其中一項條件:

  • 元素數量與 costsPerVehicleIndices 相同。costsPerVehicle[i] 對應至模型的車輛 costsPerVehicleIndices[i]。
  • 元素數量與模型中的車輛數量相同。第 i 個元素對應模型的車輛 #i。

這些費用的單位必須與 penaltyCost 相同,且不得為負值。如果沒有這類費用,請將這個欄位留空。

costsPerVehicleIndices[]

integer

costsPerVehicle 適用的車輛索引。如果不是空白,則必須與 costsPerVehicle 具有相同數量的元素。車輛索引只能指定一次。如果車輛不屬於 costsPerVehicleIndices,費用則為零。

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

指定相較於從取貨到送達的最短路徑,絕對繞道時間上限。如要指定,必須為非負值,且運送作業必須至少包含一次取貨和一次送貨。

舉例來說,假設 t 是從所選替代取貨點直接前往所選替代送貨點所需的最短時間。接著,pickupToDeliveryAbsoluteDetourLimit 設定會強制執行:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

如果同一筆運送作業同時指定相對和絕對限制,系統會針對每個可能的取貨/送貨組合,採用限制較嚴格的限制。自 2017 年 10 月起,只有在行程時間不取決於車輛時,才支援繞道。

pickupToDeliveryTimeLimit

string (Duration format)

指定從開始取貨到開始運送貨物的最長持續時間。如要指定,必須為非負值,且運送作業必須至少包含一次取貨和一次送貨。這與取貨和送貨時選用的替代方案無關,也與車輛速度無關。這項設定可與繞道上限限制一併指定,解決方案會同時遵循這兩項規格。

shipmentType

string

指定這筆運送訂單「類型」的非空白字串。這項功能可用於定義 shipment_types 之間的不相容性或需求 (請參閱 ShipmentModel 中的 shipmentTypeIncompatibilities 和 shipmentTypeRequirements)。

與針對單次造訪指定的 visitTypes 不同:屬於同一批貨件的所有取貨/送貨作業會共用相同的 shipmentType。

label

string

指定這筆運送訂單的標籤。系統會在回應中,於對應 ShipmentRoute.Visit 的 shipmentLabel 內回報這個標籤。

ignore

boolean

如果為 true,則略過這項運送作業,但不套用 penaltyCost。

如果模型中有任何 shipmentTypeRequirements,忽略運送作業會導致驗證錯誤。

系統允許忽略在 injectedFirstSolutionRoutes 或 injectedSolutionConstraint 執行的運送作業,求解器會從執行路線中移除相關的取貨/送貨造訪。參照忽略運送作業的precedenceRules也會遭到忽略。

penaltyCost

number

如果未完成運送,這項罰則會加到路線的整體費用中。只要造訪其中一個取貨和送貨替代方案,系統就會將運送視為完成。費用可使用與模型中所有其他費用相關欄位相同的單位表示,且必須為正數。

重要事項:如未指定這項罰則,系統會視為無限,也就是必須完成運送。

pickupToDeliveryRelativeDetourLimit

number

指定相較於從取貨到送貨的最短路徑,相對繞道時間上限。如要指定,必須為非負值,且運送作業必須至少包含一次取貨和一次送貨。

舉例來說,假設 t 是從所選替代取貨點直接前往所選替代送貨點所需的最短時間。接著,pickupToDeliveryRelativeDetourLimit 設定會強制執行:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

如果同一筆運送作業同時指定相對和絕對限制,系統會針對每個可能的取貨/送貨組合,採用限制較嚴格的限制。自 2017 年 10 月起,只有在行程時間不取決於車輛時,才支援繞道。

VisitRequest

要求車輛造訪:具有地理位置 (或兩個,請參閱下文)、以時間範圍表示的開放和關閉時間,以及服務持續時間 (車輛抵達後取貨或送貨所花費的時間)。

JSON 表示法
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string,
  "avoidUTurns": boolean
}
欄位
arrivalLocation

object (LatLng)

執行這項 VisitRequest 時,車輛抵達的地理位置。如果運送模型含有時間長度距離矩陣,則不得指定 arrivalLocation。

arrivalWaypoint

object (Waypoint)

車輛執行這項 VisitRequest 時抵達的路線控點。如果運送模型含有時間長度距離矩陣,則不得指定 arrivalWaypoint。

departureLocation

object (LatLng)

車輛完成這項VisitRequest後,離開時的地理位置。如果與 arrivalLocation 相同,則可省略。如果運送模型含有時間長度距離矩陣,則不得指定 departureLocation。

departureWaypoint

object (Waypoint)

車輛完成這項VisitRequest後,會從這個路線控點出發。如果與 arrivalWaypoint 相同,則可省略。如果運送模型含有時間長度距離矩陣,則不得指定 departureWaypoint。

tags[]

string

指定附加至造訪要求的標記。不得輸入空白或重複的字串。

timeWindows[]

object (TimeWindow)

限制造訪抵達時間的時間範圍。請注意,車輛可能會在抵達時間範圍外離開,也就是說,抵達時間 + 停留時間不一定要在時間範圍內。如果車輛在 TimeWindow.start_time前抵達,可能需要等待。

如果沒有 TimeWindow,表示車輛可以隨時執行這項造訪。

時間範圍不得重疊,也就是說,任何時間範圍都不得與其他時間範圍重疊或相鄰,且必須遞增排序。

只有在單一時間範圍內,才能設定 costPerHourAfterSoftEndTime 和 softEndTime。

duration

string (Duration format)

造訪時間長度,即車輛抵達和離開之間的時間 (會加到可能的等待時間,請參閱 timeWindows)。

cost

number

在車輛路線上服務這項造訪要求的成本。這項屬性可用來為每種替代取貨或運送方式設定不同的費用。這項費用的單位必須與 Shipment.penalty_cost 相同,且不得為負值。

loadDemands

map (key: string, value: object (Load))

這項造訪要求的負載需求。這與 Shipment.load_demands 欄位類似,但只適用於這個 VisitRequest,而非整個 Shipment。這裡列出的需求會新增至 Shipment.load_demands 中列出的需求。

visitTypes[]

string

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

一個類型只能出現一次。

label

string

指定這個 VisitRequest 的標籤。這個標籤會在回應中,以對應 ShipmentRoute.Visit 的 visitLabel 形式回報。

avoidUTurns

boolean

指定這個地點的行車路線是否應避免迴轉。系統會盡可能避免迴轉,但不保證完全不會迴轉。這項功能仍在實驗階段,行為可能會有異動。

實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request。

LatLng

代表經緯度組合的物件。這個物件會同時指出經度和緯度的度數。除非另有指定,否則這個物件必須符合 WGS84 標準。此外,值必須在正規化範圍內。

JSON 表示法
{
  "latitude": number,
  "longitude": number
}
欄位
latitude

number

緯度度數,必須介於 [-90.0, +90.0] 的範圍之間。

longitude

number

經度度數,必須介於 [-180.0, +180.0] 的範圍之間。

途經點

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

JSON 表示法
{
  "sideOfRoad": boolean,
  "vehicleStopover": boolean,

  // The following is a list of mutually exclusive fields. At most one of the
  // fields will be set in a response:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of mutually exclusive fields.
}
欄位
sideOfRoad

boolean

(選用步驟) 表示這個路線控點的位置,是為了讓車輛優先停靠在道路的特定一側。設定這個值後,路線會經過該位置,車輛就能停靠在該位置偏向道路中心線的那一側。這個選項不適用於「WALKING」交通模式。

vehicleStopover

boolean

表示路線控點是車輛停靠點,目的是接送乘客。這個選項僅適用於「DRIVING」交通模式,且「locationType」為「location」。

實驗性:這個欄位的行為或存在狀態日後可能會有變動。

表示位置的不同方式。以下是互斥欄位清單。回應中最多會設定下列其中一個欄位:
location

object (Location)

使用地理座標指定的點,包括選用的航向。

placeId

string

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

使用地點 ID 指定 VisitRequest 的抵達或出發地點時,請使用足夠具體的地點 ID,以便判斷導航至該地點的 LatLng 位置。舉例來說,代表建築物的地點 ID 適合,但代表道路的地點 ID 則不建議使用。

互斥欄位結束。

位置

封裝位置 (地理位置點和選用標題)。

JSON 表示法
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
欄位
latLng

object (LatLng)

路線控點的地理座標。

heading

integer

與車流方向相關聯的指南針方向。這個值用於指定上車和下車地點的道路側。航向值介於 0 到 360 之間,其中 0 代表正北,90 代表正東,依此類推。

TimeWindow

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

硬性時間範圍界限 startTime 和 endTime 會強制執行事件的最早和最晚時間,例如 startTime <= event_time <= endTime。軟性時間範圍下限 softStartTime 表示偏好事件在 softStartTime 當天或之後發生,產生的費用與事件在 softStartTime 之前發生的時間長度成正比。軟性時間範圍上限 softEndTime 表示偏好事件在 softEndTime 當天或之前發生,產生的費用與事件在 softEndTime 之後發生的時間長度成正比。startTime、endTime、softStartTime 和 softEndTime 應在全域時間限制內 (請參閱 ShipmentModel.global_start_time 和 ShipmentModel.global_end_time),並應遵循:

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
JSON 表示法
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
欄位
startTime

string (Timestamp format)

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

使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例:"2014-10-02T15:01:23Z"、"2014-10-02T15:01:23.045123456Z" 或 "2014-10-02T15:01:23+05:30"。

endTime

string (Timestamp format)

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

使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例:"2014-10-02T15:01:23Z"、"2014-10-02T15:01:23.045123456Z" 或 "2014-10-02T15:01:23+05:30"。

softStartTime

string (Timestamp format)

時間範圍的軟式開始時間。

使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例:"2014-10-02T15:01:23Z"、"2014-10-02T15:01:23.045123456Z" 或 "2014-10-02T15:01:23+05:30"。

softEndTime

string (Timestamp format)

時間範圍的軟性結束時間。

使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例:"2014-10-02T15:01:23Z"、"2014-10-02T15:01:23.045123456Z" 或 "2014-10-02T15:01:23+05:30"。

costPerHourBeforeSoftStartTime

number

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

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

這項費用必須為正數,且只有在設定 softStartTime 後,才能設定這個欄位。

costPerHourAfterSoftEndTime

number

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

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

這項費用必須為正數,且只有在設定 softEndTime 後,才能設定這個欄位。

車輛

在運送問題中建立車輛模型。解決運送問題後,系統會為這輛車建立從startLocation出發、endLocation結束的路線。路線是一連串的造訪 (請參閱 ShipmentRoute)。

JSON 表示法
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
欄位
displayName

string

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

travelMode

enum (TravelMode)

旅行模式會影響車輛可使用的道路和速度。另請參閱 travelDurationMultiple。

routeModifiers

object (RouteModifiers)

一組必須滿足的條件,會影響指定車輛的路線計算方式。

startLocation

object (LatLng)

車輛在收取任何貨件前的起始地理位置。如未指定,車輛會從第一個取貨點出發。如果運送模型含有時間長度和距離矩陣,則不得指定 startLocation。

startWaypoint

object (Waypoint)

代表車輛在收取任何貨件前,出發地點的地理位置路線控點。如果未指定 startWaypoint 和 startLocation,車輛會從第一個取貨點出發。如果運送模型含有時間長度和距離矩陣,則不得指定 startWaypoint。

endLocation

object (LatLng)

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

endWaypoint

object (Waypoint)

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

startTags[]

string

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

不得輸入空白或重複的字串。

endTags[]

string

指定附加至車輛路線結尾的標記。

不得輸入空白或重複的字串。

startTimeWindows[]

object (TimeWindow)

車輛可從起始位置出發的時間範圍。必須在全域時間限制內 (請參閱 ShipmentModel.global_* 欄位)。如未指定,則除了全域時間限制外,沒有其他限制。

屬於同一個重複欄位的時間範圍不得重疊,也就是說,時間範圍不得與其他時間範圍重疊或相鄰,且必須按照時間順序排列。

只有在單一時間範圍內,才能設定 costPerHourAfterSoftEndTime 和 softEndTime。

endTimeWindows[]

object (TimeWindow)

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

屬於同一個重複欄位的時間範圍不得重疊,也就是說,時間範圍不得與其他時間範圍重疊或相鄰,且必須按照時間順序排列。

只有在單一時間範圍內,才能設定 costPerHourAfterSoftEndTime 和 softEndTime。

unloadingPolicy

enum (UnloadingPolicy)

車輛強制執行的卸載政策。

loadLimits

map (key: string, value: object (LoadLimit))

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

costPerHour

number

車輛費用:所有費用加總,且必須與 Shipment.penalty_cost 採用相同單位。

車輛路線的每小時費用。這項費用會計入路線總耗時,包括行程時間、等待時間和造訪時間。使用 costPerHour 而非 costPerTraveledHour 可能會導致額外延遲。

costPerTraveledHour

number

車輛路線每小時行駛費用。這項費用僅適用於路線的行程時間 (即 ShipmentRoute.transitions 中回報的時間),不含等待時間和造訪時間。

costPerKilometer

number

車輛路線每公里的費用。這項費用會套用至 ShipmentRoute.transitions 中回報的距離,不會套用至從單一 VisitRequest 的 arrivalLocation 到 departureLocation 的任何隱含移動距離。

fixedCost

number

使用這輛車輛處理運送作業時,會套用固定費用。

usedIfRouteIsEmpty

boolean

這個欄位僅適用於路線不提供任何運送服務的車輛。指出車輛是否應視為二手車。

如果設為 true,車輛即使不運送任何貨物,也會從起點前往終點,且系統會考量從起點到終點的時間和距離成本。

否則,車輛不會從起點行駛到終點,也不會為這輛車安排 breakRule 或延遲 (來自 TransitionAttributes)。在這種情況下,車輛的 ShipmentRoute 除了車輛索引和標籤外,不含任何資訊。

routeDurationLimit

object (DurationLimit)

套用至車輛路線總時長的限制。在特定 OptimizeToursResponse 中,車輛的路線時間長度是 vehicleEndTime 和 vehicleStartTime 之間的差異。

travelDurationLimit

object (DurationLimit)

車輛路線行程時間長度的限制。在特定 OptimizeToursResponse 中,路線行程時間長度是所有 transitions.travel_duration 的總和。

routeDistanceLimit

object (DistanceLimit)

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

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

指定從 visitTypes 字串到持續時間的對應。時間長度是指在指定 visitTypes 的造訪中,除了 VisitRequest.duration 以外所需的時間。如果指定 costPerHour,這段額外的造訪時間會增加費用。鍵 (即 visitTypes) 不得為空字串。

如果造訪要求有多種類型,地圖會為每種類型新增時間長度。

breakRule

object (BreakRule)

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

label

string

指定這輛車輛的標籤。系統會在回應中,將這個標籤回報為對應 ShipmentRoute 的 vehicleLabel。

ignore

boolean

如果設為 true,usedIfRouteIsEmpty 必須為 false,且這輛車輛將保持未使用狀態。

如果運送作業是由 injectedFirstSolutionRoutes 中忽略的車輛執行,系統會在第一個解決方案中略過該作業,但可在回應中自由執行。

如果貨件是由 injectedSolutionConstraint 中忽略的車輛運送,且任何相關取貨/送貨作業都限制在車輛上 (即未放寬至 RELAX_ALL_AFTER_THRESHOLD 級),則會在回應中略過。如果運送作業的 allowedVehicleIndices 欄位不為空白,且所有允許的車輛都遭到忽略,系統就會在回應中略過該運送作業。

travelDurationMultiple

number

指定乘法係數,可用於增加或減少這輛車的行程時間。舉例來說,如果將這個值設為 2.0,表示這輛車的速度較慢,行程時間是一般車輛的兩倍。這個倍數不會影響造訪時間長度。如果指定 costPerHour 或 costPerTraveledHour,則會影響費用。必須介於 [0.001, 1000.0] 之間。如未設定,則車輛為標準車輛,且這個倍數會視為 1.0。

警告:套用這個倍數後,行程時間會四捨五入至最接近的秒數,然後才執行任何數值運算,因此較小的倍數可能會導致精確度降低。

另請參閱下方的 extraVisitDurationForVisitType。

TravelMode

車輛可使用的交通工具。

這些應是 Google Maps Platform Routes API 交通方式的子集,請參閱:https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode

注意:WALKING路線目前為 Beta 版,有時可能無法明確提供人行道或行人步道。在應用程式中顯示步行路線時,您必須向使用者顯示這則警告。

列舉
TRAVEL_MODE_UNSPECIFIED 未指定交通方式,等同於 DRIVING。
DRIVING 與行車路線對應的交通工具 (汽車、...)。
WALKING 步行路線對應的交通方式。
TWO_WHEELER 雙輪機動車輛。例如摩托車。請注意,這與 BICYCLING 交通模式不同,後者涵蓋人力交通模式。這項交通方式僅適用於「支援兩輪車的國家/地區」中列出的國家/地區。

RouteModifiers

封裝一組選用條件,在計算車輛路線時必須滿足這些條件。這與 Google Maps Platform Routes Preferred API 中的 RouteModifiers 類似,詳情請參閱:https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers。

JSON 表示法
{
  "avoidTolls": boolean,
  "avoidHighways": boolean,
  "avoidFerries": boolean,
  "avoidIndoor": boolean
}
欄位
avoidTolls

boolean

指定是否在合理情況下避開收費路段。系統會優先選擇不含收費路段的路線。僅適用於機動交通工具。

avoidHighways

boolean

指定是否盡可能避開高速公路。系統會優先選擇不含高速公路的路線。僅適用於機動交通工具。

avoidFerries

boolean

指定是否盡可能避開渡輪。系統會優先選擇不含渡輪行程的路線。僅適用於機動交通工具。

avoidIndoor

boolean

(選用步驟) 指定是否盡可能避免室內導航。系統會優先選擇不含室內導航的路線。僅適用於WALKING交通模式。

UnloadingPolicy

車輛卸貨方式的政策。僅適用於同時有取貨和送貨地點的運送作業。

其他運送作業則可在路線上的任何位置進行,不受 unloadingPolicy 影響。

列舉
UNLOADING_POLICY_UNSPECIFIED 未指定卸貨政策;送貨作業必須在對應的取貨作業之後進行。
LAST_IN_FIRST_OUT 送貨順序必須與取貨順序相反
FIRST_IN_FIRST_OUT 送達順序必須與取貨順序相同

LoadLimit

定義車輛的載重限制,例如「這輛卡車最多只能載重 3, 500 公斤」。詳情請參閱《loadLimits》。

JSON 表示法
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string,
  "costPerKilometer": {
    object (LoadCost)
  },
  "costPerTraveledHour": {
    object (LoadCost)
  }
}
欄位
softMaxLoad

string (int64 format)

負載的軟性限制。詳情請參閱《costPerUnitAboveSoftMax》。

costPerUnitAboveSoftMax

number

如果這輛車的路線負載超過 softMaxLoad,系統會套用下列費用罰則 (每輛車僅限一次):(負載 - softMaxLoad) * costPerUnitAboveSoftMax。所有費用都會加總,且必須與 Shipment.penalty_cost 採用相同單位。軟限制只能定義在整個模型中僅適用於取貨或僅適用於送貨的類型。

startLoadInterval

object (Interval)

車輛在路線起點的可接受載重量區間。

endLoadInterval

object (Interval)

車輛在路線終點的可接受載重區間。

maxLoad

string (int64 format)

可接受的負載量上限。

costPerKilometer

object (LoadCost)

這輛車每公里移動一個單位負載的成本。這項指標可用來代表燃料消耗量:如果負載是重量 (以牛頓為單位),則負載*公里具有能量的維度。

實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request。

costPerTraveledHour

object (LoadCost)

這輛車載運一個單位的貨物行駛一小時的費用。

實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request。

間隔

可接受的負載量間隔。

JSON 表示法
{
  "min": string,
  "max": string
}
欄位
min

string (int64 format)

可接受的最低負載。必須 ≥ 0。如果兩者都指定,min 必須 ≤ max。

max

string (int64 format)

可接受的負載上限。必須 ≥ 0。如未指定,這則訊息不會限制最大負載。如果兩者都指定,min 必須 ≤ max。

LoadCost

Transition內移動一個單位負載的成本。特定負載的費用是下列兩部分的總和:

  • min(load, loadThreshold) * costPerUnitBelowThreshold
  • max(0, load - loadThreshold) * costPerUnitAboveThreshold

有了這項成本,解決方案會優先配送高需求,或最後取貨高需求。舉例來說,如果車輛

load_limit {
  key: "weight"
  value {
    costPerKilometer {
      loadThreshold: 15
      costPerUnitBelowThreshold: 2.0
      costPerUnitAboveThreshold: 10.0
    }
  }
}

路線為起點、取貨、取貨、送貨、送貨、終點,轉移如下:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

則這輛LoadCost產生的費用為 (cost_below * load_below * 公里數 + cost_above * load_above * 公里數)

  • transition 0: 0.0
  • 轉換 1:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • 轉換 2:2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
  • 轉換 3:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transition 4: 0.0

因此,路線的 LoadCost 為 120.0。

不過,如果路線是起點、取貨、送貨、取貨、送貨、終點,且有以下轉場:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

則這個 LoadCost 產生的費用為

  • transition 0: 0.0
  • 轉換 1:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transition 2: 0.0
  • 轉換 3:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transition 4: 0.0

這裡的路線LoadCost為 40.0。

LoadCost會使轉換負載較重的解決方案成本更高。

實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request。

JSON 表示法
{
  "loadThreshold": string,
  "costPerUnitBelowThreshold": number,
  "costPerUnitAboveThreshold": number
}
欄位
loadThreshold

string (int64 format)

負載量超過這個值時,移動一個負載單位的費用會從 costPerUnitBelowThreshold 變更為 costPerUnitAboveThreshold。必須大於或等於 0。

costPerUnitBelowThreshold

number

移動一個單位負載的費用,適用於 0 到門檻之間的每個單位。必須是有限值,且 >= 0。

costPerUnitAboveThreshold

number

移動一個單位負載的費用,適用於超過門檻的每個單位。在特殊情況下,門檻 = 0,這是每單位的固定費用。必須是有限值,且 >= 0。

DurationLimit

定義車輛路線時間長度上限的限制。可以是硬體或軟體權杖。

定義軟性限制欄位時,必須一併定義軟性上限門檻和相關費用。

JSON 表示法
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
欄位
maxDuration

string (Duration format)

硬性限制,將時間長度限制在 maxDuration 以內。

softMaxDuration

string (Duration format)

軟性限制不會強制執行時間長度上限,但違反時會導致路線產生費用。這項費用會與模型中定義的其他費用相加,單位相同。

如果已定義,softMaxDuration 必須為非負值。如果也定義了 maxDuration,softMaxDuration 必須小於 maxDuration。

quadraticSoftMaxDuration

string (Duration format)

軟性限制不會強制執行時間長度上限,但如果違反,路線會產生費用,費用與時間長度呈二次方關係。這項費用會與模型中定義的其他費用相加,單位相同。

如果設定 quadraticSoftMaxDuration,則必須符合下列條件:

  • 不得為負數。
  • 必須定義 maxDuration。
  • quadraticSoftMaxDuration 必須小於 maxDuration。
  • 兩者相差不得超過一天:maxDuration - quadraticSoftMaxDuration <= 86400 seconds
costPerHourAfterSoftMax

number

如果違反 softMaxDuration 門檻,每小時產生的費用。如果時間長度低於門檻,則額外費用為 0,否則費用取決於時間長度,如下所示:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

費用不得為負值。

costPerSquareHourAfterQuadraticSoftMax

number

如果違反 quadraticSoftMaxDuration 門檻,每平方小時產生的費用。

如果時間長度低於門檻,則額外費用為 0,否則費用取決於時間長度,如下所示:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

費用不得為負值。

DistanceLimit

定義可移動的最大距離。可以是硬體或軟體權杖。

如果定義了軟限制,則必須同時定義 softMaxMeters 和 costPerKilometerAboveSoftMax,且兩者都必須為非負數。

JSON 表示法
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
欄位
maxMeters

string (int64 format)

硬性限制,將距離限制在 maxMeters 以內。限制不得為負數。

softMaxMeters

string (int64 format)

軟性限制不會強制執行最大距離限制,但如果違反,則會產生費用,並與模型中定義的其他費用相加,單位相同。

如果已定義 softMaxMeters,則必須小於 maxMeters,且不得為負值。

costPerKilometerBelowSoftMax

number

每公里產生的費用,最高可達 softMaxMeters,公式如下:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

routeDistanceLimit不支援這項費用。

costPerKilometerAboveSoftMax

number

如果距離超過 softMaxMeters 限制,則會產生每公里費用。如果距離低於上限,則額外費用為 0,否則會使用下列公式計算費用:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

費用不得為負值。

BreakRule

為車輛產生休息時間 (例如午休) 的規則。休息時間是指車輛在目前位置保持閒置,且無法執行任何造訪的連續時間。可能發生中斷的情況包括:

  • 在兩次造訪之間的行程期間 (包括造訪前後的時間,但不包括造訪期間),在這種情況下,系統會延長造訪之間的相應運送時間,
  • 或在車輛啟動前 (車輛不得在休息期間啟動),在這種情況下,休息時間不會影響車輛啟動時間。
  • 或車輛結束後 (同上,使用車輛結束時間)。
JSON 表示法
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
欄位
breakRequests[]

object (BreakRequest)

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

frequencyConstraints[]

object (FrequencyConstraint)

可能適用多個FrequencyConstraint。這個 BreakRule 的 BreakRequest 必須符合所有條件。請參閱 FrequencyConstraint。

BreakRequest

您必須事先知道每輛車適用的休息時間序列 (即休息時間的數量和順序)。重複的 BreakRequest 會按照必須發生的順序定義該序列。時間範圍 (earliestStartTime/latestStartTime) 可能會重疊,但必須與訂單相容 (系統會檢查這點)。

JSON 表示法
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
欄位
earliestStartTime

string (Timestamp format)

必填。休息時間開始的下限 (含)。

使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例:"2014-10-02T15:01:23Z"、"2014-10-02T15:01:23.045123456Z" 或 "2014-10-02T15:01:23+05:30"。

latestStartTime

string (Timestamp format)

必填。休息時間開始時間的上限 (含)。

使用 RFC 3339,產生的輸出內容一律會經過 Z 正規化,並使用 0、3、6 或 9 個小數位數,也接受「Z」以外的偏移量。範例:"2014-10-02T15:01:23Z"、"2014-10-02T15:01:23.045123456Z" 或 "2014-10-02T15:01:23+05:30"。

minDuration

string (Duration format)

必填。廣告插播時間長度下限。必須為正數。

FrequencyConstraint

您可以強制規定最短休息頻率,進一步限制上述休息時間的頻率和時長,例如「每 12 小時必須休息至少 1 小時」。假設這可以解讀為「在任何 12 小時的滑動時間範圍內,必須至少有一次至少一小時的休息時間」,則該範例會轉譯為以下 FrequencyConstraint:

{
   minBreakDuration { seconds: 3600 }         # 1 hour.
   maxInterBreakDuration { 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
JSON 表示法
{
  "minBreakDuration": string,
  "maxInterBreakDuration": string
}
欄位
minBreakDuration

string (Duration format)

必填。這項限制的最短廣告插播時間長度。非負值。查看FrequencyConstraint的說明。

maxInterBreakDuration

string (Duration format)

必填。路線中任何時間間隔的最大允許範圍,不包含至少部分 duration >= minBreakDuration 的休息時間。必須為正數。

目標

目標會完全取代成本模型,因此與現有成本不相容。每個目標都會對應至多個預先定義的成本,例如車輛、運送或轉換屬性。

實驗功能:詳情請參閱 https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request。

JSON 表示法
{
  "type": enum (Type),
  "weight": number
}
欄位
type

enum (Type)

目標類型。

weight

number

這個目標相對於其他目標的比重。可以是任何非負數,權重總和不一定要等於 1。權重預設為 1.0。

類型

要對應至一組費用的目標類型。

列舉
DEFAULT 系統會使用一組預設成本,確保解決方案合理。注意:這個目標可以單獨使用,但如果使用者指定的目標中尚未包含這個目標,系統一律會將這個目標新增至使用者指定的目標,並將權重設為 1.0,做為基準。
MIN_DISTANCE 「MIN」目標。盡可能縮短總行經距離。
MIN_WORKING_TIME 盡量縮短所有車輛的總工作時間。
MIN_TRAVEL_TIME 與上述相同,但只著重於行程時間。
MIN_NUM_VEHICLES 盡可能減少使用的車輛數量。

DurationDistanceMatrix

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

JSON 表示法
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
欄位
rows[]

object (Row)

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

vehicleStartTag

string

定義這項時間長度和距離矩陣適用於哪些車輛的標記。如果留空,則會套用至所有車輛,且只能有一個矩陣。

每輛車的起點都必須與一個矩陣完全相符,也就是說,車輛的 startTags 欄位必須與矩陣的 vehicleStartTag 完全相符 (且僅與該矩陣相符)。

所有矩陣都必須有不同的 vehicleStartTag。

資料列

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

JSON 表示法
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
欄位
durations[]

string (Duration format)

指定資料列的持續時間值。元素數量必須與 ShipmentModel.duration_distance_matrix_dst_tags 相同。

meters[]

number

指定資料列的距離值。如果模型中沒有任何費用或限制參照距離,則可留空;否則,元素數量必須與 durations 相同。

TransitionAttributes

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

JSON 表示法
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
欄位
srcTag

string

定義這組屬性適用的一組 (src->dst) 轉換。

來源造訪或車輛起點的 VisitRequest.tags 或 Vehicle.start_tags 包含 srcTag 或不含 excludedSrcTag (取決於這兩個欄位中哪個欄位不為空白),則視為相符。

excludedSrcTag

string

請參閱 srcTag。srcTag 和 excludedSrcTag 必須擇一填寫。

dstTag

string

目的地造訪或車輛結束作業的 VisitRequest.tags 或 Vehicle.end_tags 包含 dstTag 或不含 excludedDstTag (取決於這兩個欄位中哪個欄位不為空白),則視為相符。

excludedDstTag

string

請參閱 dstTag。dstTag 和 excludedDstTag 必須擇一填寫。

cost

number

指定執行這項轉換的費用。這個值的單位與模型中所有其他費用相同,且不得為負值。這項費用會加在所有其他現有費用之上。

costPerKilometer

number

指定執行這項轉換時,每公里移動距離的費用。這項費用會加到車輛指定的任何 Vehicle.cost_per_kilometer。

distanceLimit

object (DistanceLimit)

指定執行這項轉場時的移動距離限制。

截至 2021 年 6 月,系統僅支援軟性限制。

delay

string (Duration format)

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

這項延遲一律發生在來源造訪結束後,以及目的地造訪開始前。

ShipmentTypeIncompatibility

根據運送類型,指定運送作業之間的不相容性。系統會根據不相容模式,限制不相容的運送作業出現在同一路線上。

JSON 表示法
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
欄位
types[]

string

不相容類型清單。如果兩個運送服務的 shipment_types 不同,則視為「不相容」。

incompatibilityMode

enum (IncompatibilityMode)

不相容問題適用的模式。

IncompatibilityMode

定義如何限制不相容貨件在同一路線上出現的模式。

列舉
INCOMPATIBILITY_MODE_UNSPECIFIED 未指定不相容模式。請一律不要使用這個值。
NOT_PERFORMED_BY_SAME_VEHICLE 在這種模式下,不相容類型的兩筆運送作業絕不會共用同一輛車。
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

在這個模式下,不相容類型的兩筆運送作業絕不會同時在同一輛車上:

  • 只有在先送達其中一項工作,再取貨另一項工作時,才能共用同一輛車。
  • 如果兩筆運送作業都僅限取貨 (不含送貨) 或僅限送貨 (不含取貨),則完全無法共用同一輛車。

ShipmentTypeRequirement

根據運送類型 (shipmentType),指定運送之間的規定。具體規定由規定模式定義。

JSON 表示法
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
欄位
requiredShipmentTypeAlternatives[]

string

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

dependentShipmentTypes[]

string

如果貨件在 dependentShipmentTypes 欄位中指定了類型,則至少須有一個 requiredShipmentTypeAlternatives 類型的貨件在同一條路線上接受造訪。

注意:不得建立 shipmentType 依賴自身的依附元件鏈。

requirementMode

enum (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 與先前相同,但「依附」運送作業在送達時,車輛上必須有「必要」運送作業。

PrecedenceRule

兩個事件之間的優先順序規則 (每個事件都是取貨或送貨):第二個事件必須在第一個事件開始後至少 offsetDuration才能開始。

多個優先順序可以參照相同 (或相關) 事件,例如「在 A 送達後取件 B」和「在取件 B 後取件 C」。

此外,只有在執行兩項運送作業時,優先順序才會生效,否則會遭到忽略。

JSON 表示法
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
欄位
firstIsDelivery

boolean

指出「第一個」事件是否為送達。

secondIsDelivery

boolean

指出「第二個」事件是否為傳送。

offsetDuration

string (Duration format)

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

firstIndex

integer

「第一個」事件的貨件索引。必須指定這個欄位。

secondIndex

integer

「第二個」事件的貨件索引。必須指定這個欄位。