Coûts de chargement

Les coûts de chargement sont définis dans la propriété `loadLimits` d'un `Vehicle` sous `ShipmentModel`.

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 :

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 : 50
Colis 2 : 10
Colis 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 costPerUnitAboveThreshold de 1 à 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