Route Optimization API 会返回相应请求中车辆的路线。系统会根据请求的属性将配送任务分配给车辆,或者跳过配送任务。
OptimizeToursResponse
消息(REST、gRPC)具有两个主要顶级属性:
routes[]
是每辆车辆的路线,其中包含分配给相应车辆的货件。每个Route
都包含反映相应路线属性的指标。metrics
是整个响应中所有交通方式和路线方案的汇总指标。顶级指标包含与每条路线的指标相同的属性,但其值是所有路线的汇总值。
某些属性可能不会始终填充,具体取决于优化结果:
skippedShipments[]
列出未使用任何车辆执行的货件。 如果无法在指定限制内执行某次配送,或者执行该配送的费用超过其违规费用,则可以跳过该配送。 例如,如果货件的取货或送货时间非常短timeWindow
,车辆可能无法在所需的时间范围内完成访问,或者这样做不经济实惠。- 当请求的
solvingMode
设置为VALIDATE_ONLY
时,validationErrors[]
指定导致请求无效或无法解决的错误。在正常的DEFAULT_SOLVE
模式下,验证错误将显示在错误消息中,而不是响应正文中。请注意,VALIDATE_ONLY
求解模式可以同时报告多个错误,这有助于快速调试请求。
路线属性
每个 routes[]
条目都是一个 ShipmentRoute
消息(REST、gRPC)。每个 ShipmentRoute
都表示相应请求中特定车辆的路线分配。与相应 Vehicle
相关的重要 ShipmentRoute
属性包括:
vehicleIndex
是相应请求消息中Vehicle
的索引(从零开始)。如果值为零,REST 响应会省略此属性。vehicleStartTime
是车辆必须开始行驶的时间。vehicleEndTime
是车辆预计完成路线的时间。
在响应中,routes
将如下所示:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
每个 ShipmentRoute
都包含车辆将完成的 visits
的有序列表。每个 Visit
(REST、gRPC)都表示相应请求的 VisitRequest
(REST、gRPC)。重要的 Visit
属性包括:
shipmentIndex
是相应请求中相应访问所属的货件的从零开始的索引。- 如果相应访问是取货,则
isPickup
为 true;如果相应访问是送货,则isPickup
为 false。如果值为 false,REST 响应会省略此属性。 visitRequestIndex
是相应请求中Visit
所代表的Shipment.pickups
或Shipment.deliveries
中VisitRequest
的从零开始的索引。如果值为零,REST 响应会省略此属性。startTime
是预计的到访开始时间。loadDemands
将加载类型映射到完成Visit
所需的加载量。对于送货访问,负载量为负值,表示从车辆中移除的负载。
示例 Visit
如下所示:
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
每个 ShipmentRoute
都包含一个有序的 transitions
列表,用于表示特定车辆在 visits
之间的行程。重要 Transition
消息(REST、gRPC)属性包括:
startTime
是车辆开始执行过渡的时间。travelDuration
是车辆必须行驶才能完成过渡的时长。travelDistanceMeters
是指车辆完成过渡必须行驶的距离(以米为单位)。trafficInfoUnavailable
表示相应过渡是否有可用的流量数据。waitDuration
表示车辆在开始下一个Visit
之前等待的空闲时间。这可能是由于以下Visit
的start_time
而产生的。totalDuration
是过渡的总时长,包括出行、等待、休息和延迟时间。vehicleLoads
将负载类型映射到车辆在此过渡期间所载的负载量。
示例 Transition
如下所示:
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
如需详细了解 vists
和 transitions
之间的关系,请参阅取货和送货站点的顺序优化以及 ShipmentRoute
参考文档(REST、gRPC)。如需详细了解 Transition
消息的 routePolyline
和 routeToken
属性,请参阅过渡折线和路线令牌。
指标属性
Metrics
消息(REST、gRPC)总结了整个解决方案。一些重要的 Metrics
属性包括:
totalCost
是完成路线所产生的总费用。如需详细了解费用,请参阅费用模型参数。usedVehicleCount
是解决方案中使用的车辆总数。 如果优化器确定车辆无需使用,则车辆可能没有路线。skippedMandatoryShipmentCount
是“强制性”跳过配送的数量。强制性货件未指定跳过货件时产生的penaltyCost
。如果强制性配送在指定限制条件下不可行,仍可跳过。如需详细了解费用,请参阅费用模型参数。
其他指标以 AggregatedMetrics
消息(REST、gRPC)的形式报告。AggregatedMetrics
消息类型用于 Metrics.aggregatedRouteMetrics
属性,而 ShipmentRoute.metrics
属性 Metrics.aggregatedRouteMetrics
包含 OptimizeToursResponse
中所有 ShipmentRoute
的汇总指标。每个 ShipmentRoute.metrics
媒体资源都包含相应特定 ShipmentRoute
的指标。
重要的 AggregatedMetrics
属性包括:
performedShipmentCount
是车辆在整个路线中执行的配送次数。travelDuration
是车辆在完成路线时花费的总运输时间。waitDuration
是车辆在完成路线时等待的总时间。delayDuration
是车辆的总延迟时间。除非请求中使用了TransitionAttributes
,否则此值通常为零。breakDuration
是车辆在完成路线时休息的总时间。visitDuration
是车辆在完成路线期间执行访问所花费的总时间。这实际上是分配给适用车辆的Visit
对应的VisitRequest
的所有VisitRequest.duration
值的总和。totalDuration
是完成车辆路线所需的总时长。travelDistanceMeters
是车辆在完成路线时行驶的总距离。maxLoads
将载荷类型映射到车辆在其路线上的任何时间点所能承载的最大载荷量。
Metrics
消息的示例如下所示:
{
"routes": [
...
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}
完整示例
构建请求中的请求的完整响应示例如下所示:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
{
"startTime": "2024-02-13T00:19:31Z",
"detour": "0s"
}
],
"transitions": [
{
"travelDuration": "0s",
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1151s",
"travelDistanceMeters": 9599,
"waitDuration": "0s",
"totalDuration": "1151s",
"startTime": "2024-02-13T00:19:31Z"
}
],
"metrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"routeCosts": {
"model.vehicles.cost_per_kilometer": 18.603
},
"routeTotalCost": 18.603
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}