Ce guide décrit les éléments loadDemands
et loadLimits
, ainsi que leur lien avec chacun.
autre.
Comme indiqué dans la section Contraintes liées aux délais de retrait et de livraison, la
Le message OptimizeToursRequest
(REST, gRPC) contient un certain nombre de
qui spécifient des contraintes concernant le problème à optimiser. Plusieurs
Les propriétés OptimizeToursRequest
représentent des contraintes de chargement.
Les véhicules et les livraisons possèdent des propriétés physiques qui doivent être prises en compte lorsque planifier un itinéraire.
- Véhicules: la propriété
loadLimits
spécifie la charge maximale que le véhicule peut supporter. Consultez les messagesVehicle
(REST, gRPC) dans la documentation Google Cloud. - Expéditions: la propriété
loadDemands
indique la charge d'un produit car le colis est consommé. Consultez les messagesShipment
(REST, gRPC) dans la documentation Google Cloud.
Ensemble, ces deux contraintes permettent à l'optimiseur d'attribuer les expéditions aux véhicules de la manière qui correspond le mieux possible à celle-ci ; la capacité de votre parc et les besoins en livraison.
Ce reste de ce document traite de loadLimits
et de loadDemands
en détail.
Exigences et limites de charge: types
Vous exprimez chaque demande de charge et contrainte de limite en termes de type.
Vous pouvez fournir votre propre ensemble de types de chargement, comme dans les exemples suivants:
- weight
- volume
- mesures linéaires
- noms des objets ou équipements transportés
Ce guide utilise weightKg
comme exemple de type.
Shipment.loadDemands
et Vehicle.loadLimits
utilisent les tampons de protocole
Type map
, avec des clés string
qui représentent les types de charges.
Les valeurs Shipment.loadDemands
utilisent le message Load
(REST, gRPC).
Le message Load
comporte une seule propriété amount
représentant la capacité.
est nécessaire pour finaliser la livraison du type spécifié.
Les valeurs Vehicle.loadLimits
utilisent le message LoadLimit
(REST,
gRPC). Le message LoadLimit
comporte plusieurs propriétés, avec maxLoad
représentant la capacité de charge maximale du véhicule pour le type spécifié.
L'attribut loadDemands
d'une livraison ne consomme le loadLimits
du véhicule qui lui a été attribué que si
ont des clés de type de chargement correspondantes. Par exemple, un colis avec
loadDemands
sur:
"loadDemands": {
"weightKg": {
"amount": 50
}
}
nécessite 50 unités de chargement de type weightKg
pour que la livraison
terminé. Un véhicule avec un loadLimits
de:
"loadLimits": {
"weightKg": {
"maxLoad": 100
}
}
peut être en mesure de finaliser la livraison, car l'identifiant maxLoad
du véhicule indiqué dans
La valeur du type weightKg
est supérieure ou égale à la valeur loadDemands
de la livraison
le type weightKg
. Toutefois, un véhicule avec loadLimits
:
"loadLimits": {
"equipmentRackStorage": {
"maxLoad": 10
}
}
dispose implicitement d'une capacité weightKg
illimitée en raison de l'absence d'un
de charge maximale de weightKg
, de sorte que le véhicule n'est pas restreint par les exigences
de la demande de pondération.
Transfert de charge entre les expéditions et les véhicules
Les colis sont récupérés et livrés par des véhicules,
loadDemand
correspondances entre la livraison et le véhicule. Vous pouvez voir
du véhicule dans le message OptimizeToursResponse
(REST,
l'entrée gRPC)routes.transitions
pour un véhicule donné. La séquence est la suivante :
ce qui suit:
- La capacité de charge requise pour le colis est définie en tant que
loadDemand
. - La commande est récupérée par le véhicule qui vous a été attribué et
vehicleLoads
augmente du montant de laloadDemand
de l'envoi. Ce le transfert est représenté par une valeurvisits.loadDemands
positive dans la réponse . - Le véhicule livre la livraison, et le
vehicleLoads
du véhicule diminue du montant de laloadDemand
du colis livré. Ce transfert est représentée par une valeurvisits.loadDemands
négative dans le message de réponse.
La valeur vehicleLoads
d'un véhicule ne peut en aucun cas dépasser la valeur loadLimits
spécifiée
sur son trajet.
Exemple complet présentant les exigences et les limites de charge
Voici un exemple de requête avec des exigences de charge limites
{ "populatePolylines": false, "populateTransitionPolylines": false, "model": { "globalStartTime": "2023-01-13T16:00:00Z", "globalEndTime": "2023-01-14T16:00:00Z", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0, "loadDemands": { "weightKg": { "amount": 50 } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 15.0, "loadDemands": { "weightKg": { "amount": 10 } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0, "loadDemands": { "weightKg": { "amount": 80 } } } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0, "loadLimits": { "weightKg": { "maxLoad": 100 } } } ] } }
L'exemple de requête contient plusieurs paramètres liés au chargement:
shipments[0]
a une demande de charge de 50weightKg
.shipments[1]
a une demande de charge de 10weightKg
.shipments[2]
a une demande de charge de 80weightKg
.- La limite de chargement de
vehicles[0]
est de 100weightKg
.
afficher une réponse à la requête avec les demandes de charge ; limites
{ "routes": [ { "vehicleStartTime": "2023-01-13T16:00:00Z", "vehicleEndTime": "2023-01-13T16:43:27Z", "visits": [ { "isPickup": true, "startTime": "2023-01-13T16:00:00Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "50" } } }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-13T16:02:30Z", "detour": "150s", "loadDemands": { "weightKg": { "amount": "10" } } }, { "startTime": "2023-01-13T16:08:55Z", "detour": "150s", "loadDemands": { "weightKg": { "amount": "-50" } } }, { "shipmentIndex": 1, "startTime": "2023-01-13T16:16:37Z", "detour": "343s", "loadDemands": { "weightKg": { "amount": "-10" } } }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-13T16:27:07Z", "detour": "1627s", "loadDemands": { "weightKg": { "amount": "80" } } }, { "shipmentIndex": 2, "startTime": "2023-01-13T16:36:26Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "-80" } } } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T16:00:00Z", "vehicleLoads": { "weightKg": {} } }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T16:02:30Z", "vehicleLoads": { "weightKg": { "amount": "50" } } }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-13T16:05:00Z", "vehicleLoads": { "weightKg": { "amount": "60" } } }, { "travelDuration": "212s", "travelDistanceMeters": 791, "waitDuration": "0s", "totalDuration": "212s", "startTime": "2023-01-13T16:13:05Z", "vehicleLoads": { "weightKg": { "amount": "10" } } }, { "travelDuration": "380s", "travelDistanceMeters": 1190, "waitDuration": "0s", "totalDuration": "380s", "startTime": "2023-01-13T16:20:47Z", "vehicleLoads": { "weightKg": {} } }, { "travelDuration": "409s", "travelDistanceMeters": 1371, "waitDuration": "0s", "totalDuration": "409s", "startTime": "2023-01-13T16:29:37Z", "vehicleLoads": { "weightKg": { "amount": "80" } } }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-13T16:40:36Z", "vehicleLoads": { "weightKg": {} } } ], "metrics": { "performedShipmentCount": 3, "travelDuration": "1407s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2607s", "travelDistanceMeters": 4812, "maxLoads": { "weightKg": { "amount": "80" } } }, "routeCosts": { "model.vehicles.cost_per_kilometer": 48.12, "model.vehicles.cost_per_hour": 28.966666666666665 }, "routeTotalCost": 77.086666666666659 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1407s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2607s", "travelDistanceMeters": 4812, "maxLoads": { "weightKg": { "amount": "80" } } }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-13T16:00:00Z", "latestVehicleEndTime": "2023-01-13T16:43:27Z", "totalCost": 77.086666666666659, "costs": { "model.vehicles.cost_per_hour": 28.966666666666665, "model.vehicles.cost_per_kilometer": 48.12 } } }
Les contraintes de charge ajoutées affectent l'ordre de visits
:
shipment[0]
a été retiréshipment[1]
a été retiréshipment[0]
est livréshipment[1]
est livréshipment[2]
a été retiréshipment[2]
est livré
Cette commande indique que le véhicule ne peut pas procéder à trois expéditions au
en même temps, car leur loadDemands
total dépasse
loadLimits
Chaque entrée visits
inclut la modification de la charge de véhicule résultant de
l'achèvement de Visit
. Les valeurs de chargement positives représentent le chargement du colis
Les valeurs négatives représentent le déchargement du colis.
Chaque entrée transitions
inclut la charge totale du véhicule pendant la
Transition
transitions[2]
, par exemple, a une charge weightKg
de 60,
représentant les chargements combinés de shipment[0]
et shipment[1]
.
Les objets de métriques routes[0].metrics
et metrics.aggregatedRouteMetrics
incluent
une propriété maxLoads
. La valeur du type weightKg
est 80, ce qui représente
la portion de l'itinéraire du véhicule qui a transporté shipments[2]
jusqu'à
le lieu de livraison.
Contraintes de limite de chargement partiel
Comme pour les périodes décrites dans la section Créneaux horaires de retrait et de livraison
Les contraintes et les contraintes de limite de charge ont des variantes strictes et souples. La
La propriété maxLoad
du message LoadLimit
exprime une contrainte stricte: la
le véhicule ne doit jamais transporter une charge supérieure à la valeur maxLoad
dans les
de mots clés. Les propriétés softMaxLoad
et costPerUnitAboveSoftMax
expriment une
, chaque unité dépassant softMaxLoad
générant une
Coût : costPerUnitAboveSoftMax
.
Les contraintes de limite de chargement partiel ont plusieurs utilisations, par exemple:
- Équilibrer les expéditions sur plus de véhicules que le nombre minimum requis lorsque cela s'avère rentable
- en exprimant la préférence du conducteur concernant le nombre d'articles qu'il peut facilement acheter retrait et livraison sur un itinéraire donné
- en dessous de leur capacité physique maximale pour limiter l'usure de réduire les coûts de maintenance
Les contraintes de limite de chargement fixe et de limite de charge flexible peuvent être utilisées ensemble. Par exemple, peut indiquer le poids maximal de la cargaison qu'un véhicule peut transporter en toute sécurité ou le nombre maximal d'objets qu'un véhicule peut accueillir simultanément, tandis qu'un par exemple le poids ou le nombre maximal d'articles soumis à des taxes la capacité du conducteur à tout intégrer dans le véhicule.