비용 모델 매개변수

OptimizeToursRequest 메시지 (REST, gRPC)에는 비용과 관련된 여러 속성이 포함되어 있습니다. 이러한 비용 매개변수는 요청의 비용 모델을 나타냅니다. 비용 모델은 다음과 같이 요청의 상위 수준 최적화 목표 대부분을 포착합니다.

  • 짧은 경로 또는 그 반대 방향보다 빠른 Vehicle 경로에 우선순위 지정
  • Shipment 제공 비용이 Shipment 완료 가치만큼의 가치가 있는지 결정
  • 기간 내에 픽업 및 배달을 수행하는 것이 비용 효율적인 경우에만 수행

비용이 포함된 요청 예 보기

{
  "model": {
    "globalStartTime": "2023-01-13T16:00:00-08:00",
    "globalEndTime": "2023-01-14T16:00:00-08:00",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 5.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

비용 속성 Vehicle

Vehicle 메시지 (REST, gRPC)에는 몇 가지 비용 속성이 있습니다.

  • Vehicle.cost_per_hour: 대중교통, 대기, 방문, 휴식 시간을 포함하여 시간당 차량 운행 비용을 나타냅니다.
  • Vehicle.cost_per_kilometer: 차량의 주행 킬로미터당 비용을 나타냅니다.
  • Vehicle.cost_per_traveled_hour: 대기, 방문, 휴식 시간을 제외하고 운송 중에만 차량을 운행하는 비용을 나타냅니다.

이러한 비용 매개변수를 사용하면 옵티마이저가 시간 대비 이동 거리를 조정할 수 있습니다. 최적화된 경로에서 발생하는 비용은 응답 메시지에 metrics.costs로 표시됩니다.

costPerHour가 증가함에 따라 최적화 도구는 최단 거리가 아닐 수 있는 더 빠른 경로를 찾으려고 시도합니다. 이 예에서는 가장 빠른 경로가 가장 짧기 때문에 비용 매개변수를 변경해도 효과가 거의 없습니다.

비용 속성 Shipment

Shipment 메시지 (REST, gRPC)에도 여러 비용 매개변수가 있습니다.

  • Shipment.penalty_cost는 배송을 건너뛰기하여 발생한 비용을 나타냅니다.
  • Shipment.VisitRequest.cost는 특정 수령 또는 배송 비용을 나타내며, 주로 단일 배송의 여러 수령 또는 배송 옵션 간의 비용 절충을 가능하게 하는 데 사용됩니다.

Shipment 비용 매개변수는 Vehicle 비용 매개변수와 동일한 측정기준 없는 단위를 사용합니다. 비용이 완전히 발생하면 Shipment가 페널티 비용을 초과하면 ShipmentVehicle의 경로에 포함되지 않고 응답 메시지의 skipped_shipments 목록에 표시됩니다.

비용 속성 ShipmentModel

ShipmentModel 메시지 (REST, gRPC)에는 단일 비용 속성 globalDurationCostPerHour가 포함되어 있습니다. 이 비용은 모든 차량이 ShipmentRoute를 완료하는 데 필요한 총 시간을 기준으로 발생합니다. globalDurationCostPerHour를 늘리면 모든 배송을 조기에 완료하는 것이 우선시됩니다.

경로 최적화 응답 비용 속성

OptimizeToursResponse 메시지 (REST, gRPC)에는 ShipmentRoute를 완료하는 과정에서 발생하는 비용을 나타내는 비용 속성이 있습니다. metrics.costsmetrics.totalCost 속성은 응답의 모든 경로에서 발생한 비용 단위 수를 나타냅니다. 각 routes 항목에는 특정 경로의 비용을 나타내는 routeCostsrouteTotalCosts 속성이 있습니다.

비용이 포함된 예시 요청에 대한 응답 보기

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-14T00:00:00Z",
      "vehicleEndTime": "2023-01-14T00:28:22Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-14T00:00:00Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-14T00:02:30Z",
          "detour": "150s"
        },
        {
          "startTime": "2023-01-14T00:08:55Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-14T00:21:21Z",
          "detour": "572s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-14T00:00:00Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-14T00:02:30Z"
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-14T00:05:00Z"
        },
        {
          "travelDuration": "496s",
          "travelDistanceMeters": 1893,
          "waitDuration": "0s",
          "totalDuration": "496s",
          "startTime": "2023-01-14T00:13:05Z"
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-14T00:25:31Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "902s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "800s",
        "totalDuration": "1702s",
        "travelDistanceMeters": 3353
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 33.53,
        "model.vehicles.cost_per_hour": 18.911111111111111
      },
      "routeTotalCost": 52.441111111111113
    }
  ],
  "skippedShipments": [
    {
      "index": 1
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "902s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "800s",
      "totalDuration": "1702s",
      "travelDistanceMeters": 3353
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-14T00:00:00Z",
    "latestVehicleEndTime": "2023-01-14T00:28:22Z",
    "totalCost": 57.441111111111113,
    "costs": {
      "model.vehicles.cost_per_kilometer": 33.53,
      "model.vehicles.cost_per_hour": 18.911111111111111,
      "model.shipments.penalty_cost": 5
    }
  }
}
    

응답 예에서 최상위 metrics.costs는 다음과 같습니다.

{
  "metrics": {
    ...
    "costs": {
      "model.vehicles.cost_per_hour": 18.911111111111111,
      "model.vehicles.cost_per_kilometer": 33.53,
      "model.shipments.penalty_cost": 5
    }
  }
}

model.shipments.penalty_cost 값은 건너뛴 배송으로 인해 발생한 비용을 나타냅니다. skippedShipments 속성은 건너뛴 배송을 나열합니다.

이 예시에서는 예시 요청의 model.shipments[1]만 건너뜁니다. model.shipments[1]의 페널티 비용은 5단위이며, 이는 예시 응답의 총 model.shipments.penalty_cost 키와 일치합니다. Vehicle의 40.0 costPerHour 및 10.0 costPerKilometer에 비해 배송의 penaltyCost이 낮기 때문에 배송을 완료하는 것보다 배송을 건너뛰는 것이 더 비용 효율적입니다.

고급 주제: 비용 및 유연한 제약조건

여러 OptimizeToursRequest 메시지 (REST, gRPC) 속성은 소프트 제약조건을 나타내며, 이 제약조건을 충족할 수 없을 때 비용이 발생하는 제약조건입니다.

예를 들어 차량 LoadLimit (REST, gRPC) 제약조건에는 softMaxLoadcostPerUnitAboveSoftMax 속성이 있습니다. 이와 함께 softMaxLoad를 초과하는 로드 단위에 비례하는 비용이 발생하므로 비용 측면에서 타당한 경우에만 한도를 초과하도록 할 수 있습니다.

마찬가지로 TimeWindow 제약조건 (REST, gRPC)에는 soft_start_timesoft_end_time 속성이 있으며, 상응하는 cost_per_hour_before_soft_start_timecost_per_hour_after_soft_end_time 속성은 TimeWindow와 관련하여 제한된 이벤트가 얼마나 일찍 또는 늦게 발생하는지에 따라 발생합니다.

모든 비용 모델 매개변수와 마찬가지로 유연한 제약조건 비용은 다른 비용 매개변수와 동일한 차원 없는 단위로 표현됩니다.

LoadLimit 제약 조건은 부하 수요 및 한도에서 자세히 다룹니다. TimeWindow 제약 조건은 수령 및 배송 기간 제약 조건에서 자세히 다룹니다.