L'API Route Optimization renvoie des itinéraires pour les véhicules de la requête correspondante. Les envois sont attribués à des véhicules ou peuvent être ignorés en fonction des propriétés de la requête.
Un message OptimizeToursResponse (REST, gRPC) comporte deux propriétés de premier niveau principales :
routes[]sont les itinéraires de chaque véhicule avec les livraisons 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.
Certaines propriétés ne sont pas toujours renseignées, en fonction des résultats de l'optimisation :
skippedShipments[]répertorie les envois qui ne sont effectués 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 mode de résolutionVALIDATE_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 particulier de la requête. Voici quelques propriétés importantes de ShipmentRoute liées à son Vehicle correspondant :
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 égale à zéro.vehicleStartTimecorrespond à l'heure à laquelle le véhicule doit commencer son trajet.vehicleEndTimeest l'heure à laquelle le véhicule devrait terminer son itinéraire.
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 effectuera. Chaque Visit (REST, gRPC) représente un VisitRequest (REST, gRPC) de la requête correspondante. Voici quelques propriétés importantes de Visit :
shipmentIndexcorrespond à l'index de base 0 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'une visite est une livraison. Les réponses REST omettent cette propriété lorsque la valeur est "false".visitRequestIndexcorrespond à l'index de base 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.startTimecorrespond à l'heure de début prévue de la visite.loadDemandsmappe le type de chargement au montant de chargement demandé pour effectuer leVisit. 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 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 trajets 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.travelDurationest 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é du véhicule avant qu'il puisse démarrer sa prochaineVisit. Cela peut être dû à lastart_timedesVisitsuivants.totalDurationest 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 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 de collecte et de livraison et la documentation de référence sur 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. Pour en savoir plus sur les coûts, consultez Paramètres du modèle de coûts.usedVehicleCountest le 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 ignorées qui sont "obligatoires". 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 contraintes spécifiées. Pour en savoir plus sur les coûts, consultez 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 au temps total que les véhicules passent en transit pendant qu'ils effectuent 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 prises par les véhicules pendant leurs trajets.visitDurationcorrespond au temps total que les véhicules passent à effectuer des visites pendant leurs itinéraires. 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 charge maximale transportée par les véhicules à tout moment de leur itinéraire.
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
}
}
}