L'API Route Optimization renvoie les itinéraires des véhicules dans 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) possède deux propriétés de premier niveau principales:
routes[]
: itinéraires de chaque véhicule avec les envois qui lui sont attribués. ChaqueRoute
contient des métriques reflétant les propriétés de cette route individuelle.metrics
sont des métriques agrégées pour l'ensemble de la réponse, pour tous les véhicules et tous les plans de trajet. Les métriques de niveau supérieur contiennent les mêmes propriétés que les métriques par trajet, avec des valeurs agrégées pour tous les trajets.
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. Une livraison peut être ignorée si elle ne peut pas être effectuée dans les contraintes spécifiées ou si le coût de la livraison dépasse le coût de pénalité. Par exemple, si latimeWindow
de la collecte ou de la livraison d'un envoi est très étroite, il est possible qu'il ne soit pas possible ou rentable pour un véhicule d'effectuer la visite dans la période requise.validationErrors[]
spécifie les erreurs qui rendent la requête non valide ou impossible à résoudre lorsque lesolvingMode
de la requête est défini surVALIDATE_ONLY
. En modeDEFAULT_SOLVE
normal, 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_ONLY
peut 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'un itinéraire à un véhicule particulier à partir de la requête. Les propriétés ShipmentRoute
importantes liées à son Vehicle
correspondant incluent les suivantes:
vehicleIndex
est l'index basé sur zéro de l'Vehicle
dans le message de requête correspondant. Les réponses REST omettent cette propriété lorsque la valeur est nulle.vehicleStartTime
correspond à l'heure à laquelle le véhicule doit commencer son itinéraire.vehicleEndTime
correspond à 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 des 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 Visit
importantes:
shipmentIndex
correspond à l'index de base 0 de l'envoi auquel cette visite appartient dans la requête correspondante.isPickup
est défini sur "true" lorsqu'une visite correspond à un retrait et sur "false" lorsqu'elle correspond à une livraison. Les réponses REST omettent cette propriété lorsque la valeur est "false".visitRequestIndex
est l'indice de base zéro duVisitRequest
à partir deShipment.pickups
ou deShipment.deliveries
dans la requête correspondante représentée parVisit
. Les réponses REST omettent cette propriété lorsque la valeur est nulle.startTime
est l'heure de début prévue de la visite.loadDemands
met en correspondance le type de charge avec la quantité de charge demandée pour effectuer laVisit
. Les quantités de charge sont négatives pour les visites de livraison, car elles représentent la charge 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
représentant les trajets entre des visits
pour un véhicule donné. Les propriétés importantes des messages Transition
(REST, gRPC) incluent les suivantes:
startTime
est l'heure à laquelle le véhicule commencera à effectuer la transition.travelDuration
est la durée pendant laquelle le véhicule doit circuler pour effectuer la transition.travelDistanceMeters
est la distance en mètres que le véhicule doit parcourir pour effectuer la transition.trafficInfoUnavailable
indique si des données sur le trafic sont disponibles pour la transition.waitDuration
représente le temps d'inactivité que le véhicule passe à attendre avant de pouvoir démarrer son prochainVisit
. Cela peut être dû austart_time
de l'Visit
suivant.totalDuration
correspond à la durée totale de la transition, y compris les temps de trajet, d'attente, de pause et de retard.vehicleLoads
mappe le type de charge à la quantité de charge transportée par le véhicule lors de 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 la section Optimisation de l'ordre des arrêts de ramassage 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 la section Polylignes de transition et jetons de parcours.
Propriétés des métriques
Le message Metrics
(REST, gRPC) résume la solution dans son ensemble.
Voici quelques-unes des propriétés importantes de Metrics
:
totalCost
correspond au coût total des itinéraires. Pour en savoir plus sur les coûts, consultez la section Paramètres du modèle de coûts.usedVehicleCount
correspond 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.skippedMandatoryShipmentCount
est le nombre d'expéditions ignorées qui sont "obligatoires". Un envoi obligatoire ne spécifie pas depenaltyCost
qui sera appliqué si l'envoi est ignoré. Les envois obligatoires peuvent toujours être ignorés si leurs performances ne sont pas réalisables dans les contraintes spécifiées. Pour en savoir plus sur les coûts, consultez la section Paramètres du modèle de coûts.
Les métriques supplémentaires sont signalées sous la 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
. Metrics.aggregatedRouteMetrics
contient des métriques agrégées pour tous les ShipmentRoute
de OptimizeToursResponse
. Chaque propriété ShipmentRoute.metrics
contient des métriques pour ce ShipmentRoute
spécifique.
Voici quelques propriétés AggregatedMetrics
importantes:
performedShipmentCount
correspond au nombre d'envois effectués par les véhicules sur l'ensemble de leur parcours.travelDuration
correspond à la durée totale de trajet des véhicules pendant qu'ils effectuent leurs itinéraires.waitDuration
correspond au temps total d'attente des véhicules pendant l'exécution de leurs itinéraires.delayDuration
correspond au temps de retard total des véhicules. Cette valeur est généralement nulle, sauf siTransitionAttributes
est utilisé dans la requête.breakDuration
correspond à la durée totale des pauses des véhicules pendant qu'ils effectuent leurs trajets.visitDuration
correspond au temps total passé par les véhicules à effectuer des visites lors de l'exécution de leurs itinéraires. Il s'agit en fait de la somme de toutes les valeursVisitRequest.duration
pour lesVisitRequest
correspondant auxVisit
attribués au véhicule concerné.totalDuration
correspond à la durée totale nécessaire pour effectuer les trajets des véhicules.travelDistanceMeters
correspond à la distance totale parcourue par les véhicules lors de leur trajet.maxLoads
met en correspondance les types de charge avec la quantité de charge maximale transportée par les véhicules à n'importe quel point 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 Construire 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
}
}
}