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 dont le coût global est réduit.

Un modèle ShipmentModel se compose principalement de Shipment à exécuter et de Vehicle qui peuvent être utilisés pour transporter les Shipment. Les ShipmentRoute attribuent des Shipment aux Vehicle. Plus précisément, elle attribue 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 de fournir une attribution de ShipmentRoute à Vehicle qui minimise le coût total lorsque de nombreux composants sont définis dans le 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 cible pour passer un appel.

Format: * projects/{project-id} * projects/{project-id}/locations/{location-id}

Si aucun emplacement n'est spécifié, une région sera choisie automatiquement.

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 est défini, le serveur renvoie une réponse avant la fin du délai ou avant que le délai du serveur pour les requêtes synchrones ne soit atteint, 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 un maximum de neuf chiffres après la virgule, se terminant par "s". Exemple: "3.5s".

model

object (ShipmentModel)

Modèle de livraison à résoudre.

solvingMode

enum (SolvingMode)

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

searchMode

enum (SearchMode)

Mode de recherche utilisé pour résoudre la requête.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

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

Le modèle est soumis à des contraintes lorsque la première solution est créée. Les expéditions qui ne sont pas effectuées sur un itinéraire sont implicitement ignorées dans la première solution, mais elles peuvent être effectuées dans des solutions successives.

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 doit pas être dupliqué.
  • pour toutes les visites, shipmentIndex et visitRequestIndex doivent être compris dans la plage.
  • un envoi ne peut être référencé que sur une seule route.
  • le retrait d'un colis avec retrait et livraison doit être effectué avant la livraison.
  • seule une alternative pour le retrait ou la livraison d'un envoi peut être effectuée.
  • pour tous les itinéraires, les délais augmentent (par exemple, vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • un envoi ne peut être effectué 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 et une erreur indiquant l'infaisabilité peut s'afficher à la place.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Appliquez des contraintes à l'algorithme d'optimisation pour trouver une solution finale semblable à une solution précédente. Vous pouvez, par exemple, figer des parties d'itinéraires déjà terminés ou qui doivent être terminés, mais qui ne doivent pas être modifiés.

Si la solution injectée n'est pas réalisable, une erreur de validation n'est pas nécessairement renvoyée et une erreur indiquant l'infaisabilité peut s'afficher à la place.

refreshDetailsRoutes[]

object (ShipmentRoute)

S'il n'est pas vide, les itinéraires indiqués seront actualisés sans modifier leur séquence de visites ni leur temps de trajet sous-jacent: seuls les autres détails seront mis à jour. Cela ne résout pas le problème.

Depuis 2020/11, seules les polylignes des itinéraires non vides sont insérées. La valeur populatePolylines doit être définie sur "true".

Les champs routePolyline des routes transmises peuvent être incohérents avec l'itinéraire transitions.

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

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

interpretInjectedSolutionsUsingLabels

boolean

Si la valeur est "true" :

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

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

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

Supprimer des itinéraires ou des itinéraires entiers d'une solution injectée peut avoir un effet sur les contraintes implicites, ce qui peut entraîner un changement de 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 (livraison par le représentant) utilisée dans les deux demandes concernées: la requête précédente qui a généré 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

Prenez en compte l'estimation du trafic pour calculer les champs ShipmentRoute Transition.travel_duration, Visit.start_time et vehicleEndTime, ainsi que pour configurer le champ ShipmentRoute.has_traffic_infeasibilities et OptimizeToursResponse.total_cost.

populatePolylines

boolean

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

populateTransitionPolylines

boolean

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

allowLargeDeadlineDespiteInterruptionRisk

boolean

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

useGeodesicDistances

boolean

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

label

string

Libellé pouvant être utilisé pour identifier cette demande, indiqué dans le OptimizeToursResponse.request_label.

geodesicMetersPerSecond

number

Lorsque useGeodesicDistances est défini sur "true", ce champ doit être défini et définit la vitesse appliquée aux temps de trajet pour le calcul. Sa valeur doit être d'au moins 1 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 que détail de l'erreur BadRequest (https://cloud.google.com/apis/design/errors#error_details), sauf si la résolution du problème est de résolution=VALIDATE_ONLY: consultez le champ OptimizeToursResponse.validation_errors. La valeur par défaut est 100,et la limite est fixée à 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