Route Optimization API 会在相应请求中返回车辆的路线。系统会将运输分配给车辆,但也可能会跳过,具体取决于请求的属性。
OptimizeToursResponse 消息(REST、gRPC)具有两个主要顶级属性:
routes[]是每辆车辆的路线及其分配的运输。每个Route都包含反映该具体路线属性的指标。metrics是针对所有车辆和路线方案的整个响应的汇总指标。顶级指标包含与按路线指标相同的属性,其值是跨所有路线汇总的。
某些属性可能并不总是填充,具体取决于优化结果:
skippedShipments[]列出了未由任何车辆执行的运输。如果无法在指定的约束条件下执行发货,或者执行发货的费用超出违规处罚费用,则可以跳过发货。例如,如果运输的接收或送达时间非常短,车辆可能无法在所需的时间范围内完成访问,或者这样做不经济。timeWindowvalidationErrors[]用于指定当请求的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是相应请求中此访问所属的运输的编号(从 0 开始)。- 如果是上门自提,则
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
}
}
}