ShipmentModel

Un modèle d'expédition 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 est la somme des éléments suivants :

  • le coût de l'itinéraire des véhicules (somme du coût par durée totale, du coût par durée de trajet et du coût fixe pour tous les véhicules).
  • les pénalités pour les livraisons non effectuées.
  • le coût de la durée globale des expéditions.
Représentation JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "objectives": [
    {
      object (Objective)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
Champs
shipments[]

object (Shipment)

Ensemble d'expéditions qui doivent être effectuées dans le modèle.

vehicles[]

object (Vehicle)

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

objectives[]

object (Objective)

Ensemble d'objectifs pour ce modèle, que nous allons transformer en coûts. Si elle n'est pas vide, le modèle d'entrée doit être sans frais. Pour obtenir la requête modifiée, veuillez utiliser solvingMode = TRANSFORM_AND_RETURN_REQUEST. Notez que la demande ne sera pas résolue dans ce cas. Consultez la documentation correspondante.

Expérimental : pour en savoir plus, consultez https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

globalStartTime

string (Timestamp format)

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 globalEndTime et globalStartTime doivent être séparés de moins de 31 536 000 secondes.

Lorsque vous utilisez des champs cost_per_*hour, vous pouvez définir cette fenêtre sur un intervalle plus petit pour améliorer les performances (par exemple, si vous modélisez une seule journée, vous devez définir les limites de temps globales sur cette journée). Si elle n'est pas définie, la valeur par défaut est 00:00:00 UTC, le 1er janvier 1970 (c'est-à-dire secondes : 0, nanosecondes : 0).

Utilise la norme RFC 3339, où la sortie générée utilise toujours le format UTC (indiqué par "Z" pour le temps universel coordonné) avec des secondes fractionnaires de 0, 3, 6 ou 9 chiffres décimaux. Des décalages horaires autres que "Z" (UTC) sont également acceptés. Exemples : "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ou "2014-10-02T15:01:23+05:30".

globalEndTime

string (Timestamp format)

Si elle n'est pas définie, la valeur par défaut est 00:00:00 UTC, le 1er janvier 1971 (c'est-à-dire secondes : 31536000, nanosecondes : 0).

Utilise la norme RFC 3339, où la sortie générée utilise toujours le format UTC (indiqué par "Z" pour le temps universel coordonné) avec des secondes fractionnaires de 0, 3, 6 ou 9 chiffres décimaux. Des décalages horaires autres que "Z" (UTC) sont également acceptés. Exemples : "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ou "2014-10-02T15:01:23+05:30".

globalDurationCostPerHour

number

La "durée globale" du plan global correspond à la différence entre la date de début effective la plus ancienne et la date de fin effective la plus récente de tous les véhicules. Les utilisateurs peuvent attribuer un coût par heure à cette quantité pour essayer d'optimiser la date d'achèvement des tâches, par exemple. Ce coût doit être exprimé dans la même unité que Shipment.penalty_cost.

durationDistanceMatrices[]

object (DurationDistanceMatrix)

Spécifie les matrices de durée et de distance utilisées dans le modèle. Si ce champ est vide, les distances Google Maps ou géodésiques seront utilisées à la place, en fonction de la valeur du champ useGeodesicDistances. S'il n'est pas vide, useGeodesicDistances ne peut pas être défini sur "true", et durationDistanceMatrixSrcTags et durationDistanceMatrixDstTags ne peuvent pas être vides.

Exemples d'utilisation :

  • Il existe deux emplacements : locA et locB.
  • Un véhicule commence son trajet à l'emplacement A et le termine à l'emplacement A.
  • 1 demande de visite pour enlèvement à l'adresse locB.
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Il existe trois emplacements : locA, locB et locC.
  • Un véhicule commence son trajet à l'emplacement A et le termine à l'emplacement B, en utilisant la matrice "fast".
  • Un véhicule commence son trajet à locB et le termine à locB, en utilisant la matrice "slow".
  • Un véhicule commence son trajet à l'emplacement B et le termine à l'emplacement B, en utilisant la matrice "fast".
  • 1 demande de visite pour retrait à locC.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "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
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "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
    }
  }
}
durationDistanceMatrixSrcTags[]

string

Balises définissant les sources des matrices de durée et de distance ; durationDistanceMatrices(i).rows(j) définit les durées et les distances des visites avec la balise durationDistanceMatrixSrcTags(j) vers d'autres visites dans la matrice i.

Les tags correspondent à VisitRequest.tags ou Vehicle.start_tags. Un VisitRequest ou un Vehicle donné doit correspondre exactement à un tag dans ce champ. Notez que les tags source, de destination et de matrice d'un Vehicle peuvent être identiques. De même, les tags source et de destination d'un VisitRequest peuvent être identiques. Tous les tags doivent être différents et ne peuvent pas être des chaînes vides. Si ce champ n'est pas vide, durationDistanceMatrices ne doit pas l'être non plus.

durationDistanceMatrixDstTags[]

string

Tags définissant les destinations des matrices de durée et de distance : durationDistanceMatrices(i).rows(j).durations(k) (resp. durationDistanceMatrices(i).rows(j).meters(k)) définit la durée (ou la distance) du trajet entre les visites avec le tag durationDistanceMatrixSrcTags(j) et celles avec le tag durationDistanceMatrixDstTags(k) dans la matrice i.

Les tags correspondent à VisitRequest.tags ou Vehicle.start_tags. Un VisitRequest ou un Vehicle donné doit correspondre exactement à un tag dans ce champ. Notez que les tags source, de destination et de matrice d'un Vehicle peuvent être identiques. De même, les tags source et de destination d'un VisitRequest peuvent être identiques. Tous les tags doivent être différents et ne peuvent pas être des chaînes vides. Si ce champ n'est pas vide, durationDistanceMatrices ne doit pas l'être non plus.

transitionAttributes[]

object (TransitionAttributes)

Ajout d'attributs de transition au modèle.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Ensembles de shipment_types incompatibles (voir ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Ensembles d'exigences shipmentType (voir ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

Ensemble de règles de priorité qui doivent être appliquées dans le modèle.

IMPORTANT : L'utilisation de règles de précédence limite la taille du problème qui peut être optimisé. Les demandes utilisant des règles de priorité qui incluent de nombreuses expéditions peuvent être refusées.

maxActiveVehicles

integer

Limite le nombre maximal de véhicules actifs. Un véhicule est actif si son itinéraire effectue au moins une livraison. Cela peut être utilisé pour limiter le nombre d'itinéraires dans le cas où il y a moins de chauffeurs que de véhicules et que la flotte de véhicules est hétérogène. L'optimisation sélectionnera ensuite le meilleur sous-ensemble de véhicules à utiliser. Doit être strictement positif.

Livraison

Envoi d'un seul article, d'un point de collecte à un point de livraison. Pour qu'une livraison soit considérée comme effectuée, un véhicule unique doit se rendre à l'un de ses lieux de prise en charge (et réduire ses capacités disponibles en conséquence), puis à l'un de ses lieux de livraison (et donc augmenter à nouveau ses capacités disponibles en conséquence).

Représentation JSON
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
Champs
displayName

string

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

pickups[]

object (VisitRequest)

Ensemble d'alternatives de retrait associées à l'envoi. Si aucune heure n'est spécifiée, le véhicule n'a besoin de se rendre qu'à un lieu correspondant aux livraisons.

deliveries[]

object (VisitRequest)

Ensemble d'alternatives de livraison associées à l'expédition. Si aucune heure n'est spécifiée, le véhicule n'a besoin de se rendre qu'à un lieu correspondant aux points de collecte.

loadDemands

map (key: string, value: object (Load))

Les exigences de chargement de l'envoi (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 correspondant, idéalement en incluant également les unités. Par exemple : "weight_kg", "volume_gallons", "pallet_count", etc. Si une clé donnée n'apparaît pas dans la carte, la charge correspondante est considérée comme nulle.

allowedVehicleIndices[]

integer

Ensemble des véhicules pouvant effectuer cette livraison. Si ce champ est vide, tous les véhicules peuvent effectuer la tâche. Les véhicules sont indiqués par leur index dans la liste vehicles de ShipmentModel.

costsPerVehicle[]

number

Spécifie le coût encouru lorsque cette livraison est effectuée par chaque véhicule. Si elle est spécifiée, elle doit comporter l'UNE des options suivantes :

  • le même nombre d'éléments que costsPerVehicleIndices. costsPerVehicle[i] correspond au véhicule costsPerVehicleIndices[i] du modèle.
  • le même nombre d'éléments que le nombre de véhicules dans le modèle. Le i-ème élément correspond au véhicule i du modèle.

Ces coûts doivent être exprimés dans la même unité que penaltyCost et ne doivent pas être négatifs. Laissez ce champ vide si vous n'avez pas de frais de ce type.

costsPerVehicleIndices[]

integer

Indices des véhicules auxquels costsPerVehicle s'applique. S'il n'est pas vide, il doit comporter le même nombre d'éléments que costsPerVehicle. Un index de véhicule ne peut pas être spécifié plusieurs fois. Si un véhicule est exclu de costsPerVehicleIndices, son coût est nul.

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

Spécifie le temps de détour maximal absolu par rapport au chemin le plus court entre le point de prise en charge et le point de livraison. Si elle est spécifiée, elle doit être non négative et l'expédition doit contenir au moins un enlèvement et une livraison.

Par exemple, soit t le temps le plus court pour aller directement de l'alternative de retrait sélectionnée à l'alternative de livraison sélectionnée. Le paramètre pickupToDeliveryAbsoluteDetourLimit applique ensuite les règles suivantes :

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

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

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

pickupToDeliveryTimeLimit

string (Duration format)

Spécifie la durée maximale entre le début de l'enlèvement et le début de la livraison d'un colis. Si elle est spécifiée, elle doit être non négative et l'expédition doit contenir au moins un enlèvement et une livraison. Cela ne dépend pas des alternatives sélectionnées pour le retrait et la livraison, ni de la vitesse du véhicule. Cette contrainte peut être spécifiée en même temps que les contraintes de détour maximal : la solution respectera les deux spécifications.

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

shipmentType

string

Chaîne non vide spécifiant un "type" pour cet envoi. Cette fonctionnalité peut être utilisée pour définir des incompatibilités ou des exigences entre shipment_types (voir shipmentTypeIncompatibilities et shipmentTypeRequirements dans ShipmentModel).

Diffère de visitTypes, qui est spécifié pour une seule visite : tous les retraits/toutes les livraisons appartenant au même envoi partagent le même shipmentType.

label

string

Spécifie un libellé pour cette expédition. Ce libellé est indiqué dans la réponse, dans le shipmentLabel du ShipmentRoute.Visit correspondant.

ignore

boolean

Si la valeur est "true", ignorez cet envoi, mais n'appliquez pas de penaltyCost.

Si vous ignorez une expédition alors que le modèle contient des shipmentTypeRequirements, une erreur de validation se produit.

Il est possible d'ignorer une expédition effectuée dans injectedFirstSolutionRoutes ou injectedSolutionConstraint. Le solveur supprime les visites d'enlèvement/de livraison associées de l'itinéraire. Les precedenceRules qui font référence à des expéditions ignorées seront également ignorés.

penaltyCost

number

Si l'expédition n'est pas effectuée, cette pénalité est ajoutée au coût global des itinéraires. Une livraison est considérée comme terminée si l'une de ses alternatives de retrait et de livraison est visitée. Le coût peut être exprimé dans la même unité que celle utilisée pour tous les autres champs liés aux coûts dans le modèle et doit être positif.

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

pickupToDeliveryRelativeDetourLimit

number

Spécifie le temps de détour relatif maximal par rapport au chemin le plus court entre le point de prise en charge et le point de livraison. Si elle est spécifiée, elle doit être non négative et l'expédition doit contenir au moins un enlèvement et une livraison.

Par exemple, soit t le temps le plus court pour aller directement de l'alternative de retrait sélectionnée à l'alternative de livraison sélectionnée. Le paramètre pickupToDeliveryRelativeDetourLimit applique ensuite les règles suivantes :

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

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

VisitRequest

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

Représentation JSON
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string,
  "avoidUTurns": boolean
}
Champs
arrivalLocation

object (LatLng)

Emplacement géographique où le véhicule arrive lors de l'exécution de cette VisitRequest. Si le modèle d'expédition comporte des matrices de distance et de durée, arrivalLocation ne doit pas être spécifié.

arrivalWaypoint

object (Waypoint)

Point de cheminement où le véhicule arrive lors de l'exécution de cette VisitRequest. Si le modèle d'expédition comporte des matrices de distance et de durée, arrivalWaypoint ne doit pas être spécifié.

departureLocation

object (LatLng)

Emplacement géographique où le véhicule part après avoir terminé cette VisitRequest. Peut être omis s'il est identique à arrivalLocation. Si le modèle d'expédition comporte des matrices de distance et de durée, departureLocation ne doit pas être spécifié.

departureWaypoint

object (Waypoint)

Point de cheminement où le véhicule repart après avoir terminé cette VisitRequest. Peut être omis s'il est identique à arrivalWaypoint. Si le modèle d'expédition comporte des matrices de distance et de durée, departureWaypoint 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.

timeWindows[]

object (TimeWindow)

Périodes qui limitent l'heure d'arrivée à une visite. Notez qu'un véhicule peut partir en dehors de la période d'arrivée. En d'autres termes, l'heure d'arrivée et la durée ne doivent pas nécessairement se trouver dans une période. 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 périodes doivent être disjointes, c'est-à-dire qu'aucune période ne doit chevaucher une autre ni être adjacente à une autre, et elles doivent être dans l'ordre croissant.

costPerHourAfterSoftEndTime et softEndTime ne peuvent être définis que s'il n'y a qu'un seul créneau horaire.

duration

string (Duration format)

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

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

cost

number

Coût du traitement de cette demande de visite sur un itinéraire de véhicule. Vous pouvez l'utiliser pour payer différents coûts pour chaque alternative de retrait ou de livraison d'un colis. Ce coût doit être exprimé dans la même unité que Shipment.penalty_cost et ne doit pas être négatif.

loadDemands

map (key: string, value: object (Load))

Charge les demandes de cette demande de visite. Ce champ est identique au champ Shipment.load_demands, sauf qu'il ne s'applique qu'à ce VisitRequest au lieu de l'ensemble de Shipment. Les exigences listées ici sont ajoutées à celles listées dans Shipment.load_demands.

visitTypes[]

string

Spécifie les types de visites. 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 indiqué dans la réponse sous la forme visitLabel dans le ShipmentRoute.Visit correspondant.

avoidUTurns

boolean

Indique si les demi-tours doivent être évités sur les itinéraires en voiture à cet endroit. L'évitement des demi-tours est une fonctionnalité optimale, mais l'évitement complet n'est pas garanti. Il s'agit d'une fonctionnalité expérimentale. Son comportement est susceptible d'être modifié.

Expérimental : pour en savoir plus, consultez https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

LatLng

Objet représentant une paire latitude/longitude. Cette valeur est exprimée par une paire de doubles représentant les degrés de latitude et de longitude. Sauf indication contraire, cet objet doit être conforme à la norme WGS84. Les valeurs doivent se situer dans les limites normalisées.

Représentation JSON
{
  "latitude": number,
  "longitude": number
}
Champs
latitude

number

Latitude en degrés. Elle doit être comprise dans la plage [-90.0, +90.0].

longitude

number

Longitude en degrés. Elle doit être comprise dans la plage [-180.0, +180.0].

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.

Représentation JSON
{
  "sideOfRoad": boolean,
  "vehicleStopover": boolean,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
Champs
sideOfRoad

boolean

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

vehicleStopover

boolean

Indique que le point de cheminement est destiné à l'arrêt des véhicules, dans le but de prendre en charge ou de déposer des passagers. Cette option ne fonctionne que pour le mode de déplacement "DRIVING" et lorsque le "locationType" est défini sur "location".

Expérimental : le comportement ou l'existence de ce champ peuvent changer à l'avenir.

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

object (Location)

Point spécifié à l'aide de coordonnées géographiques, y compris un cap facultatif.

placeId

string

ID de lieu du point d'intérêt associé au point de repère.

Lorsque vous utilisez un ID de lieu pour spécifier le lieu d'arrivée ou de départ d'une VisitRequest, utilisez un ID de lieu suffisamment précis pour déterminer un emplacement LatLng pour la navigation vers le lieu. Par exemple, un ID de lieu représentant un bâtiment convient, mais un ID de lieu représentant une route est déconseillé.

Emplacement

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

Représentation JSON
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
Champs
latLng

object (LatLng)

Coordonnées géographiques du point de repère.

heading

integer

Direction indiquée par la boussole et associée au sens du trafic. Cette valeur permet de spécifier le côté de la route à utiliser pour la prise en charge et la dépose. Les valeurs de cap peuvent être comprises entre 0 et 360, où 0 indique un cap plein nord, 90 un cap plein est, etc.

TimeWindow

Les plages horaires limitent la durée d'un événement, comme l'heure d'arrivée à une visite ou l'heure de début et de fin d'un véhicule.

Les limites de la période stricte, startTime et endTime, imposent les heures les plus tôt et les plus tard de l'événement, de sorte que startTime <= event_time <= endTime. La limite inférieure de la période flexible, softStartTime, exprime une préférence pour que l'événement se produise à softStartTime ou après, en entraînant un coût proportionnel à la durée avant softStartTime à laquelle l'événement se produit. La limite supérieure de la période flexible, softEndTime, exprime une préférence pour que l'événement se produise à softEndTime ou avant, en entraînant un coût proportionnel à la durée écoulée après softEndTime. startTime, endTime, softStartTime et softEndTime doivent respecter les limites de temps globales (voir ShipmentModel.global_start_time et ShipmentModel.global_end_time) et les règles suivantes :

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
Représentation JSON
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
Champs
startTime

string (Timestamp format)

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

Utilise la norme RFC 3339, où la sortie générée utilise toujours le format UTC (indiqué par "Z" pour le temps universel coordonné) avec des secondes fractionnaires de 0, 3, 6 ou 9 chiffres décimaux. Des décalages horaires autres que "Z" (UTC) sont également acceptés. Exemples : "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ou "2014-10-02T15:01:23+05:30".

endTime

string (Timestamp format)

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

Utilise la norme RFC 3339, où la sortie générée utilise toujours le format UTC (indiqué par "Z" pour le temps universel coordonné) avec des secondes fractionnaires de 0, 3, 6 ou 9 chiffres décimaux. Des décalages horaires autres que "Z" (UTC) sont également acceptés. Exemples : "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ou "2014-10-02T15:01:23+05:30".

softStartTime

string (Timestamp format)

Heure de début de la période.

Utilise la norme RFC 3339, où la sortie générée utilise toujours le format UTC (indiqué par "Z" pour le temps universel coordonné) avec des secondes fractionnaires de 0, 3, 6 ou 9 chiffres décimaux. Des décalages horaires autres que "Z" (UTC) sont également acceptés. Exemples : "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ou "2014-10-02T15:01:23+05:30".

softEndTime

string (Timestamp format)

Heure de fin flexible de la période.

Utilise la norme RFC 3339, où la sortie générée utilise toujours le format UTC (indiqué par "Z" pour le temps universel coordonné) avec des secondes fractionnaires de 0, 3, 6 ou 9 chiffres décimaux. Des décalages horaires autres que "Z" (UTC) sont également acceptés. Exemples : "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ou "2014-10-02T15:01:23+05:30".

costPerHourBeforeSoftStartTime

number

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

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

Ce coût doit être positif. Le champ ne peut être défini que si softStartTime a été défini.

costPerHourAfterSoftEndTime

number

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

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

Ce coût doit être positif. Le champ ne peut être défini que si softEndTime a été défini.

Véhicule

Modélise un véhicule dans un problème de livraison. La résolution d'un problème de livraison créera un itinéraire commençant à startLocation et se terminant à endLocation pour ce véhicule. Un itinéraire est une séquence de visites (voir ShipmentRoute).

Représentation JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
Champs
displayName

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.

travelMode

enum (TravelMode)

Mode de transport qui affecte les routes utilisables par le véhicule et sa vitesse. Voir aussi travelDurationMultiple.

routeModifiers

object (RouteModifiers)

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

startLocation

object (LatLng)

Emplacement géographique où le véhicule commence son trajet avant de récupérer des colis. Si aucune heure n'est spécifiée, le véhicule commence son trajet à son premier point de retrait. Si le modèle d'expédition comporte des matrices de durée et de distance, startLocation ne doit pas être spécifié.

startWaypoint

object (Waypoint)

Point de cheminement représentant un emplacement géographique où le véhicule démarre avant de récupérer des colis. Si vous ne spécifiez pas startWaypoint ni startLocation, le véhicule commence son trajet à son premier point de prise en charge. Si le modèle d'expédition comporte des matrices de durée et de distance, startWaypoint ne doit pas être spécifié.

endLocation

object (LatLng)

Emplacement géographique où se trouve le véhicule après avoir effectué sa dernière VisitRequest. Si la valeur n'est pas spécifiée, le ShipmentRoute du véhicule se termine immédiatement après la dernière VisitRequest. Si le modèle d'expédition comporte des matrices de durée et de distance, endLocation ne doit pas être spécifié.

endWaypoint

object (Waypoint)

Point de cheminement représentant un emplacement géographique où le véhicule se termine après avoir effectué son dernier VisitRequest. Si vous ne spécifiez pas endWaypoint ni endLocation, le ShipmentRoute du véhicule se termine immédiatement lorsqu'il termine son dernier VisitRequest. Si le modèle d'expédition comporte des matrices de durée et de distance, endWaypoint ne doit pas être spécifié.

startTags[]

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.

endTags[]

string

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

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

startTimeWindows[]

object (TimeWindow)

Plages horaires pendant lesquelles le véhicule peut quitter son point de départ. Elles doivent respecter les limites de temps globales (voir les champs ShipmentModel.global_*). Si aucune valeur n'est spécifiée, il n'y a pas de limite, en dehors des limites de temps globales.

Les périodes appartenant au même champ répété doivent être disjointes, c'est-à-dire qu'aucune période ne peut chevaucher une autre ni être adjacente à une autre, et elles doivent être dans l'ordre chronologique.

costPerHourAfterSoftEndTime et softEndTime ne peuvent être définis que s'il n'y a qu'un seul créneau horaire.

endTimeWindows[]

object (TimeWindow)

Plages horaires pendant lesquelles le véhicule peut arriver à sa destination finale. Elles doivent respecter les limites de temps globales (voir les champs ShipmentModel.global_*). Si aucune valeur n'est spécifiée, il n'y a pas de limite, en dehors des limites de temps globales.

Les périodes appartenant au même champ répété doivent être disjointes, c'est-à-dire qu'aucune période ne peut chevaucher une autre ni être adjacente à une autre, et elles doivent être dans l'ordre chronologique.

costPerHourAfterSoftEndTime et softEndTime ne peuvent être définis que s'il n'y a qu'un seul créneau horaire.

unloadingPolicy

enum (UnloadingPolicy)

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

loadLimits

map (key: string, value: object (LoadLimit))

Capacités du véhicule (poids, volume, nombre de palettes, par exemple). Les clés du mappage sont les identifiants du type de charge, qui correspondent 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.

costPerHour

number

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

Coût par heure de l'itinéraire du véhicule. Ce coût est appliqué à la durée totale de l'itinéraire et inclut le temps de trajet, le temps d'attente et le temps de visite. L'utilisation de costPerHour au lieu de costPerTraveledHour peut entraîner une latence supplémentaire.

costPerTraveledHour

number

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

costPerKilometer

number

Coût par kilomètre de l'itinéraire du véhicule. Ce coût s'applique à la distance indiquée dans ShipmentRoute.transitions et non à la distance parcourue implicitement entre arrivalLocation et departureLocation d'un même VisitRequest.

fixedCost

number

Coût fixe appliqué si ce véhicule est utilisé pour gérer un envoi.

usedIfRouteIsEmpty

boolean

Ce champ ne s'applique aux véhicules que lorsque leur itinéraire ne dessert aucune expédition. Indique si le véhicule doit être considéré comme d'occasion ou non dans ce cas.

Si la valeur est "true", le véhicule se déplace de son point de départ à son point d'arrivée, même s'il ne livre aucun colis. Les coûts de temps et de distance résultant de ce trajet sont pris en compte.

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

routeDurationLimit

object (DurationLimit)

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

travelDurationLimit

object (DurationLimit)

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

routeDistanceLimit

object (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.

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

Spécifie un mappage des chaînes visitTypes aux durées. La durée correspond au temps supplémentaire à ajouter à VisitRequest.duration pour les visites avec le visitTypes spécifié. Cette durée de visite supplémentaire entraîne des coûts si costPerHour est spécifié. Les clés (c'est-à-dire visitTypes) 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.

breakRule

object (BreakRule)

Décrit le programme de pause à appliquer à ce véhicule. Si ce champ est vide, aucune pause n'est prévue pour ce véhicule.

label

string

Spécifie un libellé pour ce véhicule. Ce libellé est indiqué dans la réponse en tant que vehicleLabel du ShipmentRoute correspondant.

ignore

boolean

Si la valeur est "true", usedIfRouteIsEmpty doit être défini sur "false" et ce véhicule restera inutilisé.

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

Si une expédition est effectuée par un véhicule ignoré dans injectedSolutionConstraint et que toute collecte/livraison associée est contrainte de rester sur le véhicule (c'est-à-dire qu'elle n'est pas relâchée au niveau RELAX_ALL_AFTER_THRESHOLD), elle est ignorée dans la réponse. Si une expédition comporte un champ allowedVehicleIndices non vide et que tous les véhicules autorisés sont ignorés, elle est ignorée dans la réponse.

travelDurationMultiple

number

Spécifie un facteur multiplicatif qui peut être utilisé pour augmenter ou diminuer les temps de trajet de ce véhicule. Par exemple, si vous définissez cette valeur sur 2.0, cela signifie que ce véhicule est plus lent et que ses temps de trajet sont deux fois plus longs que ceux des véhicules standards. Ce multiple n'a aucune incidence sur la durée des visites. Elle a une incidence sur le coût si costPerHour ou costPerTraveledHour sont spécifiés. La valeur doit être comprise entre 0,001 et 1 000,0. Si cette valeur n'est pas définie, le véhicule est considéré comme standard et ce multiple est défini sur 1.0.

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

Voir également extraVisitDurationForVisitType ci-dessous.

TravelMode

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

Il doit s'agir d'un sous-ensemble des modes de déplacement de l'API Routes Google Maps Platform. Pour en savoir plus, consultez https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode.

Remarque : Les itinéraires WALKING sont en version bêta et peuvent parfois ne pas inclure de trottoirs ou de voies piétonnes clairs. Vous devez afficher cet avertissement à l'utilisateur pour tous les itinéraires à pied que vous affichez dans votre application.

Enums
TRAVEL_MODE_UNSPECIFIED Mode de transport non spécifié, équivalent à DRIVING.
DRIVING Mode de transport correspondant aux itinéraires en voiture (voiture, etc.).
WALKING Mode de transport correspondant aux itinéraires à pied.

RouteModifiers

Encapsule un ensemble de conditions facultatives à respecter lors du calcul des itinéraires de véhicules. Cela ressemble à RouteModifiers dans l'API Routes Preferred de Google Maps Platform. Pour en savoir plus, consultez https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

Représentation JSON
{
  "avoidTolls": boolean,
  "avoidHighways": boolean,
  "avoidFerries": boolean,
  "avoidIndoor": boolean
}
Champs
avoidTolls

boolean

Indique s'il faut éviter les routes à péage lorsque cela est raisonnable. La préférence sera accordée aux itinéraires ne comportant pas de routes à péage. Ne s'applique qu'aux modes de déplacement motorisés.

avoidHighways

boolean

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

avoidFerries

boolean

Indique s'il faut éviter les ferries lorsque cela est raisonnable. La priorité sera donnée aux itinéraires qui n'incluent pas de traversée en ferry. Ne s'applique qu'aux modes de déplacement motorisés.

avoidIndoor

boolean

Facultatif. Indique s'il faut éviter la navigation en intérieur lorsque cela est raisonnable. La préférence sera accordée aux itinéraires ne contenant pas de navigation en intérieur. Ne s'applique qu'au mode de déplacement WALKING.

UnloadingPolicy

Règles concernant le déchargement d'un véhicule. Ne s'applique qu'aux expéditions avec retrait et livraison.

Les autres expéditions peuvent avoir lieu n'importe où sur l'itinéraire, indépendamment de unloadingPolicy.

Enums
UNLOADING_POLICY_UNSPECIFIED Aucune règle de déchargement n'est spécifiée. Les livraisons doivent simplement avoir lieu après les collectes correspondantes.
LAST_IN_FIRST_OUT Les livraisons doivent être effectuées dans l'ordre inverse des collectes.
FIRST_IN_FIRST_OUT Les livraisons doivent avoir lieu dans le même ordre que les collectes.

LoadLimit

Définit une limite de charge s'appliquant à un véhicule, par exemple "ce camion ne peut transporter que 3 500 kg maximum". Consultez les loadLimits.

Représentation JSON
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string,
  "costPerKilometer": {
    object (LoadCost)
  },
  "costPerTraveledHour": {
    object (LoadCost)
  }
}
Champs
softMaxLoad

string (int64 format)

Limite souple de la charge. Consultez les costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

Si la charge dépasse softMaxLoad sur l'itinéraire de ce véhicule, la pénalité de coût suivante s'applique (une seule fois par véhicule) : (charge - softMaxLoad) * costPerUnitAboveSoftMax. Tous les coûts s'additionnent et doivent être exprimés dans la même unité que Shipment.penalty_cost. Les limites souples ne peuvent être définies que sur les types qui s'appliquent soit aux retraits uniquement, soit aux livraisons uniquement dans l'ensemble du modèle.

startLoadInterval

object (Interval)

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

endLoadInterval

object (Interval)

Intervalle de chargement acceptable du véhicule à la fin du trajet.

maxLoad

string (int64 format)

Charge maximale acceptable.

costPerKilometer

object (LoadCost)

Coût du déplacement d'une unité de charge sur un kilomètre pour ce véhicule. Cela peut être utilisé comme proxy pour la consommation de carburant : si la charge est un poids (en newtons), alors charge*kilomètre a la dimension d'une énergie.

Expérimental : pour en savoir plus, consultez https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

costPerTraveledHour

object (LoadCost)

Coût du transport d'une unité de charge pendant une heure pour ce véhicule.

Expérimental : pour en savoir plus, consultez https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Intervalle

Intervalle de quantités de charge acceptables.

Représentation JSON
{
  "min": string,
  "max": string
}
Champs
min

string (int64 format)

Une charge minimale acceptable. Doit être ≥ 0. Si les deux sont spécifiés, min doit être inférieur ou égal à max.

max

string (int64 format)

Une charge maximale acceptable. Doit être ≥ 0. Si elle n'est pas spécifiée, la charge maximale n'est pas limitée par ce message. Si les deux sont spécifiés, min doit être inférieur ou égal à max.

LoadCost

Coût du déplacement d'une unité de charge pendant une Transition. Pour une charge donnée, le coût correspond à la somme de deux parties :

  • min(charge, loadThreshold) * costPerUnitBelowThreshold
  • max(0, load - loadThreshold) * costPerUnitAboveThreshold

Avec ce coût, les solutions préfèrent répondre d'abord aux demandes élevées ou, de manière équivalente, les récupérer en dernier. Par exemple, si un véhicule est équipé

load_limit {
  key: "weight"
  value {
    costPerKilometer {
      loadThreshold: 15
      costPerUnitBelowThreshold: 2.0
      costPerUnitAboveThreshold: 10.0
    }
  }
}

et son itinéraire est start,pickup,pickup,delivery,delivery,end avec les transitions suivantes :

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

Le coût engendré par cette LoadCost est alors (cost_below * load_below * kilometers + cost_above * load_above * kms)

  • transition 0 : 0,0
  • transition 1 : 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transition 2 : 2,0 * 15 * 1,0 + 10,0 * (20 - 15) * 1,0 = 80,0
  • transition 3 : 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transition 4 : 0.0

La valeur LoadCost sur l'itinéraire est donc de 120,0.

Toutefois, si l'itinéraire est "start,pickup,delivery,pickup,delivery,end" (départ, retrait, livraison, retrait, livraison, arrivée) avec des transitions :

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

Le coût engendré par ce LoadCost est alors

  • transition 0 : 0,0
  • transition 1 : 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transition 2 : 0.0
  • transition 3 : 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • transition 4 : 0.0

Ici, la LoadCost sur l'itinéraire est de 40.0.

LoadCost rend les solutions avec des transitions très chargées plus coûteuses.

Expérimental : pour en savoir plus, consultez https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Représentation JSON
{
  "loadThreshold": string,
  "costPerUnitBelowThreshold": number,
  "costPerUnitAboveThreshold": number
}
Champs
loadThreshold

string (int64 format)

Quantité de charge au-delà de laquelle le coût du déplacement d'une unité de charge passe de costPerUnitBelowThreshold à costPerUnitAboveThreshold. Doit être supérieur ou égal à 0.

costPerUnitBelowThreshold

number

Coût du déplacement d'une unité de charge, pour chaque unité comprise entre 0 et le seuil. Doit être une valeur finie et supérieure ou égale à 0.

costPerUnitAboveThreshold

number

Coût du déplacement d'une unité de charge, pour chaque unité au-dessus du seuil. Dans le cas particulier où le seuil est égal à 0, il s'agit d'un coût fixe par unité. Doit être une valeur finie et supérieure ou égale à 0.

DurationLimit

Limite définissant la durée maximale de l'itinéraire d'un véhicule. Il peut s'agir d'une erreur bloquante ou non bloquante.

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

Représentation JSON
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
Champs
maxDuration

string (Duration format)

Limite stricte qui contraint la durée à être au maximum égale à maxDuration.

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

softMaxDuration

string (Duration format)

Une limite flexible qui n'impose pas de durée maximale, mais qui, en cas de non-respect, entraîne un coût pour l'itinéraire. Ce coût s'ajoute aux autres coûts définis dans le modèle, avec la même unité.

Si elle est définie, softMaxDuration ne doit pas être négative. Si maxDuration est également défini, softMaxDuration doit être inférieur à maxDuration.

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

quadraticSoftMaxDuration

string (Duration format)

Une limite flexible qui n'impose pas de durée maximale, mais qui, en cas de non-respect, entraîne un coût pour l'itinéraire, quadratique par rapport à la durée. Ce coût s'ajoute aux autres coûts définis dans le modèle, avec la même unité.

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

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

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

costPerHourAfterSoftMax

number

Coût par heure encouru si le seuil softMaxDuration est dépassé. Le coût supplémentaire est de 0 si la durée est inférieure au seuil. Sinon, le coût dépend de la durée comme suit :

  costPerHourAfterSoftMax * (duration - softMaxDuration)

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

costPerSquareHourAfterQuadraticSoftMax

number

Coût par heure carrée encouru si le seuil quadraticSoftMaxDuration est dépassé.

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

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

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

DistanceLimit

Limite définissant une distance maximale pouvant être parcourue. Il peut s'agir d'une erreur bloquante ou non bloquante.

Si une limite flexible est définie, softMaxMeters et costPerKilometerAboveSoftMax doivent être définis et non négatifs.

Représentation JSON
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
Champs
maxMeters

string (int64 format)

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

softMaxMeters

string (int64 format)

Il s'agit d'une limite flexible qui n'impose pas de distance maximale, mais qui, en cas de non-respect, entraîne un coût qui s'ajoute aux autres coûts définis dans le modèle, avec la même unité.

Si softMaxMeters est défini, il doit être inférieur à maxMeters et être non négatif.

costPerKilometerBelowSoftMax

number

Le coût par kilomètre encouru, qui peut atteindre softMaxMeters, est calculé à l'aide de la formule suivante :

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Ce coût n'est pas accepté dans routeDistanceLimit.

costPerKilometerAboveSoftMax

number

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

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

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

BreakRule

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

  • pendant le trajet entre deux visites (y compris juste avant ou juste après une visite, mais pas au milieu d'une visite), auquel cas il prolonge le temps de trajet correspondant entre les visites.
  • ou avant le démarrage du véhicule (le véhicule peut ne pas démarrer au milieu d'une pause), auquel cas cela n'affecte pas l'heure de démarrage du véhicule.
  • ou après la fin de la période de location du véhicule (idem, avec l'heure de fin de la période de location du véhicule).
Représentation JSON
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Champs
breakRequests[]

object (BreakRequest)

Séquence de pauses. Consultez le message BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

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

BreakRequest

La séquence de pauses (c'est-à-dire leur nombre et leur ordre) qui s'applique à chaque véhicule doit être connue à l'avance. Les BreakRequest répétés définissent cette séquence, dans l'ordre dans lequel ils doivent se produire. Leurs plages horaires (earliestStartTime / latestStartTime) peuvent se chevaucher, mais elles doivent être compatibles avec l'ordre (cette compatibilité est vérifiée).

Représentation JSON
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
Champs
earliestStartTime

string (Timestamp format)

Obligatoire. Limite inférieure (incluse) du début de la pause.

Utilise la norme RFC 3339, où la sortie générée utilise toujours le format UTC (indiqué par "Z" pour le temps universel coordonné) avec des secondes fractionnaires de 0, 3, 6 ou 9 chiffres décimaux. Des décalages horaires autres que "Z" (UTC) sont également acceptés. Exemples : "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ou "2014-10-02T15:01:23+05:30".

latestStartTime

string (Timestamp format)

Obligatoire. Limite supérieure (incluse) du début de la pause.

Utilise la norme RFC 3339, où la sortie générée utilise toujours le format UTC (indiqué par "Z" pour le temps universel coordonné) avec des secondes fractionnaires de 0, 3, 6 ou 9 chiffres décimaux. Des décalages horaires autres que "Z" (UTC) sont également acceptés. Exemples : "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" ou "2014-10-02T15:01:23+05:30".

minDuration

string (Duration format)

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

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

FrequencyConstraint

Il est possible de limiter davantage la fréquence et la durée des pauses spécifiées ci-dessus en imposant une fréquence de pause minimale, par exemple "Il doit y avoir une pause d'au moins une heure toutes les 12 heures". En partant du principe que cela peut être interprété comme "Dans n'importe quelle fenêtre temporelle glissante de 12 heures, il doit y avoir au moins une pause d'au moins une heure", cet exemple se traduirait par le FrequencyConstraint suivant :

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

La durée et le moment des pauses dans la solution respecteront toutes ces contraintes, en plus des créneaux horaires et des durées minimales déjà spécifiés dans BreakRequest.

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

  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
Représentation JSON
{
  "minBreakDuration": string,
  "maxInterBreakDuration": string
}
Champs
minBreakDuration

string (Duration format)

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

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

maxInterBreakDuration

string (Duration format)

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

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

Objectif

Les objectifs remplacent complètement le modèle de coût et sont donc incompatibles avec les coûts préexistants. Chaque objectif est associé à un certain nombre de coûts prédéfinis pour, par exemple, les véhicules, les expéditions ou les attributs de transition.

Expérimental : pour en savoir plus, consultez https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

Représentation JSON
{
  "type": enum (Type),
  "weight": number
}
Champs
type

enum (Type)

Type d'objectif.

weight

number

Le poids de cet objectif par rapport aux autres. Il peut s'agir de n'importe quel nombre non négatif. Les pondérations ne doivent pas nécessairement être égales à 1. Les pondérations sont définies sur 1.0 par défaut.

Type

Type d'objectif qui sera associé à un ensemble de coûts.

Enums
DEFAULT Un ensemble de coûts par défaut sera utilisé pour garantir une solution raisonnable. Remarque : Cet objectif peut être utilisé seul, mais il sera également toujours ajouté avec un poids de 1.0, comme référence, aux objectifs spécifiés par l'utilisateur, s'il n'est pas déjà présent.
MIN_DISTANCE Objectifs "MIN". Minimisez la distance totale parcourue.
MIN_WORKING_TIME Minimisez le temps de travail total, cumulé pour tous les véhicules.
MIN_TRAVEL_TIME Identique à ci-dessus, mais en se concentrant uniquement sur le temps de trajet.
MIN_NUM_VEHICLES Limitez le nombre de véhicules utilisés.

DurationDistanceMatrix

Spécifie une matrice de durée et de distance entre les lieux de début et de fin des visites et des véhicules.

Représentation JSON
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
Champs
rows[]

object (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.

vehicleStartTag

string

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

Chaque heure de début de véhicule doit correspondre exactement à une matrice. Autrement dit, exactement un de ses champs startTags doit correspondre au vehicleStartTag d'une matrice (et de cette matrice uniquement).

Toutes les matrices doivent avoir un vehicleStartTag différent.

Ligne

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

Représentation JSON
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
Champs
durations[]

string (Duration format)

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

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

meters[]

number

Valeurs de distance pour une ligne donnée. Si aucun coût ni aucune contrainte ne fait référence à des distances dans le modèle, ce champ peut être laissé vide. Sinon, il doit comporter autant d'éléments que durations.

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 "ET").

Représentation JSON
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
Champs
srcTag

string

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

Une visite de source ou un démarrage de véhicule correspondent si leur VisitRequest.tags ou Vehicle.start_tags contient srcTag ou ne contient pas excludedSrcTag (selon le champ non vide).

excludedSrcTag

string

Consultez les srcTag. Un seul des éléments srcTag et excludedSrcTag ne doit pas être vide.

dstTag

string

Une visite de destination ou une fin de véhicule correspondent si leur VisitRequest.tags ou Vehicle.end_tags contient dstTag ou ne contient pas excludedDstTag (selon le champ non vide).

excludedDstTag

string

Consultez les dstTag. Un seul des éléments dstTag et excludedDstTag ne doit pas être vide.

cost

number

Spécifie un coût pour effectuer 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.

costPerKilometer

number

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

distanceLimit

object (DistanceLimit)

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

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

delay

string (Duration format)

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

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

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

ShipmentTypeIncompatibility

Spécifie les incompatibilités entre les expéditions en fonction de leur shipmentType. L'affichage des expéditions incompatibles sur un même itinéraire est limité en fonction du mode d'incompatibilité.

Représentation JSON
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
Champs
types[]

string

Liste des types incompatibles. Deux colis ayant des shipment_types différents parmi ceux listés sont "incompatibles".

incompatibilityMode

enum (IncompatibilityMode)

Mode appliqué à l'incompatibilité.

IncompatibilityMode

Modes définissant la façon dont l'apparence des expéditions incompatibles est limitée sur le même itinéraire.

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

Dans ce mode, deux expéditions de types incompatibles ne peuvent jamais se trouver dans le même véhicule en même temps :

  • Ils ne peuvent partager le même véhicule que si l'un est déposé avant que l'autre ne soit récupéré.
  • Si les deux expéditions sont uniquement des retraits (pas de livraisons) ou uniquement des livraisons (pas de retraits), elles ne peuvent pas du tout partager le même véhicule.

ShipmentTypeRequirement

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

Représentation JSON
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
Champs
requiredShipmentTypeAlternatives[]

string

Liste des types d'expédition alternatifs requis par dependentShipmentTypes.

dependentShipmentTypes[]

string

Tous les envois dont le champ dependentShipmentTypes est renseigné doivent être associés à au moins un envoi de type requiredShipmentTypeAlternatives sur le même itinéraire.

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

requirementMode

enum (RequirementMode)

Mode appliqué à l'exigence.

RequirementMode

Modes définissant l'apparence des expéditions dépendantes sur un itinéraire.

Enums
REQUIREMENT_MODE_UNSPECIFIED Mode de condition 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 de leurs envois "requis".
IN_SAME_VEHICLE_AT_PICKUP_TIME

Avec le mode IN_SAME_VEHICLE_AT_PICKUP_TIME, tous les envois "dépendants" doivent comporter au moins un envoi "requis" dans leur véhicule au moment de leur collecte.

Par conséquent, un enlèvement d'expédition "dépendante" doit comporter :

  • Un envoi "obligatoire" uniquement pour la livraison, livré sur l'itinéraire suivant
  • Une expédition "requise" récupérée sur l'itinéraire précédent, et si l'expédition "requise" comporte une livraison, celle-ci doit être effectuée après la récupération de l'expédition "dépendante".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Comme avant, sauf que les expéditions "dépendantes" doivent avoir une expédition "requise" sur leur véhicule au moment de leur livraison.

PrecedenceRule

Règle de précédence entre deux événements (chaque événement correspond à l'enlèvement ou à la livraison d'un colis) : le "second" événement doit commencer au moins offsetDuration après le début du "premier".

Plusieurs précédences peuvent faire référence aux mêmes événements (ou à des événements associés), par exemple : "Retrait de B après la livraison de A" et "Retrait de C après le retrait de B".

De plus, les précédences ne s'appliquent que lorsque les deux expéditions sont effectuées. Dans le cas contraire, elles sont ignorées.

Représentation JSON
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
Champs
firstIsDelivery

boolean

Indique si le premier événement est une livraison.

secondIsDelivery

boolean

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

offsetDuration

string (Duration format)

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

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

firstIndex

integer

Index de l'expédition de l'événement "premier". Ce champ doit être spécifié.

secondIndex

integer

Index de l'expédition de l'événement "second". Ce champ doit être spécifié.