Les coûts de chargement spécifient les coûts ou les pénalités qu'un véhicule encourt en fonction de la charge qu'il transporte entre les enlèvements et les livraisons. Vous pouvez configurer ces coûts en fonction de la distance parcourue avec costPerKilometer, de la durée du trajet avec costPerTraveledHour ou des deux en même temps.
Configurez les coûts de chargement pour prendre en charge des objectifs tels que les suivants :
- Tenez compte des coûts de carburant qui augmentent avec le poids de la cargaison.
- Évitez de faire parcourir de longues distances aux véhicules très chargés.
- Tenez compte de l'usure du véhicule due aux marchandises lourdes.
Propriétés
Spécifiez les coûts de chargement dans la propriété loadLimits d'un Vehicle.
Comme tous les autres paramètres de coût, les coûts de chargement utilisent des unités de coût relatif sans dimension.
Vous pouvez définir les coûts de chargement à l'aide des propriétés suivantes :
| Propriété | Type | Description |
|---|---|---|
costPerKilometer |
Objet | Contient un type d'objet LoadCost pour calculer les frais de déplacement en fonction des kilomètres parcourus. |
costPerTraveledHour |
Objet | Contient un type d'objet LoadCost pour calculer les frais de déplacement en fonction des heures de trajet, à l'exclusion des temps d'attente, de visite et de pause. |
LoadCost
Un type de message LoadCost définit les frais de déplacement pour le transport d'une charge spécifique. Il vous permet de définir un seuil de charge, puis de spécifier différents taux de coût par unité de charge, à la fois en dessous et au-dessus de ce seuil.
L'objet LoadCost contient les paramètres de configuration suivants :
| Paramètre | Type | Description |
|---|---|---|
loadThreshold |
Chaîne (format int64) | Niveau de charge où le taux de calcul des coûts change. La valeur par défaut est 0. |
costPerUnitAboveThreshold |
Nombre | Coût appliqué à chaque unité de charge au-dessus de loadThreshold. La valeur par défaut est 0. |
costPerUnitBelowThreshold |
Nombre | Coût appliqué à chaque unité de charge inférieure ou égale à loadThreshold. La valeur par défaut est 0. |
Associer les coûts de chargement aux expéditions
Les coûts de chargement s'appliquent lorsque la charge transportée par un véhicule correspond au type loadDemands des expéditions sur son itinéraire. Les types de chargement sont des chaînes arbitraires, telles que le poids ou le volume. Pour en savoir plus sur la configuration des types de charge, consultez Types de charge.
Exemples
Cette section aborde trois types d'exemples :
- Des exemples de code illustrant la structure des coûts de chargement.
- Exemple de scénario montrant comment utiliser les coûts de chargement pour atteindre un objectif commercial.
- Exemple de requête incluant les valeurs définies dans le scénario exemple.
Exemples de code
L'exemple suivant montre comment structurer un coût de chargement avec tous les paramètres de configuration disponibles. Cet exemple utilise costPerKilometer, mais vous pouvez le remplacer par costPerTraveledHour pour calculer les coûts en fonction de la durée du trajet plutôt que de la distance.
{
"model": {
"vehicles": [{
"loadLimits": {
"LOAD_TYPE": {
"maxLoad": "MAX_LOAD",
"costPerKilometer": {
"loadThreshold": "LOAD_THRESHOLD",
"costPerUnitAboveThreshold": COST_ABOVE,
"costPerUnitBelowThreshold": COST_BELOW
}
}
}
}]
}
}
Exemple de scénario
Cette section décrit un scénario dans lequel vous souhaitez optimiser la consommation de carburant, qui est proportionnelle à la distance et au poids de la cargaison. Étant donné que les véhicules consomment plus de carburant lorsqu'ils transportent des charges plus lourdes, vous devez planifier des itinéraires qui livrent d'abord les colis les plus lourds.
Pour configurer ce comportement, vous pouvez configurer votre requête de manière à pénaliser les véhicules qui parcourent de longues distances avec des marchandises lourdes. Pour cet exemple, utilisez les valeurs de propriété suivantes dans votre requête :
| Parent | Propriété | Type | Valeur | Scénario |
|---|---|---|---|---|
loadLimits |
type de chargement | chaîne | weightKg |
Définit le type de capacité à suivre. Cet exemple utilise weightKg pour représenter le poids de la cargaison en kilogrammes. |
loadLimits |
maxLoad |
chaîne | 100 |
Poids maximal de la cargaison que le véhicule peut transporter. |
costPerKilometer |
loadThreshold |
chaîne | 15 |
Définit le seuil de charge de référence. Tout poids de chargement supérieur à 15 kg entraîne une pénalité de coût de carburant basée sur la charge. |
costPerKilometer |
costPerUnitAboveThreshold |
nombre | 1 |
Sert de coefficient de coût du carburant. Pour chaque kilomètre parcouru, chaque kilogramme de marchandise au-delà du seuil de 15 kg entraîne une unité de coût. |
loadDemands |
amount |
chaîne | Colis 1 : 50Colis 2 : 10Colis 3 : 80 |
Indique le poids du chargement pour chacun de vos trois envois. |
Dans ce scénario, les valeurs que vous avez configurées ont les effets suivants :
- L'outil d'optimisation organise vos itinéraires de manière à ce que vous livriez d'abord vos colis les plus lourds. Le solveur planifie les livraisons de 80 kg et 50 kg au début de l'itinéraire pour minimiser la distance parcourue avec une charge importante.
- L'optimiseur organise vos itinéraires pour minimiser la distance parcourue avec des marchandises lourdes. Pour voir l'impact de ces paramètres sur vos itinéraires, vous pouvez augmenter
costPerUnitAboveThresholdde1à5. En augmentant la pénalité de poids, vous incitez l'optimiseur à travailler encore plus dur pour minimiser la distance parcourue avec une cargaison plus lourde, ce qui peut réorganiser la séquence de dépose ou répartir les expéditions sur plusieurs véhicules.
Exemple de requête
L'exemple suivant montre la structure d'une requête optimizeTours de base intégrant les valeurs de coût de chargement du scénario exemple :
{ "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 } } } } ] } }
Formules de calcul
L'optimiseur calcule les coûts de chargement à l'aide des formules suivantes.
Calcul complet du seuil
Lorsque vous spécifiez costPerUnitAboveThreshold et costPerUnitBelowThreshold, vous engagez des frais de déplacement distincts pour les quantités de chargement supérieures et inférieures à loadThreshold. La formule est la suivante :
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
Par exemple, en utilisant les valeurs de l'exemple de requête, où la valeur de costPerUnitBelowThreshold est 2, si le véhicule parcourt 10 kilomètres avec une charge de 50, le calcul est le suivant :
max(50 - 15, 0) * 10 * 1 + min(50, 15) * 10 * 2 = 650 cost units
Calcul au-dessus du seuil
Lorsque vous ne spécifiez que costPerUnitAboveThreshold, le calcul est un cas particulier de la formule complète du seuil. Comme le coût inférieur au seuil est nul, la seconde moitié de la formule complète est égale à zéro. La formule est la suivante :
cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold
Par exemple, en utilisant les valeurs de l'exemple de requête où loadThreshold est 15 et costPerUnitAboveThreshold est 1, si le véhicule parcourt 10 kilomètres avec une charge de 50, le calcul est le suivant :
max(50 - 15, 0) * 10 * 1 = 350 cost units
Calcul en dessous du seuil
De manière symétrique, si vous ne spécifiez que costPerUnitBelowThreshold, le calcul est un autre cas particulier de la formule complète du seuil où le coût au-dessus du seuil est nul. La formule est la suivante :
cost = min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold