- Rappresentazione JSON
- Spedizione
- VisitRequest
- LatLng
- Waypoint
- Località
- TimeWindow
- Veicolo
- TravelMode
- RouteModifiers
- UnloadingPolicy
- LoadLimit
- Intervallo
- LoadCost
- DurationLimit
- DistanceLimit
- BreakRule
- BreakRequest
- FrequencyConstraint
- DurationDistanceMatrix
- Riga
- TransitionAttributes
- ShipmentTypeIncompatibility
- IncompatibilityMode
- ShipmentTypeRequirement
- RequirementMode
- PrecedenceRule
Un modello di spedizione contiene un insieme di spedizioni che devono essere eseguite da un insieme di veicoli, riducendo al minimo il costo complessivo, che è la somma di:
- Il costo di transito dei veicoli (somma del costo per tempo totale, costo per tempo di percorrenza e costo fisso su tutti i veicoli).
- le penalità di spedizione per mancata esecuzione.
- il costo della durata globale delle spedizioni
Rappresentazione JSON |
---|
{ "shipments": [ { object ( |
Campi | |
---|---|
shipments[] |
Insieme di spedizioni che devono essere effettuate nel modello. |
vehicles[] |
Insieme di veicoli che possono essere utilizzati per effettuare visite. |
globalStartTime |
Ora di inizio e di fine globali del modello: nessun orario al di fuori di questo intervallo può essere considerato valido. L'intervallo di tempo del modello deve essere inferiore a un anno, ad esempio Quando utilizzi i campi Un timestamp nel formato "Zulu" RFC3339 UTC, con risoluzione in nanosecondi e fino a nove cifre frazionarie. Esempi: |
globalEndTime |
Se non viene configurato, per impostazione predefinita viene utilizzato il valore 00:00:00 UTC, 1 gennaio 1971 (secondi: 31536000, nano: 0). Un timestamp in formato "Zulu" UTC RFC3339, con risoluzione a livello di nanosecondo e fino a nove cifre frazionarie. Esempi: |
globalDurationCostPerHour |
La "durata globale" del piano complessivo è la differenza tra l'ora di inizio effettiva più antica e l'ora di fine effettiva più recente di tutti i veicoli. Gli utenti possono assegnare un costo orario a quella quantità per provare, ad esempio, a eseguire l'ottimizzazione prima del completamento del lavoro. Questo costo deve essere nella stessa unità di |
durationDistanceMatrices[] |
Specifica le matrici di durata e distanza utilizzate nel modello. Se questo campo è vuoto, verranno utilizzate le distanze di Google Maps o geodesiche, a seconda del valore del campo Esempi di utilizzo:
|
durationDistanceMatrixSrcTags[] |
Tag che definiscono le origini delle matrici di durata e distanza; I tag corrispondono a |
durationDistanceMatrixDstTags[] |
Tag che definiscono le destinazioni delle matrici di durata e distanza; I tag corrispondono a |
transitionAttributes[] |
Attributi di transizione aggiunti al modello. |
shipmentTypeIncompatibilities[] |
Insiemi di tipi di spedizione incompatibili (vedi |
shipmentTypeRequirements[] |
Insieme di requisiti per |
precedenceRules[] |
Insieme di regole di precedenza che devono essere applicate nel modello. |
maxActiveVehicles |
Limita il numero massimo di veicoli attivi. Un veicolo è attivo se il suo percorso prevede almeno una spedizione. Questo può essere utilizzato per limitare il numero di percorsi nel caso in cui i conducenti siano inferiori ai veicoli e il parco veicoli sia eterogeneo. L'ottimizzazione selezionerà quindi il sottoinsieme migliore di veicoli da utilizzare. Deve essere strettamente positiva. |
Spedizione
La spedizione di un singolo articolo, da uno dei suoi ritiri a una delle sue consegne. Affinché la spedizione venga considerata eseguita, un veicolo unico deve recarsi in una delle sedi di prelievo (e diminuire di conseguenza la capacità di riserva), quindi recarsi in una delle sedi di consegna in un secondo momento (quindi aumentare di conseguenza la capacità di riserva).
Rappresentazione JSON |
---|
{ "displayName": string, "pickups": [ { object ( |
Campi | |
---|---|
displayName |
Il nome visualizzato della spedizione definito dall'utente. Può avere una lunghezza massima di 63 caratteri e possono essere utilizzati caratteri UTF-8. |
pickups[] |
Set di alternative di ritiro associate alla spedizione. Se non specificato, il veicolo deve visitare solo una sede corrispondente alle consegne. |
deliveries[] |
Insieme di alternative di consegna associate alla spedizione. Se non specificato, il veicolo deve visitare solo una stazione di ricarica corrispondente ai punti di ritiro. |
loadDemands |
Carica le esigenze della spedizione (ad es. peso, volume, numero di pallet e così via). Le chiavi nella mappa devono essere identificatori che descrivono il tipo di carico corrispondente, idealmente incluse le unità. Ad esempio: "weight_kg", "volume_gallons", "pallet_count" e così via. Se una determinata chiave non viene visualizzata nella mappa, il carico corrispondente viene considerato nullo. |
allowedVehicleIndices[] |
L'insieme di veicoli che potrebbero effettuare questa spedizione. Se è vuota, può farlo su tutti i veicoli. I veicoli sono indicati in base al relativo indice nell'elenco |
costsPerVehicle[] |
Specifica il costo sostenuto quando la spedizione viene consegnata da ciascun veicolo. Se specificato, deve avere OPPURE:
Questi costi devono essere nella stessa unità di |
costsPerVehicleIndices[] |
Indici dei veicoli a cui si applica |
pickupToDeliveryAbsoluteDetourLimit |
Specifica il tempo di deviazione assoluto massimo rispetto al percorso più breve dal ritiro alla consegna. Se specificato, non deve essere negativo e la spedizione deve contenere almeno un ritiro e una consegna. Ad esempio, supponiamo che t sia il tempo più breve necessario per passare dall'opzione di ritiro selezionata direttamente all'opzione di consegna selezionata. Quindi, l'impostazione di
Se nella stessa spedizione vengono specificati sia i limiti relativi che quelli assoluti, viene utilizzato il limite più restrittivo per ogni possibile coppia di ritiro/consegna. A partire da ottobre 2017, i percorsi alternativi sono supportati solo quando le durate dei viaggi non dipendono dai veicoli. Durata in secondi con un massimo di nove cifre frazionarie e termina con " |
pickupToDeliveryTimeLimit |
Specifica la durata massima dall'inizio del ritiro all'inizio della consegna di una spedizione. Se specificato, non deve essere negativo e la spedizione deve contenere almeno un ritiro e una consegna. Ciò non dipende dalle alternative selezionate per il ritiro e la consegna né dalla velocità del veicolo. Questo valore può essere specificato insieme ai vincoli di deviazione massima: la soluzione rispetterà entrambe le specifiche. Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
shipmentType |
Stringa non vuota che specifica un "type" per la spedizione. Questa funzionalità può essere utilizzata per definire incompatibilità o requisiti tra il giorno Differisce da |
label |
Specifica un'etichetta per questa spedizione. Questa etichetta viene riportata nella risposta in |
ignore |
Se il valore è true, salta questa spedizione, ma non applica un Se ignori una spedizione, il modello restituisce un errore di convalida se il modello include Ignorare una spedizione eseguita nei giorni |
penaltyCost |
Se la spedizione non viene completata, questa penale viene aggiunta al costo complessivo dei percorsi. Una spedizione è considerata completata se viene visitata una delle alternative di ritiro e consegna. Il costo può essere espresso nella stessa unità utilizzata per tutti gli altri campi relativi ai costi nel modello e deve essere positivo. IMPORTANTE: se questa penale non è specificata, è considerata infinita, ovvero la spedizione deve essere completata. |
pickupToDeliveryRelativeDetourLimit |
Specifica il tempo di deviazione massimo rispetto al percorso più breve dal ritiro alla consegna. Se specificato, non deve essere negativo e la spedizione deve contenere almeno un ritiro e una consegna. Ad esempio, lascia che sia il tempo più breve necessario per passare direttamente dall'alternativa di ritiro selezionata a quella selezionata. Quindi, l'impostazione di
Se nella stessa spedizione vengono specificati limiti sia relativi che assoluti, il limite più vincolante viene utilizzato per ogni possibile coppia di ritiro/consegna. A partire da ottobre 2017, i percorsi alternativi sono supportati solo quando le durate dei viaggi non dipendono dai veicoli. |
VisitRequest
Richiesta di una visita che può essere effettuata da un veicolo: ha una geolocalizzazione (o due, vedi di seguito), orari di apertura e chiusura rappresentati da finestre temporali e una durata del servizio (tempo impiegato dal veicolo una volta arrivato per ritirare o consegnare le merci).
Rappresentazione JSON |
---|
{ "arrivalLocation": { object ( |
Campi | |
---|---|
arrivalLocation |
La geolocalizzazione a cui arriva il veicolo quando esegui questo |
arrivalWaypoint |
Il waypoint a cui arriva il veicolo quando si esegue questo |
departureLocation |
La geolocalizzazione da cui parte il veicolo al termine di questo |
departureWaypoint |
La tappa da cui parte il veicolo dopo aver completato questo |
tags[] |
Specifica i tag associati alla richiesta di visita. Non sono consentite stringhe vuote o duplicate. |
timeWindows[] |
Finestre temporali che limitano l'ora di arrivo in una visita. Tieni presente che un veicolo può partire al di fuori dell'intervallo di tempo di arrivo, ovvero l'ora di arrivo + la durata non devono rientrare in un intervallo di tempo. Ciò può comportare dei tempi di attesa se il veicolo arriva prima del giorno L'assenza di Le finestre temporali devono essere disgiunte, ovvero nessuna finestra temporale deve sovrapporsi o essere adiacente a un'altra, e devono essere in ordine crescente.
|
duration |
Durata della visita, ossia il tempo trascorso dal veicolo tra l'arrivo e la partenza (da aggiungere al possibile tempo di attesa; consulta Durata in secondi con un massimo di nove cifre frazionarie e termina con " |
cost |
Costo per gestire questa richiesta di visita su un percorso di veicoli. Questo può essere utilizzato per pagare costi diversi per ogni ritiro o consegna alternativa di una spedizione. Questo costo deve essere nella stessa unità di |
loadDemands |
Carica le richieste di questa visita. È proprio come il campo |
visitTypes[] |
Specifica i tipi di visita. In questo modo è possibile assegnare il tempo aggiuntivo necessario a un veicolo per completare la visita (vedi Un tipo può essere visualizzato una sola volta. |
label |
Specifica un'etichetta per questo |
LatLng
Un oggetto che rappresenta una coppia di latitudine/longitudine. Questo valore è espresso come una coppia di numeri doppi per rappresentare i gradi di latitudine e di longitudine. Se non diversamente specificato, questo oggetto deve essere conforme allo standard WGS84. I valori devono essere compresi negli intervalli normalizzati.
Rappresentazione JSON |
---|
{ "latitude": number, "longitude": number } |
Campi | |
---|---|
latitude |
La latitudine in gradi. Deve essere compreso nell'intervallo [-90,0, +90,0]. |
longitude |
La longitudine in gradi. Deve essere compreso nell'intervallo [-180,0, +180,0]. |
Waypoint
Incapsula un waypoint. I waypoint contrassegnano le posizioni di arrivo e partenza delle richieste di visita e le posizioni di partenza e di arrivo dei veicoli.
Rappresentazione JSON |
---|
{ "sideOfRoad": boolean, // Union field |
Campi | |
---|---|
sideOfRoad |
(Facoltativo) Indica che la posizione di questo waypoint è destinata a avere una preferenza per la fermata del veicolo su un determinato lato della strada. Quando imposti questo valore, il percorso passerà attraverso la località in modo che il veicolo possa fermarsi sul lato della strada verso cui è inclinata la località rispetto al centro della strada. Questa opzione non funziona per la modalità di viaggio "A PIEDI". |
Campo unione location_type . Diversi modi per rappresentare un luogo. location_type può essere solo uno dei seguenti: |
|
location |
Un punto specificato utilizzando le coordinate geografiche, inclusa un'intestazione facoltativa. |
placeId |
L'ID luogo del PDI associato alla tappa. |
Località
Incapsula una posizione (un punto geografico e un'intestazione facoltativa).
Rappresentazione JSON |
---|
{
"latLng": {
object ( |
Campi | |
---|---|
latLng |
Le coordinate geografiche del waypoint. |
heading |
L'intestazione della bussola associata alla direzione del flusso del traffico. Questo valore viene utilizzato per specificare il lato della strada da utilizzare per il ritiro e il reso. I valori di rotta possono variare da 0 a 360, dove 0 indica una rotta a nord, 90 indica una rotta a est e così via. |
TimeWindow
Le finestre temporali vincolano l'ora di un evento, come l'ora di arrivo di una visita o l'ora di inizio e di fine di un veicolo.
I limiti fissi di finestre temporali, startTime
e endTime
, applicano l'ora più vicina e più recente dell'evento, ad esempio startTime <= event_time <=
endTime
. Il limite inferiore della finestra di tempo flessibile, softStartTime
, esprime una preferenza affinché l'evento si verifichi a partire da softStartTime
in base a un costo proporzionale al tempo prima del softStartTime dell'evento. Il limite superiore della finestra temporale flessibile, softEndTime
, esprime una preferenza per la data e l'ora in cui si verifica l'evento, ovvero prima del giorno softEndTime
, comportando un costo proporzionale al tempo che intercorre dopo questa data. startTime
, endTime
, softStartTime
e softEndTime
devono rispettare i limiti di tempo globali (vedi ShipmentModel.global_start_time
e ShipmentModel.global_end_time
) e devono rispettare:
0 <= `startTime` <= `endTime` and
0 <= `startTime` <= `softStartTime` and
0 <= `softEndTime` <= `endTime`.
Rappresentazione JSON |
---|
{ "startTime": string, "endTime": string, "softStartTime": string, "softEndTime": string, "costPerHourBeforeSoftStartTime": number, "costPerHourAfterSoftEndTime": number } |
Campi | |
---|---|
startTime |
L'ora di inizio dell'intervallo di tempo obbligatorio. Se non specificato, verrà impostato su Un timestamp in formato "Zulu" UTC RFC3339, con risoluzione a livello di nanosecondo e fino a nove cifre frazionarie. Esempi: |
endTime |
L'ora di fine della finestra temporale massima. Se non specificato, verrà impostato su Un timestamp nel formato "Zulu" RFC3339 UTC, con risoluzione in nanosecondi e fino a nove cifre frazionarie. Esempi: |
softStartTime |
L'ora di inizio graduale della finestra temporale. Un timestamp nel formato "Zulu" RFC3339 UTC, con risoluzione in nanosecondi e fino a nove cifre frazionarie. Esempi: |
softEndTime |
L'ora di fine soft della finestra temporale. Un timestamp in formato "Zulu" UTC RFC3339, con risoluzione a livello di nanosecondo e fino a nove cifre frazionarie. Esempi: |
costPerHourBeforeSoftStartTime |
Un costo per ora aggiunto ad altri costi nel modello se l'evento si verifica prima di softStartTime, calcolato come:
Questo costo deve essere positivo e il campo può essere impostato solo se è stato impostato softStartTime. |
costPerHourAfterSoftEndTime |
Un costo per ora aggiunto agli altri costi del modello se l'evento si verifica dopo
Questo costo deve essere positivo e il campo può essere impostato solo se è stato impostato |
Veicolo
Modella un veicolo in un problema di spedizione. La risoluzione di un problema di spedizione comporterà la creazione di un percorso che parte da startLocation
e termina a endLocation
per questo veicolo. Un percorso è una sequenza di visite (vedi ShipmentRoute
).
Rappresentazione JSON |
---|
{ "displayName": string, "travelMode": enum ( |
Campi | |
---|---|
displayName |
Il nome visualizzato del veicolo definito dall'utente. Può avere una lunghezza massima di 63 caratteri e possono essere utilizzati caratteri UTF-8. |
travelMode |
La modalità di viaggio che influisce sulle strade utilizzabili dal veicolo e sulla sua velocità. Vedi anche |
routeModifiers |
Un insieme di condizioni da soddisfare che influiscono sul modo in cui vengono calcolati i percorsi per un determinato veicolo. |
startLocation |
Posizione geografica in cui il veicolo parte prima di ritirare le spedizioni. Se non specificato, il veicolo si avvia al primo ritiro. Se il modello di spedizione ha matrici di durata e distanza, |
startWaypoint |
Waypoint che rappresenta una posizione geografica in cui il veicolo parte prima di ritirare qualsiasi spedizione. Se non viene specificato né |
endLocation |
Posizione geografica in cui termina il viaggio del veicolo dopo aver completato l'ultima |
endWaypoint |
Waypoint che rappresenta una posizione geografica in cui il veicolo termina dopo aver completato l'ultimo |
startTags[] |
Specifica i tag allegati all'inizio del percorso del veicolo. Non sono consentite stringhe vuote o duplicate. |
endTags[] |
Specifica i tag allegati alla fine del percorso del veicolo. Non sono consentite stringhe vuote o duplicate. |
startTimeWindows[] |
Fasce orarie durante le quali il veicolo può partire dalla stazione di partenza. Devono rientrare nei limiti di tempo globali (vedi i campi Le finestre temporali appartenenti allo stesso campo ripetuto devono essere disgiunte, ovvero nessuna finestra temporale può sovrapporsi o essere adiacente a un'altra e devono essere in ordine cronologico.
|
endTimeWindows[] |
Finestre temporali durante le quali il veicolo potrebbe arrivare alla sua posizione di fine. Devono rispettare i limiti di tempo globali (vedi campi Le finestre temporali appartenenti allo stesso campo ripetuto devono essere disgiunte, ovvero nessuna finestra temporale può sovrapporsi o essere adiacente a un'altra e devono essere in ordine cronologico.
|
unloadingPolicy |
Criterio di scarico applicato al veicolo. |
loadLimits |
Capacità del veicolo (ad es. peso, volume, numero di pallet). Le chiavi nella mappa sono gli identificatori del tipo di caricamento, in linea con le chiavi del campo |
costPerHour |
Costi del veicolo: tutti i costi si sommano e devono essere nella stessa unità di Costo per ora del percorso del veicolo. Questo costo viene applicato al tempo totale impiegato dal percorso e include il tempo di percorrenza, il tempo di attesa e il tempo di visita. L'uso di |
costPerTraveledHour |
Costo per ora di percorrenza del percorso con il veicolo. Questo costo viene applicato solo al tempo di percorrenza previsto per il percorso (ad es. riportato in |
costPerKilometer |
Costo per chilometro del percorso del veicolo. Questo costo viene applicato alla distanza riportata nel |
fixedCost |
Costo fisso applicato se questo veicolo viene utilizzato per gestire una spedizione. |
usedIfRouteIsEmpty |
Questo campo si applica ai veicoli solo quando il loro percorso non serve spedizioni. Indica se il veicolo deve essere considerato usato o meno in questo caso. In questo caso, il veicolo va dalla sua posizione di partenza a quella di arrivo anche se non effettua alcuna spedizione e vengono presi in considerazione i costi in termini di tempo e distanza derivanti dall'inizio --> il viaggio finale. In caso contrario, il veicolo non si sposta dall'inizio alla posizione di fine e non sono previsti |
routeDurationLimit |
Limite applicato alla durata totale del percorso del veicolo. In un determinato |
travelDurationLimit |
Limite applicato alla durata del percorso del veicolo. In un determinato |
routeDistanceLimit |
Limite applicato alla distanza totale del percorso del veicolo. In un determinato |
extraVisitDurationForVisitType |
Specifica una mappa dalle stringhe di visitTypes alle durate. La durata è il tempo aggiuntivo di Se una richiesta di visita ha più tipi, nella mappa verrà aggiunta una durata per ogni tipo. |
breakRule |
Descrive la programmazione delle interruzioni da applicare a questo veicolo. Se è vuoto, non verranno pianificate interruzioni per questo veicolo. |
label |
Specifica un'etichetta per questo veicolo. Questa etichetta viene riportata nella risposta come |
ignore |
Se true, Se una spedizione viene eseguita da un veicolo ignorato in Se una spedizione viene eseguita da un veicolo ignorato in |
travelDurationMultiple |
Specifica un fattore moltiplicativo che può essere utilizzato per aumentare o diminuire i tempi di percorrenza di questo veicolo. Ad esempio, se imposti questo valore su 2,0, il veicolo è più lento e i tempi di percorrenza sono il doppio di quelli dei veicoli standard. Questo multiplo non influisce sulla durata delle visite. Influisce sul costo se vengono specificati AVVERTENZA: i tempi di percorrenza verranno arrotondati al secondo più vicino dopo l'applicazione di questo moltiplicatore, ma prima di eseguire qualsiasi operazione numerica. Pertanto, un piccolo moltiplicatore potrebbe comportare una perdita di precisione. Vedi anche |
TravelMode
Modalità di viaggio utilizzabili dai veicoli.
Devono essere un sottoinsieme dei modi di viaggio dell'API Routes Preferred della piattaforma Google Maps, consulta: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.
Enum | |
---|---|
TRAVEL_MODE_UNSPECIFIED |
Modalità di viaggio non specificata, equivalente a DRIVING . |
DRIVING |
Modalità di viaggio corrispondente alle indicazioni stradali (auto, ...). |
WALKING |
Modalità di viaggio corrispondente alle indicazioni stradali a piedi. |
RouteModifiers
Include una serie di condizioni facoltative da soddisfare durante il calcolo dei percorsi dei veicoli. Questo valore è simile a RouteModifiers
nell'API Routes Preferred di Google Maps Platform; consulta: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.
Rappresentazione JSON |
---|
{ "avoidTolls": boolean, "avoidHighways": boolean, "avoidFerries": boolean, "avoidIndoor": boolean } |
Campi | |
---|---|
avoidTolls |
Specifica se evitare le strade a pedaggio, ove ragionevole. Verrà data la preferenza ai percorsi che non contengono strade a pedaggio. Si applica solo alle modalità di viaggio motorizzate. |
avoidHighways |
Specifica se evitare le autostrade, ove possibile. Verrà data la preferenza ai percorsi che non contengono autostrade. Si applica solo alle modalità di viaggio motorizzate. |
avoidFerries |
Specifica se evitare i traghetti, ove ragionevole. Verrà data la preferenza ai percorsi che non includono viaggi in traghetto. Si applica solo alle modalità di viaggio motorizzate. |
avoidIndoor |
(Facoltativo) Consente di specificare se evitare la navigazione al chiuso dove ragionevole. Verrà data la preferenza ai percorsi che non contengono la navigazione al chiuso. Si applica solo alla modalità di viaggio |
UnloadingPolicy
Norme sulle modalità di scarico di un veicolo. Si applica solo alle spedizioni con sia un ritiro che una consegna.
Le altre spedizioni possono avvenire in qualsiasi punto del percorso, indipendentemente da unloadingPolicy
.
Enum | |
---|---|
UNLOADING_POLICY_UNSPECIFIED |
Criterio di unload non specificato; le consegne devono avvenire solo dopo i ritiri corrispondenti. |
LAST_IN_FIRST_OUT |
Le consegne devono avvenire in ordine inverso rispetto ai ritiri |
FIRST_IN_FIRST_OUT |
Le consegne devono avvenire nello stesso ordine dei ritiri |
LoadLimit
Definisce un limite di carico applicabile a un veicolo, ad esempio "questo camion può trasportare solo fino a 3500 kg". Leggi i loadLimits
.
Rappresentazione JSON |
---|
{ "softMaxLoad": string, "costPerUnitAboveSoftMax": number, "startLoadInterval": { object ( |
Campi | |
---|---|
softMaxLoad |
Un limite flessibile del carico. Leggi i |
costPerUnitAboveSoftMax |
Se il carico supera |
startLoadInterval |
L'intervallo di carico accettabile del veicolo all'inizio del percorso. |
endLoadInterval |
L'intervallo di carico accettabile del veicolo alla fine del percorso. |
maxLoad |
La quantità massima di carico accettabile. |
costPerKilometer |
Costo del trasporto di una unità di carico per un chilometro per questo veicolo. Questo può essere utilizzato come sostituto del consumo di carburante: se il carico è un peso (in Newton), il carico per chilometro ha la dimensione di un'energia. |
costPerTraveledHour |
Costo del viaggio con una unità di carico per un'ora per questo veicolo. |
Intervallo
Intervallo di importi di carico accettabili.
Rappresentazione JSON |
---|
{ "min": string, "max": string } |
Campi | |
---|---|
min |
Un carico minimo accettabile. Deve essere ≥ 0. Se sono specificati entrambi, |
max |
Un carico massimo accettabile. Deve essere ≥ 0. Se non specificato, il carico massimo non è limitato da questo messaggio. Se sono specificati entrambi, |
LoadCost
Costo dello spostamento di un'unità di carico durante un Transition
. Per un determinato carico, il costo è la somma di due parti:
- min(caricamento,
loadThreshold
) *costPerUnitBelowThreshold
- max(0, load -
loadThreshold
) *costPerUnitAboveThreshold
Con questo costo, le soluzioni preferiscono soddisfare prima le richieste elevate o, in modo equivalente, raccogliere le richieste elevate per ultime. Ad esempio, se un veicolo ha
load_limit {
key: "weight"
value {
costPerKilometer {
loadThreshold: 15
costPerUnitBelowThreshold: 2.0
costPerUnitAboveThreshold: 10.0
}
}
}
e il suo percorso è start,pickup,pickup,delivery,delivery,end con le transizioni:
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
il costo sostenuto da questo LoadCost
è (cost_ below * load_ below * chilometri + costi_above * load_above * km)
- transizione 0: 0,0
- transizione 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- transizione 2: 2,0 * 15 * 1,0 + 10,0 * (20 - 15) * 1,0 = 80,0
- transizione 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- transizione 4: 0,0
Quindi LoadCost
lungo il percorso è 120,0.
Tuttavia, se il percorso è inizio,ritiro,consegna,ritiro,consegna,termina con transizioni:
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
il costo sostenuto da questo LoadCost
è
- transizione 0: 0.0
- transizione 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- transizione 2: 0,0
- transizione 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- transizione 4: 0,0
Qui il valore LoadCost
sul percorso è 40.0.
LoadCost
rende più costose le soluzioni con transizioni molto complesse.
Rappresentazione JSON |
---|
{ "loadThreshold": string, "costPerUnitBelowThreshold": number, "costPerUnitAboveThreshold": number } |
Campi | |
---|---|
loadThreshold |
Quantità di carico al di sopra della quale il costo del trasferimento di una unità di carico passa da costPerUnitBelowThreshold a costPerUnitAboveThreshold. Deve essere >= 0. |
costPerUnitBelowThreshold |
Costo dello spostamento di un'unità di carico, per ogni unità compresa tra 0 e la soglia. Deve essere un valore finito e maggiore o uguale a 0. |
costPerUnitAboveThreshold |
Costo del trasferimento di una unità di carico per ogni unità superiore alla soglia. Nel caso speciale soglia = 0, si tratta di un costo fisso per unità. Deve essere un valore finito e >= 0. |
DurationLimit
Un limite che definisce una durata massima del percorso di un veicolo. Può essere dura o morbida.
Quando viene definito un campo del limite flessibile, è necessario definire insieme la soglia massima e il costo associato.
Rappresentazione JSON |
---|
{ "maxDuration": string, "softMaxDuration": string, "quadraticSoftMaxDuration": string, "costPerHourAfterSoftMax": number, "costPerSquareHourAfterQuadraticSoftMax": number } |
Campi | |
---|---|
maxDuration |
Un limite massimo che impone che la durata non superi maxDuration. Durata in secondi con un massimo di nove cifre frazionarie e termina con " |
softMaxDuration |
Un limite flessibile che non applica un limite di durata massimo, ma in caso di violazione comporta un costo per la route. Questo costo si somma agli altri costi definiti nel modello, con la stessa unità di misura. Se definito, Durata in secondi con un massimo di nove cifre frazionarie e termina con " |
quadraticSoftMaxDuration |
Un limite flessibile non applica un limite di durata massimo, ma se viene violato comporta un costo quadratico nella durata. Questo costo si somma agli altri costi definiti nel modello, con la stessa unità di misura. Se definito,
Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
costPerHourAfterSoftMax |
Costo orario sostenuto se viene violata la soglia
Il costo non deve essere negativo. |
costPerSquareHourAfterQuadraticSoftMax |
Costo per ora quadrata in caso di violazione della soglia di Il costo aggiuntivo è pari a 0 se la durata è inferiore alla soglia, altrimenti il costo dipende dalla durata, come segue:
Il costo non deve essere negativo. |
DistanceLimit
Un limite che definisce la distanza massima che può essere percorsa. Può essere difficile o morbida.
Se è definito un limite flessibile, sia softMaxMeters
che costPerKilometerAboveSoftMax
devono essere definiti e non negativi.
Rappresentazione JSON |
---|
{ "maxMeters": string, "softMaxMeters": string, "costPerKilometerBelowSoftMax": number, "costPerKilometerAboveSoftMax": number } |
Campi | |
---|---|
maxMeters |
Un limite rigido che obbliga la distanza a non superare il limite massimo di maxMeters. Il limite non deve essere negativo. |
softMaxMeters |
Un limite flessibile non applica un limite massimo per la distanza, ma se violato genera un costo che si somma ad altri costi definiti nel modello, con la stessa unità. Se definito il valore softMaxMeters deve essere inferiore a maxMeters e deve essere un numero non negativo. |
costPerKilometerBelowSoftMax |
Costo per chilometro sostenuto, crescente fino a
Questo costo non è supportato in |
costPerKilometerAboveSoftMax |
Costo per chilometro addebitato se la distanza supera il limite di
Il costo deve essere non negativo. |
BreakRule
Regole per generare interruzioni di tempo per un veicolo (ad es. pause pranzo). Una pausa è un periodo di tempo contiguo durante il quale il veicolo rimane inattivo nella sua posizione corrente e non può effettuare alcuna visita. Potrebbe verificarsi una pausa:
- durante il viaggio tra due visite (che include il tempo immediatamente prima o subito dopo una visita, ma non nel corso di una visita), nel qual caso estende il tempo di transito corrispondente tra una visita e l'altra;
- o prima dell'avvio del veicolo (il veicolo potrebbe non avviarsi nel bel mezzo di una pausa), nel qual caso l'operazione non influisce sull'ora di inizio del veicolo.
- o dopo la fine del servizio (idem, con l'ora di fine del servizio).
Rappresentazione JSON |
---|
{ "breakRequests": [ { object ( |
Campi | |
---|---|
breakRequests[] |
Sequenza delle interruzioni. Leggi il messaggio di |
frequencyConstraints[] |
Potrebbero essere applicati diversi |
BreakRequest
La sequenza delle interruzioni (ovvero il numero e l'ordine) che si applicano a ogni veicolo deve essere nota in anticipo. I valori BreakRequest
ripetuti definiscono questa sequenza, nell'ordine in cui devono verificarsi. Le relative finestre temporali (earliestStartTime
/latestStartTime
) possono sovrapporsi, ma devono essere compatibili con l'ordine (questo viene controllato).
Rappresentazione JSON |
---|
{ "earliestStartTime": string, "latestStartTime": string, "minDuration": string } |
Campi | |
---|---|
earliestStartTime |
Obbligatorio. Limite inferiore (compreso) all'inizio dell'interruzione. Un timestamp nel formato "Zulu" RFC3339 UTC, con risoluzione in nanosecondi e fino a nove cifre frazionarie. Esempi: |
latestStartTime |
Obbligatorio. Limite superiore (incluso) all'inizio dell'interruzione. Un timestamp in formato "Zulu" UTC RFC3339, con risoluzione a livello di nanosecondo e fino a nove cifre frazionarie. Esempi: |
minDuration |
Obbligatorio. Durata minima della pausa. Deve essere positivo. Durata in secondi con un massimo di nove cifre frazionarie e termina con " |
FrequencyConstraint
È possibile limitare ulteriormente la frequenza e la durata delle interruzioni specificate sopra, imponendo una frequenza minima delle interruzioni, ad esempio "Deve esserci un'interruzione di almeno 1 ora ogni 12 ore". Supponendo che questo possa essere interpretato come "In qualsiasi finestra temporale scorrevole di 12 ore, deve esserci almeno una pausa di almeno un'ora", questo esempio si tradurrebbe nel seguente FrequencyConstraint
:
{
minBreakDuration { seconds: 3600 } # 1 hour.
maxInterBreakDuration { seconds: 39600 } # 11 hours (12 - 1 = 11).
}
I tempi e la durata delle interruzioni nella soluzione rispetteranno tutti questi vincoli, oltre alle finestre temporali e alle durate minime già specificate in BreakRequest
.
In pratica, un FrequencyConstraint
può essere applicato alle interruzioni non consecutive. Ad esempio, la programmazione seguente rispetta l'esempio "1 h ogni 12 h":
04:00 vehicle start
.. performing travel and visits ..
09:00 1 hour break
10:00 end of the break
.. performing travel and visits ..
12:00 20-min lunch break
12:20 end of the break
.. performing travel and visits ..
21:00 1 hour break
22:00 end of the break
.. performing travel and visits ..
23:59 vehicle end
Rappresentazione JSON |
---|
{ "minBreakDuration": string, "maxInterBreakDuration": string } |
Campi | |
---|---|
minBreakDuration |
Obbligatorio. Durata minima dell'interruzione per questo vincolo. Non negativo. Vedi la descrizione di Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
maxInterBreakDuration |
Obbligatorio. Periodo massimo consentito di qualsiasi intervallo di tempo nel percorso che non include almeno parzialmente un'interruzione di Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
DurationDistanceMatrix
Specifica una matrice di durata e distanza tra le posizioni delle visite e di partenza dei veicoli da visitare e le località di fine dei veicoli.
Rappresentazione JSON |
---|
{
"rows": [
{
object ( |
Campi | |
---|---|
rows[] |
Specifica le righe della durata e della matrice della distanza. Deve contenere lo stesso numero di elementi di |
vehicleStartTag |
Tag che definisce a quali veicoli si applica la durata e la matrice della distanza. Se vuoto, questo vale per tutti i veicoli e può essere presente una sola matrice. L'inizio di ogni veicolo deve corrispondere esattamente a una matrice, ovvero a uno dei campi Tutte le matrici devono avere un |
Riga
Specifica una riga della durata e della matrice della distanza.
Rappresentazione JSON |
---|
{ "durations": [ string ], "meters": [ number ] } |
Campi | |
---|---|
durations[] |
Valori di durata per una determinata riga. Deve avere un numero di elementi pari a Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
meters[] |
Valori di distanza per una determinata riga. Se nel modello non sono presenti costi o vincoli che fanno riferimento alle distanze, questo campo può essere lasciato vuoto; in caso contrario, deve contenere lo stesso numero di elementi di |
TransitionAttributes
Specifica gli attributi delle transizioni tra due visite consecutive su un percorso. Alla stessa transizione possono essere applicati diversi TransitionAttributes
: in questo caso, tutti i costi aggiuntivi vengono sommati e viene applicato il vincolo o il limite più rigido (secondo la semantica "AND" naturale).
Rappresentazione JSON |
---|
{
"srcTag": string,
"excludedSrcTag": string,
"dstTag": string,
"excludedDstTag": string,
"cost": number,
"costPerKilometer": number,
"distanceLimit": {
object ( |
Campi | |
---|---|
srcTag |
Tag che definiscono l'insieme di transizioni (src->dst) a cui si applicano questi attributi. Una visita della sorgente o l'inizio di un veicolo corrisponde a se il suo |
excludedSrcTag |
Leggi i |
dstTag |
Una visita di destinazione o una fine del veicolo corrisponde se la sua |
excludedDstTag |
Leggi i |
cost |
Specifica un costo per l'esecuzione di questa transizione. Si tratta della stessa unità di misura di tutti gli altri costi del modello e non deve essere negativo. Viene applicato in aggiunta a tutti gli altri costi esistenti. |
costPerKilometer |
Specifica un costo per chilometro applicato alla distanza percorsa durante l'esecuzione di questa transizione. Si somma a qualsiasi |
distanceLimit |
Specifica un limite alla distanza percorsa durante l'esecuzione di questa transizione. A partire dal 2021/06, sono supportati solo i limiti software. |
delay |
Specifica un ritardo durante l'esecuzione di questa transizione. Questo ritardo si verifica sempre dopo il completamento della visita di origine e prima dell'inizio della visita di destinazione. Durata in secondi con un massimo di nove cifre frazionarie e termina con " |
ShipmentTypeIncompatibility
Specifica le incompatibilità tra le spedizioni a seconda del relativo tipo di spedizione. La comparsa di spedizioni incompatibili sullo stesso percorso è limitata in base alla modalità di incompatibilità.
Rappresentazione JSON |
---|
{
"types": [
string
],
"incompatibilityMode": enum ( |
Campi | |
---|---|
types[] |
Elenco di tipi incompatibili. Due spedizioni con |
incompatibilityMode |
Modalità applicata all'incompatibilità. |
IncompatibilityMode
Modalità che definiscono le limitazioni di visualizzazione di spedizioni incompatibili sullo stesso percorso.
Enum | |
---|---|
INCOMPATIBILITY_MODE_UNSPECIFIED |
Modalità di incompatibilità non specificata. Questo valore non deve mai essere utilizzato. |
NOT_PERFORMED_BY_SAME_VEHICLE |
In questa modalità, due spedizioni con tipi incompatibili non possono mai condividere lo stesso veicolo. |
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY |
Per due importazioni con tipi incompatibili con la modalità di incompatibilità
|
ShipmentTypeRequirement
Specifica i requisiti tra una spedizione in base all'attributo billingType. Le specifiche dei requisiti sono definite dalla modalità dei requisiti.
Rappresentazione JSON |
---|
{
"requiredShipmentTypeAlternatives": [
string
],
"dependentShipmentTypes": [
string
],
"requirementMode": enum ( |
Campi | |
---|---|
requiredShipmentTypeAlternatives[] |
Elenco dei tipi di spedizione alternativi richiesti dal |
dependentShipmentTypes[] |
Tutte le spedizioni con un tipo nel campo NOTA: non sono consentite catene di requisiti in cui un |
requirementMode |
Modalità applicata al requisito. |
RequirementMode
Modalità che definiscono l'aspetto di spedizioni dipendenti su un itinerario.
Enum | |
---|---|
REQUIREMENT_MODE_UNSPECIFIED |
Modalità requisito non specificata. Questo valore non deve mai essere utilizzato. |
PERFORMED_BY_SAME_VEHICLE |
In questa modalità, tutte le spedizioni "dipendenti" devono condividere lo stesso veicolo di almeno una delle spedizioni "obbligatorie". |
IN_SAME_VEHICLE_AT_PICKUP_TIME |
Con la modalità Di conseguenza, il ritiro di una spedizione "dipendente" deve avere:
|
IN_SAME_VEHICLE_AT_DELIVERY_TIME |
Come prima, tranne che le spedizioni "dipendenti" devono avere una spedizione "obbligatoria" sul veicolo al momento della consegna. |
PrecedenceRule
Una regola di precedenza tra due eventi (ogni evento rappresenta il ritiro o la consegna di una spedizione): il "secondo" evento deve iniziare almeno offsetDuration
dopo l'inizio del "primo".
Più precedenze possono fare riferimento agli stessi eventi (o correlati), ad esempio "Il ritiro di B avviene dopo la consegna di A" e "il ritiro di C avviene dopo il ritiro di B".
Inoltre, le precedenze si applicano solo quando vengono eseguite entrambe le importazioni e vengono ignorate in caso contrario.
Rappresentazione JSON |
---|
{ "firstIsDelivery": boolean, "secondIsDelivery": boolean, "offsetDuration": string, "firstIndex": integer, "secondIndex": integer } |
Campi | |
---|---|
firstIsDelivery |
Indica se il "primo" evento è una pubblicazione. |
secondIsDelivery |
Indica se il "secondo" evento è una pubblicazione. |
offsetDuration |
L'offset tra il "primo" e il "secondo" evento. Può essere negativo. Durata in secondi con un massimo di nove cifre frazionarie e termina con " |
firstIndex |
Indice di spedizione dell'evento "primo". Questo campo è obbligatorio. |
secondIndex |
Indice di spedizione del "secondo" evento. Questo campo deve essere specificato. |