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)

指定模型中使用的時間和距離矩陣。如果這個欄位空白,系統會改用 Google 地圖或測地距離,具體取決於 useGeodesicDistances 欄位的值。如果不是空白,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」矩陣。
  • 在 locC 提出 1 項取貨要求。
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) (分別為 durationDistanceMatrices(i).rows(j).meters(k)) 定義矩陣 i 中,從含有標記 durationDistanceMatrixSrcTags(j) 的造訪到含有標記 durationDistanceMatrixDstTags(k) 的造訪,旅程的持續時間 (或距離)。

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

transitionAttributes[]

object (TransitionAttributes)

已將轉場效果屬性新增至模型。

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

不相容的 shipment_type 組合 (請參閱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's 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 的抵達和出發地點,以及 Vehicle 的起點和終點。

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

(選用步驟) 表示這個路線控點的位置偏好車輛停靠在道路的特定一側。設定這個值後,路線會經過該位置,讓車輛停靠在道路一側,該側與道路中心線的距離會偏向該位置。這個選項不適用於「步行」交通方式。

vehicleStopover

boolean

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

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

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

object (Location)

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

placeId

string

與途中的航點相關聯的 POI 地點 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

如果車輛的路線不包含任何貨物,則僅適用於車輛。指出車輛是否應視為二手車。

如果為真,車輛會從起點前往終點,即使沒有運送任何貨物,系統也會將起點到終點的行車時間和距離納入考量。

否則車輛不會從起點行駛至終點,且不會為這輛車排定 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 與步行路線對應的交通方式。

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

定義車輛的載重限制,例如「這輛卡車最多只能載重 3500 公斤」。詳情請參閱《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
    }
  }
}

路線為「start」、「pickup」、「pickup」、「delivery」、「delivery」、「end」,並有以下轉換:

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 產生的費用為 (下方費用 * 下方負重 * 公里數 + 上方費用 * 上方負重 * 公里數)

  • 轉場 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
  • 轉場效果 4:0.0

因此路線的 LoadCost 為 120.0。

不過,如果路線是 start、pickup、delivery、pickup、delivery、end,且有轉換:

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 產生的費用為

  • 轉場 0:0.0
  • 轉場 1:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • 轉場 2:0.0
  • 轉場 3:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • 轉場效果 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

根據出貨類型指定出貨之間的規定。具體要求取決於要求模式。

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 開始。

多個先後順序可參照相同 (或相關) 事件,例如「B 的取貨時間在 A 的送達時間之後」,以及「C 的取貨時間在 B 的取貨時間之後」。

此外,只有在執行兩項出貨作業時,系統才會套用優先順序,否則會忽略優先順序。

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

boolean

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

secondIsDelivery

boolean

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

offsetDuration

string (Duration format)

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

firstIndex

integer

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

secondIndex

integer

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