ShipmentModel

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

  • 車輛路線的費用 (所有車輛的總交通時間、平均交通時間、固定費用)。
  • 未完成出貨的處罰。
  • 運送作業全球作業期間的成本
JSON 表示法
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "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)

可用於執行拜訪的車輛組合。

globalStartTime

string (Timestamp format)

模型的全球開始和結束時間:系統不會將範圍外的時間視為有效時間。

模型的時間跨度不得超過一年,也就是 globalEndTimeglobalStartTime 之間的時間差不得超過 31536000 秒。

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

RFC3339 世界標準時間「Zulu」格式的時間戳記,解析度以奈秒為單位,小數點後最多 9 位。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

globalEndTime

string (Timestamp format)

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

RFC3339 世界標準時間「Zulu」格式的時間戳記,解析度以奈秒為單位,小數點後最多 9 位。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

globalDurationCostPerHour

number

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

durationDistanceMatrices[]

object (DurationDistanceMatrix)

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

使用範例:

  • 其中有兩個位置:locA 和 locB。
  • 1 輛車輛的路線起點和終點皆為 locA。
  • 1 個位於 locB 的取件造訪要求。
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 結束。
  • 1 輛車以 locB 開始路線,並於 locB 結束,使用矩陣「慢速」。
  • 1 輛車以 locB 起點開始路線,並使用「快速」矩陣於 locB 結束。
  • 在 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) 定義與矩陣中其他造訪的持續時間和距離。

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

durationDistanceMatrixDstTags[]

string

定義時間和距離矩陣目的地的標記;durationDistanceMatrices(i).rows(j).durations(k) (resp. durationDistanceMatrices(i).rows(j).meters(k)) 會定義矩陣 i 中,從標記為 durationDistanceMatrixSrcTags(j) 的造訪轉換為標記為 durationDistanceMatrixDstTags(k) 的造訪所需的時間 (或距離)。

標記對應至 VisitRequest.tagsVehicle.start_tags。指定的 VisitRequestVehicle 必須與這個欄位中的一個標記完全相符。請注意,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" 等。如果指定的鍵未顯示在對應的載入中,系統會將該載入視為空值。

這個物件中包含 "key": value 組合的清單,範例:{ "name": "wrench", "mass": "1.3kg", "count": "3" }

allowedVehicleIndices[]

integer

可能執行這項運送作業的車輛組合。如果留空,則所有車輛都可能執行該動作。車輛會依據 ShipmentModelvehicles 清單中的索引指定。

costsPerVehicle[]

number

指定每輛車出貨時的運費。如果已指定,則必須具備下列其中一種條件:

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

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

costsPerVehicleIndices[]

integer

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

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

指定從上車到貨運之間的最短路徑等待時間。如果指定了這個值,則必須為非負值,且運送作業至少必須包含一個取件和一個送達作業。

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

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

如果同一運送屬性同時指定了相對和絕對限制,則每個取貨/外送組合使用的限制越多。自 2017 年 10 月起,系統只會在行程時間不受車輛影響時支援繞道。

持續時間以秒為單位,最多 9 個小數位數,結尾為「s」。例如:"3.5s"

pickupToDeliveryTimeLimit

string (Duration format)

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

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

shipmentType

string

指定這個貨品的「type」為非空白字串。這項功能可用於定義 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 月 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 中列出的需求。

這個物件中包含 "key": value 組合的清單,範例:{ "name": "wrench", "mass": "1.3kg", "count": "3" }

visitTypes[]

string

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

一個類型只能出現一次。

label

string

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

avoidUTurns

boolean

指定這個位置的行車路線是否應避開迴轉。迴轉迴轉是盡可能避免的,但不保證能完全避免。這是實驗功能,行為可能會有所變動。

LatLng

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

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

number

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

longitude

number

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

途經點

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

JSON 表示法
{
  "sideOfRoad": 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

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

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

object (Location)

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

placeId

string

與路標相關聯的 POI 地點 ID。

位置

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

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

object (LatLng)

航點的地理座標。

heading

integer

與車流方向相關聯的指南針方向。這個值用於指定接送和下車地點的道路兩側。方向值的範圍為 0 到 360,其中 0 指定正北方向,90 指定正東方向,以此類推。

TimeWindow

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

硬性時間範圍邊界 startTimeendTime 會強制執行事件的最早和最晚時間,例如 startTime <= event_time <= endTime。軟性時間回溯期的下限 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

RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

endTime

string (Timestamp format)

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

RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

softStartTime

string (Timestamp format)

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

RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

softEndTime

string (Timestamp format)

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

RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。例如 "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

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 的情況下才能設定這個欄位。

車輛

模擬出貨問題中的車輛。解決運送問題時,系統會為這輛車輛建立從 startLocationendLocation 的路線。路線是一系列造訪記錄 (請參閱 ShipmentRoute)。

JSON 表示法
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "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

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 欄位的鍵一致。如果這個對應表中沒有特定鍵,則系統會將對應容量視為無限。

這個物件中包含 "key": value 組合的清單,範例:{ "name": "wrench", "mass": "1.3kg", "count": "3" }

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 字串到 times 的對應。時間長度是指在指定 visitTypes 的造訪中,除了 VisitRequest.duration 之外所需的時間。若指定 costPerHour,延長造訪時間會使費用增加。金鑰 (即 visitTypes) 不得為空白字串。

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

這個物件中包含 "key": value 組合的清單,範例:{ "name": "wrench", "mass": "1.3kg", "count": "3" }

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 地圖平台路線偏好 API 的部分交通模式,請參閱:https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode

列舉
TRAVEL_MODE_UNSPECIFIED 未指定交通方式,相當於 DRIVING
DRIVING 與駕駛路線相對應的交通模式 (汽車、...)。
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
}
欄位
softMaxLoad

string (int64 format)

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

costPerUnitAboveSoftMax

number

如果載重量超過這輛車輛路線的 softMaxLoad,系統會依據下列費用懲罰 (每輛車輛只會收取一次) 收取費用:(載重量 - softMaxLoad) * costPerUnitAboveSoftMax。所有費用都會加總,且必須與 Shipment.penalty_cost 位於相同的單位。

startLoadInterval

object (Interval)

車輛在路線起點的允許載客量間隔。

endLoadInterval

object (Interval)

車輛在路線結束時可接受的載客量間隔。

maxLoad

string (int64 format)

可接受的最大負載量。

時間間隔

可接受的負載量間隔。

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

string (int64 format)

可接受的最低負載。必須大於 0。如果同時指定這兩個值,min 必須小於或等於 max

max

string (int64 format)

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

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 不得為負數。如果同時定義了 maxDurationquadraticSoftMaxDuration 必須小於 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,
  "costPerKilometerAboveSoftMax": number
}
欄位
maxMeters

string (int64 format)

硬性限制會將距離限制在 maxMeter 內。限制值不得為負數。

softMaxMeters

string (int64 format)

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

如果定義的 softMaxMeters 必須小於 maxMeters,且不得為負數。

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

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

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

string (Timestamp format)

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

RFC3339 世界標準時間「Zulu」格式的時間戳記,解析度以奈秒為單位,小數點後最多 9 位。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

latestStartTime

string (Timestamp format)

必要欄位。休息時間開始的上限 (包含在內)。

RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

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"

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

根據 shipmentType 指定不同出貨之間的不相容性。系統會根據不相容模式,限制在同一路線上顯示不相容的貨件。

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

如果兩個出貨項目的類型不相容,且使用 NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY 不相容模式:

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

ShipmentTypeRequirement

根據運送類型指定貨物之間的各項規定。需求的具體內容則由需求模式定義。

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

string

dependentShipmentTypes 所需的替代運送類型清單。

dependentShipmentTypes[]

string

所有在 dependentShipmentTypes 欄位中類型為 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 送貨後取貨」和「從 B 取件後到貨 (C) 發生」。

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

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

boolean

指出「first」事件是否為放送事件。

secondIsDelivery

boolean

表示「第二個」事件是否為傳送事件。

offsetDuration

string (Duration format)

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

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

firstIndex

integer

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

secondIndex

integer

「second」事件的出貨索引。必須指定此欄位。