Interpréter la réponse

L'API Route Optimization renvoie des routes pour les véhicules requête. Les expéditions sont attribuées à des véhicules ou peuvent être ignorées en fonction de les propriétés de la requête.

Un message OptimizeToursResponse (REST, gRPC) présente deux instances principales propriétés:

  • 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 cet itinéraire individuel.
  • Les metrics sont des métriques agrégées pour l'ensemble de la réponse, pour l'ensemble les véhicules et les plans d'itinéraire. Les métriques de premier niveau contiennent les mêmes propriétés que 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:

  1. skippedShipments[] répertorie les livraisons qui ne sont effectuées par aucun véhicule. Un colis peut être ignoré s'il ne peut pas être effectué dans les délais spécifiés ou si le coût d'exécution de l'expédition dépasse le coût de pénalité. Par exemple, si la timeWindow 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.
  2. validationErrors[] spécifie les erreurs qui rendent la requête non valide ou impossible à résoudre lorsque le paramètre solvingMode de la requête est défini sur VALIDATE_ONLY En mode DEFAULT_SOLVE normal, les erreurs de validation apparaître 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'itinéraire attribué à un véhicule spécifique à partir de la demande. Propriétés ShipmentRoute importantes liées aux propriétés Vehicle incluent:

  • 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 égale à zéro.
  • vehicleStartTime correspond à l'heure à laquelle le véhicule doit commencer son itinéraire.
  • vehicleEndTime est l'heure à laquelle le véhicule doit terminer sa via un routage réseau.

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 terminé. Chaque Visit (REST, gRPC) représente un VisitRequest (REST, gRPC) à partir de la requête correspondante. Important Visit sont les suivantes:

  • shipmentIndex correspond à l'indice de base zéro du colis à laquelle appartient cette visite. dans la requête correspondante.
  • isPickup a la valeur "true" lorsqu'une visite est considérée comme un retrait et la valeur "false" lorsqu'il s'agit d'une visite la livraison. Les réponses REST omettent cette propriété lorsque la valeur est "false".
  • visitRequestIndex est l'indice base zéro de la valeur VisitRequest issue Shipment.pickups ou Shipment.deliveries dans la requête correspondante que représente Visit. Les réponses REST omettent cette propriété lorsque la méthode est égale à zéro.
  • startTime est l'heure de début prévue de la visite.
  • loadDemands type de chargement de cartes à charger pour effectuer le chargement Visit 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 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 de trajets entre visits pour un véhicule donné. Message important Transition (REST, gRPC) incluent:

  • startTime est l'heure à laquelle le véhicule commencera à effectuer la transition.
  • travelDuration correspond à la durée du trajet jusqu'au terminer la transition.
  • travelDistanceMeters est la distance en mètres que le véhicule doit pour effectuer la transition.
  • trafficInfoUnavailable indique si des données de trafic sont disponibles pour 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 suivant Visit.
  • 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 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 Optimisation des commandes à livrer à l'arrêt et à emporter, de même que Documentation de référence sur 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. En savoir plus sur les coûts dans Paramètres du modèle de coût.
  • 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". Une livraison obligatoire ne spécifie pas de penaltyCost en cas de non-livraison. Les livraisons obligatoires peuvent toujours être ignorées si leurs performances ne sont pas réalisables dans les limites 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 par des messages AggregatedMetrics (REST, gRPC). Le type de message AggregatedMetrics est utilisé pour Propriété Metrics.aggregatedRouteMetrics et pour ShipmentRoute.metrics la propriété Metrics.aggregatedRouteMetrics contient des métriques agrégées ShipmentRoute dans le OptimizeToursResponse. Chaque ShipmentRoute.metrics contient des métriques pour cet 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 au temps total que les véhicules passent en transit pour terminer leur parcours.
  • waitDuration est le temps total que les véhicules ont passé à attendre pendant la fin leurs itinéraires.
  • delayDuration correspond au temps de retard total des véhicules. C'est généralement zéro, sauf si TransitionAttributes est utilisé dans la requête.
  • breakDuration correspond au temps total que les véhicules passent en pause pour terminer leur parcours.
  • visitDuration correspond au temps total passé par les véhicules à effectuer des visites lors de l'exécution de leurs itinéraires. C'est en fait la somme de toutes Valeurs VisitRequest.duration pour les VisitRequest correspondant aux Visit attribuée 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 lorsque pour terminer leur parcours.
  • maxLoads associe les types de chargement à la quantité de chargement maximale autorisée par des véhicules à n'importe quel 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

Un exemple complet de réponse à la requête de la section Construire une requête ressemble à par exemple:

{
  "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
    }
  }
}