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 généraux de la requête, tels que:
- Privilégier les itinéraires
Vehicle
plus rapides sur des itinéraires plus courts ou l'inverse - Déterminer si le coût de diffusion d'un
Shipment
vaut la valeur de l'achèvement de l'Shipment
- Effectuer les retraits et les livraisons dans les créneaux horaires uniquement si 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 } ] } }
Vehicle
propriétés de coût
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 transport, 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. 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 peut-être pas les itinéraires les plus courts. Dans cet exemple, l'itinéraire le plus rapide est 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 par l'omission de la livraison.Shipment.VisitRequest.cost
représente le coût d'un retrait ou d'une livraison spécifique. Il est principalement utilisé pour permettre des compromis entre plusieurs options de retrait ou de livraison pour une même livraison.
Les paramètres de coût Shipment
utilisent les mêmes unités sans dimension que les paramètres de coût Vehicle
. Le coût encouru pour un Shipment
complet dépasse le coût de sa pénalité. Shipment
n'est inclus sur aucune route d'Vehicle
et apparaît à la place dans la liste skipped_shipments
du message de réponse.
ShipmentModel
propriétés de coût
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 de coût de la réponse d'optimisation des routes
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 encourues pour toutes les routes dans 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.
Afficher une réponse à l'exemple de requête avec des 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 le coût engendré pour les livraisons ignorées. La propriété skippedShipments
répertorie 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 5 unités, ce qui correspond au total de la clé model.shipments.penalty_cost
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 des frais lorsqu'elles ne peuvent pas être satisfaites.
Par exemple, les contraintes LoadLimit
du véhicule (REST, gRPC) ont des propriétés softMaxLoad
et costPerUnitAboveSoftMax
. Ensemble, ces deux mécanismes 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 pertinent du point de vue des coûts.
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 traitées en détail dans la section Contraintes liées aux périodes de retrait et de livraison.