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의 0부터 시작하는 색인입니다. 값이 0인 경우 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이고 배송인 경우 false입니다. 값이 false인 경우 REST 응답은 이 속성을 생략합니다.visitRequestIndex는Visit가 나타내는 해당 요청의Shipment.pickups또는Shipment.deliveries에서VisitRequest의 0부터 시작하는 색인입니다. REST 응답은 값이 0인 경우 이 속성을 생략합니다.startTime은 방문이 시작될 것으로 예상되는 시간입니다.loadDemands는Visit를 완료하는 데 필요한 로드 유형을 로드 양에 매핑합니다. 배송 방문의 경우 로드 금액이 음수이며 차량에서 로드가 삭제되었음을 나타냅니다.
Visit 예시는 다음과 같습니다.
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
각 ShipmentRoute에는 지정된 차량의 visits 간의 이동을 나타내는 순서가 지정된 transitions 목록이 포함됩니다. 중요한 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가 사용되지 않는 한 일반적으로 0입니다.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
}
}
}