Package google.maps.routeoptimization.v1

Index

RouteOptimization

Service permettant d'optimiser les trajets en véhicule.

Validité de certains types de champs:

  • google.protobuf.Timestamp
    • Les heures sont exprimées en heure Unix: nombre de secondes depuis 1970-01-01T00:00:00+00:00.
    • secondes doivent être comprises entre [0, 253402300799], c'est-à-dire entre [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • La valeur nanos ne doit pas être définie ou doit être définie sur 0.
  • google.protobuf.Duration
    • secondes doivent être comprises entre [0, 253402300799], c'est-à-dire entre [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • La valeur nanos ne doit pas être définie ou doit être définie sur 0.
  • google.type.LatLng
    • la latitude doit être de [-90.0, 90.0].
    • la longitude doit être de [-180.0, 180.0].
    • au moins l'une des valeurs de latitude et de longitude doit être différente de zéro.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Optimise les parcours des véhicules pour un ou plusieurs messages OptimizeToursRequest par lot.

Cette méthode est une opération de longue durée (LRO). Les entrées d'optimisation (messages OptimizeToursRequest) et les sorties (messages OptimizeToursResponse) sont lues/écrites depuis/vers Cloud Storage au format spécifié par l'utilisateur. Comme pour la méthode OptimizeTours, chaque OptimizeToursRequest contient un ShipmentModel et renvoie un OptimizeToursResponse contenant des ShipmentRoute, qui sont un ensemble d'itinéraires que les véhicules doivent effectuer en minimisant le coût global.

L'utilisateur peut interroger operations.get pour vérifier l'état de l'opération de longue durée:

Si le champ done de l'opération de longue durée est "false", cela signifie qu'au moins une requête est toujours en cours de traitement. Il est possible que d'autres requêtes aient abouti et que leurs résultats soient disponibles dans GCS.

Si le champ done de l'ordre de traitement des requêtes est défini sur "true", toutes les requêtes ont été traitées. Les résultats de toutes les requêtes traitées avec succès sont disponibles dans GCS. Les résultats des requêtes ayant échoué ne seront pas disponibles dans GCS. Si le champ error de l'ordre de requêtes en ligne est défini, il contient l'erreur de l'une des requêtes ayant échoué.

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.operations.create

Pour en savoir plus, consultez la documentation IAM.

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

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

Un modèle ShipmentModel se compose principalement de Shipment à effectuer et de Vehicle pouvant être utilisés pour transporter les Shipment. Les ShipmentRoute attribuent des Shipment à des 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 de fournir une attribution des ShipmentRoute aux Vehicle qui minimise le coût total lorsque le coût comporte de nombreux composants définis dans le ShipmentModel.

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.

AggregatedMetrics

Métriques agrégées pour ShipmentRoute (correspondant à OptimizeToursResponse pour tous les éléments Transition et/ou Visit (correspondant à tous les ShipmentRoute).

Champs
performed_shipment_count

int32

Nombre d'expéditions effectuées. Notez qu'une paire de retrait et de livraison ne compte qu'une seule fois.

travel_duration

Duration

Durée totale du trajet pour un itinéraire ou une solution.

wait_duration

Duration

Temps d'attente total pour un itinéraire ou une solution.

delay_duration

Duration

Durée totale du retard d'un itinéraire ou d'une solution.

break_duration

Duration

Durée totale de la coupure pour un itinéraire ou une solution.

visit_duration

Duration

Durée totale de la visite pour un itinéraire ou une solution.

total_duration

Duration

La durée totale doit être égale à la somme de toutes les durées ci-dessus. Pour les itinéraires, cela correspond également à:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

Distance totale parcourue pour un itinéraire ou une solution.

max_loads

map<string, VehicleLoad>

Charge maximale atteinte sur l'ensemble de l'itinéraire (solution spécifique), pour chacune des quantités sur cet itinéraire (solution spécifique), calculée comme le maximum dans toutes les Transition.vehicle_loads (resp. ShipmentRoute.metrics.max_loads.

BatchOptimizeToursMetadata

Ce type ne comporte aucun champ.

Métadonnées d'opération pour les appels BatchOptimizeToursRequest.

BatchOptimizeToursRequest

Requête d'optimisation par lot des visites en tant qu'opération asynchrone. Chaque fichier d'entrée doit contenir un élément OptimizeToursRequest, et chaque fichier de sortie contiendra un élément OptimizeToursResponse. La requête contient des informations permettant de lire/écrire et d'analyser les fichiers. Tous les fichiers d'entrée et de sortie doivent appartenir au même projet.

Champs
parent

string

Obligatoire. Projet et 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.

model_configs[]

AsyncModelConfig

Obligatoire. Informations d'entrée/sortie pour chaque modèle d'achat, telles que les chemins d'accès aux fichiers et les formats de données

AsyncModelConfig

Informations permettant de résoudre un modèle d'optimisation de manière asynchrone.

Champs
display_name

string

Facultatif. Nom du modèle défini par l'utilisateur, qui peut être utilisé comme alias pour suivre les modèles.

input_config

InputConfig

Obligatoire. Informations sur le modèle d'entrée.

output_config

OutputConfig

Obligatoire. Informations sur l'emplacement de sortie souhaité.

BatchOptimizeToursResponse

Ce type ne comporte aucun champ.

Réponse à un BatchOptimizeToursRequest. Cette valeur est renvoyée dans l'opération de longue durée une fois l'opération terminée.

BreakRule

Règles permettant de générer des pauses pour un véhicule (par exemple, des pauses déjeuner) Une pause est une période continue au cours de laquelle le véhicule reste inactif à sa position actuelle et ne peut effectuer aucune visite. Une pause peut se produire:

  • pendant le trajet entre deux visites (ce qui inclut le temps juste avant ou juste après une visite, mais pas au milieu d'une visite), auquel cas il prolonge le temps de trajet correspondant entre les visites ;
  • ou avant le démarrage du véhicule (il ne doit pas démarrer en plein milieu d'une pause), auquel cas l'heure de début du véhicule n'est pas affectée.
  • ou après la fin du véhicule (identifié, avec l'heure de fin du véhicule).
Champs
break_requests[]

BreakRequest

Séquence de coupures. Le message BreakRequest s'affiche.

frequency_constraints[]

FrequencyConstraint

Plusieurs FrequencyConstraint peuvent s'appliquer. Elles doivent toutes être satisfaites par les BreakRequest de ce BreakRule. Voir FrequencyConstraint.

BreakRequest

Vous devez connaître au préalable l'ordre des coupures (c'est-à-dire leur numéro et leur ordre) applicable à chaque véhicule. Les BreakRequest répétées définissent cette séquence, dans l'ordre dans lequel elles doivent apparaître. Leurs périodes (earliest_start_time / latest_start_time) peuvent se chevaucher, mais elles doivent être compatibles avec l'ordre (cette option est cochée).

Champs
earliest_start_time

Timestamp

Obligatoire. Limite inférieure (incluse) au début de la coupure publicitaire.

latest_start_time

Timestamp

Obligatoire. Limite supérieure (incluse) au début de la coupure publicitaire.

min_duration

Duration

Obligatoire. Durée minimale de la coupure. Doit être positive.

FrequencyConstraint

Vous pouvez également limiter davantage la fréquence et la durée des pauses spécifiées ci-dessus en appliquant une fréquence minimale de pause, par exemple "Il doit y avoir une pause d'au moins une heure toutes les 12 heures". En supposant que cela puisse être interprété comme "Dans toute fenêtre glissante de 12 heures, il doit y avoir au moins une pause d'au moins une heure", cet exemple se traduirait par le FrequencyConstraint suivant:

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

Le moment et la durée des coupures dans la solution respectent l'ensemble de ces contraintes, en plus des fenêtres temporelles et des durées minimales déjà spécifiées dans BreakRequest.

En pratique, un FrequencyConstraint peut s'appliquer à des pauses non consécutives. Par exemple, la programmation suivante respecte l'horaire "1h toutes les 12h" Exemple:

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Champs
min_break_duration

Duration

Obligatoire. Durée minimale de coupure pour cette contrainte. Non négatif. Voir la description de FrequencyConstraint.

max_inter_break_duration

Duration

Obligatoire. Durée maximale autorisée de tout intervalle de temps de l'itinéraire n'incluant pas au moins partiellement une pause de duration >= min_break_duration. Doit être positive.

DataFormat

Formats de données pour les fichiers d'entrée et de sortie

Enums
DATA_FORMAT_UNSPECIFIED Valeur non valide. Le format ne doit pas être UNSPECIFIED.
JSON JavaScript Object Notation.
PROTO_TEXT Format de texte Protocol Buffers. Consultez https://protobuf.dev/reference/protobuf/textformat-spec/.

DistanceLimit

Limite définissant la distance maximale pouvant être parcourue. Il peut être dur ou mou.

Si une limite flexible est définie, soft_max_meters et cost_per_kilometer_above_soft_max doivent être définis et ne pas être négatifs.

Champs
max_meters

int64

Limite stricte qui limite la distance à max_meters au maximum. La limite ne doit pas être négative.

soft_max_meters

int64

Une limite flexible n'applique pas de limite de distance maximale, mais en cas de non-respect, les coûts qui s'ajoutent aux autres coûts définis dans le modèle, avec la même unité, sont ajoutés.

Si elle est définie, la valeur soft_max_meters doit être inférieure à max_meters et non négative.

cost_per_kilometer_below_soft_max

double

Coût au kilomètre engagé, qui augmente jusqu'à soft_max_meters, selon la formule suivante:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

Ce coût n'est pas accepté en route_distance_limit.

cost_per_kilometer_above_soft_max

double

Frais par kilomètre facturés si la distance dépasse la limite de soft_max_meters. Le coût supplémentaire est égal à 0 si la distance est inférieure à la limite. Sinon, la formule utilisée pour calculer le coût est la suivante:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

Le coût ne doit pas être négatif.

GcsDestination

Emplacement Google Cloud Storage dans lequel le ou les fichiers de sortie seront écrits.

Champs
uri

string

Obligatoire. URI Google Cloud Storage.

GcsSource

Emplacement Google Cloud Storage à partir duquel le fichier d'entrée sera lu.

Champs
uri

string

Obligatoire. URI d'un objet Google Cloud Storage au format gs://bucket/path/to/object.

InjectedSolutionConstraint

Solution injectée dans la requête, y compris des informations sur les visites qui doivent être limitées et sur la manière dont elles doivent l'être.

Champs
routes[]

ShipmentRoute

Routes de la solution à injecter. Certaines routes peuvent être omises de la solution d'origine. Les itinéraires et les envois ignorés doivent respecter les hypothèses de validité de base indiquées pour injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

Envois ignorés de la solution à injecter. Certaines peuvent être omises de la solution d'origine. Consultez le champ routes.

constraint_relaxations[]

ConstraintRelaxation

Pour zéro ou plusieurs groupes de véhicules, indique quand et dans quelle mesure assouplir les contraintes. Si ce champ est vide, tous les itinéraires de véhicules non vides sont entièrement contraints.

ConstraintRelaxation

Pour un groupe de véhicules, indique à quel seuil les contraintes liées aux visites seront assouplies et à quel niveau. Les livraisons indiquées dans le champ skipped_shipment ne peuvent pas être ignorées. c'est-à-dire qu'elles ne peuvent pas être effectuées.

Champs
relaxations[]

Relaxation

Toutes les assouplissements des contraintes de visite qui s'appliqueront aux visites sur les itinéraires avec des véhicules dans le pays suivant : vehicle_indices.

vehicle_indices[]

int32

Spécifie les index de véhicule auxquels la contrainte de visite relaxations s'applique. Si ce champ est vide, il s'agit de la valeur par défaut, et les relaxations s'appliquent à tous les véhicules qui ne sont pas spécifiés dans d'autres constraint_relaxations. Il ne peut y avoir qu'un seul champ d'assouplissement des contraintes par défaut, c'est-à-dire qu'un seul champ d'assouplissement des contraintes est autorisé (vehicle_indices). Un indice de véhicule ne peut être listé qu'une seule fois, même entre plusieurs constraint_relaxations.

Un indice de véhicule est mappé de la même manière que ShipmentRoute.vehicle_index, si interpret_injected_solutions_using_labels est défini sur "true" (voir le commentaire fields).

Relaxation

Si le champ relaxations est vide, cela signifie que l'heure de début et la séquence de toutes les visites du routes sont limitées. Aucune nouvelle visite ne peut donc être insérée ni ajoutée à ces itinéraires. De plus, les heures de début et de fin d'un véhicule dans routes sont entièrement contraintes, sauf si le véhicule est vide (c'est-à-dire qu'il n'a pas de visites et que used_if_route_is_empty est défini sur "false" dans le modèle).

relaxations(i).level spécifie le niveau d'assouplissement de la contrainte appliqué à une visite #j qui répond aux critères suivants:

  • route.visits(j).start_time >= relaxations(i).threshold_time ET
  • j + 1 >= relaxations(i).threshold_visit_count

De même, le démarrage du véhicule est relâché sur relaxations(i).level s'il répond aux conditions suivantes:

  • vehicle_start_time >= relaxations(i).threshold_time ET
  • relaxations(i).threshold_visit_count == 0 et l'extrémité du véhicule est relâchée sur relaxations(i).level si les conditions suivantes sont remplies:
  • vehicle_end_time >= relaxations(i).threshold_time ET
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Pour appliquer un niveau d'assouplissement si une visite respecte le threshold_visit_count OU l'threshold_time, ajoutez deux relaxations avec le même level: l'un avec uniquement threshold_visit_count défini et l'autre avec seulement threshold_time défini. Si une visite remplit les conditions de plusieurs relaxations, le niveau le plus souple s'applique. Par conséquent, entre le début du véhicule et les visites de l'itinéraire jusqu'à la fin du véhicule, le niveau de relaxation devient plus détendu: le niveau de relaxation ne diminue pas à mesure que l'itinéraire progresse.

La durée et la séquence des visites d'itinéraires qui ne satisfont pas aux conditions de seuil d'un relaxations sont totalement limitées, et aucune visite ne peut être insérée dans ces séquences. De plus, si le début ou la fin d'un véhicule ne remplit pas les conditions d'un assouplissement, la durée est fixe, sauf si le véhicule est vide.

Champs
level

Level

Niveau d'assouplissement de la contrainte qui s'applique lorsque les conditions égales ou postérieures à threshold_time ET au moins à threshold_visit_count sont remplies.

threshold_time

Timestamp

Moment auquel ou après lequel l'assouplissement level peut être appliqué.

threshold_visit_count

int32

Nombre de visites avant ou après lequel l'assouplissement level peut être appliqué. Si threshold_visit_count est défini sur 0 (ou n'est pas défini), le level peut être appliqué directement au démarrage du véhicule.

Si la valeur est route.visits_size() + 1, l'level ne peut être appliqué qu'au côté du véhicule. Si elle est supérieure à route.visits_size() + 1, level n'est pas appliquée du tout pour cet itinéraire.

Niveau

Exprime les différents niveaux d'assouplissement des contraintes qui sont appliqués à une visite et ceux qui le suivent lorsque les conditions du seuil sont remplies.

L'énumération ci-dessous est organisée par ordre d'apaisement croissant.

Enums
LEVEL_UNSPECIFIED

Niveau de relaxation par défaut implicite : aucune contrainte n'est levée, c'est-à-dire que toutes les visites sont entièrement contraintes.

Cette valeur ne doit pas être utilisée explicitement dans level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Les heures de début et de fin des visites seront assouplies, mais chaque visite restera liée au même véhicule, et la séquence des visites doit être respectée: aucune visite ne peut être insérée entre elles ni avant.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Identique à RELAX_VISIT_TIMES_AFTER_THRESHOLD, mais la séquence des visites est également assouplie: les visites ne peuvent être effectuées que par ce véhicule, mais elles peuvent ne pas être effectuées.
RELAX_ALL_AFTER_THRESHOLD Identique à RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, mais le véhicule est également assoupli: les visites sont entièrement sans frais à l'heure seuil ou après, et peuvent potentiellement ne pas être réalisées.

InputConfig

Spécifiez une entrée pour [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Champs
data_format

DataFormat

Obligatoire. Format des données d'entrée.

Champ d'union source. Obligatoire. source ne peut être qu'un des éléments suivants :
gcs_source

GcsSource

Emplacement Google Cloud Storage. Il doit s'agir d'un objet unique (fichier).

Lieu

Encapsule un emplacement (un point géographique et un en-tête facultatif).

Champs
lat_lng

LatLng

Coordonnées géographiques du point de cheminement

heading

int32

Direction associée au sens du flux de circulation. Cette valeur permet d'indiquer le côté de la route à utiliser pour les lieux de prise en charge et de dépose. Les valeurs d'en-tête peuvent être comprises entre 0 et 360, où 0 correspond à l'orientation vers le nord, 90 à l'est, etc.

OptimizeToursRequest

Demande à transmettre à un outil de résolution d'optimisation des visites, qui définit le modèle de livraison à résoudre ainsi que les paramètres d'optimisation.

Champs
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 est automatiquement sélectionnée.

timeout

Duration

Si ce délai est défini, le serveur renvoie une réponse avant l'expiration du délai ou avant que le délai du serveur pour les requêtes synchrones 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.

model

ShipmentModel

Modèle de livraison à résoudre.

solving_mode

SolvingMode

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

search_mode

SearchMode

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

injected_first_solution_routes[]

ShipmentRoute

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

Le modèle est soumis à des contraintes lors de la création de la première solution. 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 satisfaire à quelques hypothèses de validité de base:

  • Pour tous les parcours, vehicle_index doit être à portée et ne pas être en double.
  • pour l'ensemble des visites, shipment_index et visit_request_index doivent être compris dans la plage.
  • une livraison ne peut être référencée que sur une route.
  • l'enlèvement d'un colis avec retrait en magasin doit être effectué avant la livraison.
  • vous ne pouvez pas proposer plusieurs options de retrait ou de livraison pour une expédition.
  • Pour tous les itinéraires, les horaires augmentent vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • une livraison 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 vehicle_index 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. À la place, une erreur indiquant une irrégularité peut être renvoyée.

injected_solution_constraint

InjectedSolutionConstraint

Appliquez des contraintes à l'algorithme d'optimisation pour trouver une solution finale semblable à une solution précédente. Par exemple, vous pouvez les utiliser pour figer des portions de routes déjà terminées ou qui doivent l'être, 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'impossibilité de la solution peut être renvoyée à la place.

refresh_details_routes[]

ShipmentRoute

Si ce champ n'est pas renseigné, les itinéraires indiqués sont actualisés, sans modifier la séquence sous-jacente de visites ou de temps de trajet. Seuls les autres détails sont mis à jour. Cela ne résout pas le modèle.

Depuis 2020/11, seules les polylignes d'itinéraires non vides sont remplies et populate_polylines doit être défini sur "true".

Les champs route_polyline des itinéraires transmis peuvent ne pas correspondre à l'itinéraire transitions.

Ce champ ne doit pas être utilisé avec injected_first_solution_routes ou injected_solution_constraint.

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

interpret_injected_solutions_using_labels

bool

Si vrai:

Cette interprétation s'applique aux champs injected_first_solution_routes, injected_solution_constraint et refresh_details_routes. Vous pouvez l'utiliser lorsque les index de livraison ou de véhicule de la requête ont changé depuis la création de la solution (par exemple, lorsque 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 ne doivent apparaître qu'une seule fois dans leur catégorie :

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

Supprimer des visites 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 la solution, des erreurs de validation ou une impossibilité.

REMARQUE: L'appelant doit s'assurer que chaque Vehicle.label (correspondant Shipment.label) identifie de manière unique une entité de véhicule (correspondant à la livraison) utilisée dans les deux demandes pertinentes: la demande antérieure qui a généré l'OptimizeToursResponse utilisé dans la solution injectée et la demande actuelle qui inclut la solution injectée. Les vérifications de l'unicité décrites ci-dessus ne suffisent pas à garantir cette exigence.

consider_road_traffic

bool

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

populate_polylines

bool

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

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

Si cet attribut est défini, la requête peut avoir un délai (voir https://grpc.io/blog/deadlines) de 60 minutes maximum. 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 important (mais tout de même faible).

use_geodesic_distances

bool

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

label

string

Libellé pouvant servir à identifier cette demande, signalé dans le OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

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

max_validation_errors

int32

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étails d'erreur BadRequest (https://cloud.google.com/apis/design/errors#error_details), sauf si resolve_mode=VALIDATE_ONLY: consultez le champ OptimizeToursResponse.validation_errors. La valeur par défaut est 100,mais elle est limitée à 10 000.

SearchMode

Mode définissant le comportement de la recherche, en faisant un compromis entre latence et qualité de la solution. Dans tous les modes, la limite de temps de la requête globale est appliquée.

Enums
SEARCH_MODE_UNSPECIFIED Mode de recherche non spécifié, équivalent à RETURN_FAST.
RETURN_FAST Arrêtez la recherche après avoir trouvé la première bonne solution.
CONSUME_ALL_AVAILABLE_TIME Consacrer tout le temps disponible à la recherche de meilleures solutions.

SolvingMode

Définit la manière dont le résolveur doit gérer la requête. Dans tous les modes, à l'exception de VALIDATE_ONLY, si la requête n'est pas valide, vous recevrez une erreur INVALID_REQUEST. Consultez max_validation_errors pour limiter le nombre d'erreurs renvoyées.

Enums
DEFAULT_SOLVE Résolvez le modèle. Des avertissements peuvent être émis dans [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY Ne valide que le modèle sans le résoudre: insère autant de OptimizeToursResponse.validation_errors que possible.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Renseigne uniquement OptimizeToursResponse.validation_errors ou OptimizeToursResponse.skipped_shipments et ne résout pas le reste de la requête (status et routes ne sont pas définis dans la réponse). Si des infeasibilitys sont détectées dans les itinéraires injected_solution_constraint, elles sont renseignées dans le champ OptimizeToursResponse.validation_errors et OptimizeToursResponse.skipped_shipments est laissé vide.

IMPORTANT: Les livraisons impossibles ne sont pas toutes renvoyées ici, mais seulement celles qui ont été identifiées comme impossibles lors du prétraitement.

OptimizeToursResponse

Réponse après avoir résolu un problème d'optimisation des visites comprenant les itinéraires suivis par chaque véhicule, les livraisons ignorées et le coût global de la solution.

Champs
routes[]

ShipmentRoute

Itinéraires calculés pour chaque véhicule le i-ième itinéraire correspond au i-ième véhicule du modèle.

request_label

string

Copie de OptimizeToursRequest.label, si un libellé a été spécifié dans la requête.

skipped_shipments[]

SkippedShipment

Liste de toutes les livraisons ignorées.

validation_errors[]

OptimizeToursValidationError

Liste de toutes les erreurs de validation que nous avons pu détecter indépendamment. Reportez-vous à la section "MULTIPLES ERREURS" explication pour le message OptimizeToursValidationError. Au lieu d'erreurs, des avertissements sont affichés dans le cas où solving_mode est défini sur DEFAULT_SOLVE.

metrics

Metrics

Métriques de durée, de distance et d'utilisation pour cette solution.

Métriques

Métriques globales, agrégées pour toutes les routes.

Champs
aggregated_route_metrics

AggregatedMetrics

Agrégation sur les itinéraires. Chaque métrique correspond à la somme (ou à la valeur maximale, pour les charges) de tous les champs ShipmentRoute.metrics du même nom.

skipped_mandatory_shipment_count

int32

Nombre de colis obligatoires ignorés.

used_vehicle_count

int32

Nombre de véhicules utilisés. Remarque: Si un itinéraire est vide et que Vehicle.used_if_route_is_empty est défini sur "true", le véhicule est considéré comme utilisé.

earliest_vehicle_start_time

Timestamp

Heure de départ la plus proche pour un véhicule d'occasion, calculée comme le minimum pour l'ensemble des véhicules d'occasion (ShipmentRoute.vehicle_start_time).

latest_vehicle_end_time

Timestamp

Heure de fin la plus tardive pour un véhicule d'occasion, calculée comme le maximum de l'ensemble des véhicules utilisés de ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Coût de la solution, réparti selon les champs de demande liés aux coûts. Les clés sont des chemins proto correspondant à la requête OptimizeToursRequest d'entrée. Exemple : "model.shipments.pickups.cost", et les valeurs correspondent au coût total généré par le champ de coût correspondant, agrégé pour l'ensemble de la solution. En d'autres termes, la valeur "cost["model.shipments.pickups.cost"] est la somme de tous les coûts de retrait par rapport à la solution. Tous les coûts définis dans le modèle sont indiqués ici en détail, à l'exception des coûts liés aux TransitionAttributes, qui ne sont indiqués que de manière agrégée en date du 1er janvier 2022.

total_cost

double

Coût total de la solution. Somme de toutes les valeurs du mappage des coûts.

OptimizeToursValidationError

Décrit une erreur ou un avertissement rencontrés lors de la validation d'un OptimizeToursRequest.

Champs
code

int32

Une erreur de validation est définie par les paires (code, display_name), qui sont toujours présentes.

Les autres champs (ci-dessous) fournissent plus de contexte sur l'erreur.

MULTIPLE ERRORS (ERREURS MULTIPLES) : lorsqu'il y a plusieurs erreurs, le processus de validation tente d'en générer plusieurs. Tout comme un compilateur, ce processus est imparfait. Certaines erreurs de validation peuvent avoir le statut "fatal", ce qui signifie qu'elles interrompent l'ensemble du processus de validation. C'est notamment le cas pour les erreurs display_name="UNSPECIFIED". Certaines erreurs peuvent entraîner l'omission d'autres erreurs par le processus de validation.

STABILITÉ: code et display_name devraient être très stables. Toutefois, de nouveaux codes et noms à afficher peuvent apparaître au fil du temps, ce qui peut amener une requête (non valide) donnée à générer une paire différente (code, display_name), car la nouvelle erreur a masqué l'ancienne (voir la section "MULTIPLES ERREURS").

REFERENCE: liste de toutes les paires (code, nom) :

  • UNSPECIFIED = 0;
  • VALIDATION_TIMEOUT_ERROR = 10; Impossible d'effectuer la validation dans le délai imparti.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_Small = 1 205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ENABLED_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_AFTER_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_AFTER_END_TIME = 2805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_AFTER_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2819;
    • TIME_WINDOW_SOFT_END_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2820;
    • TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2816;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSITION_ATTRIBUTES_INVALID_COST = 3000;
    • TRANSITION_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001;
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
  • DISTANCE_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3602;
    • DISTANCE_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3603
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605;
    • DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_AFTER_SOFT_MAX = 3802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3803;
    • DURATION_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_HOURS = 3807;
    • DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811;
    • DURATION_LIMIT_DIFF_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_USED_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOURS = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOURS = 4219;
    • VEHICLE_INVALID_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_MIN_DURATION_LONGER_THAN_DURATION_LIMIT = 4222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
  • PRECEDENCE_ERROR = 46;
    • PRECEDENCE_RULE_MISSING_FIRST_INDEX = 4600;
    • PRECEDENCE_RULE_MISSING_SECOND_INDEX = 4601;
    • PRECEDENCE_RULE_FIRST_INDEX_OUT_OF_BOUNDS = 4602;
    • PRECEDENCE_RULE_SECOND_INDEX_OUT_OF_BOUNDS = 4603;
    • PRECEDENCE_RULE_DUPLICATE_INDEX = 4604;
    • PRECEDENCE_RULE_INEXISTENT_FIRST_VISIT_REQUEST = 4605;
    • PRECEDENCE_RULE_INEXISTENT_SECOND_VISIT_REQUEST = 4606;
  • BREAK_ERROR = 48;
    • BREAK_RULE_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804; = 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805;
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806;
    • BREAK_REQUEST_LATEST_END_TIME_AFTER_GLOBAL_END_TIME = 4807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813;
    • BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4814;
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5601;
  • WARNING = 9;
    • WARNING_INJECTED_FIRST_SOLUTION = 90;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_SHIPMENTS_REMOVED = 9000;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 9001;
display_name

string

Nom à afficher pour l'erreur.

fields[]

FieldReference

Un contexte d'erreur peut impliquer 0, 1 (la plupart du temps) ou plusieurs champs. Par exemple, pour faire référence au véhicule 4 et à la première collecte de l'envoi 2, vous pouvez procéder comme suit :

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

Notez toutefois que la cardinalité de fields ne doit pas changer pour un code d'erreur donné.

error_message

string

Chaîne de texte décrivant l'erreur. Il existe un mappage 1:1 entre code et error_message (lorsque le code != "UNSPECIFIED" [NON SPÉCIFIÉ]).

STABILITY: non stable: le message d'erreur associé à une code donnée peut changer au fil du temps (dans l'espoir de le clarifier). Veuillez plutôt vous fier aux display_name et aux code.

offending_values

string

Peut contenir la ou les valeurs du ou des champs. Ce n'est pas toujours possible. Vous ne devez absolument pas vous y fier et ne l'utiliser que pour le débogage manuel du modèle.

FieldReference

Spécifie un contexte pour l'erreur de validation. Un FieldReference fait toujours référence à un champ donné dans ce fichier et suit la même structure hiérarchique. Par exemple, l'élément 2 de start_time_windows du véhicule n°5 peut être spécifié comme suit:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

Nous omettez toutefois les entités de niveau supérieur telles que OptimizeToursRequest ou ShipmentModel pour éviter d'encombrer le message.

Champs
name

string

Nom du champ (par exemple, "véhicules".

sub_field

FieldReference

Sous-champ imbriqué de manière récursive, si nécessaire.

Champ d'union index_or_key.

index_or_key ne peut être qu'un des éléments suivants :

index

int32

Index du champ s'il est répété.

key

string

Clé si le champ est une carte.

OutputConfig

Spécifiez une destination pour les résultats [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Champs
data_format

DataFormat

Obligatoire. Format des données de sortie.

Champ d'union destination. Obligatoire. destination ne peut être qu'un des éléments suivants :
gcs_destination

GcsDestination

Emplacement Google Cloud Storage dans lequel écrire la sortie.

RouteModifiers

Encapsule un ensemble de conditions facultatives à remplir lors du calcul des itinéraires des véhicules. Cette méthode est semblable à RouteModifiers dans l'API Routes Preferred de Google Maps Platform. consultez la page https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

Champs
avoid_tolls

bool

Indique s'il faut éviter les routes à péage dans la mesure du raisonnable. La priorité sera donnée aux itinéraires ne comportant pas de routes à péage. S'applique uniquement aux modes de transport motorisés.

avoid_highways

bool

Indique s'il faut éviter les autoroutes lorsque cela est raisonnable. La préférence sera donnée aux itinéraires ne comportant pas d'autoroutes. Ne s'applique qu'aux modes de transport motorisés.

avoid_ferries

bool

Spécifie s'il faut éviter les ferries dans la mesure du possible. Une préférence sera donnée aux itinéraires qui ne comportent pas de trajets en ferry. S'applique uniquement aux modes de transport motorisés.

avoid_indoor

bool

Facultatif. Indique s'il faut éviter de naviguer en intérieur dans la mesure du possible. La préférence sera donnée aux itinéraires ne contenant pas de navigation en intérieur. S'applique uniquement au mode de transport WALKING.

Livraison

Livraison d'un seul article, de l'un de ses retraits à l'une de ses livraisons. Pour que la livraison soit considérée comme effectuée, un véhicule unique doit se rendre dans l'un de ses points de retrait (et réduire ses capacités de rechange en conséquence), puis se rendre ultérieurement dans l'un de ses sites de livraison (et ainsi augmenter ses capacités de rechange en conséquence).

Champs
display_name

string

Nom à afficher de l'envoi défini par l'utilisateur. Il peut comporter jusqu'à 63 caractères et utiliser des caractères UTF-8.

pickups[]

VisitRequest

Ensemble d'alternatives de retrait associé à la livraison. S'il n'est pas spécifié, le véhicule n'a besoin de se rendre qu'à un lieu correspondant aux livraisons.

deliveries[]

VisitRequest

Ensemble d'autres options de livraison associées à la livraison. Si aucune valeur n'est spécifiée, le véhicule ne doit se rendre qu'à un lieu correspondant aux prises en charge.

load_demands

map<string, Load>

Exigences relatives au chargement de la livraison (par exemple, le poids, le volume, le nombre de palettes, etc.) Les clés de la carte doivent être des identifiants décrivant le type de charge correspondante et, idéalement, incluant également les unités. Par exemple : "weight_kg", "volume_gallons", "pallet_count", etc. Si une clé donnée n'apparaît pas dans la mappe, la charge correspondante est considérée comme nulle.

allowed_vehicle_indices[]

int32

Ensemble des véhicules susceptibles d'effectuer cette livraison. Si ce champ est vide, tous les véhicules peuvent l'exécuter. Les véhicules sont indiqués en fonction de leur indice dans la liste vehicles de ShipmentModel.

costs_per_vehicle[]

double

Indique le coût facturé lorsque la livraison est livrée par chaque véhicule. Si elle est spécifiée, elle doit SOIT:

  • le même nombre d'éléments que costs_per_vehicle_indices. costs_per_vehicle[i] correspond au costs_per_vehicle_indices[i] du véhicule du modèle.
  • le même nombre d'éléments qu'il y a de véhicules dans le modèle. Le i-ième élément correspond au véhicule n°i du modèle.

Ces coûts doivent appartenir à la même unité que penalty_cost et ne doivent pas être négatifs. Laissez ce champ vide s'il n'y a pas de coûts de ce type.

costs_per_vehicle_indices[]

int32

Indices des véhicules auxquels costs_per_vehicle s'applique. S'il n'est pas vide, il doit comporter le même nombre d'éléments que costs_per_vehicle. Vous ne pouvez pas spécifier un véhicule spécifique plus d'une fois. Si un véhicule est exclu de costs_per_vehicle_indices, son coût est nul.

pickup_to_delivery_absolute_detour_limit

Duration

Spécifie le délai absolu maximal du détour par rapport au trajet le plus court entre le retrait et la livraison. S'il est spécifié, il ne doit pas être négatif, et le colis doit contenir au moins un enlèvement et une livraison.

Par exemple, prenons t comme temps le plus court pour passer directement de l'option de retrait sélectionnée à l'option de livraison sélectionnée. Ensuite, la définition de pickup_to_delivery_absolute_detour_limit applique:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

Si des limites relatives et absolues sont spécifiées pour une même livraison, la limite la plus contraignante est utilisée pour chaque paire retrait/livraison possible. Depuis 2017/10, les détours ne sont acceptés que lorsque la durée du trajet ne dépend pas du véhicule.

pickup_to_delivery_time_limit

Duration

Spécifie la durée maximale entre le début de la collecte et le début de la livraison d'un envoi. S'il est spécifié, il ne doit pas être négatif, et le colis doit contenir au moins un enlèvement et une livraison. Cela ne dépend pas des alternatives choisies pour le retrait et la livraison, ni de la vitesse du véhicule. Vous pouvez le spécifier avec des contraintes de déviation maximales : la solution respectera les deux spécifications.

shipment_type

string

Chaîne non vide spécifiant un "type" pour cette livraison. Cette fonctionnalité peut être utilisée pour définir des incompatibilités ou des exigences entre les shipment_types (voir shipment_type_incompatibilities et shipment_type_requirements dans ShipmentModel).

Différent de visit_types, spécifié pour une seule visite: tous les retraits/livraisons appartenant à la même livraison partagent le même shipment_type.

label

string

Spécifie une étiquette pour ce colis. Cette étiquette est indiquée dans la réponse du shipment_label du ShipmentRoute.Visit correspondant.

ignore

bool

Si la valeur est "true", ignorez cette livraison, mais n'appliquez pas de penalty_cost.

Si vous ignorez une livraison, une erreur de validation est générée lorsque le modèle contient des shipment_type_requirements.

Vous pouvez ignorer une livraison effectuée en injected_first_solution_routes ou injected_solution_constraint. Le solveur supprime les visites de ramassage/livraison associées du parcours de livraison. Les precedence_rules qui font référence à des livraisons ignorées seront également ignorées.

penalty_cost

double

Si l'expédition n'est pas finalisée, cette pénalité est ajoutée au coût global des itinéraires. Une expédition est considérée comme terminée si l'une des options de retrait et de livraison proposées est consultée. Le coût peut être exprimé dans la même unité que celle utilisée pour tous les autres champs du modèle relatifs aux coûts. La valeur doit être positive.

IMPORTANT: Si cette pénalité n'est pas spécifiée, elle est considérée comme infinie, c'est-à-dire que l'expédition doit être finalisée.

pickup_to_delivery_relative_detour_limit

double

Indique le temps de détour maximal par rapport au chemin le plus court entre le point de collecte et la livraison. S'il est spécifié, il ne doit pas être négatif, et le colis doit contenir au moins un enlèvement et une livraison.

Par exemple, le délai le plus court peut être nécessaire pour passer directement de l'option de retrait choisie directement à l'alternative de livraison choisie. Le paramètre pickup_to_delivery_relative_detour_limit applique ensuite les éléments suivants :

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

Si des limites relatives et absolues sont spécifiées pour le même envoi, la limite la plus contraignante est utilisée pour chaque paire de ramassage/livraison possible. Depuis octobre 2017, les détours ne sont acceptés que lorsque les durées de trajet ne dépendent pas des véhicules.

Charger

Lors d'une visite, une quantité prédéfinie peut être ajoutée à la charge du véhicule s'il s'agit d'une collecte ou soustraite s'il s'agit d'une livraison. Ce message définit ce montant. Consultez les load_demands.

Champs
amount

int64

La charge du véhicule effectuant la visite correspondante varie en fonction de l'importance. Étant donné qu'il s'agit d'un nombre entier, nous recommandons aux utilisateurs de choisir une unité appropriée pour éviter toute perte de précision. Doit être ≥ 0.

VisitRequest

Demande de visite réalisable par un véhicule: elle comporte une géolocalisation (ou deux, voir ci-dessous), les heures d'ouverture et de fermeture représentées par des plages horaires, et la durée du service (temps passé par le véhicule une fois arrivé pour récupérer ou déposer les marchandises).

Champs
arrival_location

LatLng

Géolocalisation à laquelle le véhicule arrive lors de l'exécution de cette VisitRequest. Si le modèle de livraison comporte des matrices de distance de durée, arrival_location ne doit pas être spécifié.

arrival_waypoint

Waypoint

Point de cheminement où arrive le véhicule lors de l'exécution de ce VisitRequest. Si le modèle de livraison comporte des matrices de distance de durée, arrival_waypoint ne doit pas être spécifié.

departure_location

LatLng

Géolocalisation où le véhicule part après avoir terminé ce VisitRequest. Peut être omis s'il est identique à arrival_location. Si le modèle de livraison comporte des matrices de distance de durée, departure_location ne doit pas être spécifié.

departure_waypoint

Waypoint

Point de cheminement vers lequel le véhicule part après avoir terminé ce VisitRequest. Peut être omis s'il est identique à arrival_waypoint. Si le modèle de livraison comporte des matrices de distance de durée, departure_waypoint ne doit pas être spécifié.

tags[]

string

Spécifie les tags associés à la demande de visite. Les chaînes vides ou en double ne sont pas autorisées.

time_windows[]

TimeWindow

Fenêtres temporelles qui limitent l'heure d'arrivée à une visite. Notez qu'un véhicule peut partir en dehors de la plage horaire d'arrivée. Autrement dit, l'heure d'arrivée et la durée n'ont pas besoin d'être comprises dans un créneau horaire. Cela peut entraîner un délai d'attente si le véhicule arrive avant TimeWindow.start_time.

L'absence de TimeWindow signifie que le véhicule peut effectuer cette visite à tout moment.

Les périodes doivent être disjointes, c'est-à-dire qu'aucune période ne doit se chevaucher ni se trouver adjacente, et elles doivent être classées par ordre croissant.

cost_per_hour_after_soft_end_time et soft_end_time ne peuvent être définis que s'il n'y a qu'une seule période.

duration

Duration

Durée de la visite, c'est-à-dire le temps passé par le véhicule entre l'arrivée et le départ (à ajouter au temps d'attente possible ; voir time_windows).

cost

double

Coût du service pour cette demande de visite sur un itinéraire en véhicule. Cela permet de payer des frais différents pour chaque retrait ou livraison d'un colis. Ce coût doit être dans la même unité que Shipment.penalty_cost et ne doit pas être négatif.

load_demands

map<string, Load>

Charger les demandes de cette demande de visite. Ce champ est semblable au champ Shipment.load_demands, sauf qu'il ne s'applique qu'à ce champ VisitRequest, et non à l'ensemble de la Shipment. Les demandes listées ici sont ajoutées à celles listées dans Shipment.load_demands.

visit_types[]

string

Spécifie les types de visite. Cela peut permettre d'allouer le temps supplémentaire nécessaire au véhicule pour effectuer cette visite (voir Vehicle.extra_visit_duration_for_visit_type).

Un type ne peut apparaître qu'une seule fois.

label

string

Spécifie un libellé pour cet élément VisitRequest. Ce libellé est indiqué dans la réponse sous la forme visit_label dans le ShipmentRoute.Visit correspondant.

ShipmentModel

Un modèle de livraison contient un ensemble d'expéditions qui doivent être effectuées par un ensemble de véhicules, tout en réduisant le coût global, qui correspond à la somme des éléments suivants:

  • le coût de l'itinéraire des véhicules (somme du coût par temps total, coût par temps de trajet et coût fixe pour tous les véhicules)
  • des pénalités d'expédition non appliquées.
  • le coût de la durée globale des expéditions
Champs
shipments[]

Shipment

Ensemble des expéditions à effectuer dans le modèle.

vehicles[]

Vehicle

Ensemble de véhicules pouvant être utilisés pour effectuer des visites.

global_start_time

Timestamp

Heures de début et de fin globales du modèle: aucune heure en dehors de cette plage ne peut être considérée comme valide.

La période du modèle doit être inférieure à un an, c'est-à-dire que la distance entre les valeurs global_end_time et global_start_time doit être inférieure ou égale à 3 153 000 secondes.

Lorsque vous utilisez des champs cost_per_*hour, vous pouvez définir un intervalle plus court pour améliorer les performances (par exemple, si vous modélisez un seul jour, vous devez définir les limites de temps globales sur ce jour-là). Si cette règle n'est pas configurée, la valeur 00:00:00 UTC, 1er janvier 1970 (autrement dit, nombre de secondes: 0, nanos: 0) est utilisée par défaut.

global_end_time

Timestamp

Si cette règle n'est pas configurée, la valeur 00:00:00 UTC, 1er janvier 1971 (soit 31536000 secondes, nanos : 0) est utilisée par défaut.

global_duration_cost_per_hour

double

La "durée globale" du plan global correspond à la différence entre l'heure de début effective au plus tôt et la dernière heure de fin effective de tous les véhicules. Les utilisateurs peuvent, par exemple, attribuer un coût par heure à cette quantité afin d'essayer d'optimiser les jobs pour les terminer au plus tôt. Ce coût doit être dans la même unité que Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

Spécifie les matrices de durée et de distance utilisées dans le modèle. Si ce champ est vide, Google Maps ou des distances géodésiques sont utilisés à la place, en fonction de la valeur du champ use_geodesic_distances. Si ce n'est pas le cas, use_geodesic_distances ne peut pas être défini sur "true", et duration_distance_matrix_src_tags ni duration_distance_matrix_dst_tags ne peuvent être vides.

Exemples d'utilisation :

  • Il y a deux emplacements: locA et locB.
  • 1 véhicule commence son trajet à l'endroitA et l'arrête à l'endroitA.
  • 1 demande de visite de retrait chez locB.
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Il y a trois emplacements: locA, locB et locC.
  • 1 véhicule commençant son trajet à locA et finissant à locB, en utilisant la matrice "rapide".
  • 1 véhicule commence son trajet au locB et l'arrête au locB, à l'aide d'une matrice "lent".
  • 1 véhicule commence son trajet au locB et l'arrête au locB, avec la matrice "rapide".
  • 1 demande de visite avec retrait sur locC.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

Balises définissant les sources des matrices de durée et de distance. duration_distance_matrices(i).rows(j) définit les durées et les distances entre les visites avec la balise duration_distance_matrix_src_tags(j) et les autres visites dans la matrice i.

Les balises correspondent à VisitRequest.tags ou Vehicle.start_tags. Une valeur VisitRequest ou Vehicle donnée doit correspondre exactement à une balise de ce champ. Notez que les balises source, de destination et de matrice d'un Vehicle peuvent être identiques. De même, les balises source et de destination d'un VisitRequest peuvent être identiques. Toutes les balises doivent être différentes et ne peuvent pas être des chaînes vides. Si ce champ n'est pas vide, duration_distance_matrices est obligatoire.

duration_distance_matrix_dst_tags[]

string

Balises définissant les destinations des matrices de durée et de distance. duration_distance_matrices(i).rows(j).durations(k) (resp. duration_distance_matrices(i).rows(j).meters(k)) définit la durée (correspondant à la distance) du trajet entre les visites associées à la balise duration_distance_matrix_src_tags(j) et celles associées à la balise duration_distance_matrix_dst_tags(k) dans la matrice i.

Les balises correspondent à VisitRequest.tags ou Vehicle.start_tags. Une valeur VisitRequest ou Vehicle donnée doit correspondre exactement à une balise de ce champ. Notez que les balises source, de destination et matricielles d'un Vehicle peuvent être identiques. De même, les balises source et de destination d'un VisitRequest peuvent être identiques. Toutes les balises doivent être différentes et ne peuvent pas être des chaînes vides. Si ce champ n'est pas vide, duration_distance_matrices est obligatoire.

transition_attributes[]

TransitionAttributes

Attributs de transition ajoutés au modèle.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Ensembles de types de livraison incompatibles (voir ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Ensembles de conditions requises pour shipment_type (voir ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Ensemble de règles de priorité à appliquer dans le modèle.

max_active_vehicles

int32

Limite le nombre maximal de véhicules actifs. Un véhicule est actif s'il effectue au moins une livraison sur son itinéraire. Cela permet de limiter le nombre d'itinéraires lorsqu'il y a moins de conducteurs que de véhicules et que le parc de véhicules est hétérogène. L'optimisation sélectionnera ensuite le meilleur sous-ensemble de véhicules à utiliser. Doit être strictement positif.

DurationDistanceMatrix

Spécifie une matrice de durée et de distance entre les lieux de départ des visites et des véhicules à visiter, et les lieux d'arrivée des véhicules.

Champs
rows[]

Row

Spécifie les lignes de la matrice de durée et de distance. Il doit comporter autant d'éléments que ShipmentModel.duration_distance_matrix_src_tags.

vehicle_start_tag

string

Tag définissant les véhicules auxquels cette matrice de durée et de distance s'applique. Si ce champ est vide, cela s'applique à tous les véhicules, et il ne peut y avoir qu'une seule matrice.

Chaque démarrage de véhicule doit correspondre à une seule matrice, c'est-à-dire qu'un seul de ses champs start_tags doit correspondre au vehicle_start_tag d'une matrice (et de cette matrice uniquement).

Toutes les matrices doivent avoir un vehicle_start_tag différent.

Ligne

Spécifie une ligne de la matrice de durée et de distance.

Champs
durations[]

Duration

Valeurs de durée pour une ligne donnée. Il doit comporter autant d'éléments que ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Valeurs de distance pour une ligne donnée. Si aucun coût ni aucune contrainte ne font référence aux distances dans le modèle, vous pouvez laisser ce champ vide. Sinon, il doit comporter autant d'éléments que durations.

PrecedenceRule

Règle de priorité entre deux événements (chaque événement correspond au retrait ou à la livraison d'une livraison): le "deuxième" l'événement doit commencer au moins offset_duration après le "premier" a commencé.

Plusieurs priorités peuvent faire référence aux mêmes événements (ou à des événements associés), par exemple : "Le retrait du point B a lieu après la livraison du point A" et "le retrait de C a lieu après le retrait de B".

De plus, les priorités ne s'appliquent que lorsque les deux envois sont effectués, et sont ignorées dans le cas contraire.

Champs
first_is_delivery

bool

Indique si l'événement "premier" est une diffusion.

second_is_delivery

bool

Indique si la "seconde" est une livraison.

offset_duration

Duration

Décalage entre le premier et le deuxième événement. Elle peut être négative.

first_index

int32

Indice de livraison du "premier" . Ce champ doit être renseigné.

second_index

int32

Indice de livraison du "deuxième" . Ce champ doit être renseigné.

ShipmentRoute

L'itinéraire d'un véhicule peut être décomposé en fonction de l'axe temporel, comme ceci (nous supposons qu'il y a n visites):

  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end

Notez que nous faisons la différence entre:

  • Les "événements ponctuels", tels que les heures de début et de fin du véhicule, et les heures de début et de fin de chaque visite (arrivée et départ). Elles se produisent à une seconde donnée.
  • "Intervalles de temps", comme les visites elles-mêmes et la transition entre les visites Bien que les intervalles de temps puissent parfois avoir une durée nulle (c'est-à-dire qu'ils commencent et se terminent à la même seconde), ils ont souvent une durée positive.

Règles invariantes :

  • S'il y a n visites, il y a n+1 transitions.
  • Une visite est toujours entourée d'une transition avant (même index) et d'une transition après (index + 1).
  • Le démarrage du véhicule est toujours suivi de la transition n° 0.
  • La fin du véhicule est toujours précédée de la transition #n.

En zoomant, voici ce qui se passe lors d'une Transition et d'une Visit :

---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end

Enfin, voici comment organiser les éléments TRAVEL, BREAKS, retard et WAIT lors d'une transition.

  • Ils ne se chevauchent pas.
  • Le délai est unique et doit correspondre à une période contiguë juste avant la prochaine visite (ou l'arrivée du véhicule). Il suffit donc de connaître la durée du délai pour connaître ses heures de début et de fin.
  • Les PAUSES sont des périodes de temps contiguës et non se chevauchant. La réponse spécifie l'heure de début et la durée de chaque coupure.
  • TRAVEL et WAIT sont "préemptables" : ils peuvent être interrompus plusieurs fois au cours de cette transition. Les clients peuvent supposer que le trajet se fait "dès que possible" et que l'attente occupe le temps restant.

Exemple (complexe) :

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Champs
vehicle_index

int32

Véhicule effectuant l'itinéraire, identifié par son indice dans la source ShipmentModel.

vehicle_label

string

Libellé du véhicule effectuant cet itinéraire (valeur égale à ShipmentModel.vehicles(vehicle_index).label, si spécifié).

vehicle_start_time

Timestamp

Heure à laquelle le véhicule commence son trajet.

vehicle_end_time

Timestamp

Heure à laquelle le véhicule termine son itinéraire.

visits[]

Visit

Séquence ordonnée de visites représentant un itinéraire. visites[i] correspond à la i-ième visite de l'itinéraire. Si ce champ est vide, le véhicule est considéré comme inutilisé.

transitions[]

Transition

Liste numérotée des transitions pour la route.

has_traffic_infeasibilities

bool

Lorsque OptimizeToursRequest.consider_road_traffic est défini sur "true", ce champ indique que les incohérences dans les horaires des itinéraires sont prédites à l'aide d'estimations de la durée du trajet basées sur le trafic. Le temps nécessaire peut être insuffisant pour effectuer le trajet, les retards et les pauses ajustés en fonction du trafic entre les visites, avant ou après la première visite, tout en respectant les horaires de visite et les horaires des véhicules. Par exemple,

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

L'arrivée à next_visit se produira probablement plus tard que la période actuelle, en raison de l'augmentation estimée du temps de trajet travel_duration(previous_visit, next_visit) en raison du trafic. En outre, une pause peut se chevaucher avec une visite en raison d'une augmentation des estimations de temps de trajet et des restrictions liées aux périodes de visite ou de pause.

route_polyline

EncodedPolyline

Représentation de l'itinéraire sous forme de polyligne encodée. Ce champ n'est renseigné que si OptimizeToursRequest.populate_polylines est défini sur "true".

breaks[]

Break

Arrêts prévus pour le véhicule effectuant cet itinéraire. La séquence breaks représente des intervalles de temps, chacun commençant à l'start_time correspondant et durant duration secondes.

metrics

AggregatedMetrics

Métriques de durée, de distance et de charge pour cet itinéraire. Les champs de AggregatedMetrics sont additionnés pour tous les ShipmentRoute.transitions ou ShipmentRoute.visits, en fonction du contexte.

route_costs

map<string, double>

Coût de l'itinéraire, réparti selon les champs de requête liés aux coûts. Les clés sont des chemins proto correspondant à la requête OptimizeToursRequest d'entrée. Exemple : "model.shipments.pickups.cost", et les valeurs correspondent au coût total généré par le champ de coût correspondant, agrégé sur l'ensemble de l'itinéraire. En d'autres termes, la valeur "cost["model.shipments.pickups.cost"] correspond à la somme de tous les coûts de retrait sur l'itinéraire. Tous les coûts définis dans le modèle sont indiqués ici en détail, à l'exception des coûts liés aux TransitionAttributes, qui ne sont indiqués que de manière agrégée en date du 1er janvier 2022.

route_total_cost

double

Coût total de l'itinéraire. Somme de tous les coûts dans la carte des coûts.

Pause

Données représentant l'exécution d'une coupure.

Champs
start_time

Timestamp

Heure de début d'une pause.

duration

Duration

Durée d'une pause.

EncodedPolyline

Représentation encodée d'une polyligne. Pour en savoir plus sur l'encodage des polylignes, consultez cette page: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

Champs
points

string

Chaîne représentant les points encodés de la polyligne.

Transition

Transition entre deux événements sur le parcours. Consultez la description de ShipmentRoute.

Si le véhicule ne dispose pas de start_location et/ou de end_location, les métriques de trajet correspondantes sont égales à 0.

Champs
travel_duration

Duration

Durée du voyage pendant cette transition.

travel_distance_meters

double

Distance parcourue pendant la transition.

traffic_info_unavailable

bool

Lorsque le trafic est demandé via OptimizeToursRequest.consider_road_traffic et que les informations sur le trafic n'ont pas pu être récupérées pour un Transition, cette valeur booléenne est définie sur "true". Il peut s'agir d'un problème temporaire (rare problème sur les serveurs de trafic en temps réel) ou permanent (aucune donnée pour cet emplacement).

delay_duration

Duration

Somme des délais appliqués à cette transition. Le cas échéant, le délai commence exactement delay_duration secondes avant l'événement suivant (visite ou fin du véhicule). Consultez les TransitionAttributes.delay.

break_duration

Duration

Durée totale des coupures survenues pendant cette transition, le cas échéant. Les détails concernant l'heure de début et la durée de chaque coupure sont stockés dans ShipmentRoute.breaks.

wait_duration

Duration

Temps d'attente durant cette transition. La durée d'attente correspond au temps d'inactivité et n'inclut pas le temps de pause. Notez également que ce temps d'attente peut être divisé en plusieurs intervalles non contigus.

total_duration

Duration

Durée totale de la transition, indiquée pour plus de commodité. Il est égal à :

  • visite suivante start_time (ou vehicle_end_time s'il s'agit de la dernière transition) : start_time de cette transition.
  • Si ShipmentRoute.has_traffic_infeasibilities est défini sur "false", les conditions suivantes s'appliquent également: `total_duration = Travel_duration + delay_duration
  • "break_duration + wait_duration".
start_time

Timestamp

Heure de début de cette transition.

route_polyline

EncodedPolyline

Représentation polyligne encodée de l'itinéraire suivi pendant la transition. Ce champ n'est renseigné que si populate_transition_polylines est défini sur "true".

vehicle_loads

map<string, VehicleLoad>

Les chargements de véhicules au cours de cette transition, pour chaque type qui apparaît dans le Vehicle.load_limits de ce véhicule, ou dont la valeur Shipment.load_demands est différente de zéro pour une livraison effectuée sur cet itinéraire.

Les chargements effectués lors de la première transition sont les chargements de départ de l'itinéraire du véhicule. Ensuite, après chaque visite, les load_demands de la visite sont ajoutés ou soustraits pour obtenir les charges de la prochaine transition, selon que la visite était un retrait ou une livraison.

VehicleLoad

Indique la charge réelle du véhicule tout au long de l'itinéraire, pour un type donné (voir Transition.vehicle_loads).

Champs
amount

int64

Quantité de charge sur le véhicule pour le type donné. L'unité de charge est généralement indiquée par le type. Consultez les Transition.vehicle_loads.

Accéder à la page

Visite effectuée sur un itinéraire. Cette visite correspond à un retrait ou à la livraison d'un Shipment.

Champs
shipment_index

int32

Index du champ shipments dans la source ShipmentModel.

is_pickup

bool

Si la valeur est "true", la visite correspond à la prise en charge d'un Shipment. Sinon, elle correspond à une diffusion.

visit_request_index

int32

Index de VisitRequest dans le champ de retrait ou de livraison de Shipment (voir is_pickup).

start_time

Timestamp

Heure de début de la visite. Notez qu'il est possible que le véhicule arrive plus tôt au lieu de la visite. Les heures sont cohérentes avec l'ShipmentModel.

load_demands

map<string, Load>

Nombre total de demandes de chargement de visites, calculé comme suit : somme des livraisons et des demandes de visite (load_demands). Les valeurs sont négatives si la visite correspond à une livraison. Les demandes sont signalées pour les mêmes types que Transition.loads (voir ce champ).

detour

Duration

Temps de déviation supplémentaire en raison des envois visités sur l'itinéraire avant la visite et du temps d'attente potentiel induit par les délais. Si la visite est une livraison, le détour est calculé à partir de la visite de prise en charge correspondante et est égal à:

start_time(delivery) - start_time(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

Sinon, il est calculé à partir du start_location du véhicule et est égal à :

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

Copie du Shipment.label correspondant, si spécifié dans Shipment.

visit_label

string

Copie du VisitRequest.label correspondant, si spécifié dans VisitRequest.

ShipmentTypeIncompatibility

Spécifie les incompatibilités entre les envois en fonction de leur type d'envoi. L'apparence des colis incompatibles sur le même itinéraire est limitée en raison du mode d'incompatibilité.

Champs
types[]

string

Liste des types incompatibles. Deux livraisons dont l'attribut shipment_types est différent parmi celles listées sont "incompatibles".

incompatibility_mode

IncompatibilityMode

Mode appliqué à l'incompatibilité.

IncompatibilityMode

Modes définissant la façon dont l'affichage des envois incompatibles est limité sur le même itinéraire.

Enums
INCOMPATIBILITY_MODE_UNSPECIFIED Mode d'incompatibilité non spécifié. Cette valeur ne doit jamais être utilisée.
NOT_PERFORMED_BY_SAME_VEHICLE Dans ce mode, deux envois dont les types sont incompatibles ne peuvent jamais partager le même véhicule.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

Pour deux envois de types incompatibles avec le mode d'incompatibilité NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY :

  • Si les deux livraisons sont uniquement en retrait (pas de livraisons) ou en livraison (pas de retraits), elles ne peuvent pas partager le même véhicule.
  • Si l'un des envois est une livraison et l'autre une prise en charge, les deux envois peuvent partager le même véhicule si l'envoi précédent est livré avant que l'envoi suivant ne soit pris en charge.

ShipmentTypeRequirement

Spécifie les exigences entre les expéditions en fonction de leur type d'expédition. Les spécificités de l'exigence sont définies par le mode de l'exigence.

Champs
required_shipment_type_alternatives[]

string

Liste des autres types de livraison requis par le dependent_shipment_types.

dependent_shipment_types[]

string

Pour tous les envois dont le type est indiqué dans le champ dependent_shipment_types, au moins un envoi de type required_shipment_type_alternatives doit être visité sur le même itinéraire.

REMARQUE : Les chaînes d'exigences telles qu'un shipment_type dépend de lui-même ne sont pas autorisées.

requirement_mode

RequirementMode

Mode appliqué à l'exigence.

RequirementMode

Modes définissant l'apparence des envois dépendants sur un itinéraire.

Enums
REQUIREMENT_MODE_UNSPECIFIED Mode d'exigence non spécifié. Cette valeur ne doit jamais être utilisée.
PERFORMED_BY_SAME_VEHICLE Dans ce mode, tous les rôles les livraisons doivent partager le même véhicule qu'au moins un des livraisons.
IN_SAME_VEHICLE_AT_PICKUP_TIME

Avec le mode IN_SAME_VEHICLE_AT_PICKUP_TIME, tous les éléments "dépendants" les livraisons doivent comporter au moins un envoi "obligatoire" le colis sur son véhicule au moment de la prise en charge.

Une entité « dépendante » L'attribut "retrait à la livraison" doit donc être associé à l'un des attributs suivants:

  • Une valeur "obligatoire" pour une livraison uniquement livraison livrée sur l'itinéraire après, ou
  • Une valeur "obligatoire" le colis a été retiré sur l'itinéraire le plus tôt et, si la valeur « obligatoire » comporte une livraison, celle-ci doit être effectuée après la date de livraison le retrait du colis.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Identiques à l'étape précédente, à l'exception de la variable les livraisons doivent présenter un attribut "obligatoire" sur leur véhicule au moment de la livraison.

SkippedShipment

Spécifie les détails des envois non effectués dans une solution. Dans les cas exceptionnels et/ou si nous sommes en mesure d'identifier la cause de l'omission, nous signalons la raison ici.

Champs
index

int32

L'index correspond à l'index de l'envoi dans le ShipmentModel source.

label

string

Copie du Shipment.label correspondant, si spécifié dans Shipment.

reasons[]

Reason

Liste des raisons expliquant pourquoi la livraison a été ignorée. Voir le commentaire au-dessus de Reason. Si nous ne comprenons pas pourquoi une livraison a été ignorée, les motifs ne seront pas définis.

Motif

Si nous pouvons expliquer pourquoi l'envoi a été ignoré, les raisons seront indiquées ici. Si la raison n'est pas la même pour tous les véhicules, reason contiendra plus d'un élément. Un colis ignoré ne peut pas avoir de motifs en double (c'est-à-dire lorsque tous les champs sont identiques, à l'exception de example_vehicle_index). Exemple :

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

L'envoi ignoré est incompatible avec tous les véhicules. Les raisons peuvent être différentes pour tous les véhicules, mais les "Apples" d'au moins un véhicule est dépassée (y compris pour le véhicule 1), la capacité d'au moins un véhicule est dépassée la capacité serait dépassée (véhicule 3 compris) et la limite de distance d'au moins un véhicule serait dépassée (véhicule 1 compris).

Champs
code

Code

Reportez-vous aux commentaires de Code.

example_exceeded_capacity_type

string

Si le code de motif est DEMAND_EXCEEDS_VEHICLE_CAPACITY, indique un type de capacité qui est dépassé.

example_vehicle_index

int32

Si le motif est lié à une incompatibilité entre l'envoi et le véhicule, ce champ indique l'indice d'un véhicule pertinent.

Code

Code identifiant le type de motif. L'ordonnance n'a aucun sens ici. En particulier, il n'indique pas si une raison donnée apparaîtra avant une autre dans la solution, si les deux s'appliquent.

Enums
CODE_UNSPECIFIED Elle ne doit jamais être utilisée.
NO_VEHICLE Aucun véhicule du modèle ne rend toutes les expéditions impossibles.
DEMAND_EXCEEDS_VEHICLE_CAPACITY La demande de livraison dépasse la capacité d'un véhicule pour certains types de capacité, dont example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

La distance minimale nécessaire pour effectuer cette livraison, c'est-à-dire entre le start_location du véhicule, les lieux de prise en charge et/ou de livraison du véhicule et le lieu d'arrivée du véhicule, dépasse les route_distance_limit du véhicule.

Notez que pour ce calcul, nous utilisons les distances géodésiques.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

Le temps minimal nécessaire pour effectuer cette livraison, y compris le temps de trajet, le temps d'attente et le temps de maintenance, dépasse la valeur route_duration_limit du véhicule.

Remarque : dans le meilleur des cas, le temps de trajet est calculé comme suit : distance géodésique x 36 m/s (soit environ 130 km/heure).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Mêmes données que ci-dessus, mais nous ne comparons que la durée minimale du trajet et le travel_duration_limit du véhicule.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Le véhicule ne peut pas effectuer cette livraison dans le meilleur des cas (voir CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT pour le calcul du temps) s'il commence à son heure de début la plus précoce : le temps total ferait que le véhicule se terminerait après son heure de fin la plus tardive.
VEHICLE_NOT_ALLOWED Le champ allowed_vehicle_indices du colis n'est pas vide, et ce véhicule n'en fait pas partie.

TimeWindow

Les fenêtres de temps limitent l'heure d'un événement, comme l'heure d'arrivée à une visite, ou les heures de départ et de fin d'un véhicule.

Les limites de la fenêtre stricte, start_time et end_time, appliquent l'heure la plus ancienne et la plus récente de l'événement, par exemple start_time <= event_time <= end_time. La limite inférieure de la fenêtre à durée flexible, soft_start_time, exprime une préférence pour que l'événement se produise à soft_start_time ou après, en encourant un coût proportionnel au temps écoulé avant que l'événement ne se produise. La limite supérieure de la fenêtre à durée flexible, soft_end_time, exprime une préférence pour que l'événement se produise à soft_end_time ou avant, en encourant un coût proportionnel au temps après soft_end_time où l'événement se produit. start_time, end_time, soft_start_time et soft_end_time doivent se situer dans les limites de temps globales (voir ShipmentModel.global_start_time et ShipmentModel.global_end_time) et doivent respecter:

  0 <= `start_time` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
Champs
start_time

Timestamp

Heure de début de la période difficile. Si aucune valeur n'est spécifiée, la valeur est ShipmentModel.global_start_time.

end_time

Timestamp

Heure de fin de la période difficile. Si aucune valeur n'est spécifiée, elle est définie sur ShipmentModel.global_end_time.

soft_start_time

Timestamp

Heure de début en douceur de la fenêtre temporelle.

soft_end_time

Timestamp

Heure de fin flexible de la période.

cost_per_hour_before_soft_start_time

double

Un coût par heure ajouté aux autres coûts du modèle si l'événement se produit avant soft_start_time, calculé comme suit:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

Ce coût doit être positif, et le champ ne peut être défini que si soft_start_time a été défini.

cost_per_hour_after_soft_end_time

double

Un coût par heure ajouté aux autres coûts du modèle si l'événement se produit après le soft_end_time, calculé comme suit:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

Ce coût doit être positif, et le champ ne peut être défini que si soft_end_time a été défini.

TransitionAttributes

Spécifie les attributs des transitions entre deux visites consécutives sur un itinéraire. Plusieurs TransitionAttributes peuvent s'appliquer à la même transition. Dans ce cas, tous les coûts supplémentaires s'additionnent et la contrainte ou la limite la plus stricte s'applique (en suivant la sémantique naturelle "AND").

Champs
src_tag

string

Tags définissant l'ensemble de transitions (src->dst) auxquelles ces attributs s'appliquent.

Une visite à la source ou le début d'un véhicule correspond si sa VisitRequest.tags ou son Vehicle.start_tags contient src_tag ou ne contient pas excluded_src_tag (selon lequel de ces deux champs n'est pas vide).

excluded_src_tag

string

Consultez les src_tag. Une seule valeur pour src_tag et excluded_src_tag ne doit pas être vide.

dst_tag

string

Une visite à la destination ou un véhicule correspond si sa VisitRequest.tags ou son Vehicle.end_tags contient soit dst_tag, soit excluded_dst_tag (selon lequel de ces deux champs n'est pas vide).

excluded_dst_tag

string

Consultez les dst_tag. Une seule valeur pour dst_tag et excluded_dst_tag ne doit pas être vide.

cost

double

Spécifie un coût pour effectuer cette transition. Cette valeur est dans la même unité que tous les autres coûts du modèle et ne doit pas être négative. Il s'applique en plus de tous les autres coûts existants.

cost_per_kilometer

double

Spécifie un coût par kilomètre appliqué à la distance parcourue lors de cette transition. Il s'ajoute à tous les Vehicle.cost_per_kilometer spécifiés sur les véhicules.

distance_limit

DistanceLimit

Spécifie la limite de distance parcourue lors de la transition.

Depuis le 6 février 2021, seules les limites souples sont acceptées.

delay

Duration

Spécifie le délai encouru lors de l'exécution de cette transition.

Ce délai survient toujours après la fin de la visite de la source et avant le début de la visite de destination.

Véhicule

Modélise un véhicule en cas de problème d'expédition. La résolution d'un problème de livraison permet de créer un itinéraire entre le start_location et le end_location pour ce véhicule. Un itinéraire correspond à une séquence de visites (voir ShipmentRoute).

Champs
display_name

string

Nom à afficher du véhicule défini par l'utilisateur. Il peut comporter jusqu'à 63 caractères et utiliser des caractères UTF-8.

travel_mode

TravelMode

Mode de déplacement qui affecte les routes utilisables par le véhicule et sa vitesse. Voir aussi travel_duration_multiple.

route_modifiers

RouteModifiers

Ensemble de conditions à remplir qui affectent la façon dont les itinéraires sont calculés pour le véhicule concerné.

start_location

LatLng

Emplacement géographique où le véhicule commence avant de récupérer des envois. Si aucune valeur n'est spécifiée, le véhicule commence à la première prise en charge. Si le modèle d'expédition comporte des matrices de durée et de distance, start_location ne doit pas être spécifié.

start_waypoint

Waypoint

Point de cheminement représentant un emplacement géographique où le véhicule part avant d'aller chercher une livraison Si vous ne spécifiez pas start_waypoint ni start_location, le véhicule démarre à son premier ramassage. Si le modèle de livraison comporte des matrices de durée et de distance, start_waypoint ne doit pas être spécifié.

end_location

LatLng

Emplacement géographique où le véhicule se termine après avoir terminé sa dernière VisitRequest. Si aucune valeur n'est spécifiée, le ShipmentRoute du véhicule se termine immédiatement lorsqu'il termine son dernier VisitRequest. Si le modèle de livraison comporte des matrices de durée et de distance, end_location ne doit pas être spécifié.

end_waypoint

Waypoint

Point de cheminement représentant un emplacement géographique où le véhicule se termine après avoir terminé sa dernière VisitRequest. Si aucune des valeurs end_waypoint ni end_location n'est spécifiée, la valeur ShipmentRoute du véhicule se termine immédiatement lorsqu'il termine son dernier VisitRequest. Si le modèle de livraison comporte des matrices de durée et de distance, end_waypoint ne doit pas être spécifié.

start_tags[]

string

Spécifie les tags associés au début de l'itinéraire du véhicule.

Les chaînes vides ou en double ne sont pas autorisées.

end_tags[]

string

Spécifie les tags associés à la fin de l'itinéraire du véhicule.

Les chaînes vides ou en double ne sont pas autorisées.

start_time_windows[]

TimeWindow

Périodes durant lesquelles le véhicule peut partir de sa position de départ. Ils doivent respecter les limites de temps globales (voir les champs ShipmentModel.global_*). Si aucune valeur n'est spécifiée, aucune limite n'est appliquée en dehors de ces limites globales.

Les fenêtres temporelles appartenant au même champ répété doivent être disjointes, c'est-à-dire qu'aucune fenêtre temporelle ne peut se chevaucher ni être adjacente, et elles doivent être présentées dans l'ordre chronologique.

cost_per_hour_after_soft_end_time et soft_end_time ne peuvent être définis que s'il n'y a qu'une seule période.

end_time_windows[]

TimeWindow

Périodes durant lesquelles le véhicule peut arriver à sa position d'arrivée. Ils doivent respecter les limites de temps globales (voir les champs ShipmentModel.global_*). Si elles ne sont pas spécifiées, il n'existe aucune limite en dehors de ces limites de temps globales.

Les fenêtres temporelles appartenant au même champ répété doivent être disjointes, c'est-à-dire qu'aucune fenêtre temporelle ne peut se chevaucher ni être adjacente, et elles doivent être présentées dans l'ordre chronologique.

cost_per_hour_after_soft_end_time et soft_end_time ne peuvent être définis que s'il existe une seule fenêtre temporelle.

unloading_policy

UnloadingPolicy

Règle de déchargement appliquée au véhicule.

load_limits

map<string, LoadLimit>

Capacités du véhicule (poids, volume, nombre de palettes, par exemple) Les clés du mappage sont les identifiants du type de charge, conformément aux clés du champ Shipment.load_demands. Si une clé donnée est absente de ce mappage, la capacité correspondante est considérée comme illimitée.

cost_per_hour

double

Coûts du véhicule : tous les coûts doivent être additionnés et être exprimés dans la même unité que Shipment.penalty_cost.

Coût par heure du trajet du véhicule. Ce coût est appliqué au temps total emprunté pour l'itinéraire. Il comprend le temps de trajet, le temps d'attente et le temps de visite. L'utilisation de cost_per_hour au lieu de cost_per_traveled_hour seulement peut entraîner une latence supplémentaire.

cost_per_traveled_hour

double

Coût par heure parcourue sur l'itinéraire du véhicule. Ce coût ne s'applique qu'au temps de trajet emprunté par l'itinéraire (c'est-à-dire celui indiqué dans ShipmentRoute.transitions). Il exclut le temps d'attente et le temps de visite.

cost_per_kilometer

double

Coût par kilomètre de l'itinéraire du véhicule. Ce coût est appliqué à la distance indiquée dans les ShipmentRoute.transitions. Il ne s'applique pas aux distances implicitement parcourue entre le arrival_location et le departure_location d'un même VisitRequest.

fixed_cost

double

Un coût fixe s'applique si ce véhicule est utilisé pour gérer une livraison.

used_if_route_is_empty

bool

Ce champ ne s'applique qu'aux véhicules dont l'itinéraire ne desserve aucune livraison. Il indique si le véhicule doit être considéré comme d'occasion ou non dans ce cas.

Si la valeur est définie sur "true", le véhicule va de son point de départ à son point d'arrivée même s'il ne desserve aucune livraison, et les coûts de temps et de distance liés à son départ --> à la fin du voyage sont pris en compte.

Sinon, il ne se déplace pas de son point de départ à son point d'arrivée, et aucun break_rule ni retard (à partir de TransitionAttributes) n'est programmé pour ce véhicule. Dans ce cas, le ShipmentRoute du véhicule ne contient aucune information, à l'exception de l'indice et de l'étiquette du véhicule.

route_duration_limit

DurationLimit

Limite appliquée à la durée totale du trajet du véhicule. Dans un OptimizeToursResponse donné, la durée de l'itinéraire d'un véhicule correspond à la différence entre sa vehicle_end_time et sa vehicle_start_time.

travel_duration_limit

DurationLimit

Limite appliquée à la durée du trajet du véhicule. Dans une OptimizeToursResponse donnée, la durée du trajet est la somme de toutes les valeurs transitions.travel_duration de l'itinéraire.

route_distance_limit

DistanceLimit

Limite appliquée à la distance totale de l'itinéraire du véhicule. Dans un OptimizeToursResponse donné, la distance de l'itinéraire correspond à la somme de tous ses transitions.travel_distance_meters.

extra_visit_duration_for_visit_type

map<string, Duration>

Spécifie une correspondance entre les chaînes "visit_types" et les durées. La durée correspond au temps supplémentaire à prendre en plus de VisitRequest.duration lors des visites avec la visit_types spécifiée. Cette durée de visite supplémentaire entraîne des frais si cost_per_hour est spécifié. Les clés (visit_types, par exemple) ne peuvent pas être des chaînes vides.

Si une demande de visite comporte plusieurs types, une durée sera ajoutée pour chacun d'eux sur la carte.

break_rule

BreakRule

Décrit le calendrier des pauses à appliquer à ce véhicule. Si ce champ est vide, aucun pause ne sera programmé pour ce véhicule.

label

string

Spécifie un libellé pour ce véhicule. Cette étiquette est indiquée dans la réponse en tant que vehicle_label du ShipmentRoute correspondant.

ignore

bool

Si la valeur est "true", used_if_route_is_empty doit être définie sur "false" et ce véhicule ne sera pas utilisé.

Si une livraison est effectuée par un véhicule ignoré dans injected_first_solution_routes, elle est ignorée dans la première solution, mais elle peut être incluse dans la réponse.

Si une livraison est effectuée par un véhicule ignoré dans injected_solution_constraint et que tous les enlèvements/livraisons associés sont contraints de rester dans le véhicule (c'est-à-dire qu'ils ne sont pas assouplis au niveau RELAX_ALL_AFTER_THRESHOLD), il est ignoré dans la réponse. Si un colis comporte un champ allowed_vehicle_indices non vide et que tous les véhicules autorisés sont ignorés, il est ignoré dans la réponse.

travel_duration_multiple

double

Spécifie un facteur multiplicatif pouvant être utilisé pour augmenter ou réduire les temps de trajet de ce véhicule. Par exemple, la valeur 2.0 signifie que le véhicule est plus lent et présente des temps de trajet deux fois supérieurs à ceux des véhicules standards. Ce multiple n'a aucune incidence sur la durée des visites. Cela affecte le coût si cost_per_hour ou cost_per_traveled_hour sont spécifiés. Elle doit être comprise dans la plage [0,001, 1 000,0]. Si cette valeur n'est pas définie, le véhicule est de type standard, et ce multiple est considéré comme étant de 1,0.

AVERTISSEMENT : Les temps de trajet seront arrondis à la seconde la plus proche après l'application de ce multiple, mais avant l'exécution d'opérations numériques. Par conséquent, un multiple faible peut entraîner une perte de précision.

Voir aussi extra_visit_duration_for_visit_type ci-dessous.

DurationLimit

Limite définissant la durée maximale de l'itinéraire d'un véhicule. Elle peut être soit difficile, soit douce.

Lorsqu'un champ de limite flexible est défini, le seuil maximal flexible et son coût associé doivent être définis ensemble.

Champs
max_duration

Duration

Limite stricte qui limite la durée à max_duration.

soft_max_duration

Duration

Une limite flexible n'applique pas de limite de durée maximale, mais lorsqu'elle n'est pas respectée, la route entraîne des frais. Ce coût s'ajoute aux autres coûts définis dans le modèle, avec la même unité.

Si la valeur soft_max_duration est définie, elle ne doit pas être négative. Si max_duration est également défini, soft_max_duration doit être inférieur à max_duration.

quadratic_soft_max_duration

Duration

Une limite flexible n'applique pas de limite de durée maximale, mais lorsqu'elle n'est pas respectée, la route entraîne des frais, qu'elle est de nature quadratique. Ce coût s'ajoute aux autres coûts définis dans le modèle, avec la même unité.

Si elle est définie, quadratic_soft_max_duration ne doit pas être négative. Si max_duration est également défini, quadratic_soft_max_duration doit être inférieur à max_duration, et la différence ne doit pas dépasser un jour:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Coût par heure en cas de dépassement du seuil soft_max_duration. Le coût supplémentaire est égal à 0 si la durée est inférieure au seuil. Sinon, le coût dépend de la durée, comme suit:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

Le coût ne doit pas être négatif.

cost_per_square_hour_after_quadratic_soft_max

double

Coût par heure carrée en cas de dépassement du seuil quadratic_soft_max_duration.

Le coût supplémentaire est égal à 0 si la durée est inférieure au seuil. Sinon, le coût dépend de la durée, comme suit:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

Le coût ne doit pas être négatif.

LoadLimit

Définit une limite de charge qui s'applique à un véhicule (par exemple, "ce camion ne doit pas peser plus de 3 500 kg". Consultez les load_limits.

Champs
soft_max_load

int64

Limite souple de la charge. Consultez les cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

Si la charge dépasse soft_max_load sur l'itinéraire de ce véhicule, la pénalité liée aux coûts est la suivante (une seule fois par véhicule): (charge - soft_max_load) * cost_per_unit_above_soft_max. Tous les coûts s'additionnent et doivent être dans la même unité que Shipment.penalty_cost.

start_load_interval

Interval

Intervalle de chargement acceptable du véhicule au début de l'itinéraire.

end_load_interval

Interval

Intervalle de chargement acceptable pour le véhicule à la fin de l'itinéraire.

max_load

int64

Charge maximale acceptable.

Intervalle

Intervalle entre des volumes de chargement acceptables.

Champs
min

int64

Charge minimale acceptable Doit être ≥ 0. Si les deux sont spécifiés, min doit être ≤ max.

max

int64

Charge maximale acceptable Doit être ≥ 0. Si elle n'est pas spécifiée, ce message ne limite pas la charge maximale. Si les deux sont spécifiés, min doit être ≤ max.

TravelMode

Modes de transport pouvant être utilisés par les véhicules.

Il doit s'agir d'un sous-ensemble des modes de transport de l'API Routes Preferred de Google Maps Platform. Consultez la page https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

Enums
TRAVEL_MODE_UNSPECIFIED Mode de transport non spécifié, équivalent à DRIVING.
DRIVING Mode de transport correspondant à l'itinéraire (voiture, etc.)
WALKING Mode de transport correspondant à l'itinéraire à pied

UnloadingPolicy

Règle concernant le déchargement d'un véhicule. S'applique uniquement aux envois avec retrait et livraison.

Les autres expéditions sont sans frais n'importe où sur l'itinéraire, indépendamment de unloading_policy.

Enums
UNLOADING_POLICY_UNSPECIFIED Règle de déchargement non spécifiée : les livraisons doivent simplement avoir lieu après les collectes correspondantes.
LAST_IN_FIRST_OUT Les livraisons doivent être effectuées dans l'ordre inverse des retraits.
FIRST_IN_FIRST_OUT Les livraisons doivent avoir lieu dans la même commande que les retraits

Repère

Encapsule un point de cheminement. Les points de cheminement marquent les lieux d'arrivée et de départ des demandes de visite, et les lieux de départ et d'arrivée des véhicules.

Champs
side_of_road

bool

Facultatif. Indique que l'emplacement de ce point de cheminement est destiné à indiquer au véhicule de s'arrêter d'un côté particulier de la route. Lorsque vous définissez cette valeur, l'itinéraire passe par l'emplacement afin que le véhicule puisse s'arrêter sur le côté de la route vers lequel l'emplacement est orienté à partir du centre. Cette option ne fonctionne pas avec le mode de déplacement "À PIED".

Champ d'union location_type. Différentes manières de représenter un lieu. location_type ne peut être qu'un des éléments suivants :
location

Location

Point spécifié à l'aide de coordonnées géographiques, y compris un en-tête facultatif.

place_id

string

ID de lieu du POI associé au point de cheminement.