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ûts capture de nombreux objectifs d'optimisation de haut niveau de la requête, par exemple:
- Priorisation des routes
Vehicle
plus rapides par rapport aux routes plus courtes ou inversement - Décider si le coût de diffusion d'un
Shipment
est justifié par la valeur de l'achèvement de l'Shipment
- Effectuer des collectes et des livraisons dans des délais uniquement lorsque cela est rentable
Voir un exemple de requête avec des 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'utilisation 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'utilisation 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 encourus 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 nécessairement les plus courts. Dans cet exemple, le trajet le plus rapide se trouve être le plus court. Par conséquent, les modifications apportées aux paramètres de coût ont peu d'effet.
Shipment
propriétés de coût
Le message Shipment
(REST, gRPC) comporte également plusieurs paramètres de coût:
Shipment.penalty_cost
représente le coût encouru en sautant l'envoi.Shipment.VisitRequest.cost
représente le coût d'un retrait ou d'une livraison spécifique, utilisé principalement pour permettre des arbitrages de coûts entre plusieurs options de retrait ou de livraison pour un seul 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 total d'un Shipment
dépasse son coût de pénalité, Shipment
n'est pas inclus dans le parcours d'un Vehicle
et apparaî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 facturé en fonction du temps total nécessaire pour que tous les véhicules terminent leurs ShipmentRoute
. Augmenter globalDurationCostPerHour
donne la priorité à la finalisation plus rapide de toutes les expéditions.
Propriétés des coûts de réponse Route Optimization
Le message OptimizeToursResponse
(REST, gRPC) comporte des propriétés de coût qui représentent les coûts engendrés par le processus d'exécution des ShipmentRoute
.
Les propriétés metrics.costs
et metrics.totalCost
représentent le nombre d'unités de coût engagées pour tous les itinéraires de la réponse. Chaque entrée routes
possède 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 niveau supérieur sont les suivantes:
{
"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 encourus en raison des envois ignorés. La propriété skippedShipments
répertorie les livraisons ignorées.
Dans cet exemple, seul model.shipments[1]
est ignoré dans l'exemple de requête.
model.shipments[1]
a un coût de pénalité de cinq unités, qui correspond à la clé model.shipments.penalty_cost
totale dans l'exemple de réponse. Avec un penaltyCost
de livraison peu élevé par rapport aux Vehicle
40,0 costPerHour
et 10,0 costPerKilometer
, il est plus rentable de l'ignorer que de le finaliser.
Sujet avancé: coûts et contraintes souples
Plusieurs propriétés de message OptimizeToursRequest
(REST, gRPC) représentent des contraintes souples, qui sont des contraintes qui entraînent un coût lorsqu'elles ne peuvent pas être satisfaites.
Par exemple, les contraintes de véhicule LoadLimit
(REST, gRPC) ont des propriétés softMaxLoad
et costPerUnitAboveSoftMax
. Ensemble, ces éléments entraînent un coût proportionnel aux unités de charge qui dépassent softMaxLoad
, ce qui ne permet de dépasser la limite que si cela est justifié d'un point de vue coûteux.
De même, les contraintes TimeWindow
(REST, gRPC) comportent des propriétés soft_start_time
et soft_end_time
, et les cost_per_hour_before_soft_start_time
et cost_per_hour_after_soft_end_time
correspondants sont générés en fonction de l'avance ou du retard de l'événement de contrainte par rapport à TimeWindow
.
Comme pour tous les paramètres de modèle de coût, les coûts associés à une contrainte souple sont exprimés dans les mêmes unités sans dimension que les autres paramètres de coût.
Les contraintes LoadLimit
sont traitées en détail dans la section Demandes et limites de chargement. Les contraintes TimeWindow
sont abordées en détail dans la section Contraintes de période de ramassage et de livraison.