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 obiettivi di ottimizzazione di alto livello della richiesta, tra cui:
- Dare la priorità ai percorsi
Vehicle
più veloci su percorsi più brevi o viceversa - Decidere se il costo di pubblicazione di un
Shipment
vale il valore del completamento diShipment
- Eseguire ritiri e consegne entro le finestre temporali solo quando ciò è 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à di costo
Il messaggio Vehicle
(REST, gRPC) ha diverse proprietà di costo:
Vehicle.cost_per_hour
: rappresenta il costo di utilizzo di un veicolo all'ora, inclusi i tempi di transito, di attesa, di visita e di 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 trasporto, esclusi i tempi di attesa, di visita e di pausa.
Questi parametri di costo consentono all'ottimizzatore di effettuare compromessi in termini di tempo e distanza percorsa. I costi sostenuti dalla route ottimizzata vengono visualizzati nel messaggio di risposta come metrics.costs
:
Con l'aumento di costPerHour
, l'ottimizzatore tenta di trovare route più veloci
che potrebbero non essere quelle più brevi. In questo esempio il percorso più veloce è quello più breve, quindi le modifiche ai parametri di costo hanno scarso impatto.
Shipment
proprietà di costo
Anche il messaggio Shipment
(REST, gRPC) ha diversi
parametri di costo:
Shipment.penalty_cost
rappresenta il costo sostenuto per saltare la spedizione.- Il
Shipment.VisitRequest.cost
rappresenta il costo di un ritiro o 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à senza dimensioni di Vehicle
parametri di costo. Il costo sostenuto per completare una Shipment
supera il costo della penalità, Shipment
non è incluso nel percorso di Vehicle
e viene invece visualizzato nell'elenco skipped_shipments
nel messaggio di risposta.
ShipmentModel
proprietà di costo
Il messaggio ShipmentModel
(REST, gRPC) include una singola proprietà di costo, globalDurationCostPerHour
. Questo costo viene addebitato in base al tempo totale
necessario a tutti i veicoli per completare i ShipmentRoute
. L'aumento di globalDurationCostPerHour
dà priorità al completamento anticipato di tutte le spedizioni.
Proprietà dei costi della risposta di ottimizzazione del percorso
Il messaggio OptimizeToursResponse
(REST, gRPC) ha proprietà di costo
che rappresentano i costi sostenuti nel processo di completamento dei 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, 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 ignorate. La proprietà skippedShipments
elenca le spedizioni
ignorate.
In questo esempio, solo model.shipments[1]
nella richiesta dell'esempio viene ignorato.
model.shipments[1]
ha un costo della penalità di 5 unità, che corrisponde al totale
della chiave model.shipments.penalty_cost
nella risposta di esempio. Il penaltyCost
basso della spedizione rispetto ai 40,0 costPerHour
e 10,0 costPerKilometer
di Vehicle
rendono più conveniente saltare la spedizione piuttosto che completarla.
Argomento avanzato: costi e vincoli flessibili
Varie proprietà dei messaggi OptimizeToursRequest
(REST, gRPC)
rappresentano i vincoli flessibili, ovvero vincoli che comportano un costo quando
non possono essere soddisfatti.
Ad esempio, i vincoli LoadLimit
del veicolo (REST, gRPC) hanno
proprietà softMaxLoad
e costPerUnitAboveSoftMax
. Insieme, queste hanno un costo proporzionale alle unità di carico che superano softMaxLoad
, consentendo di superare il limite solo se ciò 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 le corrispondenti proprietà cost_per_hour_before_soft_start_time
e cost_per_hour_after_soft_end_time
sostenute in base all'anticipo o al ritardo dell'evento vincolato, rispetto a TimeWindow
.
Come per tutti i parametri del modello di costo, i costi dei vincoli flessibili vengono espressi nelle stesse unità senza dimensioni degli altri parametri di costo.
I vincoli LoadLimit
vengono affrontati in dettaglio in
Richieste e limiti di caricamento. I vincoli TimeWindow
vengono gestiti in dettaglio
nella sezione Vincoli per il ritiro e la finestra dei tempi di consegna.