L'API Route Optimization renvoie des itinéraires pour les véhicules dans la requête correspondante. Les expéditions sont attribuées à des véhicules ou peuvent être ignorées en fonction des propriétés de la demande.
Un message OptimizeToursResponse (REST, gRPC) comporte deux propriétés de premier niveau principales :
routes[]: itinéraires de chaque véhicule avec les expéditions qui lui sont attribuées. ChaqueRoutecontient des métriques reflétant les propriétés de cet itinéraire.metricssont des métriques agrégées pour l'ensemble de la réponse, pour tous les véhicules et plans de route. Les métriques de niveau supérieur contiennent les mêmes propriétés que les métriques par route, avec des valeurs agrégées pour toutes les routes.
Il est possible que certaines propriétés ne soient pas toujours renseignées en fonction des résultats de l'optimisation :
skippedShipments[]liste les expéditions qui ne sont effectuées par aucun véhicule. Un envoi peut être ignoré s'il ne peut pas être effectué dans les limites spécifiées ou si le coût de l'envoi dépasse son coût de pénalité. Par exemple, si l'enlèvement ou la livraison d'un colis a unetimeWindowtrès courte, il peut être impossible ou peu rentable pour un véhicule d'effectuer la visite pendant le créneau horaire requis.validationErrors[]spécifie les erreurs qui rendent la requête non valide ou impossible à résoudre lorsque lesolvingModede la requête est défini surVALIDATE_ONLY. En modeDEFAULT_SOLVEnormal, les erreurs de validation s'affichent dans un message d'erreur au lieu du corps de la réponse. Notez que le modeVALIDATE_ONLYpeut signaler plusieurs erreurs à la fois, ce qui est utile pour déboguer rapidement les requêtes.
Propriétés de la route
Chaque entrée routes[] est un message ShipmentRoute (REST, gRPC). Chaque ShipmentRoute représente l'attribution d'itinéraire pour un véhicule spécifique de la requête. Les propriétés importantes de ShipmentRoute liées à son Vehicle correspondant incluent :
vehicleIndexest l'index basé sur zéro deVehicledans le message de requête correspondant. Les réponses REST omettent cette propriété lorsque la valeur est nulle.vehicleStartTimecorrespond à l'heure à laquelle le véhicule doit commencer son trajet.vehicleEndTimecorrespond à l'heure à laquelle le véhicule devrait terminer son trajet.
Dans une réponse, routes se présente comme suit :
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
Chaque ShipmentRoute inclut une liste ordonnée de visits que le véhicule doit effectuer. Chaque Visit (REST, gRPC) représente un VisitRequest (REST, gRPC) de la requête correspondante. Voici quelques propriétés importantes :Visit
shipmentIndexcorrespond à l'index de base zéro de l'envoi auquel appartient cette visite dans la requête correspondante.isPickupest défini sur "true" lorsqu'une visite est un retrait et sur "false" lorsqu'il s'agit d'une livraison. Les réponses REST omettent cette propriété lorsque la valeur est "false".visitRequestIndexest l'index basé sur zéro deVisitRequestà partir deShipment.pickupsouShipment.deliveriesdans la requête correspondante queVisitreprésente. Les réponses REST omettent cette propriété lorsque la valeur est nulle.startTimeest l'heure à laquelle la visite doit commencer.loadDemandsmappe le type de chargement à la quantité de chargement requise pour terminerVisit. Les quantités de chargement sont négatives pour les visites de livraison, ce qui signifie que la charge est retirée du véhicule.
Voici un exemple de fichier Visit :
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
Chaque ShipmentRoute inclut une liste ordonnée de transitions qui représentent les déplacements entre les visits pour un véhicule donné. Les propriétés importantes des messages Transition (REST, gRPC) incluent :
startTimecorrespond à l'heure à laquelle le véhicule commencera la transition.travelDurationcorrespond à la durée pendant laquelle le véhicule doit se déplacer pour effectuer la transition.travelDistanceMeterscorrespond à la distance en mètres que le véhicule doit parcourir pour terminer la transition.trafficInfoUnavailableindique si des données sur le trafic sont disponibles pour la transition.waitDurationreprésente le temps d'inactivité pendant lequel le véhicule attend avant de pouvoir démarrer son prochainVisit. Cela peut être dû à lastart_timedesVisitsuivants.totalDurationcorrespond à la durée totale de la transition, y compris les temps de trajet, d'attente, de pause et de retard.vehicleLoadsmappe le type de charge à la quantité de charge transportée par le véhicule pendant cette transition.
Voici un exemple de fichier Transition :
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
Pour en savoir plus sur la relation entre vists et transitions, consultez Optimisation de l'ordre des arrêts pour les enlèvements et les livraisons et la documentation de référence ShipmentRoute (REST, gRPC). Pour en savoir plus sur les propriétés routePolyline et routeToken d'un message Transition, consultez Polylignes de transition et jetons de route.
Propriétés des métriques
Le message Metrics (REST, gRPC) résume l'ensemble de la solution.
Voici quelques propriétés importantes de Metrics :
totalCostcorrespond au coût total encouru pour effectuer les itinéraires. En savoir plus sur les coûts dans Paramètres du modèle de coûtsusedVehicleCountcorrespond au nombre total de véhicules utilisés dans la solution. Les véhicules peuvent avoir des itinéraires vides lorsque l'optimiseur détermine que leur utilisation n'est pas nécessaire.skippedMandatoryShipmentCountcorrespond au nombre d'expéditions obligatoires ignorées. Une expédition obligatoire ne spécifie pas depenaltyCostqui est encouru si l'expédition est ignorée. Les expéditions obligatoires peuvent toujours être ignorées si leurs performances ne sont pas réalisables dans les limites spécifiées. En savoir plus sur les coûts dans Paramètres du modèle de coûts
Les métriques supplémentaires sont signalées sous forme de messages AggregatedMetrics (REST, gRPC). Le type de message AggregatedMetrics est utilisé pour la propriété Metrics.aggregatedRouteMetrics et pour la propriété ShipmentRoute.metrics. La propriété Metrics.aggregatedRouteMetrics contient des métriques agrégées pour tous les ShipmentRoute dans le OptimizeToursResponse. Chaque propriété ShipmentRoute.metrics contient des métriques pour ce ShipmentRoute spécifique.
Voici quelques propriétés importantes de AggregatedMetrics :
performedShipmentCountcorrespond au nombre d'expéditions effectuées par les véhicules sur l'ensemble de leurs itinéraires.travelDurationcorrespond à la durée totale pendant laquelle les véhicules sont en transit pour effectuer leurs itinéraires.waitDurationcorrespond au temps total passé par les véhicules à attendre pendant qu'ils effectuent leurs itinéraires.delayDurationcorrespond au temps de retard total des véhicules. Cette valeur est généralement nulle, sauf si desTransitionAttributessont utilisés dans la requête.breakDurationcorrespond à la durée totale des pauses effectuées par les véhicules lors de leurs trajets.visitDurationcorrespond au temps total passé par les véhicules à effectuer des visites lors de leurs trajets. Il s'agit en fait de la somme de toutes les valeursVisitRequest.durationpour lesVisitRequestcorrespondant auxVisitattribués au véhicule concerné.totalDurationcorrespond à la durée totale nécessaire pour effectuer les itinéraires des véhicules.travelDistanceMeterscorrespond à la distance totale parcourue par les véhicules pour effectuer leurs itinéraires.maxLoadsmappe les types de chargement à la quantité de chargement maximale transportée par les véhicules à tout moment sur leurs itinéraires.
Voici un exemple de message Metrics :
{
"routes": [
...
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}
Exemple complet
Voici un exemple de réponse complète à la requête de la section Créer une requête :
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
{
"startTime": "2024-02-13T00:19:31Z",
"detour": "0s"
}
],
"transitions": [
{
"travelDuration": "0s",
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1151s",
"travelDistanceMeters": 9599,
"waitDuration": "0s",
"totalDuration": "1151s",
"startTime": "2024-02-13T00:19:31Z"
}
],
"metrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"routeCosts": {
"model.vehicles.cost_per_kilometer": 18.603
},
"routeTotalCost": 18.603
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}