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à a percorsi
Vehicle
più veloci su percorsi più brevi o viceversa - Decidere se il costo per fornire un
Shipment
vale il valore del completamento diShipment
- Effettuare ritiri e consegne entro gli intervalli di tempo è un'operazione economica
Vedi 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 orario di sosta su un veicolo, 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 per guidare un veicolo solo durante il trasporto, esclusi i tempi di attesa, di visita e di pausa.
Questi parametri dei costi consentono all'ottimizzatore di trovare compromessi tra 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, la route più veloce è la più breve,
quindi le modifiche ai parametri di costo hanno poco effetto.
Shipment
proprietà di costo
Il messaggio Shipment
(REST, gRPC) ha anche diversi parametri di costo:
Shipment.penalty_cost
rappresenta il costo sostenuto saltando la spedizione.Shipment.VisitRequest.cost
rappresenta il costo di un ritiro o di una consegna specifico, utilizzato principalmente per consentire un compromesso tra i costi tra più opzioni di ritiro o consegna per una singola spedizione.
Shipment
parametro di costo utilizzano le stesse unità senza dimensioni dei parametri di costo Vehicle
. Il costo sostenuto per il completamento di una Shipment
supera il costo della penalità, pertanto Shipment
non viene incluso in nessuna route di Vehicle
, ma viene visualizzato nell'elenco skipped_shipments
del 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à la priorità al completamento anticipato di tutte le spedizioni.
Proprietà dei costi della risposta di ottimizzazione delle route
Il messaggio OptimizeToursResponse
(REST, gRPC) contiene proprietà di costo che rappresentano i costi sostenuti per il processo di completamento di ShipmentRoute
.
Le proprietà metrics.costs
e metrics.totalCost
rappresentano il numero di unità di costo sostenute per tutte le route nella risposta. Ogni voce routes
ha proprietà routeCosts
e routeTotalCosts
che rappresentano i costi per quella specifica route.
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 di spedizioni ignorate. La proprietà skippedShipments
elenca le spedizioni
ignorate.
In questo esempio, solo model.shipments[1]
viene ignorato nella richiesta di esempio.
model.shipments[1]
ha un costo di penalizzazione di 5 unità, che corrisponde alla chiave
model.shipments.penalty_cost
totale nella risposta di esempio. Il basso valore di penaltyCost
della spedizione rispetto ai 40,0 costPerHour
e 10,0costPerKilometer
di Vehicle
rende più conveniente saltare la spedizione piuttosto che 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 per il veicolo LoadLimit
(REST, gRPC) hanno proprietà softMaxLoad
e costPerUnitAboveSoftMax
. Insieme, questi comportano 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 cost_per_hour_before_soft_start_time
e cost_per_hour_after_soft_end_time
che vengono sostenute in base a quanto presto o tardi si verifica l'evento vincolato in relazione a TimeWindow
.
Come per tutti i parametri del modello di costo, i costi vincolati flessibili sono espressi nelle stesse unità senza dimensioni degli altri parametri di costo.
I vincoli relativi a LoadLimit
vengono affrontati in dettaglio in Demands and Limits di carico. I vincoli relativi a TimeWindow
vengono affrontati nel dettaglio
nei vincoli per le tempistiche di ritiro e consegna.