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)

模型的全球開始和結束時間:超出這個範圍的時間一律無效。

模型的時間範圍必須少於一年,也就是說,globalEndTimeglobalStartTime 之間必須相差 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,且 durationDistanceMatrixSrcTagsdurationDistanceMatrixDstTags 皆不得為空白。

使用範例:

  • 有兩個地點: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.tagsVehicle.start_tags。這個欄位中的每個 VisitRequestVehicle 都必須與一個標記完全相符。請注意,Vehicle 的來源、目的地和矩陣標記可能相同;同樣地,VisitRequest 的來源和目的地標記可能相同。所有標記都必須互不相同,且不得為空字串。如果這個欄位不為空,則 durationDistanceMatrices 不得為空。

durationDistanceMatrixDstTags[]

string

定義時間和距離矩陣目的地的標記;durationDistanceMatrices(i).rows(j).durations(k) (分別為 durationDistanceMatrices(i).rows(j).meters(k)) 定義從具有標記 durationDistanceMatrixSrcTags(j) 的造訪到具有標記 durationDistanceMatrixDstTags(k) 的造訪,在矩陣 i 中的移動時間 (或距離)。

標記會對應至 VisitRequest.tagsVehicle.start_tags。這個欄位中的每個 VisitRequestVehicle 都必須與一個標記完全相符。請注意,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 月起,只有在行程時間不取決於車輛時,系統才會支援繞道。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

pickupToDeliveryTimeLimit

string (Duration format)

指定貨件從取貨開始到開始運送之間的最長時間。如要指定,必須為非負值,且出貨內容至少須包含取貨和送達。這與取貨和送貨的替代方案或車輛速度無關。這項限制可以與最大繞道限制一併指定,解決方案會同時遵守這兩項規格。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

shipmentType

string

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

與單次取貨/送貨的 visitTypes 不同:同一批貨的所有取貨/送貨作業都共用相同的 shipmentType

label

string

指定這批貨件的標籤。這個標籤會在對應 ShipmentRoute.VisitshipmentLabel 中回報。

ignore

boolean

如果為 true,請略過這批貨,但不要套用 penaltyCost

如果模型中含有任何 shipmentTypeRequirements,忽略出貨會導致驗證錯誤。

你可以忽略在 injectedFirstSolutionRoutesinjectedSolutionConstraint 中執行的貨運作業,求解器會從執行路線中移除相關的取貨/送貨行程。系統也會忽略參照遭忽略出貨內容的 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,表示車輛隨時可以執行這項拜訪。

時段不得重疊或相鄰,且必須遞增排序。

只有在單一時間範圍內,才能設定 costPerHourAfterSoftEndTimesoftEndTime

duration

string (Duration format)

停留時間,也就是車輛抵達和出發之間的時間 (會加到可能的等待時間;請參閱 timeWindows)。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

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,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
欄位
sideOfRoad

boolean

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

vehicleStopover

boolean

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

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

聯集欄位 location_type。表示位置的不同方式。location_type 只能是下列其中一項:
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

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

硬性時間範圍界線 startTimeendTime 會強制執行事件的最早和最晚時間,因此 startTime <= event_time <= endTime。軟性時間範圍下限 softStartTime 表示偏好事件發生時間為 softStartTime 或之後,並根據事件發生時間早於 softStartTime 的時間長度,產生相應的費用。軟性時間範圍上限 softEndTime 表示偏好事件發生時間為 softEndTime 之前或當下,如果事件發生時間晚於 softEndTime,則會產生與延遲時間成正比的費用。startTimeendTimesoftStartTimesoftEndTime 應符合全域時間限制 (請參閱 ShipmentModel.global_start_timeShipmentModel.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)

代表車輛在收取任何貨物前出發的地理位置。如果未指定 startWaypointstartLocation,車輛會從第一個上車地點開始。如果貨運模型有時間和距離矩陣,則不得指定 startWaypoint

endLocation

object (LatLng)

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

endWaypoint

object (Waypoint)

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

startTags[]

string

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

不得使用空白或重複的字串。

endTags[]

string

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

不得使用空白或重複的字串。

startTimeWindows[]

object (TimeWindow)

車輛可從出發地點出發的時間範圍。且必須符合全球時間限制 (請參閱ShipmentModel.global_*欄位)。如未指定,則除了全域時間限制外,沒有其他限制。

屬於相同重複欄位的時間範圍不得重疊或相鄰,且必須依時間順序排列。

只有在單一時間範圍內,才能設定 costPerHourAfterSoftEndTimesoftEndTime

endTimeWindows[]

object (TimeWindow)

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

屬於相同重複欄位的時間範圍不得重疊或相鄰,且必須依時間順序排列。

只有在單一時間範圍內,才能設定 costPerHourAfterSoftEndTimesoftEndTime

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 中回報的距離,不會套用至從單一 VisitRequestarrivalLocationdepartureLocation 隱含移動的任何距離。

fixedCost

number

如果使用這輛車處理貨件,則會套用固定費用。

usedIfRouteIsEmpty

boolean

如果車輛的路線不包含任何貨物,這項欄位就只適用於車輛。指出車輛是否應視為二手車。

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

否則,車輛不會從起點行駛至終點,且系統不會為這輛車排定 breakRule 或延誤 (從 TransitionAttributes)。在本例中,車輛的 ShipmentRoute 除了車輛索引和標籤外,不含任何資訊。

routeDurationLimit

object (DurationLimit)

車輛路線的總時長限制。在特定 OptimizeToursResponse 中,車輛的路線時間長度是 vehicleEndTimevehicleStartTime 之間的差異。

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

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

ignore

boolean

如為 true,usedIfRouteIsEmpty 必須為 false,且這部車輛會維持未使用狀態。

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

如果出貨作業是由 injectedSolutionConstraint 中遭忽略的車輛執行,且任何相關取貨/送貨作業都受限於車輛 (即未放寬至 RELAX_ALL_AFTER_THRESHOLD 層級),則回應中會略過該作業。如果貨運的 allowedVehicleIndices 欄位不為空,且所有允許的車輛都遭到忽略,則回應中會略過該貨運。

travelDurationMultiple

number

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

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

另請參閱下方的 extraVisitDurationForVisitType

TravelMode

車輛可使用的交通方式。

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

注意:WALKING 路線目前為 Beta 版,有時可能缺少明確的人行道或行人路徑。您必須在應用程式中顯示的所有步行路線中,向使用者顯示這項警告。

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

RouteModifiers

封裝一組選用條件,用於計算車輛路線時。這與 Google 地圖平台 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 產生的費用為 (cost_below * load_below * kilometers + cost_above * load_above * kms)

  • 轉場 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。

不過,如果路線是「開始、取貨、送貨、取貨、送貨、結束」,且包含轉場效果:

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。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

softMaxDuration

string (Duration format)

軟性限制不會強制執行最長時限,但如果違反規定,路線就會產生費用。這項費用會與模型中定義的其他費用加總,單位相同。

如果已定義,softMaxDuration 不得為負數。如果也定義了 maxDuration,softMaxDuration 必須小於 maxDuration。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

quadraticSoftMaxDuration

string (Duration format)

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

如果已定義,quadraticSoftMaxDuration 不得為負數。如果也定義了 maxDuration,則 quadraticSoftMaxDuration 必須小於 maxDuration,且兩者差異不得超過一天:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

costPerHourAfterSoftMax

number

如果違反 softMaxDuration 門檻,每小時的費用。如果時間長度低於門檻,則額外費用為 0;否則費用會依時間長度而定,如下所示:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

費用不得為負值。

costPerSquareHourAfterQuadraticSoftMax

number

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

如果時間長度低於門檻,則額外費用為 0;否則費用會依時間長度而定,如下所示:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

費用不得為負值。

DistanceLimit

可移動的最大距離。可以是硬體或軟體。

如果定義了軟性限制,則 softMaxMeterscostPerKilometerAboveSoftMax 都必須定義,且不得為負數。

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。這些條件必須由這個 BreakRuleBreakRequest 滿足。詳情請參閱 FrequencyConstraint

BreakRequest

必須事先瞭解適用於每輛車的休息順序 (即休息次數和順序)。重複的 BreakRequests 會定義該序列,且必須按照出現順序發生。時間範圍 (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)

必要欄位。休息時間下限。必須為正數。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

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 的說明。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

maxInterBreakDuration

string (Duration format)

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

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

目標

目標會完全取代費用模式,因此與先前的費用不相容。每個目標都會對應到預先定義的成本,例如車輛、貨運或轉移屬性。

實驗功能:詳情請參閱 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 相同。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

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.tagsVehicle.start_tags 包含 srcTag,或不包含 excludedSrcTag (視這兩個欄位中哪個不為空而定),即為相符。

excludedSrcTag

string

詳情請參閱 srcTagsrcTagexcludedSrcTag 必須恰好其中一個不得為空。

dstTag

string

如果目的地拜訪或車輛終點的 VisitRequest.tagsVehicle.end_tags 包含 dstTag 或不包含 excludedDstTag (視這兩個欄位中哪一個不為空而定),即為相符。

excludedDstTag

string

詳情請參閱 dstTagdstTagexcludedDstTag 必須恰好其中一個不得為空。

cost

number

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

costPerKilometer

number

指定在執行這項轉換時,每公里行駛距離適用的成本。最多可為車輛新增任何Vehicle.cost_per_kilometer

distanceLimit

object (DistanceLimit)

指定執行這項轉場效果時的行駛距離上限。

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

delay

string (Duration format)

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

這項延遲一律發生在完成來源造訪,以及開始目的地造訪

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

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)

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

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

firstIndex

integer

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

secondIndex

integer

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