Il messaggio OptimizeToursRequest
(REST, gRPC) contiene una serie di proprietà relative ai costi. Questi parametri di costo rappresentano il modello di costo della richiesta. Il modello di costo acquisisce molti degli obiettivi di ottimizzazione di alto livello della richiesta, ad esempio:
- Dare la priorità ai percorsi più veloci
Vehicle
rispetto a quelli più brevi o viceversa - Decidere se il costo per la consegna di un
Shipment
valga il valore del completamento delShipment
- Eseguire ritiri e consegne entro finestre temporali solo quando è conveniente
Visualizza un esempio di richiesta con i costi
{ "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 } ] } }
Proprietà del costo Vehicle
Il messaggio Vehicle
(REST, gRPC) ha diverse proprietà di costo:
Vehicle.cost_per_hour
: rappresenta il costo di funzionamento di un veicolo all'ora, inclusi i tempi di transito, attesa, visita e pausa.Vehicle.cost_per_kilometer
: rappresenta il costo per chilometro percorso dal veicolo.Vehicle.cost_per_traveled_hour
: rappresenta il costo di gestione di un veicolo solo durante il transito, esclusi i tempi di attesa, visita e pausa.
Questi parametri di costo consentono all'ottimizzatore di effettuare compromessi tra tempo e distanza percorsa. I costi sostenuti dall'itinerario ottimizzato vengono visualizzati nel messaggio di risposta come metrics.costs
:
Man mano che costPerHour
aumenta, l'ottimizzatore tenta di trovare percorsi più veloci
che potrebbero non essere i percorsi più brevi. In questo esempio, il percorso più veloce è anche il più breve, quindi le modifiche ai parametri di costo hanno un effetto minimo.
Proprietà del costo Shipment
Il messaggio Shipment
(REST, gRPC) ha anche diversi parametri di costo:
Shipment.penalty_cost
rappresenta il costo sostenuto per saltare la spedizione. Se non imposti il parametropenalty_cost
di una spedizione, la spedizione diventa obbligatoria, il che significa che verrà ignorata solo se non può essere completata in base ai vincoli specificati.Shipment.VisitRequest.cost
rappresenta il costo di un ritiro o di una consegna specifici, utilizzato principalmente per consentire compromessi sui costi tra più opzioni di ritiro o consegna per una singola spedizione.
I parametri di costo Shipment
utilizzano le stesse unità adimensionali dei parametri di costo Vehicle
. Il costo sostenuto per completare un Shipment
supera il costo della penalità, il
Shipment
non è incluso nel percorso di alcun Vehicle
e viene visualizzato nell'elenco
skipped_shipments
nel messaggio di risposta.
Proprietà del costo ShipmentModel
Il messaggio ShipmentModel
(REST, gRPC) include una singola proprietà di costo, globalDurationCostPerHour
. Questo costo viene sostenuto in base al tempo totale necessario a tutti i veicoli per completare i relativi ShipmentRoute
. L'aumento
globalDurationCostPerHour
dà la priorità al completamento anticipato di tutte le spedizioni.
Proprietà dei costi della risposta di Route Optimization
Il messaggio OptimizeToursResponse
(REST, gRPC) ha proprietà di costo
che rappresentano i costi sostenuti durante il processo di completamento delle ShipmentRoute
.
Le proprietà metrics.costs
e metrics.totalCost
rappresentano il numero di
unità di costo sostenute in tutte le route nella risposta. Ogni voce routes
ha proprietà routeCosts
e routeTotalCosts
che rappresentano i costi per quella rotta specifica.
Visualizza una risposta alla richiesta di esempio con i costi
{ "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 } } }
Nella risposta di esempio, gli metrics.costs
di primo livello sono:
{
"metrics": {
...
"costs": {
"model.vehicles.cost_per_hour": 18.911111111111111,
"model.vehicles.cost_per_kilometer": 33.53,
"model.shipments.penalty_cost": 5
}
}
}
Il valore model.shipments.penalty_cost
rappresenta il costo sostenuto a causa
delle spedizioni saltate. La proprietà skippedShipments
elenca le spedizioni che sono state
saltate.
In questo esempio, viene ignorato solo model.shipments[1]
nella richiesta di esempio.
model.shipments[1]
ha un costo di penalità di 5 unità, che corrisponde alla chiave
model.shipments.penalty_cost
nella risposta di esempio. Il basso penaltyCost
della spedizione rispetto al Vehicle
di 40,0 costPerHour
e 10,0 costPerKilometer
rende più conveniente saltare la spedizione che completarla.
Argomento avanzato: costi e vincoli soft
Diverse proprietà dei messaggi OptimizeToursRequest
(REST, gRPC) rappresentano vincoli soft, ovvero vincoli che comportano un costo quando non possono essere soddisfatti.
Ad esempio, i vincoli del veicolo LoadLimit
(REST, gRPC) hanno le proprietà
softMaxLoad
e costPerUnitAboveSoftMax
. Insieme, questi comportano un costo proporzionale alle unità di carico che superano softMaxLoad
, consentendo di superare il limite solo se ha senso dal punto di vista dei costi.
Allo stesso modo, i vincoli TimeWindow
(REST, gRPC) hanno proprietà soft_start_time
e soft_end_time
, con cost_per_hour_before_soft_start_time
e cost_per_hour_after_soft_end_time
corrispondenti, che vengono sostenuti in base a quanto presto o tardi si verifica l'evento vincolato rispetto a TimeWindow
.
Come per tutti i parametri del modello di costo, i costi dei vincoli deboli sono espressi nelle stesse unità adimensionali degli altri parametri di costo.
I vincoli LoadLimit
sono trattati in dettaglio in
Load Demands and Limits. I vincoli TimeWindow
sono trattati in dettaglio
in Vincoli relativi alla finestra temporale di ritiro e consegna.