Route Optimization API 会在相应请求中返回车辆的路线。运单会分配给车辆,也可以跳过,具体取决于请求的属性。
OptimizeToursResponse
消息(REST、gRPC)有两个主要的顶级属性:
routes[]
是具有已分配货运的每辆车的路线。每个Route
都包含反映该单个路由的属性的指标。metrics
是涵盖所有车辆和路线方案的整个响应的汇总指标。顶级指标包含与每条路线的指标相同的属性,包括所有路线的汇总值。
根据优化结果,系统未必总能填充某些属性:
skippedShipments[]
用于列出并非由任何车辆执行的运单。如果无法在指定约束范围内执行某个运单或执行该运单的费用超出其罚款费用,则可以跳过该运单。例如,如果货物的提货或送餐服务timeWindow
非常窄,车辆可能无法在要求的时间范围内执行访问,或者成本效益可能不高。validationErrors[]
指定当请求的solvingMode
设置为VALIDATE_ONLY
时,这些错误会导致请求无效或无法解决。在普通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,如果访问是送餐,则为 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"
},
...
],
...
}
],
...
}
取货和送货停止订单优化以及 ShipmentRoute
参考文档(REST、gRPC)中介绍了 vists
和 transitions
之间的关系。
指标属性
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
是车辆在完成路线时为执行到访而花费的总时间。这实际上是VisitRequest
(与分配给适用车辆的Visit
相对应)的所有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
}
}
}