비용 모델 매개변수

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 제약 조건은 수거 및 배송 시간 제한 제약 조건에 자세히 설명되어 있습니다.