Package google.maps.routeoptimization.v1

Index

RouteOptimization

Service permettant d'optimiser les visites guidées d'un véhicule.

Validité de certains types de champs:

  • google.protobuf.Timestamp
    • Les heures sont exprimées en temps Unix: secondes à partir du 1970-01-01T00:00:00+00:00.
    • Les secondes doivent être comprises entre [0, 253402300799], c'est-à-dire dans [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • La valeur nanos doit être désactivée ou définie sur 0.
  • google.protobuf.Duration
    • Les secondes doivent être comprises entre [0, 253402300799], c'est-à-dire dans [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • La valeur nanos doit être désactivée ou définie sur 0.
  • google.type.LatLng
    • La latitude doit être comprise entre [-90,0, 90,0].
    • la longitude doit être au format [-180,0, 180,0].
    • au moins une latitude et une longitude doit être différente de zéro.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Optimise les visites du véhicule 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/dans Cloud Storage au format spécifié par l'utilisateur. Comme la méthode OptimizeTours, chaque OptimizeToursRequest contient un ShipmentModel et renvoie un OptimizeToursResponse contenant des ShipmentRoute, qui sont un ensemble d'itinéraires à effectuer par les véhicules dont le coût global est réduit.

Champs d'application des autorisations

Requiert le niveau d'accès OAuth suivant :

  • https://www.googleapis.com/auth/cloud-platform
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 à effectuer par les véhicules dont le coût global est réduit.

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

L'objectif est de fournir une attribution de ShipmentRoute à Vehicle qui minimise le coût total lorsque de nombreux composants sont définis dans le ShipmentModel.

Champs d'application des autorisations

Requiert le niveau d'accès OAuth suivant :

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

AggregatedMetrics

Métriques agrégées pour ShipmentRoute (rép. OptimizeToursResponse sur tous les éléments Transition et/ou Visit, par rapport à tous les éléments ShipmentRoute).

Champs
performed_shipment_count

int32

Nombre d'envois effectués. Notez qu'une paire retrait/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

Durée d'attente totale pour un itinéraire ou une solution.

delay_duration

Duration

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

break_duration

Duration

Durée totale de la pause 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, il 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 de la réponse) pour chacune des quantités sur cet itinéraire (solution choisie), calculée comme étant la charge maximale sur l'ensemble des Transition.vehicle_loads (rép. 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 lots des visites en tant qu'opération asynchrone. Chaque fichier d'entrée doit contenir un élément OptimizeToursRequest et chaque fichier de sortie doit contenir un élément OptimizeToursResponse. La requête contient des informations à lire, écrire et analyser les fichiers. Tous les fichiers d'entrée et de sortie doivent se trouver dans le 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 sera choisie automatiquement.

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 de modèle défini par l'utilisateur, qui peut être utilisé comme alias par les utilisateurs pour suivre les modèles.

input_config

InputConfig

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

output_config

OutputConfig

Obligatoire. Les informations d'emplacement de sortie souhaitées.

BatchOptimizeToursResponse

Ce type ne comporte aucun champ.

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

BreakRule

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

  • pendant le trajet entre deux visites (ce qui inclut le moment qui précède ou suit une visite, mais pas au milieu d'une visite), auquel cas le délai d'acheminement correspondant entre les visites est prolongé ;
  • ou avant le démarrage du véhicule (il se peut qu'il ne démarre pas au milieu d'une pause), auquel cas cela n'a aucune incidence sur l'heure de début du véhicule.
  • ou après l'arrêt du véhicule (identique à l'heure d'arrivée du véhicule).
Champs
break_requests[]

BreakRequest

Séquence de pauses. Consultez le message BreakRequest.

frequency_constraints[]

FrequencyConstraint

Plusieurs FrequencyConstraint peuvent s'appliquer. Ils doivent tous être satisfaits par les BreakRequest de ce BreakRule. Consultez FrequencyConstraint.

BreakRequest

La séquence de coupures (numéro et ordre) qui s'applique à chaque véhicule doit être connue au préalable. Les éléments BreakRequest répétés définissent cette séquence, dans l'ordre dans lequel ils doivent se produire. Leurs périodes (earliest_start_time / latest_start_time) peuvent se chevaucher, mais elles doivent être compatibles avec l'ordre (sélectionné).

Champs
earliest_start_time

Timestamp

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

latest_start_time

Timestamp

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

min_duration

Duration

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

FrequencyConstraint

Vous pouvez restreindre davantage la fréquence et la durée des pauses spécifiées ci-dessus en appliquant une fréquence minimale de coupure, telle que "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 une fenêtre à durée flexible de 12 h, il doit y avoir au moins une pause d'au moins une heure", cet exemple se traduit par la valeur FrequencyConstraint suivante :

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

L'heure et la durée des pauses dans la solution respecteront toutes ces contraintes, en plus des fenêtres temporelles et des durées minimales déjà spécifiées dans le BreakRequest.

En pratique, un FrequencyConstraint peut s'appliquer aux coupures non consécutives. Par exemple, la planification suivante respecte l'exemple "1 h toutes les 12 h" :

  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 la coupure pour cette contrainte. Non négatif. Voir la description de FrequencyConstraint.

max_inter_break_duration

Duration

Obligatoire. Délai maximal autorisé de n'importe quel intervalle de temps de la route qui n'inclut pas au moins une partie d'une interruption 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 difficile ou doux.

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

Champs
max_meters

int64

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

soft_max_meters

int64

Une limite flexible n'appliquant pas de limite de distance maximale, mais en cas de violation entraîne un coût qui s'ajoute aux autres coûts définis dans le modèle, avec la même unité.

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

cost_per_kilometer_above_soft_max

double

Coût au kilomètre facturé si la distance est supérieure à la limite de soft_max_meters. Le coût supplémentaire est égal à 0 si la distance est inférieure à la limite. Dans le cas contraire, 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 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 demande, y compris des informations sur les visites et la façon dont elles doivent l'être

Champs
routes[]

ShipmentRoute

Routes de la solution à injecter Certains itinéraires peuvent être omis de la solution d'origine. Les itinéraires et les livraisons ignorées doivent respecter les hypothèses de validité de base énumérées pour injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

Envois ignorés de la solution à injecter. Certains peuvent être omis 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 empruntés par des véhicules sont soumis à des contraintes complètes.

ConstraintRelaxation

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

Champs
relaxations[]

Relaxation

Tous les assouplissements des contraintes de visite qui s'appliqueront aux visites d'itinéraires avec des véhicules dans vehicle_indices.

vehicle_indices[]

int32

Spécifie les indices de véhicules auxquels la contrainte de visite relaxations s'applique. Si ce champ est vide, il est considéré comme défini par défaut, et le relaxations s'applique à tous les véhicules qui ne sont pas spécifiés dans d'autres constraint_relaxations. Il ne peut y avoir qu'une seule valeur 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 dans plusieurs constraint_relaxations.

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

Relaxation

Si le champ relaxations est vide, l'heure de début et l'ordre des visites du routes sont totalement contraignants, et aucune nouvelle visite ne peut être insérée ni ajoutée à ces itinéraires. De plus, les heures de début et d'arrivée d'un véhicule dans routes sont totalement limitées, sauf si le véhicule est vide (c'est-à-dire qu'il n'a pas de visite et que le paramètre 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 satisfait aux conditions suivantes:

  • 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 détendu sur relaxations(i).level si les conditions suivantes sont respectées:

  • vehicle_start_time >= relaxations(i).threshold_time ET
  • relaxations(i).threshold_visit_count == 0 et l'extrémité du véhicule est flexible sur relaxations(i).level si les conditions suivantes sont respectées:
  • 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 répond aux threshold_visit_count OU les threshold_time, ajoutez deux relaxations avec le même level: l'un avec seulement 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. Ainsi, entre le départ du véhicule et l'arrêt 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 chronologie et la séquence des visites d'itinéraire qui ne remplissent pas les conditions de seuil des relaxations sont totalement soumises à des contraintes, et aucune visite ne peut être insérée dans ces séquences. De plus, si le départ ou la fin d'un véhicule ne remplit pas les conditions d'un assouplissement, l'heure 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 supérieures à threshold_time ET au moins threshold_visit_count sont remplies.

threshold_time

Timestamp

Heure à laquelle l'assouplissement level peut être appliqué, ou après cette date.

threshold_visit_count

int32

Nombre de visites après lesquelles 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 elle est définie sur route.visits_size() + 1, la valeur level ne peut être appliquée qu'à l'extrémité du véhicule. Si elle est supérieure à route.visits_size() + 1, la valeur level n'est pas du tout appliquée à cette route.

Niveau

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

L'énumération ci-dessous permet d'augmenter la relaxation.

Enums
LEVEL_UNSPECIFIED

Niveau d'assouplissement implicite par défaut: aucune contrainte n'est assouplie, c'est-à-dire que toutes les visites sont entièrement soumises à des contraintes.

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

RELAX_VISIT_TIMES_AFTER_THRESHOLD Les heures de début des visites et les heures de début/fin du véhicule seront assouplies, mais chaque visite reste 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 ou avant.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Identique à RELAX_VISIT_TIMES_AFTER_THRESHOLD, mais la séquence des visites est également souple: les visites restent simplement liées au véhicule.
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 à un certain moment après le seuil défini, et elles peuvent ne pas être effectué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

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

Emplacement

Encapsule un emplacement (un point géographique et un titre facultatif).

Champs
lat_lng

LatLng

Coordonnées géographiques du point de cheminement

heading

int32

Cap de la boussole associé au sens de la circulation. Cette valeur permet d'indiquer le côté de la route à utiliser pour les montées et les descentes. Les valeurs de cap peuvent aller de 0 à 360, où 0 indique un sens vers le nord, 90 indique un cap suivant l'orientation vers l'est, etc.

OptimizeToursRequest

Requête à envoyer à un outil 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 sera choisie automatiquement.

timeout

Duration

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

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

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

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

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

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

  • Pour tous les itinéraires, vehicle_index doit être dans la plage et ne doit pas être dupliqué.
  • pour toutes les visites, shipment_index et visit_request_index doivent être compris dans la plage.
  • un envoi ne peut être référencé que sur une seule route.
  • le retrait d'un colis avec retrait et livraison doit être effectué avant la livraison.
  • seule une alternative pour le retrait ou la livraison d'un envoi peut être effectuée.
  • pour tous les itinéraires, les délais augmentent (par exemple, vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • un envoi ne peut être effectué que sur un véhicule autorisé. Un véhicule est autorisé si Shipment.allowed_vehicle_indices est vide ou si son 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 et une erreur indiquant l'infaisabilité peut s'afficher à la place.

injected_solution_constraint

InjectedSolutionConstraint

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

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

refresh_details_routes[]

ShipmentRoute

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

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

Les champs route_polyline des routes transmises peuvent être incohérents avec 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 ce comportement. Les polylignes sont toujours renseignées entre toutes les visites pour tous les itinéraires non vides, que les colis ou les véhicules associés soient ignorés ou non.

interpret_injected_solutions_using_labels

bool

Si la valeur est "true" :

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

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

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

Supprimer des itinéraires ou des itinéraires entiers d'une solution injectée peut avoir un effet sur les contraintes implicites, ce qui peut entraîner un changement de solution, des erreurs de validation ou une infaisabilité.

REMARQUE: L'appelant doit s'assurer que chaque Vehicle.label (resp. Shipment.label) identifie de manière unique une entité de véhicule (livraison par le représentant) utilisée dans les deux demandes concernées: la requête précédente qui a généré le OptimizeToursResponse utilisé dans la solution injectée et la requête actuelle qui inclut la solution injectée. Les vérifications d'unicité décrites ci-dessus ne suffisent pas à garantir cette exigence.

consider_road_traffic

bool

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

populate_polylines

bool

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

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

use_geodesic_distances

bool

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

label

string

Libellé pouvant être utilisé pour identifier cette demande, indiqué 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 aux temps de trajet pour le calcul. Sa valeur doit être d'au moins 1 mètre/seconde.

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étail de l'erreur BadRequest (https://cloud.google.com/apis/design/errors#error_details), sauf si la résolution du problème est la suivante : VALIDATE_ONLY : consultez le champ OptimizeToursResponse.validation_errors. La valeur par défaut est 100,et la limite est fixée à 10 000.

SearchMode

Mode définissant le comportement de la recherche, en compromettant la latence par rapport à la qualité de la solution. Dans tous les modes, le délai global des requêtes est appliqué.

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 solution adaptée.
CONSUME_ALL_AVAILABLE_TIME Consacrez 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, une erreur INVALID_REQUEST s'affiche. Consultez la section max_validation_errors pour limiter le nombre d'erreurs renvoyées.

Enums
DEFAULT_SOLVE Résoudre le modèle
VALIDATE_ONLY Valide uniquement le modèle sans le résoudre: insère autant de OptimizeToursResponse.validation_errors que possible.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Ne renseigne que 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 problèmes sont détectés dans les routes injected_solution_constraint, ils sont renseignés dans le champ OptimizeToursResponse.validation_errors, et le champ OptimizeToursResponse.skipped_shipments est laissé vide.

IMPORTANT: Tous les envois non réalisables ne sont pas renvoyés ici, mais uniquement ceux qui ont été identifiés comme irréalisables lors du prétraitement.

OptimizeToursResponse

Réponse après avoir résolu un problème d'optimisation des visites, contenant les itinéraires suivis par chaque véhicule, les envois ignorés 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 expéditions ignorées.

validation_errors[]

OptimizeToursValidationError

Liste de toutes les erreurs de validation que nous avons pu détecter indépendamment. Consultez l'explication "PLUSIEURS ERREURS" pour le message OptimizeToursValidationError.

metrics

Metrics

Durée, distance et métriques d'utilisation de cette solution.

Métriques

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

Champs
aggregated_route_metrics

AggregatedMetrics

Agrégation des routes. Chaque métrique correspond à la somme (ou maximale, pour les chargements) de tous les champs ShipmentRoute.metrics du même nom.

skipped_mandatory_shipment_count

int32

Nombre d'envois obligatoires ignorés.

used_vehicle_count

int32

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

earliest_vehicle_start_time

Timestamp

Heure de départ au plus tôt d'un véhicule d'occasion, calculée comme le minimum pour tous les véhicules d'occasion (ShipmentRoute.vehicle_start_time).

latest_vehicle_end_time

Timestamp

Heure de fin la plus tardive d'un véhicule d'occasion, calculée comme étant le maximum pour tous les véhicules d'occasion de ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Coût de la solution, ventilé par champs de requête liés au coût. Les clés sont des chemins proto par rapport à la requête OptimizeToursRequest d'entrée (par exemple, "model.shipments.pickups.cost"). 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, les coûts["model.shipments.pickups.cost"] correspondent à la somme de tous les coûts de retrait dans la solution. Tous les coûts définis dans le modèle sont présentés en détail ici, à 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 plan des coûts.

OptimizeToursValidationError

Décrit une erreur rencontrée lors de la validation d'un OptimizeToursRequest.

Champs
code

int32

Une erreur de validation est définie par la paire (code, display_name), qui est toujours présente.

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

PLUSIEURS ERREURS: lorsqu'il existe plusieurs erreurs, le processus de validation tente d'en afficher plusieurs. Tout comme un compilateur, il s'agit d'un processus imparfait. Certaines erreurs de validation sont "fatales" et interrompent l'ensemble du processus de validation. C'est le cas des erreurs display_name="UNSPECIFIED", entre autres. Certaines peuvent empêcher le processus de validation d'ignorer d'autres erreurs.

STABILITÉ: code et display_name doivent ê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 donnée (non valide) à générer une paire différente (code, display_name), car la nouvelle erreur a masqué l'ancienne (voir la section "PLUS D'ERREURS").

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

  • UNSPECIFIED = 0;
  • VALIDATION_TIMEOUT_ERROR = 10 ; la validation n'a pas pu être effectuée 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 = 1205;
    • 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_AFTER_END_TIME = 2814;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_END_TIME = 2815;
    • 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_APRÈS_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_HOUR = 3 807
    • DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3 808
    • 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_HOUR = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 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_Minimum_DURATION_LONGER_THAN_DURATION_LIMIT = 4 222 ;
  • 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;
  • 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 = 4 811
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4 812
    • 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 = 5 601
display_name

string

Nom à afficher de 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 n° 4 et au premier enlèvement du colis n° 2, procédez 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 une correspondance 1:1 entre code et error_message (lorsque le code != "UNSPECIFIED").

STABILITÉ: non stable: le message d'erreur associé à un code donné peut changer (nous espérons clarifier ce point) au fil du temps. Veuillez plutôt utiliser display_name et code.

offending_values

string

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

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, nous pouvons spécifier l'élément n° 2 du fichier start_time_windows pour le véhicule n° 5 comme suit:

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

Toutefois, nous ignorons 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.

Livraison

L'expédition d'un seul article, d'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 réserve en conséquence), puis se rendre ultérieurement dans l'un de ses points de livraison (et donc augmenter à nouveau ses capacités de réserve en conséquence).

Champs
display_name

string

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

pickups[]

VisitRequest

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

deliveries[]

VisitRequest

Ensemble des alternatives de livraison associées à l'expédition. S'il n'est pas spécifié, il suffit que le véhicule se rende dans un lieu correspondant aux prises en charge.

load_demands

map<string, Load>

Charges requises pour le colis (par exemple, le poids, le volume, le nombre de palettes, etc.) Les clés du mappage doivent être des identifiants décrivant le type de charge correspondante, idéalement en incluant les unités. Par exemple: "weight_kg", "volume_gallons", "pallet_count", etc. Si une clé donnée n'apparaît pas sur la carte, la charge correspondante est considérée comme nulle.

allowed_vehicle_indices[]

int32

Ensemble des véhicules pouvant effectuer cette expédition. Si ce champ est vide, tous les véhicules peuvent l'utiliser. Les véhicules sont indiqués par leur indice dans la liste vehicles de ShipmentModel.

costs_per_vehicle[]

double

Indique les frais à payer lorsque cette livraison est effectuée par chaque véhicule. S'il est spécifié, il doit contenir SOIT:

  • le même nombre d'éléments que costs_per_vehicle_indices. costs_per_vehicle[i] correspond au véhicule costs_per_vehicle_indices[i] 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 numéro i du véhicule du modèle.

Ces coûts doivent être exprimés dans la même unité que le 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

Intervalles des véhicules auxquels s'applique costs_per_vehicle. 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 plusieurs fois l'index d'un véhicule. Si un véhicule est exclu de costs_per_vehicle_indices, son coût est de zéro.

pickup_to_delivery_absolute_detour_limit

Duration

Spécifie le délai absolu maximal de déviation par rapport au chemin le plus court entre le retrait et la livraison. Si cet attribut est spécifié, il ne doit pas être négatif, et le colis doit inclure au moins les options de retrait et de livraison.

Par exemple, indiquez le délai le plus court pour passer directement de l'alternative de retrait choisie directement à l'alternative de livraison choisie. Ensuite, la définition de pickup_to_delivery_absolute_detour_limit applique ce qui suit:

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 de retrait/livraison possible. Depuis 2017/2010, les déviations ne sont autorisées que lorsque la durée du trajet ne dépend pas des véhicules.

pickup_to_delivery_time_limit

Duration

Spécifie la durée maximale entre le début du retrait et le début de la livraison d'une livraison. Si cet attribut est spécifié, il ne doit pas être négatif, et le colis doit inclure au moins les options de retrait et de livraison. Cela ne dépend pas des alternatives sélectionnées pour la collecte et la livraison, ni de la vitesse du véhicule. Cette valeur peut être spécifiée en même temps que les contraintes de déviation maximales: la solution respectera ces deux spécifications.

shipment_type

string

Chaîne non vide indiquant un "type" pour cette livraison. Cette fonctionnalité permet de définir des incompatibilités ou des exigences entre shipment_types (voir shipment_type_incompatibilities et shipment_type_requirements dans ShipmentModel).

Différent de visit_types, qui est spécifié pour une seule visite: tous les retraits et livraisons associés à une même livraison partagent le même shipment_type.

label

string

Spécifie une étiquette pour cette livraison. Ce libellé est signalé dans la réponse dans l'élément shipment_label du ShipmentRoute.Visit correspondant.

ignore

bool

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

Le fait d'ignorer une livraison entraîne une erreur de validation lorsque le modèle contient des shipment_type_requirements.

Vous pouvez ignorer une expédition effectuée dans les pays suivants : injected_first_solution_routes ou injected_solution_constraint. L'outil de résolution supprime les visites associées (retrait/livraison) de l'itinéraire qui effectue les livraisons. 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 effectué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 de ses alternatives de retrait et de livraison est utilisé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 au coût. La valeur doit être positive.

IMPORTANT: Si cette pénalité n'est pas spécifiée, elle est considérée comme illimitée, ce qui signifie que l'envoi doit être effectué.

pickup_to_delivery_relative_detour_limit

double

Spécifie le délai de détour maximal relatif par rapport au trajet le plus court entre le retrait et la livraison. Si cet attribut est spécifié, il ne doit pas être négatif, et le colis doit inclure au moins les options de retrait et de livraison.

Par exemple, indiquez le délai le plus court pour passer directement de l'alternative de retrait choisie directement à l'alternative de livraison choisie. Ensuite, la définition de pickup_to_delivery_relative_detour_limit applique ce qui suit:

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 une même livraison, la limite la plus contraignante est utilisée pour chaque paire de retrait/livraison possible. Depuis 2017/2010, les déviations ne sont autorisées que lorsque la durée du trajet ne dépend pas des véhicules.

Charger

Lors d'une visite, un montant prédéfini peut être ajouté à la charge du véhicule (s'il s'agit d'un retrait) ou soustrait s'il s'agit d'une livraison. Ce message définit le montant en question. Consultez les load_demands.

Champs
amount

int64

Le volume de chargement du véhicule effectuant la visite correspondante varie. Puisqu'il s'agit d'un nombre entier, il est conseillé aux utilisateurs de choisir une unité appropriée afin d'éviter toute perte de précision. Doit être ≥ 0.

VisitRequest

Demande d'une visite pouvant être effectuée par un véhicule: un véhicule dispose d'une zone géographique (ou deux comme ci-dessous), d'heures d'ouverture et de fermeture représentées par des créneaux horaires, et d'une durée du service (temps passé par le véhicule une fois qu'il est arrivé pour récupérer ou déposer les marchandises).

Champs
arrival_location

LatLng

La géolocalisation à laquelle le véhicule arrive lorsque vous effectuez cette opération VisitRequest. Si le modèle de livraison comporte des matrices de durée et de distance, arrival_location ne doit pas être spécifié.

arrival_waypoint

Waypoint

Point de cheminement où le véhicule arrive lorsque vous effectuez cette VisitRequest. Si le modèle de livraison comporte des matrices de durée et de distance, arrival_waypoint ne doit pas être spécifié.

departure_location

LatLng

Il s'agit de la zone géographique à partir de laquelle le véhicule décolle une fois ce champ VisitRequest effectué. Peut être omis s'il est identique à arrival_location. Si le modèle de livraison comporte des matrices de durée et de distance, departure_location ne doit pas être spécifié.

departure_waypoint

Waypoint

Point de cheminement où part le véhicule une fois ce point VisitRequest terminé. Peut être omis s'il est identique à arrival_waypoint. Si le modèle de livraison comporte des matrices de durée et de distance, 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

Périodes qui limitent l'heure d'arrivée à une visite. Notez qu'un véhicule peut partir en dehors de l'heure d'arrivée. Par exemple, il n'est pas nécessaire que l'heure d'arrivée + la durée soient dans une fenêtre horaire. Cela peut entraîner un temps 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 fenêtres temporelles doivent être disjointes, c'est-à-dire qu'aucune période ne doit se chevaucher ou être adjacente à une autre, et les présenter dans un ordre croissant.

cost_per_hour_after_soft_end_time et soft_end_time ne peuvent être définis que s'il existe 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 de traitement de cette demande de visite sur l'itinéraire d'un véhicule. Cela peut être utilisé pour payer des coûts différents pour chaque retrait ou livraison d'un colis. Ce coût doit être exprimé dans la même unité que le 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 identique à Shipment.load_demands, sauf qu'il ne s'applique qu'à ce VisitRequest et non à l'ensemble du Shipment. Les demandes listées ici sont ajoutées à celles listées dans Shipment.load_demands.

visit_types[]

string

Indique les types de visite. Cela peut être utilisé pour allouer le temps supplémentaire nécessaire à un 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 signalé dans la réponse comme 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 minimisant le coût global, qui correspond à la somme des éléments suivants:

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

Shipment

Ensemble des livraisons qui doivent être effectuées 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 l'intervalle entre les éléments global_end_time et global_start_time doit être inférieur ou égal à 3 153 600 secondes.

Si 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, définissez les limites de temps globales sur ce jour-là). Si cette règle n'est pas configurée, la valeur par défaut est 00:00:00 UTC, 1er janvier 1970 (secondes: 0, nanos: 0).

global_end_time

Timestamp

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

global_duration_cost_per_hour

double

La "durée globale" du forfait global correspond à la différence entre la date de début effective la plus proche et l'heure de fin effective la plus proche pour tous les véhicules. Les utilisateurs peuvent attribuer un coût par heure à cette quantité pour essayer d'optimiser la tâche le plus tôt possible, par exemple. Ce coût doit être exprimé dans la même unité que le montant en 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 les distances géodésiques sont utilisés à la place, en fonction de la valeur du champ use_geodesic_distances. Si ce champ n'est pas vide, use_geodesic_distances ne peut pas être "true", et ni duration_distance_matrix_src_tags, ni duration_distance_matrix_dst_tags ne peuvent être vides.

Exemples d'utilisation :

  • Deux emplacements sont disponibles: locA et locB.
  • 1 véhicule qui commence son itinéraire à l'emplacement A et l'arrête à l'emplacement A.
  • 1 demande de prise en charge à l'emplacement B
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
    }
  }
}
  • Trois emplacements sont disponibles: locA, locB et locC.
  • 1 véhicule qui commence son itinéraire à la position A et finit à la position B en utilisant la matrice "rapide".
  • 1 véhicule qui commence son itinéraire à la borne B et qui arrive à la position B en utilisant la matrice "lente".
  • 1 véhicule qui commence son itinéraire à la borne B et qui arrive à la position B en utilisant la matrice "rapide".
  • 1 demande de retrait en magasin à 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. Un élément VisitRequest ou Vehicle donné doit correspondre exactement à un tag dans ce champ. Notez que les balises source, de destination et matricielle d'un Vehicle peuvent être identiques. De même, les balises de 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 ne doit pas être vide.

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 (en fonction de la distance) du trajet entre les visites avec la balise duration_distance_matrix_src_tags(j) et les visites avec la balise duration_distance_matrix_dst_tags(k) dans la matrice i.

Les balises correspondent à VisitRequest.tags ou Vehicle.start_tags. Un élément VisitRequest ou Vehicle donné doit correspondre exactement à un tag dans ce champ. Notez que les balises source, de destination et matricielle d'un Vehicle peuvent être identiques. De même, les balises de 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 ne doit pas être vide.

transition_attributes[]

TransitionAttributes

Attributs de transition ajoutés au modèle.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Ensembles de types de livraison non compatibles (voir ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Ensembles d'exigences 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 si son itinéraire effectue au moins une expédition. Cela permet de limiter le nombre d'itinéraires dans le cas où 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électionne ensuite le meilleur sous-ensemble de véhicules à utiliser. La valeur doit être strictement positive.

DurationDistanceMatrix

Spécifie une matrice de durée et de distance entre les lieux de départ des visites et les points de départ des véhicules, jusqu'aux points de départ et 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

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

Chaque départ de véhicule doit correspondre exactement à une matrice, c'est-à-dire qu'un seul des 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.

Row

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 ou aucune contrainte ne fait référence à des distances dans le modèle, ce champ peut être laissé vide. Dans le cas contraire, il doit comporter autant d'éléments que durations.

PrecedenceRule

Règle de priorité entre deux événements (chaque événement étant le retrait ou la livraison d'un colis): le "deuxième" événement doit commencer au moins offset_duration après le début du "premier".

Plusieurs priorités peuvent faire référence au même événement (ou à des événements associés). Par exemple, "Le retrait de B a lieu après la livraison de 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 expéditions sont effectuées et sont sinon ignorées.

Champs
first_is_delivery

bool

Indique si le "premier" événement est une diffusion.

second_is_delivery

bool

Indique si le "deuxième" événement est une diffusion.

offset_duration

Duration

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

first_index

int32

Index des livraisons du "premier" événement. Ce champ doit être renseigné.

second_index

int32

Index des livraisons du "deuxième" événement. Ce champ doit être renseigné.

ShipmentRoute

L'itinéraire d'un véhicule peut être décomposé le long 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 une différence entre:

  • les "événements ponctuels", tels que le début et la fin du véhicule, ou le début et la fin de chaque visite (c'est-à-dire l'arrivée et le départ). Elles se produisent à une seconde donnée.
  • "intervalles de temps", par exemple, 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 elle (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.
  • L'extrémité du véhicule est toujours précédée de la transition #n.

En zoomant, voici ce qui se passe pendant une Transition et 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 définir les paramètres VOYAGE, PAUSES, DÉLAI et ATTENTE lors d'une transition.

  • Ils ne se chevauchent pas.
  • Le délai de réponse (DELAY) est unique et doit être une période contiguë avant la prochaine visite (ou la fin du véhicule). Il suffit donc de connaître la durée du retard pour connaître ses heures de début et de fin.
  • Les BREAKS sont des périodes de temps contiguës qui ne se chevauchent pas. La réponse spécifie l'heure de début et la durée de chaque coupure.
  • Les délais de VOYAGE et d'ATTENTE sont "préemptables": ils peuvent être interrompus plusieurs fois au cours de cette transition. Les clients peuvent supposer que le trajet se déroule "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

Étiquette du véhicule effectuant cet itinéraire, égal à ShipmentModel.vehicles(vehicle_index).label, si spécifié.

vehicle_start_time

Timestamp

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

vehicle_end_time

Timestamp

Heure à laquelle le véhicule termine son trajet.

visits[]

Visit

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

transitions[]

Transition

Liste numérotée des transitions de 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 durées d'itinéraire sont prévues à l'aide d'estimations de durée de trajets basées sur le trafic. Le temps peut être insuffisant pour effectuer des trajets, des retards et des pauses adaptés aux conditions de circulation entre les visites, avant ou après la dernière visite, tout en respectant les horaires de passage et les horaires du véhicule. Par exemple :

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

L'arrivée à "next_visit" aura probablement lieu plus tard que son créneau horaire actuel, en raison de l'estimation accrue du temps de trajet travel_duration(previous_visit, next_visit) en raison de la circulation. En outre, une pause peut être forcée en même temps qu'une visite en raison d'une augmentation de l'estimation du temps de trajet et des restrictions sur les 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 planifiés pour le véhicule effectuant cet itinéraire. La séquence breaks représente des intervalles de temps, chacun commençant au start_time correspondant et durera duration secondes.

metrics

AggregatedMetrics

Métriques de durée, de distance et de chargement 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, ventilé par champs de requête liés au coût. Les clés sont des chemins proto par rapport à la requête OptimizeToursRequest d'entrée (par exemple, "model.shipments.pickups.cost"). 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 présentés en détail ici, à 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 sur le plan des coûts.

Pause

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

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 la 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 la route Consultez la description de ShipmentRoute.

Si le véhicule n'a pas de start_location et/ou de end_location, les métriques de trajet correspondantes sont de 0.

Champs
travel_duration

Duration

Durée du trajet 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 n'est disponible pour cet emplacement).

delay_duration

Duration

Somme des durées de retard appliquées à cette transition. Le cas échéant, le retard commence exactement delay_duration secondes avant le prochain événement (visite ou arrivée du véhicule). Consultez les TransitionAttributes.delay.

break_duration

Duration

Somme des durées des coupures publicitaires survenant au cours de cette transition, le cas échéant. Les informations sur l'heure de début et la durée de chaque coupure sont stockées dans ShipmentRoute.breaks.

wait_duration

Duration

Temps d'attente au cours de 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, fournie à titre indicatif. Elle est égale à:

  • prochaine visite sur 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", ce qui suit est également valable: `total_duration = travel_duration + delay_duration
  • pause_duration +wait_duration`.
start_time

Timestamp

Heure de début de cette transition.

route_polyline

EncodedPolyline

Représentation en 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>

Chargements de véhicules pendant cette transition, pour chaque type qui apparaît dans le Vehicle.load_limits de ce véhicule ou dont la valeur de Shipment.load_demands n'est pas nulle pour une livraison effectuée sur cet itinéraire.

Les charges de la première transition correspondent aux charges 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 chargements de la transition suivante, selon qu'il s'agissait d'un retrait ou d'une livraison.

VehicleLoad

Indique le chargement réel du véhicule à un moment donné de l'itinéraire, pour un type donné (voir Transition.vehicle_loads).

Champs
amount

int64

Charge du 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 au cours d'un itinéraire. Cette visite correspond à la collecte 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 à une prise en charge d'un Shipment. Dans le cas contraire, il 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 à laquelle la visite commence. Notez que le véhicule peut arriver plus tôt au lieu de la visite. Les heures correspondent aux ShipmentModel.

load_demands

map<string, Load>

Demande totale de chargement de visites, calculée en additionnant les valeurs de la livraison et des demandes de visite load_demands. Les valeurs sont négatives si la visite correspond à une livraison. Les demandes sont enregistrées pour les mêmes types que Transition.loads (voir ce champ).

detour

Duration

Délai de déviation supplémentaire en raison des expéditions visitées sur l'itinéraire avant la visite et du temps d'attente potentiel induits par les créneaux horaires. S'il s'agit d'une livraison, le détour est calculé à partir de la visite de retrait correspondante et est égal à:

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

Sinon, elle est calculée à partir du start_location du véhicule et est égale à:

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 expéditions en fonction de leur type de livraison. L'affichage d'expéditions incompatibles sur un même itinéraire est limité en fonction du mode d'incompatibilité.

Champs
types[]

string

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

incompatibility_mode

IncompatibilityMode

Mode appliqué à l'incompatibilité.

IncompatibilityMode

Modes définissant l'apparence d'expéditions incompatibles sur un 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 le type est incompatible ne peuvent jamais partager le même véhicule.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

Pour deux livraisons dont les types ne sont pas compatibles avec le mode d'incompatibilité NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Si les deux services proposent uniquement des retraits (pas de livraisons) ou des livraisons uniquement (pas de retrait), le même véhicule ne peut pas être partagé.
  • Si l'un des envois comporte une livraison et l'autre un retrait, les deux envois peuvent partager le même véhicule si l'ancien envoi est livré avant que le second soit retiré.

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 d'exigence.

Champs
required_shipment_type_alternatives[]

string

Liste des autres types de livraison requis par le dependent_shipment_types.

dependent_shipment_types[]

string

Toutes les livraisons dont le type est indiqué dans le champ dependent_shipment_types nécessitent la visite d'au moins une livraison de type required_shipment_type_alternatives sur la même route.

REMARQUE: Les chaînes d'exigences telles que 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 livraisons dépendantes 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 envois "dépendants" doivent partager le même véhicule qu'au moins l'un des envois "obligatoires".
IN_SAME_VEHICLE_AT_PICKUP_TIME

Avec le mode IN_SAME_VEHICLE_AT_PICKUP_TIME, tous les colis "dépendants" doivent avoir au moins un colis "obligatoire" dans leur véhicule au moment du retrait.

Un retrait d'un colis "dépendant" doit donc avoir l'une des valeurs suivantes:

  • d'un colis "obligatoire" réservé à la livraison et livré sur l'itinéraire suivant le ou
  • Un colis "obligatoire" récupéré sur l'itinéraire précédent. Si ce colis doit être livré, celui-ci doit être effectué après le retrait du colis "dépendant".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Identique à la procédure précédente, à la différence que les livraisons "dépendantes" doivent être associées à une livraison "obligatoire" dans le véhicule au moment de la livraison.

SkippedShipment

Spécifie les détails des envois non effectués dans une solution. Pour les cas banals et/ou si nous pouvons identifier la cause du saut de page, nous l'indiquons ici.

Champs
index

int32

L'index correspond à l'index de la livraison dans la source ShipmentModel.

label

string

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

reasons[]

Reason

Liste des raisons expliquant pourquoi l'envoi a été ignoré. Voir le commentaire au-dessus de Reason.

Motif

Si nous pouvons expliquer pourquoi la livraison a été ignorée, les raisons sont indiquées ici. Si le motif n'est pas le même pour tous les véhicules, reason comportera plusieurs éléments. Un envoi ignoré ne peut pas avoir plusieurs raisons, c'est-à-dire que 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
}

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

Champs
code

Code

Reportez-vous aux commentaires de Code.

example_exceeded_capacity_type

string

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

example_vehicle_index

int32

Si le motif est lié à une incompatibilité entre le véhicule d'expédition et le véhicule, ce champ indique l'index d'un véhicule concerné.

Code

Code identifiant le type de motif. Ici, l'ordre n'a aucun sens. En particulier, cela ne donne aucune indication sur la présence d'une raison donnée avant une autre dans la solution, si les deux s'appliquent.

Enums
CODE_UNSPECIFIED Il ne doit jamais être utilisé. Si nous ne parvenons pas à comprendre pourquoi un envoi a été ignoré, nous vous indiquons simplement un ensemble vide de motifs.
NO_VEHICLE Le modèle ne comporte aucun véhicule, ce qui rend toutes les expéditions impossibles.
DEMAND_EXCEEDS_VEHICLE_CAPACITY La demande du colis dépasse la capacité d'un véhicule pour certains types de capacité (example_exceeded_capacity_type).
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

La distance minimale nécessaire pour effectuer cette expédition, c'est-à-dire entre le start_location du véhicule et les lieux de retrait et/ou de livraison du colis, et jusqu'au lieu d'arrivée du véhicule, dépasse la valeur 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 expédition (y compris le temps de trajet, le temps d'attente et le temps de service) dépasse les route_duration_limit du véhicule.

Remarque: Le temps de trajet est calculé dans le meilleur des cas, à savoir une distance géodésique de 36 m/s (environ 130 km/heure).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Identique à ci-dessus, mais nous ne comparons que la durée de trajet minimale et le travel_duration_limit du véhicule.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Dans le meilleur des cas, le véhicule ne peut pas effectuer cette expédition (voir CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT pour le calcul du temps) s'il commence à l'heure de départ la plus proche: le temps total indiquerait que le véhicule se terminerait après sa dernière heure d'arrivée.
VEHICLE_NOT_ALLOWED Le champ "allowed_vehicle_indices" du colis n'est pas vide, et ce véhicule ne lui appartient pas.

TimeWindow

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

Les limites de fenêtre temporelle (start_time et end_time) appliquent les dates au plus tôt et au plus tard de l'événement, de sorte que start_time <= event_time <= end_time. La limite inférieure de la fenêtre temporelle flexible, soft_start_time, exprime une préférence pour que l'événement se produise à soft_start_time ou après en générant un coût proportionnel à la durée avant l'événement soft_start_time. La limite supérieure de la fenêtre temporelle flexible, soft_end_time, exprime une préférence pour que l'événement se produise au soft_end_time ou avant en générant un coût proportionnel à la durée 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` <= `soft_start_time` <= `end_time` and
  0 <= `start_time` <= `soft_end_time` <= `end_time`.
Champs
start_time

Timestamp

Heure de début de la fenêtre de temps difficile. Si aucune valeur n'est spécifiée, elle sera définie sur ShipmentModel.global_start_time.

end_time

Timestamp

Heure de fin de la fenêtre de temps difficile. Si aucune valeur n'est spécifiée, elle sera définie sur ShipmentModel.global_end_time.

soft_start_time

Timestamp

Heure de démarrage soft de la fenêtre temporelle.

soft_end_time

Timestamp

Heure de fin douce de la fenêtre temporelle.

cost_per_hour_before_soft_start_time

double

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

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 (selon la sémantique naturelle "AND").

Champs
src_tag

string

Les balises qui définissent l'ensemble des transitions (src->dst) auxquelles ces attributs s'appliquent.

Une visite à la source ou un départ de véhicule correspond si son 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. Un seul des champs src_tag et excluded_src_tag ne doit pas être vide.

dst_tag

string

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

excluded_dst_tag

string

Consultez les dst_tag. Un seul des champs dst_tag et excluded_dst_tag ne doit pas être vide.

cost

double

Indique le coût de cette transition. Cette valeur est exprimée dans la même unité que tous les autres coûts du modèle et ne doit pas être négative. Il s'ajoute à tous les autres coûts existants.

cost_per_kilometer

double

Spécifie un coût au kilomètre appliqué à la distance parcourue lors de la transition. Il s'élève à n'importe quel Vehicle.cost_per_kilometer spécifié sur les véhicules.

distance_limit

DistanceLimit

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

Depuis 2021/06, seules les limites souples sont acceptées.

delay

Duration

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

Ce retard se produit toujours après la fin de la visite de la source et avant le début de la visite de la destination.

Véhicule

modélise un véhicule lors d'un problème d'expédition ; Si vous résolvez un problème de livraison, un itinéraire commençant par start_location et se terminant à end_location sera créé pour ce véhicule. Un itinéraire est 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 transport qui affecte les routes utilisables par le véhicule et sa vitesse. Voir aussi travel_duration_multiple.

start_location

LatLng

Emplacement géographique où le véhicule commence avant de récupérer les colis. Si aucune valeur n'est spécifiée, le véhicule commence à sa première prise en charge. Si le modèle de livraison 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 l'emplacement géographique où le véhicule commence avant de récupérer les colis. Si aucune valeur n'est spécifiée pour start_waypoint ni start_location, le véhicule commence à sa première prise en charge. 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 la fin de sa dernière période de VisitRequest. Si aucune valeur n'est spécifiée, l'attribut ShipmentRoute du véhicule se termine immédiatement lorsqu'il a terminé 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 l'emplacement géographique où le véhicule s'arrête après avoir terminé son dernier VisitRequest. Si ni end_waypoint, ni end_location n'est spécifié, le ShipmentRoute du véhicule se termine immédiatement lorsqu'il termine sa dernière 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 ajouté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 pendant lesquelles le véhicule peut partir de son lieu de départ. Ils doivent respecter les limites de temps globales (voir les champs ShipmentModel.global_*). S'il n'est pas spécifié, 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. Autrement dit, aucune période ne peut se chevaucher ou être adjacente à une autre, et les présenter 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 période.

end_time_windows[]

TimeWindow

Périodes pendant lesquelles le véhicule peut arriver à son point d'arrivée. Ils doivent respecter les limites de temps globales (voir les champs ShipmentModel.global_*). S'il n'est pas spécifié, 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. Autrement dit, aucune période ne peut se chevaucher ou être adjacente à une autre, et les présenter 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 période.

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 chargement, 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 s'additionnent et doivent être exprimés dans la même unité que le Shipment.penalty_cost.

Coût à l'heure de l'itinéraire du véhicule. Ce coût s'applique à la durée totale de l'itinéraire. Il comprend le temps de trajet, le temps d'attente et le temps de visite. Utiliser cost_per_hour au lieu de cost_per_traveled_hour uniquement peut entraîner une latence supplémentaire.

cost_per_traveled_hour

double

Coût par heure parcourue de l'itinéraire du véhicule. Ce coût n'est appliqué qu'au temps de trajet de l'itinéraire (tel qu'indiqué dans ShipmentRoute.transitions). Les temps d'attente et les visites ne sont pas pris en compte.

cost_per_kilometer

double

Coût au kilomètre du trajet du véhicule Ce coût est appliqué à la distance indiquée dans le ShipmentRoute.transitions et ne s'applique pas à toute distance implicitement parcourue entre le arrival_location et le departure_location d'un seul VisitRequest.

fixed_cost

double

Frais fixes appliqués si ce véhicule est utilisé pour le traitement d'un colis.

used_if_route_is_empty

bool

Ce champ ne s'applique qu'aux véhicules lorsque leur itinéraire ne dessert aucun envoi. Il indique si le véhicule doit être considéré comme d'occasion ou non.

Si la valeur est "true", le véhicule va de son point de départ à sa destination même s'il ne propose aucune livraison. Les coûts liés au temps et à la distance résultant de son trajet de départ --> d'arrivée sont pris en compte.

Sinon, il ne se déplacera pas de son point de départ à sa position 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'index et de l'étiquette du véhicule.

route_duration_limit

DurationLimit

Limite appliquée à la durée totale de l'itinéraire du véhicule. Dans une OptimizeToursResponse donnée, la durée de l'itinéraire d'un véhicule correspond à la différence entre ses valeurs vehicle_end_time et 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 de l'itinéraire correspond à la somme de tous ses transitions.travel_duration.

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 est la somme de tous ses transitions.travel_distance_meters.

extra_visit_duration_for_visit_type

map<string, Duration>

Spécifie une carte allant des chaînes visit_types aux durées. Il s'agit du temps, en plus des VisitRequest.duration, à effectuer lors des visites avec le visit_types spécifié. Cette durée supplémentaire entraîne des frais si cost_per_hour est spécifié. Les clés (c'est-à-dire visit_types) 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 les horaires de pause à appliquer sur ce véhicule. Si ce champ est vide, aucune pause ne sera programmée pour ce véhicule.

label

string

Spécifie une étiquette pour ce véhicule. Ce libellé est signalé 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 "false", et ce véhicule ne sera pas utilisé.

Si une expédition 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 effectuée dans la réponse.

Si une expédition est effectuée par un véhicule ignoré dans injected_solution_constraint, et que tout retrait/livraison associé doit rester sur le véhicule (c'est-à-dire, ne pas être assoupli au niveau RELAX_ALL_AFTER_THRESHOLD), elle est ignorée dans la réponse. Si une livraison comporte un champ allowed_vehicle_indices non vide et que tous les véhicules autorisés sont ignorés, elle est ignorée 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 du véhicule. Par exemple, si la valeur est définie sur 2,0, ce véhicule est plus lent et son temps de trajet est deux fois supérieur à celui des véhicules standards. Ce multiple n'a pas d'incidence sur la durée des visites. Cela a une incidence sur 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, 1000,0]. Si cette règle n'est pas configurée, le véhicule est standard, et ce multiple est considéré comme 1.0.

AVERTISSEMENT: Les temps de trajet sont arrondis à la seconde la plus proche après l'application de ce multiple, mais avant d'effectuer des opérations numériques. Par conséquent, un petit multiple 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. Il peut être difficile ou doux.

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

Champs
max_duration

Duration

Limite stricte limitant la durée à max_duration maximale.

soft_max_duration

Duration

Une limite flexible n'appliquant pas de limite de durée maximale, mais lorsqu'elle est enfreinte, entraîne un coût pour l'itinéraire. Ces coûts s'ajoutent aux autres coûts définis dans le modèle, avec la même unité.

S'il est défini, la valeur soft_max_duration 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'appliquant pas de limite de durée maximale, mais lorsqu'elle est enfreinte, entraîne un coût quadratique de la durée de l'itinéraire. Ces coûts s'ajoutent aux autres coûts définis dans le modèle, avec la même unité.

S'il est défini, la valeur quadratic_soft_max_duration ne doit pas être négative. Si max_duration est également défini, la valeur quadratic_soft_max_duration doit être inférieure à max_duration et la différence ne doit pas être supérieure à un jour:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Coût à l'heure encouru 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 facturé si le seuil de quadratic_soft_max_duration est dépassé.

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 applicable à un véhicule (par exemple, "ce camion ne peut pas supporter 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 le chargement dépasse soft_max_load sur l'itinéraire du véhicule, la pénalité suivante s'applique (une seule fois par véhicule): (charge - soft_max_load) x cost_per_unit_above_soft_max. Tous les coûts s'additionnent et doivent être exprimés dans la même unité que le 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 du véhicule en fin d'itinéraire.

max_load

int64

Quantité de charge maximale acceptable.

Intervalle

Intervalle des quantités de chargement acceptables.

Champs
min

int64

Une charge minimale acceptable. Doit être ≥ 0. Si elles sont toutes les deux spécifiées, min doit être ≤ max.

max

int64

Charge maximale acceptable. Doit être ≥ 0. Si aucune valeur n'est spécifiée, la charge maximale n'est pas limitée par ce message. Si elles sont toutes les deux spécifiées, 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 privilégiés de l'API Routes de Google Maps Platform (voir 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 en voiture (voiture, ...).
WALKING Mode de transport correspondant à l'itinéraire à pied

UnloadingPolicy

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

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

Enums
UNLOADING_POLICY_UNSPECIFIED Modalités de déchargement non spécifiées ; les livraisons doivent avoir lieu après le retrait correspondant.
LAST_IN_FIRST_OUT Les livraisons doivent avoir lieu 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 indiquent les lieux d'arrivée et de départ des VisitRequests, ainsi que 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 doit permettre au véhicule de s'arrêter d'un côté de la route de préférence. Lorsque vous définissez cette valeur, l'itinéraire passe par ce lieu afin que le véhicule puisse s'arrêter au bord de la route où l'emplacement est orienté vers le centre. Cette option ne fonctionne pas pour le mode de transport "WALKING".

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 cap facultatif.

place_id

string

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