Parámetros del modelo de costo

El mensaje OptimizeToursRequest (REST, gRPC) contiene una serie de propiedades relacionadas con los costos. En conjunto, estos parámetros de costo representan el modelo de costos de la solicitud. El modelo de costos captura muchos de los objetivos de optimización de nivel superior de la solicitud, como los siguientes:

  • Priorizar las rutas Vehicle más rápidas sobre las rutas más cortas o viceversa
  • Decidir si el costo de entregar un Shipment vale el valor de la finalización de Shipment
  • Realizar retiros y entregas dentro de los períodos solo cuando sea rentable

Consulta un ejemplo de solicitud con costos

{
  "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
      }
    ]
  }
}
    

Propiedades de costo de Vehicle

El mensaje Vehicle (REST, gRPC) tiene varias propiedades de costo:

  • Vehicle.cost_per_hour: Representa el costo de operar un vehículo por hora, incluidos los tiempos de tránsito, espera, visita y descanso.
  • Vehicle.cost_per_kilometer: Representa el costo por kilómetro recorrido del vehículo.
  • Vehicle.cost_per_traveled_hour: Representa el costo de operar un vehículo solo durante el viaje, sin incluir los tiempos de espera, visita y descanso.

Estos parámetros de costo permiten que el optimizador realice compensaciones entre el tiempo y la distancia recorrida. Los costos incurridos por la ruta optimizada aparecen en el mensaje de respuesta como metrics.costs:

A medida que aumenta costPerHour, el optimizador intenta encontrar rutas más rápidas que pueden no ser las más cortas. En este ejemplo, la ruta más rápida resulta ser la más corta, por lo que los cambios en los parámetros de costo tienen poco efecto.

Propiedades de costo de Shipment

El mensaje Shipment (REST, gRPC) también tiene varios parámetros de costo:

  • Shipment.penalty_cost representa el costo que se genera por omitir el envío.
  • Shipment.VisitRequest.cost representa el costo de una recogida o entrega específica, que se usa principalmente para permitir compensaciones de costos entre varias opciones de recogida o entrega para un solo envío.

Los parámetros de costo Shipment usan las mismas unidades sin dimensiones que los parámetros de costo Vehicle. Si el costo incurrido completa un Shipment que supera su costo de penalización, el Shipment no se incluye en ninguna ruta de Vehicle y, en su lugar, aparece en la lista skipped_shipments del mensaje de respuesta.

Propiedades de costo de ShipmentModel

El mensaje ShipmentModel (REST, gRPC) incluye una sola propiedad de costo, globalDurationCostPerHour. Este costo se genera en función del tiempo total que se necesita para que todos los vehículos completen sus ShipmentRoute. Si aumentas globalDurationCostPerHour, se priorizará la finalización más temprana de todos los envíos.

Propiedades de costo de la respuesta de la optimización de rutas

El mensaje OptimizeToursResponse (REST, gRPC) tiene propiedades de costo que representan los costos incurridos en el proceso de completar ShipmentRoute. Las propiedades metrics.costs y metrics.totalCost representan la cantidad de unidades de costo incurridas en todas las rutas de la respuesta. Cada entrada routes tiene propiedades routeCosts y routeTotalCosts que representan los costos de esa ruta específica.

Consulta una respuesta a la solicitud de ejemplo con costos

{
  "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
    }
  }
}
    

En la respuesta de ejemplo, los metrics.costs de nivel superior son los siguientes:

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

El valor model.shipments.penalty_cost representa el costo incurrido debido a los envíos omitidos. La propiedad skippedShipments indica qué envíos se omitieron.

En este ejemplo, solo se omite model.shipments[1] en la solicitud de ejemplo. model.shipments[1] tiene un costo de penalización de 5 unidades, que coincide con la clave model.shipments.penalty_cost total en la respuesta de ejemplo. El penaltyCost bajo del envío en comparación con los 40.0 costPerHour y 10.0 costPerKilometer de Vehicle hace que sea más rentable omitir el envío que completarlo.

Tema avanzado: costos y restricciones flexibles

Varias propiedades del mensaje OptimizeToursRequest (REST, gRPC) representan restricciones flexibles, que son restricciones que incurren en un costo cuando no se pueden satisfacer.

Por ejemplo, las restricciones de LoadLimit (REST, gRPC) de vehículos tienen propiedades softMaxLoad y costPerUnitAboveSoftMax. En conjunto, generan un costo proporcional a las unidades de carga que superan softMaxLoad, lo que permite superar el límite solo si hacerlo tiene sentido desde el punto de vista del costo.

Del mismo modo, las restricciones de TimeWindow (REST, gRPC) tienen propiedades soft_start_time y soft_end_time, con cost_per_hour_before_soft_start_time y cost_per_hour_after_soft_end_time correspondientes que se incurren en función de qué tan temprano o tarde ocurre el evento restringido con respecto a TimeWindow.

Al igual que con todos los parámetros del modelo de costos, los costos de las restricciones suaves se expresan en las mismas unidades sin dimensiones que otros parámetros de costos.

Las restricciones de LoadLimit se abordan en detalle en Demandas y límites de carga. Las restricciones de TimeWindow se abordan en detalle en Restricciones de ventanas de tiempo de retiro y entrega.