Los costos de carga especifican los costos o las penalidades en los que incurre un vehículo según la carga que transporta entre las recolecciones y las entregas de envíos. Puedes configurar estos costos según la distancia de viaje con costPerKilometer, la duración del viaje con costPerTraveledHour o usar ambos al mismo tiempo.
Configura los costos de carga para admitir objetivos como los siguientes:
- Ten en cuenta los costos de combustible, que aumentan con el peso de la carga.
- Evita que los vehículos muy cargados recorran largas distancias.
- Ten en cuenta el desgaste del vehículo debido a la carga pesada.
Propiedades
Especifica los costos de carga dentro de la propiedad loadLimits de un Vehicle.
Al igual que todos los demás parámetros de costos, los costos de carga usan unidades de costos relativas y sin dimensiones.
Puedes definir los costos de carga con las siguientes propiedades:
| Propiedad | Tipo | Descripción |
|---|---|---|
costPerKilometer |
Objeto | Contiene un tipo de objeto LoadCost para calcular los costos de viaje según los kilómetros recorridos. |
costPerTraveledHour |
Objeto | Contiene un tipo de objeto LoadCost para calcular los costos de viaje en función de las horas de viaje, sin incluir los tiempos de espera, visita y descanso. |
LoadCost
Un tipo de mensaje LoadCost define el costo de viaje de transportar una carga específica. Te permite establecer un umbral de carga y, luego, especificar diferentes tarifas de costo por unidad de carga, tanto por debajo como por encima de ese umbral.
El objeto LoadCost contiene los siguientes parámetros de configuración:
| Parámetro | Tipo | Descripción |
|---|---|---|
loadThreshold |
cadena (formato int64) | Es el nivel de carga en el que cambia la tasa de cálculo de costos. El valor predeterminado es 0. |
costPerUnitAboveThreshold |
Número | Es el costo que se aplica a cada unidad de carga por encima de loadThreshold. El valor predeterminado es 0. |
costPerUnitBelowThreshold |
Número | Es el costo que se aplica a cada unidad de carga inferior o igual a loadThreshold. El valor predeterminado es 0. |
Cómo correlacionar los costos de carga con los envíos
Los costos de carga se aplican cuando la carga que transporta un vehículo coincide con el tipo de loadDemands de los envíos en su ruta. Los tipos de carga son cadenas arbitrarias, como peso o volumen. Para obtener más detalles sobre la configuración de los tipos de carga, consulta Tipos de carga.
Ejemplos
En esta sección, se abordan tres tipos de ejemplos:
- Muestras de código que ilustran la estructura de los costos de carga
- Un ejemplo de situación que muestra una forma de usar los costos de carga para alcanzar un objetivo comercial.
- Un ejemplo de solicitud que incluye los valores establecidos en la situación de ejemplo.
Muestras de código
En el siguiente ejemplo, se muestra cómo estructurar un costo de carga con todos los parámetros de configuración disponibles. En este ejemplo, se usa costPerKilometer, pero puedes reemplazarlo por costPerTraveledHour para calcular los costos en función de la duración del viaje en lugar de la distancia.
{
"model": {
"vehicles": [{
"loadLimits": {
"LOAD_TYPE": {
"maxLoad": "MAX_LOAD",
"costPerKilometer": {
"loadThreshold": "LOAD_THRESHOLD",
"costPerUnitAboveThreshold": COST_ABOVE,
"costPerUnitBelowThreshold": COST_BELOW
}
}
}
}]
}
}
Situación de ejemplo
En esta sección, se describe una situación en la que deseas optimizar el consumo de combustible, y el combustible consumido es proporcional a la distancia y el peso de la carga. Como los vehículos consumen más combustible cuando transportan cargas más pesadas, te conviene planificar rutas que entreguen primero los paquetes más pesados.
Para configurar este comportamiento, puedes configurar tu solicitud para penalizar los vehículos que viajan largas distancias con carga pesada. En este ejemplo, usa los siguientes valores de propiedad en tu solicitud:
| Padres | Propiedad | Tipo | Valor | Situación |
|---|---|---|---|---|
loadLimits |
Tipo de carga | string | weightKg |
Define el tipo de capacidad para hacer un seguimiento. En este ejemplo, se usa weightKg para representar el peso de la carga en kilogramos. |
loadLimits |
maxLoad |
string | 100 |
Es el peso máximo de carga que puede transportar el vehículo. |
costPerKilometer |
loadThreshold |
string | 15 |
Establece el umbral de carga de referencia. Cualquier peso de carga superior a 15 kg genera la penalización por costo de combustible basado en la carga. |
costPerKilometer |
costPerUnitAboveThreshold |
número | 1 |
Actúa como coeficiente de costo de combustible. Por cada kilómetro recorrido, cada kilogramo de carga que supere el umbral de 15 kg genera 1 unidad de costo. |
loadDemands |
amount |
string | Envío 1: 50Envío 2: 10Envío 3: 80 |
Especifica el peso de la carga para cada uno de tus tres envíos. |
En esta situación, los valores configurados tienen los siguientes efectos:
- El optimizador organiza tus rutas para entregar primero los paquetes más pesados. El solucionador programa las entregas de 80 kg y 50 kg al comienzo de la ruta para minimizar la distancia recorrida con carga pesada.
- El optimizador organiza tus rutas para minimizar la distancia recorrida con carga pesada. Para ver cómo estos parámetros de configuración afectan tus rutas, puedes aumentar
costPerUnitAboveThresholdde1a5. Si aumentas la penalización por peso, le indicas al optimizador que trabaje aún más para minimizar la distancia recorrida con carga más pesada, lo que puede reorganizar la secuencia de entrega o dividir los envíos en varios vehículos.
Ejemplo de solicitud
En el siguiente ejemplo, se muestra la estructura de una solicitud básica de optimizeTours que incorpora los valores de costo de carga del caso de ejemplo:
{ "model": { "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "penaltyCost": 100.0, "loadDemands": { "weightKg": { "amount": "50" } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "penaltyCost": 30.0, "loadDemands": { "weightKg": { "amount": "10" } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "penaltyCost": 50.0, "loadDemands": { "weightKg": { "amount": "80" } } } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0, "loadLimits": { "weightKg": { "maxLoad": "100", "costPerKilometer": { "loadThreshold": "15", "costPerUnitAboveThreshold": 1 } } } } ] } }
Fórmulas de cálculo
El optimizador calcula los costos de carga con las siguientes fórmulas.
Cálculo completo del umbral
Cuando especificas costPerUnitAboveThreshold y costPerUnitBelowThreshold, incurres en costos de viaje separados para las cantidades de carga superiores e inferiores a loadThreshold. La fórmula es:
cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold
+ min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold
Por ejemplo, si se usan los valores del Ejemplo de solicitud, en el que el valor de costPerUnitBelowThreshold es 2, si el vehículo recorre 10 kilómetros con una carga de 50, el cálculo es el siguiente:
max(50 - 15, 0) * 10 * 1 + min(50, 15) * 10 * 2 = 650 cost units
Cálculo de valores superiores al umbral
Cuando solo especificas costPerUnitAboveThreshold, el cálculo es un caso especial de la fórmula completa del umbral. Dado que el costo por debajo del umbral es cero, la segunda mitad de la fórmula completa se evalúa como cero. La fórmula es:
cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold
Por ejemplo, si se usan los valores del Ejemplo de solicitud, en el que loadThreshold es 15 y costPerUnitAboveThreshold es 1, si el vehículo recorre 10 kilómetros con una carga de 50, el cálculo es el siguiente:
max(50 - 15, 0) * 10 * 1 = 350 cost units
Cálculo por debajo del umbral
De manera simétrica, si solo especificas costPerUnitBelowThreshold, el cálculo es otro caso especial de la fórmula completa del umbral en el que el costo por encima del umbral es cero. La fórmula es:
cost = min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold