Il risolutore di routing utilizza un oggetto chiamato dimensione per tenere traccia quantità che si accumulano lungo il percorso di un veicolo, ad esempio il tempo di percorrenza o se il veicolo effettua Ritira e consegne, il peso totale che trasporta di Google. Se un problema di routing riguarda una determinata quantità, nei vincoli o funzione obiettivo, devi definire una dimensione per specificarla.
Questa sezione spiega come definire e utilizzare le dimensioni.
Esempi di dimensioni
Di seguito sono riportati alcuni esempi di dimensioni tratte dalle sezioni precedenti.
L'esempio VRPTW crea una dimensione da monitorare il tempo di percorrenza cumulativo di ciascun veicolo. Il risolutore usa la dimensione per applicare il vincolo che un veicolo può visitare solo una località finestra temporale.
L'esempio di CVRP crea una dimensione per il parametro le richieste (ad es. pesi o volumi dei pacchi da ritirare), quali il carico cumulativo che il veicolo trasporta lungo il percorso. Il risolutore utilizza la dimensione per applicare il vincolo che il carico di un veicolo non può superare la sua capacità.
I seguenti esempi definiscono una dimensione per il VRPTW utilizzando il parametro
AddDimension
.
Python
routing.AddDimension( callback_index, slack_max, capacity, fix_start_cumul_to_zero, dimension_name)
C++
routing.AddDimension( callback_index, slack_max, capacity, fix_start_cumul_to_zero, dimension_name)
Java
routing.addDimension( callbackIndex, slackMax, capacity, fixStartCumulToZero, dimensionName)
C#
routing.AddDimension( callbackIndex, slackMax, capacity, fixStartCumulToZero, dimensionName)
Il metodo AddDimension
ha i seguenti input:
callback_index
: l'indice per il callback che restituisce la quantità. La , che è il riferimento interno del risolutore al callback, viene creato comeRegisterTransitCallback
oRegisterUnitaryTransitCallback
.slack_max
: il valore massimo per slack, una variabile utilizzata per rappresentare l'attesa orari nelle sedi. Consulta le variabili di Slack di seguito per i dettagli. Se il problema non prevede tempi di attesa, in genere puoi impostareslack_max
a 0.capacity
: la quantità totale accumulata lungo ogni percorso. Utilizzacapacity
per creare vincoli come quelli nella CVRP: Se il tuo problema non presenta puoi impostarecapacity
su un valore sufficientemente grande da non imporre restrizioni ai percorsi, ad esempio la somma di tutte della matrice o dell'array utilizzate per definire il callback.fix_start_cumulative_to_zero
: valore booleano. Se true, il valore cumulativo della quantità inizia da 0. Nella maggior parte dei casi, dovrebbe essere impostato suTrue
. Tuttavia, per VRPTW o per problemi con limiti delle risorse, alcuni veicoli potrebbe dover iniziare dopo il valore 0 a causa dei vincoli della finestra temporale, quindi impostafix_start_cumulative_to_zero
suFalse
per questi problemi.dimension_name
: stringa per il nome della dimensione, ad esempio'Distance'
, che puoi usare per accedere alle variabili in un altro punto del programma.
Il programma CVRP crea un tipo di dimensione leggermente diverso utilizzando
AddDimensionWithVehicleCapacity
. Questo metodo prevede una serie di capacità, con una voce per ogni veicolo.
(Al contrario, AddDimension
assume un singolo valore per capacity
, quindi tutte
si presume che i veicoli abbiano la stessa capacità.)
Consulta la RoutingModel
pagina di riferimento per altri metodi che creano dimensioni.
La sezione Salva le finestre temporali della soluzione in un elenco o in un array presenta funzioni che salvano i dati cumulativi in una dimensione in un elenco o in una matrice.
Variabili Slack
Ecco un esempio che illustra le variabili slack per un problema che tempi di percorrenza. Supponiamo che un veicolo passa dalla posizione i alla posizione j in una fase del percorso e che:
- Il tempo di percorrenza cumulativo del veicolo alle i è di 100 minuti.
- Il tempo di percorrenza cumulativo del veicolo in j è di 200 minuti.
- Il tempo di percorrenza da i a j è di 75 minuti.
Il veicolo non può uscire dalla posizione i subito all'arrivo o dalla sua posizione cumulativa nella posizione j è pari a 175. Il veicolo deve attendere 25 minuti alle ore posizione i prima della partenza; in altre parole, l'intervallo nella posizione i è 25.
Devi consentire l'uso del VRPTW in quanto i veicoli potrebbero dover attendere prima
visitare un luogo a causa dei limiti di tempo. In un problema come questo, imposta
slack_max
per il tempo massimo che vuoi concedere ai veicoli di attendere
un luogo prima di passare al luogo successivo. Se non importa quanto a lungo
attendono, imposta slack_max
su un numero molto elevato.
Per il CVRP, invece, la variazione del carico accumulato da i
a
Il valore di j
equivale sempre alla domanda di i
, quindi non esiste un rallentamento. Per problemi quali
In questo caso, puoi impostare slack_max
su 0.
Daremo quindi la definizione formale di slack. Internamente, una dimensione memorizza due tipi di variabili relative alle quantità che si accumulano lungo i percorsi:
- Variabili di trasporto pubblico: l'aumento o la diminuzione della quantità in ogni fase della
un percorso.
Se
i -> j
è un passaggio in un percorso, la variabile di trasporto pubblico èi
,j
della matrice di transito (per una richiamata del trasporto pubblico) o semplicemente il valore di callback nella posizione i (se il callback dipende da una sola località). - Variabili cumulative: la quantità totale accumulata in ciascuna località. Tu
può accedere alla variabile cumulativa nella posizione i
dimension_name.CumulVar(i)
. Per un esempio, vedi limiti della finestra temporale nell'esempio di VRPTW.
Supponendo che un veicolo vada dalla località i
a quella j
in un solo passaggio, il
slack è correlato a queste variabili come segue:
slack(i) = cumul(j) - cumul(i) - transit(i, j)
Per ulteriori dettagli sulle dimensioni, consulta
RoutingDimension
nella sezione dei riferimenti.