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
Vehicleplus rapides par rapport aux itinéraires plus courts, ou inversement - Déterminer si le coût de la diffusion d'un
Shipmentest justifié par la valeur de la réponse duShipment - Effectuer des collectes et des livraisons dans des créneaux horaires uniquement lorsque cela est rentable
Voir un exemple de demande 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 itinéraires 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_costreprésente le coût encouru en cas d'annulation de l'expédition. Si vous ne définissez pas le paramètrepenalty_costd'une expédition, celle-ci devient obligatoire. Cela signifie qu'elle ne sera ignorée que si elle ne peut pas être effectuée en raison des contraintes spécifiées.Shipment.VisitRequest.costreprésente le coût d'un retrait ou d'une livraison spécifiques. Il est principalement utilisé pour permettre des compromis de coûts entre plusieurs options de retrait 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 à l'exemple de requête 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 faible penaltyCost de l'envoi par rapport aux 40,0 costPerHour et 10,0 costPerKilometer du Vehicle le rendent plus rentable à ignorer qu'à effectuer.
Thème avancé : coûts et contraintes souples
PlusieursOptimizeToursRequest message (REPOS, gRPC ) les propriétés représententcontraintes souples, qui sont des contraintes engendrant un coût lorsqu'elles ne peuvent être satisfaites.
Par exemple, les contraintes du 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 est judicieux 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 Demandes et limites de charge. Les contraintes TimeWindow sont abordées en détail dans Contraintes de créneaux horaires de retrait et de livraison.