Le message OptimizeToursRequest
(REST, gRPC) contient un certain nombre de propriétés liées aux coûts. Ensemble, ces paramètres de coût représentent le modèle de coût de la requête. Le modèle de coût capture de nombreux objectifs d'optimisation de haut niveau de la requête, tels que :
- Prioriser les itinéraires
Vehicle
plus rapides par rapport aux itinéraires plus courts, ou inversement - Déterminer si le coût de la diffusion d'un
Shipment
est justifié par la valeur de la finalisation duShipment
- Effectuer des collectes et des livraisons dans des créneaux horaires uniquement lorsque cela est rentable
Exemple de requête avec les coûts
{ "model": { "globalStartTime": "2023-01-13T16:00:00-08:00", "globalEndTime": "2023-01-14T16:00:00-08:00", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 5.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0 } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0 } ] } }
Propriétés de coût Vehicle
Le message Vehicle
(REST, gRPC) comporte plusieurs propriétés de coût :
Vehicle.cost_per_hour
: représente le coût d'exploitation d'un véhicule par heure, y compris les temps de trajet, d'attente, de visite et de pause.Vehicle.cost_per_kilometer
: représente le coût par kilomètre parcouru par le véhicule.Vehicle.cost_per_traveled_hour
: représente le coût d'exploitation d'un véhicule uniquement en transit, à l'exclusion des temps d'attente, de visite et de pause.
Ces paramètres de coût permettent à l'optimiseur de faire des compromis entre le temps et la distance parcourue. Les coûts engendrés par l'itinéraire optimisé apparaissent dans le message de réponse sous la forme metrics.costs
:
À mesure que costPerHour
augmente, l'optimiseur tente de trouver des itinéraires plus rapides qui ne sont pas forcément les plus courts. Dans cet exemple, l'itinéraire le plus rapide est également le plus court. Les modifications apportées aux paramètres de coût ont donc peu d'effet.
Propriétés de coût Shipment
Le message Shipment
(REST, gRPC) comporte également plusieurs paramètres de coût :
Shipment.penalty_cost
représente le coût encouru en cas d'annulation de l'expédition. Si vous ne définissez pas le paramètrepenalty_cost
d'un envoi, celui-ci devient obligatoire. Cela signifie qu'il ne sera ignoré que s'il ne peut pas être effectué en raison des contraintes spécifiées.Shipment.VisitRequest.cost
représente le coût d'un enlèvement ou d'une livraison spécifiques. Il est principalement utilisé pour permettre des compromis de coûts entre plusieurs options d'enlèvement ou de livraison pour un même envoi.
Les paramètres de coût Shipment
utilisent les mêmes unités sans dimension que les paramètres de coût Vehicle
. Si le coût encouru pour effectuer un Shipment
dépasse son coût de pénalité, le Shipment
n'est inclus dans l'itinéraire d'aucun Vehicle
et apparaît plutôt dans la liste skipped_shipments
du message de réponse.
Propriétés de coût ShipmentModel
Le message ShipmentModel
(REST, gRPC) inclut une seule propriété de coût, globalDurationCostPerHour
. Ce coût est calculé en fonction du temps total nécessaire à tous les véhicules pour effectuer leurs ShipmentRoute
. L'augmentation de globalDurationCostPerHour
permet de terminer toutes les expéditions plus tôt.
Propriétés de coût de la réponse Route Optimization
Le message OptimizeToursResponse
(REST, gRPC) comporte des propriétés de coût qui représentent les coûts encourus lors de l'exécution des ShipmentRoute
.
Les propriétés metrics.costs
et metrics.totalCost
représentent le nombre d'unités de coût encourues sur tous les itinéraires de la réponse. Chaque entrée routes
comporte des propriétés routeCosts
et routeTotalCosts
qui représentent les coûts de cet itinéraire spécifique.
Voir une réponse à la requête exemple avec les coûts
{ "routes": [ { "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:28:22Z", "visits": [ { "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-14T00:02:30Z", "detour": "150s" }, { "startTime": "2023-01-14T00:08:55Z", "detour": "150s" }, { "shipmentIndex": 2, "startTime": "2023-01-14T00:21:21Z", "detour": "572s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:02:30Z" }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-14T00:05:00Z" }, { "travelDuration": "496s", "travelDistanceMeters": 1893, "waitDuration": "0s", "totalDuration": "496s", "startTime": "2023-01-14T00:13:05Z" }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-14T00:25:31Z" } ], "metrics": { "performedShipmentCount": 2, "travelDuration": "902s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1702s", "travelDistanceMeters": 3353 }, "routeCosts": { "model.vehicles.cost_per_kilometer": 33.53, "model.vehicles.cost_per_hour": 18.911111111111111 }, "routeTotalCost": 52.441111111111113 } ], "skippedShipments": [ { "index": 1 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 2, "travelDuration": "902s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1702s", "travelDistanceMeters": 3353 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-14T00:00:00Z", "latestVehicleEndTime": "2023-01-14T00:28:22Z", "totalCost": 57.441111111111113, "costs": { "model.vehicles.cost_per_kilometer": 33.53, "model.vehicles.cost_per_hour": 18.911111111111111, "model.shipments.penalty_cost": 5 } } }
Dans l'exemple de réponse, les metrics.costs
de premier niveau sont les suivants :
{
"metrics": {
...
"costs": {
"model.vehicles.cost_per_hour": 18.911111111111111,
"model.vehicles.cost_per_kilometer": 33.53,
"model.shipments.penalty_cost": 5
}
}
}
La valeur model.shipments.penalty_cost
représente les coûts engendrés par les livraisons ignorées. La propriété skippedShipments
liste les expéditions qui ont été ignorées.
Dans cet exemple, seul model.shipments[1]
dans l'exemple de requête est ignoré.
model.shipments[1]
a un coût de pénalité de cinq unités, ce qui correspond à la clé model.shipments.penalty_cost
totale dans l'exemple de réponse. Le penaltyCost
de l'envoi est faible par rapport aux costPerHour
et costPerKilometer
de 40,0 et 10,0 du Vehicle
, ce qui rend plus rentable d'ignorer l'envoi que de le finaliser.
Thème avancé : coûts et contraintes souples
Plusieurs propriétés de message OptimizeToursRequest
(REST, gRPC) représentent des contraintes souples, c'est-à-dire des contraintes qui entraînent un coût lorsqu'elles ne peuvent pas être respectées.
Par exemple, les contraintes de véhicule LoadLimit
(REST, gRPC) ont les propriétés softMaxLoad
et costPerUnitAboveSoftMax
. Ensemble, ils entraînent un coût proportionnel aux unités de charge qui dépassent softMaxLoad
, ce qui permet de dépasser la limite uniquement si cela a un sens d'un point de vue financier.
De même, les contraintes TimeWindow
(REST, gRPC) ont des propriétés soft_start_time
et soft_end_time
, avec des cost_per_hour_before_soft_start_time
et cost_per_hour_after_soft_end_time
correspondants qui sont encourus en fonction de la précocité ou du retard de l'événement contraint par rapport à TimeWindow
.
Comme pour tous les paramètres du modèle de coûts, les coûts de contrainte souple sont exprimés dans les mêmes unités sans dimension que les autres paramètres de coûts.
Les contraintes LoadLimit
sont abordées en détail dans Exigences et limites de charge. Les contraintes TimeWindow
sont abordées en détail dans Contraintes de créneaux horaires de retrait et de livraison.