Method: projects.locations.optimizeTours

Envoie un OptimizeToursRequest contenant un ShipmentModel et renvoie un OptimizeToursResponse contenant des ShipmentRoute, qui sont un ensemble d'itinéraires à effectuer par les véhicules en minimisant le coût global.

Un modèle ShipmentModel se compose principalement de Shipment à effectuer et de Vehicle pouvant être utilisées pour transporter les Shipment. Les ShipmentRoute attribuent des Shipment aux Vehicle. Plus précisément, ils attribuent une série de Visit à chaque véhicule, où un Visit correspond à un VisitRequest, qui est un retrait ou une livraison pour un Shipment.

L'objectif est d'attribuer des ShipmentRoute à des Vehicle de manière à minimiser le coût total, qui comporte de nombreux composants définis dans ShipmentModel.

Requête HTTP

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*/locations/*}:optimizeTours

L'URL utilise la syntaxe de transcodage gRPC.

Paramètres de chemin d'accès

Paramètres
parent

string

Obligatoire. Projet ou emplacement cibles pour passer un appel.

Format :

  • projects/{project-id}
  • projects/{project-id}/locations/{location-id}

Si aucun emplacement n'est spécifié, une région est automatiquement sélectionnée.

Corps de la requête

Le corps de la requête contient des données présentant la structure suivante :

Représentation JSON
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
Champs
timeout

string (Duration format)

Si ce délai avant expiration est défini, le serveur renvoie une réponse avant l'expiration du délai ou l'échéance du serveur pour les requêtes synchrones, selon la première échéance atteinte.

Pour les requêtes asynchrones, le serveur génère une solution (si possible) avant l'expiration du délai.

Durée en secondes avec neuf chiffres au maximum après la virgule et se terminant par "s". Exemple : "3.5s"

model

object (ShipmentModel)

Modèle d'expédition à résoudre.

solvingMode

enum (SolvingMode)

Par défaut, le mode de résolution est DEFAULT_SOLVE (0).

searchMode

enum (SearchMode)

Mode Recherche utilisé pour répondre à la requête.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

Guidez l'algorithme d'optimisation pour qu'il trouve une première solution semblable à une solution précédente.

Le modèle est contraint lorsque la première solution est créée. Les livraisons non effectuées sur un itinéraire sont implicitement ignorées dans la première solution, mais elles peuvent être effectuées dans les solutions suivantes.

La solution doit répondre à certaines hypothèses de validité de base :

  • Pour tous les itinéraires, vehicleIndex doit être dans la plage et ne pas être dupliqué.
  • Pour toutes les visites, shipmentIndex et visitRequestIndex doivent être dans la plage.
  • Une expédition ne peut être référencée que sur un seul itinéraire.
  • La prise en charge d'un colis à récupérer et à livrer doit être effectuée avant la livraison.
  • Il ne peut y avoir qu'une seule alternative de retrait ou de livraison pour un envoi.
  • pour toutes les routes, les temps augmentent (c'est-à-dire vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • Une expédition ne peut être effectuée que sur un véhicule autorisé. Un véhicule est autorisé si Shipment.allowed_vehicle_indices est vide ou si son vehicleIndex est inclus dans Shipment.allowed_vehicle_indices.

Si la solution injectée n'est pas réalisable, une erreur de validation n'est pas nécessairement renvoyée. Une erreur indiquant l'irréalisabilité peut être renvoyée à la place.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Limitez l'algorithme d'optimisation pour trouver une solution finale semblable à une solution précédente. Par exemple, cela peut être utilisé pour figer des portions d'itinéraires déjà effectuées ou à effectuer, mais qui ne doivent pas être modifiées.

Si la solution injectée n'est pas réalisable, une erreur de validation n'est pas nécessairement renvoyée. Une erreur indiquant l'irréalisabilité peut être renvoyée à la place.

refreshDetailsRoutes[]

object (ShipmentRoute)

Si elle n'est pas vide, les itinéraires indiqués seront actualisés, sans que leur séquence de visites ou leurs temps de trajet sous-jacents soient modifiés. Seuls les autres détails seront mis à jour. Cela ne résout pas le modèle.

Depuis le 11/2020, cela ne remplit que les polylignes des itinéraires non vides et nécessite que populatePolylines soit défini sur "true".

Les champs routePolyline des routes transmises peuvent être incohérents avec la route transitions.

Ce champ ne doit pas être utilisé avec injectedFirstSolutionRoutes ni injectedSolutionConstraint.

Shipment.ignore et Vehicle.ignore n'ont aucun effet sur le comportement. Les polylignes sont toujours renseignées entre toutes les visites dans tous les itinéraires non vides, que les expéditions ou les véhicules associés soient ignorés ou non.

interpretInjectedSolutionsUsingLabels

boolean

Si la réponse est "True" :

Cette interprétation s'applique aux champs injectedFirstSolutionRoutes, injectedSolutionConstraint et refreshDetailsRoutes. Vous pouvez l'utiliser lorsque les index de véhicules ou d'expéditions de la requête ont changé depuis la création de la solution, par exemple parce que des expéditions ou des véhicules ont été ajoutés ou supprimés de la requête.

Si la valeur est "true", les libellés des catégories suivantes ne doivent apparaître qu'une seule fois dans leur catégorie :

Si un vehicleLabel dans la solution injectée ne correspond pas à un véhicule de requête, l'itinéraire correspondant est supprimé de la solution ainsi que ses visites. Si un shipmentLabel dans la solution injectée ne correspond pas à une expédition de demande, la visite correspondante est supprimée de la solution. Si un SkippedShipment.label dans la solution injectée ne correspond pas à une expédition de demande, le SkippedShipment est supprimé de la solution.

La suppression de visites ou d'itinéraires entiers d'une solution injectée peut avoir une incidence sur les contraintes implicites, ce qui peut entraîner une modification de la solution, des erreurs de validation ou une infaisabilité.

REMARQUE : L'appelant doit s'assurer que chaque Vehicle.label (resp. Shipment.label) identifie de manière unique une entité de véhicule (ou d'expédition) utilisée dans les deux requêtes concernées : la requête passée qui a produit le OptimizeToursResponse utilisé dans la solution injectée et la requête actuelle qui inclut la solution injectée. Les vérifications d'unicité décrites ci-dessus ne suffisent pas à garantir cette exigence.

considerRoadTraffic

boolean

Tenez compte de l'estimation du trafic pour calculer les champs ShipmentRoute Transition.travel_duration, Visit.start_time et vehicleEndTime, pour définir le champ ShipmentRoute.has_traffic_infeasibilities et pour calculer le champ OptimizeToursResponse.total_cost.

populatePolylines

boolean

Si la valeur est "true", les polylignes seront renseignées dans les ShipmentRoute de réponse.

populateTransitionPolylines

boolean

Si la valeur est "true", les polylignes et les jetons de route seront renseignés dans la réponse ShipmentRoute.transitions.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Si cette valeur est définie, la requête peut avoir un délai (voir https://grpc.io/blog/deadlines) allant jusqu'à 60 minutes. Sinon, le délai maximal est de 30 minutes. Notez que les requêtes de longue durée présentent un risque d'interruption beaucoup plus élevé (mais toujours faible).

useGeodesicDistances

boolean

Si la valeur est "true", les distances de trajet seront calculées à l'aide de distances géodésiques au lieu de distances Google Maps, et les temps de trajet seront calculés à l'aide de distances géodésiques avec une vitesse définie par geodesicMetersPerSecond.

label

string

Libellé pouvant être utilisé pour identifier cette requête, renvoyé dans OptimizeToursResponse.request_label.

geodesicMetersPerSecond

number

Lorsque useGeodesicDistances est défini sur "true", ce champ doit être défini et indique la vitesse appliquée pour calculer les temps de trajet. Sa valeur doit être d'au moins 1,0 mètre/seconde.

maxValidationErrors

integer

Tronque le nombre d'erreurs de validation renvoyées. Ces erreurs sont généralement associées à une charge utile d'erreur INVALID_ARGUMENT en tant qu'information détaillée sur l'erreur BadRequest (https://cloud.google.com/apis/design/errors#error_details), sauf si solvingMode=VALIDATE_ONLY : consultez le champ OptimizeToursResponse.validation_errors. La valeur par défaut est de 100 et la limite est de 10 000.

Corps de la réponse

Si la requête aboutit, le corps de la réponse contient une instance de OptimizeToursResponse.

Champs d'application des autorisations

Requiert le niveau d'accès OAuth suivant :

  • https://www.googleapis.com/auth/cloud-platform

Autorisations IAM

Nécessite l'autorisation IAM suivante sur la ressource parent :

  • routeoptimization.locations.use

Pour en savoir plus, consultez la documentation IAM.