Parámetros del modelo de costos

Desarrolladores del Espacio Económico Europeo (EEE)

El mensaje OptimizeToursRequest (REST, gRPC) contiene varias 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 alto nivel de la solicitud, como los siguientes:

  • Priorizar las rutas Vehicle más rápidas por sobre las más cortas o viceversa
  • Decidir si el costo de entregar un Shipment vale la pena en función del valor de la finalización del Shipment
  • Realizar retiros y entregas dentro de 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 costos 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 por el vehículo.
  • Vehicle.cost_per_traveled_hour: Representa el costo de operar un vehículo solo mientras está en tránsito, 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 que genera la ruta optimizada aparecen en el mensaje de respuesta como metrics.costs:

A medida que costPerHour aumenta, el optimizador intenta encontrar rutas más rápidas que tal vez no sean 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 costos de Shipment

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

  • Shipment.penalty_cost representa el costo en el que se incurre por omitir el envío. No establecer el parámetro penalty_cost de un envío hace que el envío sea obligatorio, lo que significa que solo se omitirá si no se puede completar según las restricciones especificadas.
  • Shipment.VisitRequest.cost representa el costo de un retiro o una entrega específicos, y se usa principalmente para permitir compensaciones de costos entre varias opciones de retiro o entrega para un solo envío.

Los parámetros de costo de Shipment usan las mismas unidades adimensionales que los parámetros de costo de Vehicle. Si el costo incurrido para completar un Shipment supera su costo de penalización, el Shipment no se incluye en la ruta de ningún Vehicle y, en cambio, aparece en la lista de skipped_shipments en el mensaje de respuesta.

Propiedades de costos de ShipmentModel

El mensaje ShipmentModel (REST, gRPC) incluye una sola propiedad de costo, globalDurationCostPerHour. Este costo se incurre en función del tiempo total que requieren todos los vehículos para completar sus ShipmentRoutes. El aumento de globalDurationCostPerHour prioriza la finalización anticipada de todos los envíos.

Propiedades de costos de la respuesta de Route Optimization

El mensaje OptimizeToursResponse (REST, gRPC) tiene propiedades de costo que representan los costos incurridos en el proceso de completar ShipmentRoutes. Las propiedades metrics.costs y metrics.totalCost representan la cantidad de unidades de costo incurridas en todas las rutas de la respuesta. Cada entrada de 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 en el que se incurrió debido a los envíos omitidos. La propiedad skippedShipments enumera los envíos que 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, lo 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 el Vehicle de 40.0 costPerHour y 10.0 costPerKilometer hace que sea más rentable omitir el envío que completarlo.

Tema avanzado: Costos y restricciones flexibles

Varias propiedades de mensajes OptimizeToursRequest (REST, gRPC) representan restricciones flexibles, que son restricciones que generan un costo cuando no se pueden satisfacer.

Por ejemplo, las restricciones de vehículo LoadLimit (REST, gRPC) tienen propiedades softMaxLoad y costPerUnitAboveSoftMax. En conjunto, estos generan un costo proporcional a las unidades de carga que superan softMaxLoad, lo que permite que se supere el límite solo si 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 generan según qué tan temprano o tarde se produce el evento restringido con respecto a TimeWindow.

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

Las restricciones de LoadLimit se abordan en detalle en Load Demands and Limits. Las restricciones de TimeWindow se abordan en detalle en Restricciones de ventanas de hora de retiro y entrega.