Interpréter la réponse

L'API Route Optimization renvoie les routes 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 requête.

Un message OptimizeToursResponse (REST, gRPC) possède deux propriétés de premier niveau principales:

  • routes[] correspond aux itinéraires de chaque véhicule avec les livraisons qui lui sont attribuées. Chaque Route contient des métriques reflétant les propriétés de cette route individuelle.
  • Les metrics sont des métriques agrégées pour l'ensemble de la réponse, pour tous les véhicules et tous les plans d'itinéraire. Les métriques de premier niveau contiennent les mêmes propriétés que les métriques par itinéraire, avec des valeurs agrégées pour tous les itinéraires.

Il est possible que certaines propriétés ne soient pas toujours renseignées en fonction des résultats de l'optimisation:

  1. skippedShipments[] répertorie les livraisons 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 limites spécifiées ou si le coût d'exécution de la livraison dépasse le montant des pénalités. Par exemple, si l'enlèvement ou la livraison d'un colis est associé à un timeWindow très restreint, il peut être impossible ou rentable pour un véhicule d'effectuer la visite pendant la période requise.
  2. validationErrors[] spécifie les erreurs qui rendent la requête non valide ou impossible à résoudre lorsque son solvingMode est défini sur VALIDATE_ONLY. En mode DEFAULT_SOLVE normal, les erreurs de validation apparaissent dans un message d'erreur au lieu du corps de la réponse. Notez que le mode de résolution VALIDATE_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'affectation d'un itinéraire à un véhicule particulier de la requête. Voici quelques propriétés ShipmentRoute importantes liées au Vehicle correspondant:

  • vehicleIndex est l'index de base zéro du Vehicle dans le message de requête correspondant. Les réponses REST omettent cette propriété lorsque la valeur est égale à zéro.
  • vehicleStartTime correspond à l'heure à laquelle le véhicule doit commencer son itinéraire.
  • vehicleEndTime est l'heure à laquelle le véhicule est censé terminer son itinéraire.

Dans une réponse, routes se présentera comme suit:

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T00:00:00Z",
      "vehicleEndTime": "2024-02-13T00:38:42Z",
      "visits": [
        ...
      ],
      "transitions": [
        ...
      ],
      "metrics": {
        ...
      },
      ...
    }
  ],
  ...
}

Chaque ShipmentRoute inclut une liste numérotée de visits que le véhicule complétera. Chaque Visit (REST, gRPC) représente un VisitRequest (REST, gRPC) de la requête correspondante. Voici les propriétés Visit importantes:

  • shipmentIndex est l'indice de base zéro de la livraison à laquelle cette visite appartient dans la requête correspondante.
  • isPickup a la valeur "true" lorsqu'une visite correspond à un retrait en magasin et la valeur "false" lorsqu'une visite est une livraison. Les réponses REST omettent cette propriété lorsque la valeur est "false".
  • visitRequestIndex est l'indice de base zéro du VisitRequest à partir de Shipment.pickups ou de Shipment.deliveries dans la requête correspondante représentée par Visit. Les réponses REST omettent cette propriété lorsque la valeur est égale à zéro.
  • startTime est l'heure de début prévue de la visite.
  • loadDemands : type de chargement de cartes permettant de charger la quantité demandée pour terminer le Visit. Les volumes de chargement sont négatifs pour les visites de livraison, ce qui correspond à la suppression de la charge 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 numérotée de transitions qui représentent les trajets entre visits pour un véhicule donné. Les propriétés importantes du message Transition (REST, gRPC) incluent:

  • 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, exprimée en mètres, que le véhicule doit parcourir pour effectuer la transition.
  • trafficInfoUnavailable indique si des données de 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 prochain Visit. Cela peut être dû à la start_time des Visit suivants.
  • totalDuration est 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 chargement à la quantité de chargement transportée par le véhicule lors de cette transition.

Voici un exemple de Transition:

{
  "routes": [
    {
      ...
      "transitions": [
        ...
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        ...
      ],
      ...
    }
  ],
  ...
}

La relation entre vists et transitions est décrite dans la section Optimisation des commandes à livrer à l'arrêt, ainsi que dans la documentation de référence ShipmentRoute (REST, gRPC).

Propriétés des métriques

Le message Metrics (REST, gRPC) résume la solution dans son ensemble. Voici quelques propriétés Metrics importantes:

  • totalCost correspond au coût total facturé pour les itinéraires. Pour en savoir plus sur les coûts, consultez la page Paramètres du modèle de coût.
  • usedVehicleCount est 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.
  • skippedMandatoryShipmentCount correspond au nombre de livraisons ignorées qui sont "obligatoires". Une livraison obligatoire ne spécifie pas de valeur penaltyCost qui sera appliquée si la livraison est ignorée. Les envois obligatoires peuvent toujours être ignorés si leurs performances ne sont pas réalisables sous les contraintes spécifiées. Pour en savoir plus sur les coûts, consultez l'article Paramètres du modèle de coût.

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. 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 de livraisons effectuées par les véhicules sur l'ensemble de leurs itinéraires.
  • travelDuration correspond au temps total que les véhicules passent en transit pendant leur trajet.
  • waitDuration correspond au temps total d'attente des véhicules pour terminer leur itinéraire.
  • delayDuration correspond au temps de retard total des véhicules. Elle est généralement égale à zéro, sauf si TransitionAttributes est utilisé dans la requête.
  • breakDuration correspond au temps total que les véhicules passent en pause pendant leur trajet.
  • visitDuration est le temps total que les véhicules passent à effectuer des visites pendant leur itinéraire. Il s'agit en fait de la somme de toutes les valeurs VisitRequest.duration pour les VisitRequest correspondant aux Visit attribués au véhicule concerné.
  • totalDuration correspond à la durée totale nécessaire pour effectuer les itinéraires empruntés par le véhicule.
  • travelDistanceMeters correspond à la distance totale parcourue par les véhicules lors de leur trajet.
  • maxLoads met en correspondance les types de chargement avec la 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 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
    }
  }
}