Il messaggio OptimizeToursRequest
(REST, gRPC) contiene una serie di proprietà relative ai costi. Insieme, questi parametri di costo rappresentano il
modello di costo della richiesta. Il modello di costo acquisisce molti degli scopi di ottimizzazione di alto livello della richiesta, ad esempio:
- Dare la priorità ai percorsi
Vehicle
più veloci rispetto a quelli più brevi o viceversa - Decidere se il costo per fornire un
Shipment
vale il valore del completamento delShipment
- Effettuare i ritiri e le consegne entro finestre temporali solo se ciò è economicamente 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 } ] } }
Vehicle
proprietà costo
Il messaggio Vehicle
(REST, gRPC) ha diverse proprietà di costo:
Vehicle.cost_per_hour
: rappresenta il costo di gestione 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 fare compromessi tra tempo e distanza percorsa. I costi sostenuti dal percorso 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, pertanto le modifiche ai parametri di costo hanno scarso effetto.
Shipment
proprietà costo
Il messaggio Shipment
(REST, gRPC) ha anche diversi parametri di costo:
Shipment.penalty_cost
indica il costo sostenuto per saltare la spedizione.Shipment.VisitRequest.cost
indica il costo di un ritiro o di una consegna specifici, utilizzato principalmente per consentire il confronto dei 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
. Se il costo sostenuto per completare un Shipment
supera il costo della penale, il Shipment
non è incluso nel percorso di nessun Vehicle
, ma viene visualizzato nell'elenco skipped_shipments
nel messaggio di risposta.
ShipmentModel
proprietà costo
Il messaggio ShipmentModel
(REST, gRPC) include una singola proprietà cost, globalDurationCostPerHour
. Questo costo viene addebitato in base al tempo totale necessario per completare le ShipmentRoute
di tutti i veicoli. Se aumenti
globalDurationCostPerHour
, dai 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 la procedura di completamento dei ShipmentRoute
.
Le proprietà metrics.costs
e metrics.totalCost
rappresentano il numero di unità di costo sostenute in tutti i percorsi della risposta. Ogni voce routes
ha proprietà routeCosts
e routeTotalCosts
che rappresentano i costi per quel percorso specifico.
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, i 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 importazioni 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 totalemodel.shipments.penalty_cost
nella risposta di esempio. Il basso valore di penaltyCost
della spedizione rispetto ai valori di 40,0 costPerHour
e 10,0costPerKilometer
di Vehicle
rende più conveniente saltare la spedizione rispetto a completarla.
Argomento avanzato: costi e vincoli flessibili
Diverse proprietà dei messaggi OptimizeToursRequest
(REST, gRPC) rappresentano vincoli flessibili, ovvero vincoli che comportano un costo quando non possono essere soddisfatti.
Ad esempio, i vincoli dei veicoli LoadLimit
(REST, gRPC) hanno proprietà softMaxLoad
e costPerUnitAboveSoftMax
. Insieme, comportano un costo proporzionale alle unità di carico che superano softMaxLoad
, consentendo di superare il limite solo se ciò è giustificato dal punto di vista dei costi.
Analogamente, i vincoli TimeWindow
(REST, gRPC) hanno proprietà soft_start_time
e soft_end_time
, con valori cost_per_hour_before_soft_start_time
e cost_per_hour_after_soft_end_time
corrispondenti che vengono applicati in base a quanto in anticipo o in ritardo si verifica l'evento vincolato rispetto a TimeWindow
.
Come per tutti i parametri del modello di costo, i costi dei vincoli flessibili sono espressi nelle stesse unità senza dimensioni degli altri parametri di costo.
I vincoli LoadLimit
sono trattati in dettaglio in
Carichi e limiti. I vincoli TimeWindow
sono trattati in dettaglio
in Vincoli relativi alla finestra temporale di ritiro e consegna.