Prioriser les visites à proximité avec les attributs de transition

Cet exemple montre comment utiliser les attributs de transition pour prioriser les itinéraires où les prises en charge et les livraisons à proximité sont effectuées par le même véhicule dans un même bloc de temps. Pour en savoir plus sur les attributs de transition, consultez Modéliser la logique métier avec des attributs de transition.

Dans cet exemple :

  • Les livraisons des envois A, B et C sont proches les unes des autres sur la même route.
  • D'autres livraisons sont prévues plus tard.
  • Les livraisons n'ont pas de délai de livraison spécifié.
  • Quel que soit le calendrier des visites, le véhicule doit emprunter cette route deux fois : une fois le matin en partant du dépôt et une fois le soir en revenant.
  • La distance totale et la durée de l'itinéraire sont toujours les mêmes, quel que soit le moment où A, B et C sont effectués.

Exemple avec des livraisons d'envois sur la même route. Trois envois (A, B et C) sont en cours de livraison depuis le dépôt vers d'autres envois. A se trouve à 1 000 m du dépôt, B est à 50 mètres plus loin du dépôt et C est à 30 mètres plus loin dans la même direction. D'autres envois se trouvent à 1 000 m de C.

Dans ce cas, et pour une requête qui n'utilise que le coût par heure et le coût par kilomètre, l'itinéraire optimisé pourrait traiter A et B le matin et C le soir, et le coût de la solution serait le même que si les trois étaient traités en même temps.

Coût par kilomètre avec un seuil

Pour regrouper les visites à proximité, vous devez d'abord sélectionner une distance seuil. Il s'agit de la distance maximale entre deux visites que vous considérez comme proches. Cet exemple utilise un seuil de 100 mètres, ce qui correspond à peu près à un pâté de maisons dans une zone urbaine. Vous pouvez augmenter ou diminuer le seuil en fonction des besoins de votre entreprise et des préférences de vos conducteurs.

Pour regrouper les visites à proximité dans un rayon de 100 mètres, vous définissez un coût élevé pour les 100 premiers mètres de chaque transition et un coût inférieur pour les mètres supplémentaires de la transition. Étant donné que les 100 premiers mètres sont les plus coûteux, l'optimiseur réalise les économies les plus importantes en utilisant des transitions inférieures au seuil de 100 mètres, même si cela signifie prolonger la longueur totale de l'itinéraire.

Pour configurer les coûts, ajoutez une entrée à ShipmentModel.transition_attributes avec les propriétés suivantes :

{
  "model": {
    "transitionAttributes": [
      {
        "excluded_dst_tag": "UNUSED_TAG",
        "excluded_src_tag": "UNUSED_TAG",
        "distanceLimit": {
          "softMaxMeters": 100,
          "costPerKilometerBelowSoftMax": 50,
          "costPerKilometerAboveSoftMax": 1,
        }
      }
    ]
  }
}

Le tag #unused_tag# ne doit être utilisé par aucun envoi ni véhicule pour correspondre à toutes les transitions possibles. Pour en savoir plus, consultez Mettre en correspondance toutes les demandes de visite.

Fonctionnement d'un coût élevé inférieur au seuil

Cette section montre comment le coût inférieur et supérieur au seuil affecte le coût global des différentes solutions du scénario d'exemple.

Solution 1 : effectuez les tâches A et B à l'aller, et la tâche C au retour

Dans cette solution, les livraisons sont réparties entre les deux traversées de cette route. Deux d'entre eux sont livrés lors du premier parcours, et le dernier lors du second. Il existe cinq transitions :

Transition Distance En dessous du seuil Au-dessus du seuil
Distance Coût Distance Coût
depot →A 1 000 m 100 m 5 900 m 0,9
A→B 50 m 50 m 2.5 0 m 0
B→autre 1 030 m 100 m 5 930 m 0,93
other→C 1 000 m 100 m 5 900 m 0,9
C→depot 1 080 m 100 m 5 980 m 0.98
Total 450 m 22,5 3 710 m 3,71

Le coût global est calculé en additionnant les deux coûts par kilomètre :

  • le coût par kilomètre en dessous du seuil (50) multiplié par la distance totale parcourue en dessous du seuil (450 m = 0,45 km),
  • le coût par kilomètre au-dessus du seuil (1) multiplié par la distance totale parcourue au-dessus du seuil (3 710 m = 3,71 km).

Le coût total est donc de 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.

Solution 2 : Effectuer les actions A, B et C à l'aller, et aucune au retour

Dans cette solution, contrairement à la solution 1, les trois envois sont livrés "en groupe" lors d'un seul passage sur la route. Sur l'autre trajet, le véhicule ne s'arrête pas du tout. Là encore, il y a cinq transitions, mais leurs longueurs et leurs compositions sont différentes :

Transition Distance En dessous du seuil Au-dessus du seuil
Distance Coût Distance Coût
depot →A 1 000 m 100 m 5 900 m 0,9
A→B 50 m 50 m 2.5 0 m 0
B→C 30 min 30 min 1.5 0 m 0
C→autre 1 000 m 100 m 5 900 m 0,9
other→depot 2 080 m 100 m 5 1 980 m 1,98
Total 380 m 19 3 780 m 3,78

En utilisant le même calcul que dans la solution 1, le coût global est de 0,38 * 50 + 3,78 * 1 = 19 + 3,78 = 22,78. Effectuer toutes les visites dans un seul bloc de temps coûte moins cher que de les effectuer en deux groupes. Vous pouvez renforcer cet effet en augmentant DistanceLimit.cost_per_kilometer_below_soft_max.

Pourquoi un faible coût par kilomètre inférieur au seuil ne fonctionne pas

Comme vous souhaitez privilégier les transitions courtes par rapport aux transitions longues, vous pouvez être tenté d'attribuer un coût par kilomètre élevé aux transitions longues et de conserver un coût par kilomètre faible pour les transitions courtes. Mais cela a en fait un effet inverse : comme les 100 premiers mètres de la transition sont les moins chers, l'optimiseur utilise ces mètres "bon marché" de manière optimale en privilégiant les transitions d'environ 100 mètres ou plus.

Vous pouvez voir cet effet sur les deux exemples de solutions. Si vous échangez le coût par kilomètre en dessous et au-dessus du seuil, les coûts de l'itinéraire changent :

Coût élevé au-dessus du seuil Coût élevé en dessous du seuil
Solution 1 Solution 2 Solution 1 Solution 2
KM en dessous du seuil 0,45 0,38 0,45 0,38
Coût par KM inférieur au seuil 1,00 1,00 50,00 50,00
KM au-dessus du seuil 3,71 3,78 3,71 3,78
Coût par km au-dessus du seuil 50,00 50,00 1,00 1,00
Coût total 185,95 189,38 26.21 22,78

Pour chaque version, le coût total le plus bas des deux solutions est indiqué en gras. Vous pouvez constater que lorsque vous utilisez un coût élevé au-dessus du seuil, le coût total de l'itinéraire est désormais plus élevé pour l'itinéraire où les visites sont regroupées, ce qui est l'inverse de ce que vous vouliez obtenir.