Cet exemple montre comment utiliser des attributs de transition pour hiérarchiser les itinéraires où les collectes 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 diffusions sont prévues à l'avenir.
- Aucun délai de livraison n'est 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 rentrant.
- La distance et la durée de trajet globales de l'itinéraire sont toujours les mêmes, quel que soit le moment où les étapes A, B et C sont effectuées.
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 être géré par A et B le matin et par C le soir. Le coût de la solution serait le même que si les trois étaient géré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 limite. 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, qui correspond à peu près à un bloc 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 chauffeurs.
Pour regrouper les visites à proximité (à moins de 100 m les unes des autres), 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 plus grandes économies en utilisant des transitions inférieures au seuil de 100 mètres, même si cela implique d'allonger la longueur globale du parcours.
Pour configurer les coûts, ajoutez une entrée à ShipmentModel.transition_attributes
avec les propriétés suivantes:
- Pour faire correspondre toutes les transitions possibles, choisissez une balise qui n'est utilisée nulle part dans le modèle, par exemple
UNUSED_TAG
. DéfinissezTransitionAttributes.excluded_src_tag
etTransitionAttributes.excluded_dst_tag
sur cette balise. - Configurez
TransitionAttributes.distance_limit
avec la distance et les coûts du seuil :- Définissez
DistanceLimit.soft_max_meters
sur le seuil sélectionné. - Définissez
DistanceLimit.cost_per_kilometer_below_soft_max
sur le coût par kilomètre en dessous du seuil. - Définissez
DistanceLimit.cost_per_kilometer_above_soft_max
sur le coût par kilomètre au-dessus du seuil.
- Définissez
{
"model": {
"transitionAttributes": [
{
"excluded_dst_tag": "UNUSED_TAG ",
"excluded_src_tag": "UNUSED_TAG ",
"distanceLimit": {
"softMaxMeters": 100,
"costPerKilometerBelowSoftMax": 50,
"costPerKilometerAboveSoftMax": 1,
}
}
]
}
}
La balise #unused_tag#
ne doit pas être utilisée par les envois ni les véhicules pour correspondre à toutes les transitions possibles. Pour en savoir plus, consultez Associer toutes les requêtes de visite.
Fonctionnement d'un coût élevé sous le seuil
Cette section montre comment le coût inférieur et supérieur au seuil affecte le coût global des différentes solutions de l'exemple de scénario.
Solution 1: Effectuer A, B sur le trajet aller, C sur le trajet retour
Dans cette solution, les envois sont répartis en deux traversées de cette route. Deux d'entre eux sont envoyés lors de la première traversée, et le troisième est envoyé lors de la seconde. Il existe cinq transitions:
Transition | Distance | En-dessous du seuil | Au-dessus du seuil | ||
---|---|---|---|---|---|
Distance | Coût | Distance | Coût | ||
dépôt →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 |
autre→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 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.
Solution 2: Effectuer A, B et C sur le trajet aller, rien sur le trajet retour
Dans cette solution, contrairement à la solution 1, les trois envois sont livrés "en groupe" lors d'un seul passage sur la route. Lors de l'autre traversée, le véhicule ne s'arrête pas du tout. Encore une fois, il y a cinq transitions, mais leurs durées et compositions sont différentes:
Transition | Distance | En-dessous du seuil | Au-dessus du seuil | ||
---|---|---|---|---|---|
Distance | Coût | Distance | Coût | ||
dépôt →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 m | 30 m | 1,5 | 0 m | 0 |
C→autre | 1 000 m | 100 m | 5 | 900 m | 0,9 |
autre→dépôt | 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 même bloc de temps est moins coûteux que de les effectuer dans deux groupes. Vous pouvez renforcer cet effet en augmentant DistanceLimit.cost_per_kilometer_below_soft_max
.
Pourquoi un faible coût par kilomètre en dessous du seuil ne fonctionne-t-il pas ?
Étant donné que vous préférez les transitions courtes aux transitions longues, vous pouvez être tenté d'attribuer un coût élevé par kilomètre aux transitions longues et de conserver le faible coût par kilomètre 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 la manière la plus efficace en privilégiant les transitions de 100 mètres ou plus.
Vous pouvez voir cet effet dans les deux exemples de solutions. Si vous remplacez le coût par kilomètre en dessous et au-dessus du seuil, les coûts du trajet 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 en dessous du 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 mis en évidence en gras. Vous pouvez constater que lorsque vous utilisez un coût élevé au-dessus du seuil, le coût total du parcours est désormais plus élevé pour le parcours où les visites sont regroupées, ce qui est l'inverse de ce que vous souhaitiez obtenir.