응답 해석

유럽 경제 지역 (EEA) 개발자

Route Optimization API는 해당 요청의 차량 경로를 반환합니다. 배송은 차량에 할당되거나 요청의 속성에 따라 건너뛸 수 있습니다.

OptimizeToursResponse 메시지 (REST, gRPC)에는 다음과 같은 두 가지 주요 최상위 속성이 있습니다.

  • routes[]는 할당된 배송이 있는 각 차량의 경로입니다. 각 Route에는 개별 경로의 속성을 반영하는 측정항목이 포함되어 있습니다.
  • metrics는 모든 차량과 경로 계획에 걸쳐 전체 응답에 대한 집계된 측정항목입니다. 최상위 측정항목에는 경로별 측정항목과 동일한 속성이 포함되며, 값은 모든 경로에 걸쳐 집계됩니다.

최적화 결과에 따라 일부 속성이 채워지지 않을 수 있습니다.

  1. skippedShipments[]에는 차량으로 수행되지 않은 배송이 나열됩니다. 지정된 제약조건 내에서 배송을 수행할 수 없거나 배송 수행 비용이 위약금을 초과하는 경우 배송을 건너뛸 수 있습니다. 예를 들어 배송의 수령 또는 배송 timeWindow이 매우 좁은 경우 차량이 필수 시간 내에 방문을 수행하는 것이 불가능하거나 비용 효율적이지 않을 수 있습니다.
  2. 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부터 시작하는 색인입니다. 값이 0이면 REST 응답에서 이 속성이 생략됩니다.
  • 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
    }
  }
}