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.
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 sautant l'envoi.Shipment.VisitRequest.cost
représente le coût d'une collecte ou d'une livraison spécifique, utilisé principalement pour permettre des arbitrages de coûts entre plusieurs options de collecte 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 calculé en fonction du temps total nécessaire à tous les véhicules pour effectuer 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 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 engagées pour 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 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
indique les envois ignorés.
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. Le faible penaltyCost
de l'envoi par rapport aux costPerHour
de 40,0 et costPerKilometer
de 10,0 de l'Vehicle
rend l'envoi plus rentable à ignorer qu'à effectuer.
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
, avec des cost_per_hour_before_soft_start_time
et cost_per_hour_after_soft_end_time
correspondants qui sont appliqués en fonction de la date et de l'heure de l'événement contraint par rapport à TimeWindow
.
Comme pour tous les paramètres du modèle de coûts, les coûts des contraintes souples sont exprimés dans les mêmes unités sans dimension que les autres paramètres de coût.
Les contraintes LoadLimit
sont abordées en détail dans la section Demandes et limites de charge. Les contraintes TimeWindow
sont détaillées dans la section Contraintes de période de ramassage et de livraison.