ShipmentModel

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 del routing dei veicoli (somma del costo per tempo totale, del costo per tempo di percorrenza e del costo fisso per tutti i veicoli).
  • le penali per la mancata spedizione.
  • il costo della durata complessiva delle spedizioni
Rappresentazione JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "objectives": [
    {
      object (Objective)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
Campi
shipments[]

object (Shipment)

Insieme di spedizioni che devono essere eseguite nel modello.

vehicles[]

object (Vehicle)

Insieme di veicoli che possono essere utilizzati per eseguire le visite.

objectives[]

object (Objective)

L'insieme di obiettivi per questo modello, che trasformeremo in costi. Se non è vuoto, il modello di input deve essere senza costi. Per ottenere la richiesta modificata, utilizza solvingMode = TRANSFORM_AND_RETURN_REQUEST. Tieni presente che in questo caso la richiesta non verrà risolta. Consulta la documentazione corrispondente.

Sperimentale: per ulteriori dettagli, consulta la pagina https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

globalStartTime

string (Timestamp format)

Ora di inizio e di fine globale del modello: non possono essere considerate valide ore al di fuori di questo intervallo.

L'intervallo di tempo del modello deve essere inferiore a un anno, ovvero globalEndTime e globalStartTime devono essere entro 31.536. 000 secondi l'uno dall'altro.

Quando utilizzi i campi cost_per_*hour, ti consigliamo di impostare questa finestra su un intervallo più piccolo per aumentare le prestazioni (ad es. se modelli un singolo giorno, devi impostare i limiti di tempo globali su quel giorno). Se non impostato, viene utilizzato come valore predefinito 00:00:00 UTC, 1° gennaio 1970 (ovvero secondi: 0, nanos: 0).

Utilizza RFC 3339, in cui l'output generato è sempre con normalizzazione Z e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" o "2014-10-02T15:01:23+05:30".

globalEndTime

string (Timestamp format)

Se non impostato, viene utilizzato come valore predefinito 00:00:00 UTC, 1° gennaio 1971 (ovvero secondi: 31536000, nanos: 0).

Utilizza RFC 3339, in cui l'output generato è sempre con normalizzazione Z e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" o "2014-10-02T15:01:23+05:30".

globalDurationCostPerHour

number

La "durata globale" del piano complessivo è la differenza tra l'ora di inizio effettiva più remota e l'ora di fine effettiva più recente di tutti i veicoli. Gli utenti possono assegnare un costo orario a questa quantità per cercare di ottimizzare, ad esempio, il completamento più rapido del job. Questo costo deve essere nella stessa unità di Shipment.penalty_cost.

durationDistanceMatrices[]

object (DurationDistanceMatrix)

Specifica le matrici di durata e Distance Matrix utilizzate nel modello. Se questo campo è vuoto, verranno utilizzate le distanze di Google Maps o geodetiche, a seconda del valore del campo useGeodesicDistances. Se non è vuoto, useGeodesicDistances non può essere true e né durationDistanceMatrixSrcTags né durationDistanceMatrixDstTags possono essere vuoti.

Esempi di utilizzo:

  • Esistono due località: locA e locB.
  • 1 veicolo che inizia il suo percorso in locA e lo termina in locA.
  • 1 richiesta di visita per il ritiro presso la località B.
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Esistono tre località: locA, locB e locC.
  • 1 veicolo che inizia il percorso in locA e lo termina in locB, utilizzando la matrice "fast".
  • 1 veicolo che inizia il percorso in locB e lo termina in locB, utilizzando la matrice "slow".
  • 1 veicolo che inizia il percorso in locB e lo termina in locB, utilizzando la matrice "fast".
  • 1 richiesta di visita per il ritiro presso locC.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
durationDistanceMatrixSrcTags[]

string

Tag che definiscono le origini delle matrici di durata e Distance Matrix; durationDistanceMatrices(i).rows(j) definisce le durate e le distanze dalle visite con tag durationDistanceMatrixSrcTags(j) ad altre visite nella matrice i.

I tag corrispondono a VisitRequest.tags o Vehicle.start_tags. Un determinato VisitRequest o Vehicle deve corrispondere esattamente a un tag in questo campo. Tieni presente che i tag di origine, destinazione e matrice di un Vehicle possono essere uguali; analogamente, i tag di origine e destinazione di un VisitRequest possono essere uguali. Tutti i tag devono essere diversi e non possono essere stringhe vuote. Se questo campo non è vuoto, durationDistanceMatrices non deve essere vuoto.

durationDistanceMatrixDstTags[]

string

Tag che definiscono le destinazioni delle matrici di durata e Distance Matrix; durationDistanceMatrices(i).rows(j).durations(k) (risp. durationDistanceMatrices(i).rows(j).meters(k)) definisce la durata (risp. la distanza) del viaggio dalle visite con tag durationDistanceMatrixSrcTags(j) alle visite con tag durationDistanceMatrixDstTags(k) nella matrice i.

I tag corrispondono a VisitRequest.tags o Vehicle.start_tags. Un determinato VisitRequest o Vehicle deve corrispondere esattamente a un tag in questo campo. Tieni presente che i tag di origine, destinazione e matrice di un Vehicle possono essere uguali; analogamente, i tag di origine e destinazione di un VisitRequest possono essere uguali. Tutti i tag devono essere diversi e non possono essere stringhe vuote. Se questo campo non è vuoto, durationDistanceMatrices non deve essere vuoto.

transitionAttributes[]

object (TransitionAttributes)

Attributi di transizione aggiunti al modello.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Insiemi di shipment_type incompatibili (vedi ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Insiemi di requisiti shipmentType (vedi ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

Insieme di regole di precedenza che devono essere applicate nel modello.

IMPORTANTE: l'utilizzo delle regole di precedenza limita le dimensioni del problema che può essere ottimizzato. Le richieste che utilizzano regole di precedenza che includono molte spedizioni potrebbero essere rifiutate.

maxActiveVehicles

integer

Vincola il numero massimo di veicoli attivi. Un veicolo è attivo se il suo percorso esegue almeno una spedizione. Questo può essere utilizzato per limitare il numero di percorsi nel caso in cui ci siano meno conducenti che veicoli e il parco veicoli sia eterogeneo. L'ottimizzazione selezionerà quindi il sottoinsieme migliore di veicoli da utilizzare. Deve essere un numero strettamente positivo.

Spedizione

La spedizione di un singolo articolo, da uno dei suoi ritiri a una delle sue consegne. Affinché la spedizione venga considerata come eseguita, un veicolo univoco deve visitare una delle sue località di ritiro (e ridurre di conseguenza le sue capacità residue), quindi visitare una delle sue località di consegna in un secondo momento (e quindi aumentare di nuovo le sue capacità residue di conseguenza).

Rappresentazione JSON
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
Campi
displayName

string

Il nome visualizzato della spedizione definito dall'utente. Può contenere fino a 63 caratteri e può utilizzare caratteri UTF-8.

pickups[]

object (VisitRequest)

Insieme di alternative di ritiro associate alla spedizione. Se non specificato, il veicolo deve solo visitare una località corrispondente alle consegne.

deliveries[]

object (VisitRequest)

Insieme di alternative di consegna associate alla spedizione. Se non specificato, il veicolo deve solo visitare una località corrispondente ai ritiri.

loadDemands

map (key: string, value: object (Load))

Requisiti di carico della spedizione (ad esempio peso, volume, numero di pallet e così via). Le chiavi nella mappa devono essere identificatori che descrivono il tipo di carico corrispondente, idealmente includendo anche 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[]

integer

L'insieme di veicoli che possono eseguire questa spedizione. Se vuoto, tutti i veicoli possono eseguirla. I veicoli sono indicati dal loro indice nell'elenco vehicles di ShipmentModel.

costsPerVehicle[]

number

Specifica il costo sostenuto quando questa spedizione viene consegnata da ciascun veicolo. Se specificato, deve avere:

  • lo stesso numero di elementi di costsPerVehicleIndices. costsPerVehicle[i] corrisponde al veicolo costsPerVehicleIndices[i] del modello.
  • lo stesso numero di elementi dei veicoli nel modello. L'i-esimo elemento corrisponde al veicolo #i del modello.

Questi costi devono essere espressi nella stessa unità di penaltyCost e non devono essere negativi. Lascia vuoto questo campo se non sono presenti costi di questo tipo.

costsPerVehicleIndices[]

integer

Indici dei veicoli a cui si applica costsPerVehicle. Se non è vuoto, deve contenere lo stesso numero di elementi di costsPerVehicle. Un indice del veicolo non può essere specificato più di una volta. Se un veicolo è escluso da costsPerVehicleIndices, il suo costo è pari a zero.

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

Specifica il tempo di deviazione assoluto massimo rispetto al percorso più breve dal ritiro alla consegna. Se specificato, deve essere un valore non negativo e la spedizione deve contenere almeno un ritiro e una consegna.

Ad esempio, supponiamo che t sia il tempo più breve impiegato per andare dall'alternativa di ritiro selezionata direttamente all'alternativa di consegna selezionata. In questo caso, l'impostazione pickupToDeliveryAbsoluteDetourLimit applica:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

Se per la stessa spedizione vengono specificati sia limiti relativi che assoluti, per ogni possibile coppia di ritiro/consegna viene utilizzato il limite più restrittivo. A partire da ottobre 2017, le deviazioni sono supportate solo quando le durate dei viaggi non dipendono dai veicoli.

pickupToDeliveryTimeLimit

string (Duration format)

Specifica la durata massima dall'inizio del ritiro all'inizio della consegna di una spedizione. Se specificato, deve essere un valore non negativo e la spedizione deve contenere almeno un ritiro e una consegna. Questo 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.

shipmentType

string

Stringa non vuota che specifica un "tipo" per questa spedizione. Questa funzionalità può essere utilizzata per definire incompatibilità o requisiti tra shipment_types (vedi shipmentTypeIncompatibilities e shipmentTypeRequirements in ShipmentModel).

A differenza di visitTypes, che viene specificato per una singola visita, tutti i ritiri/consegne appartenenti alla stessa spedizione condividono lo stesso shipmentType.

label

string

Specifica un'etichetta per questa spedizione. Questa etichetta viene riportata nella risposta nel campo shipmentLabel del ShipmentRoute.Visit corrispondente.

ignore

boolean

Se true, salta questa spedizione, ma non applicare un penaltyCost.

Se ignori una spedizione, si verifica un errore di convalida quando nel modello sono presenti shipmentTypeRequirements.

È consentito ignorare una spedizione eseguita in injectedFirstSolutionRoutes o injectedSolutionConstraint; il risolutore rimuove le visite di ritiro/consegna correlate dal percorso di esecuzione. precedenceRules che fanno riferimento a spedizioni ignorate verranno ignorati.

penaltyCost

number

Se la spedizione non viene completata, questa penalità viene aggiunta al costo complessivo dei percorsi. Una spedizione è considerata completata se viene visitata una delle sue 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 penalità non viene specificata, viene considerata infinita, ovvero la spedizione deve essere completata.

pickupToDeliveryRelativeDetourLimit

number

Specifica il tempo di deviazione relativo massimo rispetto al percorso più breve dal ritiro alla consegna. Se specificato, deve essere un valore non negativo e la spedizione deve contenere almeno un ritiro e una consegna.

Ad esempio, supponiamo che t sia il tempo più breve impiegato per andare dall'alternativa di ritiro selezionata direttamente all'alternativa di consegna selezionata. In questo caso, l'impostazione pickupToDeliveryRelativeDetourLimit applica:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

Se per la stessa spedizione vengono specificati sia limiti relativi che assoluti, per ogni possibile coppia di ritiro/consegna viene utilizzato il limite più restrittivo. A partire da ottobre 2017, le deviazioni sono supportate solo quando le durate dei viaggi non dipendono dai veicoli.

VisitRequest

Richiesta di una visita che può essere eseguita da un veicolo: ha una posizione geografica (o due, vedi sotto), orari di apertura e chiusura rappresentati da finestre temporali e una durata del servizio (tempo trascorso dal veicolo una volta arrivato per il ritiro o la consegna delle merci).

Rappresentazione JSON
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string,
  "avoidUTurns": boolean
}
Campi
arrivalLocation

object (LatLng)

La posizione geografica in cui arriva il veicolo quando esegue questa VisitRequest. Se il modello di spedizione ha matrici di distanza della durata, arrivalLocation non deve essere specificato.

arrivalWaypoint

object (Waypoint)

Il waypoint in cui arriva il veicolo durante l'esecuzione di questo VisitRequest. Se il modello di spedizione ha matrici di distanza della durata, arrivalWaypoint non deve essere specificato.

departureLocation

object (LatLng)

La posizione geografica da cui parte il veicolo dopo aver completato questo VisitRequest. Può essere omesso se è uguale a arrivalLocation. Se il modello di spedizione ha matrici di distanza della durata, departureLocation non deve essere specificato.

departureWaypoint

object (Waypoint)

Il waypoint da cui parte il veicolo dopo aver completato questo VisitRequest. Può essere omesso se è uguale a arrivalWaypoint. Se il modello di spedizione ha matrici di distanza della durata, departureWaypoint non deve essere specificato.

tags[]

string

Specifica i tag associati alla richiesta di visita. Non sono consentite stringhe vuote o duplicate.

timeWindows[]

object (TimeWindow)

Finestre temporali che limitano l'ora di arrivo a una visita. Tieni presente che un veicolo può partire al di fuori della finestra temporale di arrivo, ovvero l'ora di arrivo + la durata non devono necessariamente rientrare in una finestra temporale. Ciò può comportare un tempo di attesa se il veicolo arriva prima di TimeWindow.start_time.

L'assenza di TimeWindow indica che il veicolo può eseguire questa visita in qualsiasi momento.

Le finestre temporali devono essere disgiunte, ovvero non devono sovrapporsi o essere adiacenti l'una all'altra e devono essere in ordine crescente.

costPerHourAfterSoftEndTime e softEndTime possono essere impostati solo se esiste una singola finestra temporale.

duration

string (Duration format)

Durata della visita, ovvero il tempo trascorso dal veicolo tra l'arrivo e la partenza (da aggiungere all'eventuale tempo di attesa; vedi timeWindows).

cost

number

Costo per gestire questa richiesta di visita su un percorso del veicolo. Può essere utilizzato per pagare costi diversi per ogni ritiro o consegna alternativi di una spedizione. Questo costo deve essere espresso nella stessa unità di Shipment.penalty_cost e non deve essere negativo.

loadDemands

map (key: string, value: object (Load))

Requisiti di carico di questa richiesta di visita. Questo campo è simile al campo Shipment.load_demands, con la differenza che si applica solo a questo VisitRequest anziché all'intero Shipment. Le richieste elencate qui vengono aggiunte a quelle elencate in Shipment.load_demands.

visitTypes[]

string

Specifica i tipi di visita. Può essere utilizzato per assegnare il tempo aggiuntivo necessario a un veicolo per completare la visita (vedi Vehicle.extra_visit_duration_for_visit_type).

Un tipo può essere visualizzato una sola volta.

label

string

Specifica un'etichetta per questo VisitRequest. Questa etichetta viene riportata nella risposta come visitLabel nel ShipmentRoute.Visit corrispondente.

avoidUTurns

boolean

Specifica se le inversioni a U devono essere evitate nei percorsi in auto in questa località. L'evitamento delle inversioni a U è un'operazione "best effort" e l'evitamento completo non è garantito. Questa è una funzionalità sperimentale e il comportamento è soggetto a modifiche.

Sperimentale: per maggiori dettagli, consulta https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

LatLng

Un oggetto che rappresenta una coppia di latitudine/longitudine. Questo valore è espresso come una coppia di valori double che rappresentano i gradi di latitudine e longitudine. Se non diversamente specificato, questo oggetto deve essere conforme allo standard WGS84. I valori devono rientrare negli intervalli normalizzati.

Rappresentazione JSON
{
  "latitude": number,
  "longitude": number
}
Campi
latitude

number

La latitudine in gradi. Deve essere compreso nell'intervallo [-90.0, +90.0].

longitude

number

La longitudine in gradi. Deve essere compreso nell'intervallo [-180,0, +180,0].

Waypoint

Incapsula un waypoint. I waypoint contrassegnano le località di arrivo e partenza delle richieste di visita, nonché le località di partenza e di arrivo dei veicoli.

Rappresentazione JSON
{
  "sideOfRoad": boolean,
  "vehicleStopover": boolean,

  // The following is a list of mutually exclusive fields. At most one of the
  // fields will be set in a response:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of mutually exclusive fields.
}
Campi
sideOfRoad

boolean

Facoltativo. Indica che la posizione di questo waypoint deve avere una preferenza per la sosta del veicolo su un lato specifico 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 è orientata la località rispetto al centro della strada. Questa opzione non funziona per la modalità di viaggio "A PIEDI".

vehicleStopover

boolean

Indica che la tappa è destinata alla sosta dei veicoli, con l'intenzione di far salire o scendere i passeggeri. Questa opzione funziona solo per la modalità di viaggio "DRIVING" e quando "locationType" è "location".

Sperimentale: il comportamento o l'esistenza di questo campo potrebbero cambiare in futuro.

Diversi modi per rappresentare una località. Di seguito è riportato un elenco di campi che si escludono a vicenda. In una risposta verrà impostato al massimo uno dei campi:
location

object (Location)

Un punto specificato utilizzando le coordinate geografiche, inclusa un'intestazione facoltativa.

placeId

string

L'ID luogo del PDI associato al waypoint.

Quando utilizzi un ID luogo per specificare la località di arrivo o di partenza di una richiesta di visita, utilizza un ID luogo sufficientemente specifico da determinare una località LatLng per la navigazione verso il luogo. Ad esempio, un ID luogo che rappresenta un edificio è adatto, ma un ID luogo che rappresenta una strada è sconsigliato.

Fine dei campi che si escludono a vicenda.

Località

Incapsula una località (un punto geografico e un'intestazione facoltativa).

Rappresentazione JSON
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
Campi
latLng

object (LatLng)

Le coordinate geografiche del waypoint.

heading

integer

La direzione 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 la consegna. I valori della direzione possono essere compresi tra 0 e 360, dove 0 indica una direzione verso nord, 90 indica una direzione verso est e così via.

TimeWindow

Le finestre temporali limitano l'orario di un evento, ad esempio l'ora di arrivo di una visita o l'ora di inizio e di fine di un veicolo.

I limiti rigidi della finestra temporale, startTime e endTime, applicano l'ora di inizio e di fine dell'evento, in modo che startTime <= event_time <= endTime. Il limite inferiore della finestra temporale flessibile, softStartTime, esprime una preferenza per l'evento che si verifica in corrispondenza o dopo softStartTime, sostenendo un costo proporzionale al tempo trascorso prima di softStartTime. Il limite superiore della finestra temporale flessibile, softEndTime, esprime una preferenza per l'evento che si verifica entro o prima di softEndTime, con un costo proporzionale al tempo trascorso dopo softEndTime. startTime, endTime, softStartTime e softEndTime devono rientrare nei 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

string (Timestamp format)

L'ora di inizio della finestra temporale rigida. Se non specificato, verrà impostato su ShipmentModel.global_start_time.

Utilizza RFC 3339, in cui l'output generato è sempre con normalizzazione Z e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" o "2014-10-02T15:01:23+05:30".

endTime

string (Timestamp format)

L'ora di fine della finestra temporale rigida. Se non specificato, verrà impostato su ShipmentModel.global_end_time.

Utilizza RFC 3339, in cui l'output generato è sempre con normalizzazione Z e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" o "2014-10-02T15:01:23+05:30".

softStartTime

string (Timestamp format)

L'ora di inizio flessibile della finestra temporale.

Utilizza RFC 3339, in cui l'output generato è sempre con normalizzazione Z e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" o "2014-10-02T15:01:23+05:30".

softEndTime

string (Timestamp format)

L'ora di fine flessibile della finestra temporale.

Utilizza RFC 3339, in cui l'output generato è sempre con normalizzazione Z e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" o "2014-10-02T15:01:23+05:30".

costPerHourBeforeSoftStartTime

number

Un costo orario aggiunto ad altri costi nel modello se l'evento si verifica prima di softStartTime, calcolato come:

   max(0, softStartTime - t.seconds)
                          * costPerHourBeforeSoftStartTime / 3600,
t being the time of the event.

Questo costo deve essere positivo e il campo può essere impostato solo se è stato impostato softStartTime.

costPerHourAfterSoftEndTime

number

Un costo orario aggiunto ad altri costi nel modello se l'evento si verifica dopo il giorno softEndTime, calcolato come segue:

   max(0, t.seconds - softEndTime.seconds)
                    * costPerHourAfterSoftEndTime / 3600,
t being the time of the event.

Questo costo deve essere positivo e il campo può essere impostato solo se è stato impostato softEndTime.

Veicolo

Modella un veicolo in un problema di spedizione. La risoluzione di un problema di spedizione creerà un percorso che inizia da startLocation e termina in endLocation per questo veicolo. Un percorso è una sequenza di visite (vedi ShipmentRoute).

Rappresentazione JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
Campi
displayName

string

Il nome visualizzato del veicolo definito dall'utente. Può contenere fino a 63 caratteri e può utilizzare caratteri UTF-8.

travelMode

enum (TravelMode)

La modalità di viaggio, che influisce sulle strade utilizzabili dal veicolo e sulla sua velocità. Vedi anche travelDurationMultiple.

routeModifiers

object (RouteModifiers)

Un insieme di condizioni da soddisfare che influiscono sul modo in cui vengono calcolati i percorsi per il veicolo specificato.

startLocation

object (LatLng)

Posizione geografica in cui il veicolo inizia il percorso prima di ritirare le spedizioni. Se non specificato, il veicolo parte dal primo ritiro. Se il modello di spedizione ha matrici di durata e Distance Matrix, startLocation non deve essere specificato.

startWaypoint

object (Waypoint)

Waypoint che rappresenta una posizione geografica in cui il veicolo si trova prima di ritirare le spedizioni. Se non viene specificato né startWaypoint né startLocation, il veicolo parte dal primo ritiro. Se il modello di spedizione ha matrici di durata e Distance Matrix, startWaypoint non deve essere specificato.

endLocation

object (LatLng)

Posizione geografica in cui si trova il veicolo dopo aver completato l'ultima VisitRequest. Se non specificato, il ShipmentRoute del veicolo termina immediatamente quando completa l'ultimo VisitRequest. Se il modello di spedizione ha matrici di durata e Distance Matrix, endLocation non deve essere specificato.

endWaypoint

object (Waypoint)

Waypoint che rappresenta una posizione geografica in cui il veicolo si ferma dopo aver completato l'ultima VisitRequest. Se non vengono specificati né endWaypoint né endLocation, il ShipmentRoute del veicolo termina immediatamente quando completa l'ultimo VisitRequest. Se il modello di spedizione ha matrici di durata e Distance Matrix, endWaypoint non deve essere specificato.

startTags[]

string

Specifica i tag associati all'inizio del percorso del veicolo.

Non sono consentite stringhe vuote o duplicate.

endTags[]

string

Specifica i tag associati alla fine del percorso del veicolo.

Non sono consentite stringhe vuote o duplicate.

startTimeWindows[]

object (TimeWindow)

Finestre temporali durante le quali il veicolo può partire dalla località di partenza. Devono rientrare nei limiti di tempo globali (vedi i campi ShipmentModel.global_*). Se non specificato, non esiste alcuna limitazione oltre ai limiti di tempo globali.

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.

costPerHourAfterSoftEndTime e softEndTime possono essere impostati solo se esiste una singola finestra temporale.

endTimeWindows[]

object (TimeWindow)

Finestre temporali durante le quali il veicolo può arrivare alla località di arrivo. Devono rientrare nei limiti di tempo globali (vedi i campi ShipmentModel.global_*). Se non specificato, non esiste alcuna limitazione oltre ai limiti di tempo globali.

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.

costPerHourAfterSoftEndTime e softEndTime possono essere impostati solo se esiste una singola finestra temporale.

unloadingPolicy

enum (UnloadingPolicy)

Policy di scarico applicata al veicolo.

loadLimits

map (key: string, value: object (LoadLimit))

Capacità del veicolo (ad esempio peso, volume, numero di pallet). Le chiavi nella mappa sono gli identificatori del tipo di carico, coerenti con le chiavi del campo Shipment.load_demands. Se una determinata chiave non è presente in questa mappa, la capacità corrispondente è considerata illimitata.

costPerHour

number

Costi del veicolo: tutti i costi si sommano e devono essere espressi nella stessa unità di Shipment.penalty_cost.

Costo per ora del percorso del veicolo. Questo costo viene applicato al tempo totale impiegato per il percorso e include il tempo di percorrenza, il tempo di attesa e il tempo di visita. L'utilizzo di costPerHour anziché solo di costPerTraveledHour potrebbe comportare una latenza aggiuntiva.

costPerTraveledHour

number

Costo per ora di viaggio del percorso del veicolo. Questo costo viene applicato solo al tempo di percorrenza impiegato dal percorso (ovvero quello indicato in ShipmentRoute.transitions) ed esclude il tempo di attesa e il tempo di visita.

costPerKilometer

number

Costo per chilometro del percorso del veicolo. Questo costo viene applicato alla distanza indicata nel ShipmentRoute.transitions e non si applica alla distanza percorsa implicitamente dal arrivalLocation al departureLocation di un singolo VisitRequest.

fixedCost

number

Costo fisso applicato se questo veicolo viene utilizzato per gestire una spedizione.

usedIfRouteIsEmpty

boolean

Questo campo si applica ai veicoli solo quando il loro percorso non prevede spedizioni. Indica se il veicolo deve essere considerato usato o meno in questo caso.

Se true, il veicolo si sposta dalla località di partenza a quella di arrivo anche se non effettua spedizioni e vengono presi in considerazione i costi di tempo e distanza derivanti dal viaggio dalla località di partenza a quella di arrivo.

In caso contrario, non si sposta dalla posizione di partenza a quella di arrivo e non sono previsti breakRule o ritardi (da TransitionAttributes) per questo veicolo. In questo caso, il campo ShipmentRoute del veicolo non contiene informazioni, ad eccezione dell'indice e dell'etichetta del veicolo.

routeDurationLimit

object (DurationLimit)

Limite applicato alla durata totale del percorso del veicolo. In un determinato OptimizeToursResponse, la durata del percorso di un veicolo è la differenza tra vehicleEndTime e vehicleStartTime.

travelDurationLimit

object (DurationLimit)

Limite applicato alla durata del viaggio del percorso del veicolo. In un determinato OptimizeToursResponse, la durata del percorso è la somma di tutte le sue transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

Limite applicato alla distanza totale del percorso del veicolo. In un determinato OptimizeToursResponse, la distanza del percorso è la somma di tutte le sue transitions.travel_distance_meters.

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

Specifica una mappa dalle stringhe visitTypes alle durate. La durata è il tempo aggiuntivo rispetto a VisitRequest.duration da dedicare alle visite con il visitTypes specificato. Questa durata aggiuntiva della visita comporta un costo se viene specificato costPerHour. Le chiavi (ad es. visitTypes) non possono essere stringhe vuote.

Se una richiesta di visita ha più tipi, verrà aggiunta una durata per ogni tipo nella mappa.

breakRule

object (BreakRule)

Descrive la pianificazione delle pause da applicare a questo veicolo. Se il campo è vuoto, non verranno programmate pause per questo veicolo.

label

string

Specifica un'etichetta per questo veicolo. Questa etichetta viene riportata nella risposta come vehicleLabel del ShipmentRoute corrispondente.

ignore

boolean

Se true, usedIfRouteIsEmpty deve essere false e questo veicolo rimarrà inutilizzato.

Se una spedizione viene eseguita da un veicolo ignorato in injectedFirstSolutionRoutes, viene saltata nella prima soluzione, ma può essere eseguita nella risposta.

Se una spedizione viene eseguita da un veicolo ignorato in injectedSolutionConstraint e qualsiasi ritiro/consegna correlato è vincolato a rimanere sul veicolo (ovvero non è stato ridotto al livello RELAX_ALL_AFTER_THRESHOLD), viene ignorato nella risposta. Se una spedizione ha un campo allowedVehicleIndices non vuoto e tutti i veicoli consentiti vengono ignorati, la spedizione viene saltata nella risposta.

travelDurationMultiple

number

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, significa che questo veicolo è più lento e ha tempi di percorrenza doppi rispetto ai veicoli standard. Questo multiplo non influisce sulla durata delle visite. Influisce sul costo se vengono specificati costPerHour o costPerTraveledHour. Deve essere compreso nell'intervallo [0,001, 1000,0]. Se non viene impostato, il veicolo è standard e questo multiplo è considerato 1, 0.

ATTENZIONE: i tempi di percorrenza verranno arrotondati al secondo più vicino dopo l'applicazione di questo multiplo, ma prima di eseguire qualsiasi operazione numerica. Pertanto, un multiplo piccolo potrebbe comportare una perdita di precisione.

Vedi anche extraVisitDurationForVisitType di seguito.

TravelMode

Modalità di viaggio che possono essere utilizzate dai veicoli.

Queste dovrebbero essere un sottoinsieme delle modalità di viaggio dell'API Routes di Google Maps Platform, consulta: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode

Nota: i percorsi WALKING sono in versione beta e a volte potrebbero non avere marciapiedi o percorsi pedonali chiari. Devi mostrare questo avviso all'utente per tutti i percorsi a piedi che mostri nella tua app.

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.
TWO_WHEELER Veicolo motorizzato a due ruote. Ad esempio, una moto. Questa modalità di viaggio è supportata solo nei paesi elencati in Paesi e regioni supportati per i veicoli a due ruote.

RouteModifiers

Incapsula un insieme di condizioni facoltative da soddisfare durante il calcolo dei percorsi dei veicoli. Questo è 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

boolean

Specifica se evitare le strade a pedaggio, se possibile. Verrà data la preferenza ai percorsi che non contengono strade a pedaggio. Si applica solo alle modalità di viaggio motorizzate.

avoidHighways

boolean

Specifica se evitare le autostrade, se possibile. Verrà data la preferenza ai percorsi che non contengono autostrade. Si applica solo alle modalità di viaggio motorizzate.

avoidFerries

boolean

Specifica se evitare i traghetti, se ragionevole. Verrà data la preferenza ai percorsi che non prevedono l'utilizzo di traghetti. Si applica solo alle modalità di viaggio motorizzate.

avoidIndoor

boolean

Facoltativo. Specifica se evitare la navigazione in ambienti chiusi, se possibile. Verrà data la preferenza ai percorsi che non contengono la navigazione interna. Si applica solo alla modalità di viaggio WALKING.

UnloadingPolicy

Policy su come un veicolo può essere scaricato. Si applica solo alle spedizioni che prevedono sia il ritiro che la consegna.

Le altre spedizioni possono essere effettuate in qualsiasi punto del percorso, indipendentemente da unloadingPolicy.

Enum
UNLOADING_POLICY_UNSPECIFIED Policy di scarico non specificata; le consegne devono avvenire 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 (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string,
  "costPerKilometer": {
    object (LoadCost)
  },
  "costPerTraveledHour": {
    object (LoadCost)
  }
}
Campi
softMaxLoad

string (int64 format)

Un limite flessibile del carico. Leggi i costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

Se il carico supera softMaxLoad lungo il percorso di questo veicolo, viene applicata la seguente penalità di costo (solo una volta per veicolo): (carico - softMaxLoad) * costPerUnitAboveSoftMax. Tutti i costi si sommano e devono essere espressi nella stessa unità di Shipment.penalty_cost. I limiti flessibili possono essere definiti solo per i tipi che si applicano solo ai ritiri o solo alle consegne in tutto il modello.

startLoadInterval

object (Interval)

L'intervallo di carico accettabile del veicolo all'inizio del percorso.

endLoadInterval

object (Interval)

L'intervallo di carico accettabile del veicolo alla fine del percorso.

maxLoad

string (int64 format)

La quantità massima di carico accettabile.

costPerKilometer

object (LoadCost)

Costo dello spostamento di un'unità di carico per un chilometro per questo veicolo. Questo valore può essere utilizzato come proxy per il consumo di carburante: se il carico è un peso (in Newton), il carico*chilometro ha la dimensione di un'energia.

Sperimentale: per maggiori dettagli, consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

costPerTraveledHour

object (LoadCost)

Costo del viaggio con un'unità di carico per un'ora per questo veicolo.

Sperimentale: per maggiori dettagli, consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Intervallo

Intervallo di importi di ricarica accettabili.

Rappresentazione JSON
{
  "min": string,
  "max": string
}
Campi
min

string (int64 format)

Un carico minimo accettabile. Deve essere ≥ 0. Se vengono specificati entrambi, min deve essere ≤ max.

max

string (int64 format)

Un carico massimo accettabile. Deve essere ≥ 0. Se non specificato, il carico massimo non è limitato da questo messaggio. Se vengono specificati entrambi, min deve essere ≤ max.

LoadCost

Costo dello spostamento di un'unità di carico durante un Transition. Per un determinato carico, il costo è la somma di due parti:

  • min(load, loadThreshold) * costPerUnitBelowThreshold
  • max(0, carico - loadThreshold) * costPerUnitAboveThreshold

Con questo costo, le soluzioni preferiscono consegnare prima le domande elevate o, in modo equivalente, ritirare per ultime le domande elevate. Ad esempio, se un veicolo ha

load_limit {
  key: "weight"
  value {
    costPerKilometer {
      loadThreshold: 15
      costPerUnitBelowThreshold: 2.0
      costPerUnitAboveThreshold: 10.0
    }
  }
}

e il suo percorso è inizio,ritiro,ritiro,consegna,consegna,fine 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 }

allora il costo sostenuto da questo LoadCost è (cost_below * load_below * chilometri + cost_above * load_above * chilometri)

  • 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 il valore di LoadCost lungo il percorso è 120,0.

Tuttavia, se il percorso è inizio,ritiro,consegna,ritiro,consegna,fine 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

In questo caso, il valore di LoadCost sul percorso è 40,0.

LoadCost rende più costose le soluzioni con transizioni con carichi pesanti.

Sperimentale: per maggiori dettagli, consulta https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Rappresentazione JSON
{
  "loadThreshold": string,
  "costPerUnitBelowThreshold": number,
  "costPerUnitAboveThreshold": number
}
Campi
loadThreshold

string (int64 format)

Quantità di carico al di sopra della quale il costo di spostamento di un'unità di carico cambia da costPerUnitBelowThreshold a costPerUnitAboveThreshold. Deve essere >= 0.

costPerUnitBelowThreshold

number

Costo dello spostamento di un'unità di carico, per ogni unità compresa tra 0 e la soglia. Deve essere un valore finito e >= 0.

costPerUnitAboveThreshold

number

Costo dello spostamento di un'unità di carico, per ogni unità superiore alla soglia. Nel caso speciale in cui la soglia è pari a 0, si tratta di un costo fisso per unità. Deve essere un valore finito e >= 0.

DurationLimit

Un limite che definisce la durata massima del percorso di un veicolo. Può essere rigido o morbido.

Quando viene definito un campo di limite flessibile, devono essere definiti insieme sia la soglia massima flessibile sia il costo associato.

Rappresentazione JSON
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
Campi
maxDuration

string (Duration format)

Un limite rigido che limita la durata a un massimo di maxDuration.

softMaxDuration

string (Duration format)

Un limite flessibile che non impone un limite di durata massima, ma che, se violato, comporta un costo per il percorso. Questo costo si aggiunge agli altri costi definiti nel modello, con la stessa unità.

Se definito, softMaxDuration deve essere non negativo. Se è definito anche maxDuration, softMaxDuration deve essere inferiore a maxDuration.

quadraticSoftMaxDuration

string (Duration format)

Un limite flessibile che non impone un limite di durata massima, ma che, se violato, comporta un costo per il percorso, quadratico nella durata. Questo costo si aggiunge agli altri costi definiti nel modello, con la stessa unità.

Se quadraticSoftMaxDuration è impostato, devono essere soddisfatte le seguenti condizioni:

  • Deve essere un valore non negativo.
  • maxDuration deve essere definito.
  • quadraticSoftMaxDuration deve essere inferiore a maxDuration.
  • La differenza non deve essere superiore a un giorno: maxDuration - quadraticSoftMaxDuration <= 86400 seconds
costPerHourAfterSoftMax

number

Costo orario sostenuto se la soglia softMaxDuration viene violata. Il costo aggiuntivo è pari a 0 se la durata è inferiore alla soglia, altrimenti il costo dipende dalla durata come segue:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

Il costo deve essere non negativo.

costPerSquareHourAfterQuadraticSoftMax

number

Costo per ora al quadrato sostenuto se viene violata la soglia quadraticSoftMaxDuration.

Il costo aggiuntivo è pari a 0 se la durata è inferiore alla soglia, altrimenti il costo dipende dalla durata come segue:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

Il costo deve essere non negativo.

DistanceLimit

Un limite che definisce una distanza massima che può essere percorsa. Può essere rigido o morbido.

Se viene definito un limite flessibile, devono essere definiti sia softMaxMeters che costPerKilometerAboveSoftMax e devono essere non negativi.

Rappresentazione JSON
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
Campi
maxMeters

string (int64 format)

Un limite rigido che limita la distanza a un massimo di maxMeters. Il limite deve essere non negativo.

softMaxMeters

string (int64 format)

Un limite flessibile che non impone un limite di distanza massima, ma che, se violato, comporta un costo che si aggiunge ad altri costi definiti nel modello, con la stessa unità.

Se definito, softMaxMeters deve essere inferiore a maxMeters e non negativo.

costPerKilometerBelowSoftMax

number

Costo per chilometro sostenuto, fino a softMaxMeters, con la formula:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Questo costo non è supportato in routeDistanceLimit.

costPerKilometerAboveSoftMax

number

Costo per chilometro sostenuto se la distanza supera il limite di softMaxMeters. Il costo aggiuntivo è pari a 0 se la distanza è inferiore al limite, altrimenti la formula utilizzata per calcolare il costo è la seguente:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

Il costo deve essere non negativo.

BreakRule

Regole per generare pause per un veicolo (ad es. pause pranzo). Una pausa è un periodo di tempo contiguo durante il quale il veicolo rimane inattivo nella sua posizione attuale e non può eseguire alcuna visita. Un'interruzione può verificarsi:

  • Durante il viaggio tra due visite (che include il tempo immediatamente prima o immediatamente dopo una visita, ma non nel mezzo di una visita), nel qual caso estende il tempo di transito corrispondente tra le visite.
  • o prima dell'ora di inizio del veicolo (il veicolo non può partire nel mezzo di una pausa), nel qual caso non influisce sull'ora di inizio del veicolo.
  • o dopo la fine del veicolo (lo stesso vale per l'ora di fine del veicolo).
Rappresentazione JSON
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Campi
breakRequests[]

object (BreakRequest)

Sequenza di interruzioni. Consulta il messaggio BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

Potrebbero essere applicati diversi FrequencyConstraint. Devono essere tutte soddisfatte dai BreakRequest di questo BreakRule. Vedi FrequencyConstraint.

BreakRequest

La sequenza delle pause (ovvero il loro numero e ordine) che si applicano a ogni veicolo deve essere nota in anticipo. I BreakRequest ripetuti definiscono la sequenza, nell'ordine in cui devono verificarsi. Le loro finestre temporali (earliestStartTime/latestStartTime) possono sovrapporsi, ma devono essere compatibili con l'ordine (questo viene verificato).

Rappresentazione JSON
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
Campi
earliestStartTime

string (Timestamp format)

Obbligatorio. Limite inferiore (incluso) all'inizio della pausa.

Utilizza RFC 3339, in cui l'output generato è sempre con normalizzazione Z e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" o "2014-10-02T15:01:23+05:30".

latestStartTime

string (Timestamp format)

Obbligatorio. Limite superiore (incluso) per l'inizio della pausa.

Utilizza RFC 3339, in cui l'output generato è sempre con normalizzazione Z e utilizza 0, 3, 6 o 9 cifre frazionarie. Sono accettati anche offset diversi da "Z". Esempi: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" o "2014-10-02T15:01:23+05:30".

minDuration

string (Duration format)

Obbligatorio. Durata minima dell'interruzione. Deve essere positivo.

FrequencyConstraint

È possibile limitare ulteriormente la frequenza e la durata delle pause specificate sopra applicando una frequenza minima delle pause, ad esempio "Deve essere prevista una pausa di almeno 1 ora ogni 12 ore". Supponendo che questo possa essere interpretato come "All'interno di qualsiasi finestra temporale scorrevole di 12 ore, deve esserci almeno una pausa di almeno un'ora", l'esempio si tradurrebbe nel seguente FrequencyConstraint:

{
   minBreakDuration { seconds: 3600 }         # 1 hour.
   maxInterBreakDuration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

La tempistica e la durata delle pause 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 a interruzioni non consecutive. Ad esempio, la seguente pianificazione rispetta l'esempio "1 ora ogni 12 ore":

  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

string (Duration format)

Obbligatorio. Durata minima dell'interruzione per questo vincolo. Non negativo. Visualizza la descrizione di FrequencyConstraint.

maxInterBreakDuration

string (Duration format)

Obbligatorio. Durata massima consentita di qualsiasi intervallo di tempo nel percorso che non includa, almeno parzialmente, una pausa di duration >= minBreakDuration. Deve essere positivo.

Obiettivo

Gli obiettivi sostituiscono completamente il modello di costo e, pertanto, non sono compatibili con i costi preesistenti. Ogni obiettivo corrisponde a un numero di costi predefiniti, ad esempio per veicoli, spedizioni o attributi di transizione.

Sperimentale: per ulteriori dettagli, consulta la pagina https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

Rappresentazione JSON
{
  "type": enum (Type),
  "weight": number
}
Campi
type

enum (Type)

Il tipo di obiettivo.

weight

number

Quanto deve contare questo obiettivo rispetto agli altri. Può essere qualsiasi numero non negativo; la somma dei pesi non deve essere necessariamente pari a 1. Il valore predefinito dei pesi è 1,0.

Tipo

Il tipo di obiettivo che verrà mappato a un insieme di costi.

Enum
DEFAULT Verrà utilizzato un insieme di costi predefinito per garantire una soluzione ragionevole. Nota: questo obiettivo può essere utilizzato da solo, ma verrà sempre aggiunto con un peso di 1,0, come base di riferimento, agli obiettivi specificati dall'utente, se non è già presente.
MIN_DISTANCE "MIN". Ridurre al minimo la distanza totale percorsa.
MIN_WORKING_TIME Ridurre al minimo il tempo di lavoro totale, sommato per tutti i veicoli.
MIN_TRAVEL_TIME Come sopra, ma concentrandosi solo sul tempo di percorrenza.
MIN_NUM_VEHICLES Ridurre al minimo il numero di veicoli utilizzati.

DurationDistanceMatrix

Specifica una matrice di durata e Distance Matrix dalle località di partenza delle visite e dei veicoli alle località di arrivo delle visite e dei veicoli.

Rappresentazione JSON
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
Campi
rows[]

object (Row)

Specifica le righe della matrice di durata e distanza. Deve avere lo stesso numero di elementi di ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

Tag che definisce i veicoli a cui si applica questa Distance Matrix di durata e distanza. Se non viene specificato, si applica a tutti i veicoli e può esistere una sola matrice.

Ogni partenza del veicolo deve corrispondere esattamente a una matrice, ovvero esattamente uno dei campi startTags deve corrispondere al campo vehicleStartTag di una matrice (e solo di quella matrice).

Tutte le matrici devono avere un vehicleStartTag diverso.

Riga

Specifica una riga della matrice di durata e distanza.

Rappresentazione JSON
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
Campi
durations[]

string (Duration format)

Valori di durata per una determinata riga. Deve avere lo stesso numero di elementi di ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

number

Valori di distanza per una determinata riga. Se nessun costo o vincolo fa riferimento alle distanze nel modello, questo campo può essere lasciato vuoto; in caso contrario, deve contenere lo stesso numero di elementi di durations.

TransitionAttributes

Specifica gli attributi delle transizioni tra due visite consecutive su un percorso. A una stessa transizione possono essere applicati più TransitionAttributes: in questo caso, tutti i costi aggiuntivi vengono sommati e viene applicato il vincolo o il limite più restrittivo (seguendo la semantica naturale "AND").

Rappresentazione JSON
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
Campi
srcTag

string

Tag che definiscono l'insieme di transizioni (src->dst) a cui si applicano questi attributi.

Una visita di origine o una partenza del veicolo corrisponde se e solo se il relativo VisitRequest.tags o Vehicle.start_tags contiene srcTag o non contiene excludedSrcTag (a seconda di quale di questi due campi non è vuoto).

excludedSrcTag

string

Leggi i srcTag. Esattamente uno tra srcTag e excludedSrcTag non deve essere vuoto.

dstTag

string

Una visita alla destinazione o una fine del veicolo corrisponde se il relativo VisitRequest.tags o Vehicle.end_tags contiene dstTag o non contiene excludedDstTag (a seconda di quale di questi due campi non è vuoto).

excludedDstTag

string

Leggi i dstTag. Esattamente uno tra dstTag e excludedDstTag non deve essere vuoto.

cost

number

Specifica un costo per l'esecuzione di questa transizione. Deve essere nella stessa unità di tutti gli altri costi del modello e non deve essere negativo. Viene applicata in aggiunta a tutti gli altri costi esistenti.

costPerKilometer

number

Specifica un costo per chilometro applicato alla distanza percorsa durante l'esecuzione di questa transizione. Si somma a qualsiasi Vehicle.cost_per_kilometer specificato sui veicoli.

distanceLimit

object (DistanceLimit)

Specifica un limite per la distanza percorsa durante l'esecuzione di questa transizione.

A partire da giugno 2021, sono supportati solo i limiti flessibili.

delay

string (Duration format)

Specifica un ritardo che si verifica 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.

ShipmentTypeIncompatibility

Specifica le incompatibilità tra le spedizioni in base al relativo shipmentType. La presenza di spedizioni incompatibili sullo stesso percorso è limitata in base alla modalità di incompatibilità.

Rappresentazione JSON
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
Campi
types[]

string

Elenco dei tipi non compatibili. Due spedizioni con shipment_types diversi tra quelli elencati sono "incompatibili".

incompatibilityMode

enum (IncompatibilityMode)

Modalità applicata all'incompatibilità.

IncompatibilityMode

Modalità che definiscono il modo in cui l'aspetto delle spedizioni incompatibili è limitato 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

In questa modalità, due spedizioni con tipi incompatibili non possono mai trovarsi sullo stesso veicolo contemporaneamente:

  • Possono condividere lo stesso veicolo solo se uno viene consegnato prima che l'altro venga ritirato.
  • Quando entrambe le spedizioni sono solo ritiri (nessuna consegna) o solo consegne (nessun ritiro), non possono condividere lo stesso veicolo.

ShipmentTypeRequirement

Specifica i requisiti tra le spedizioni in base al relativo shipmentType. Le specifiche del requisito sono definite dalla modalità del requisito.

Rappresentazione JSON
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
Campi
requiredShipmentTypeAlternatives[]

string

Elenco dei tipi di spedizione alternativi richiesti da dependentShipmentTypes.

dependentShipmentTypes[]

string

Tutte le spedizioni con un tipo nel campo dependentShipmentTypes richiedono che almeno una spedizione di tipo requiredShipmentTypeAlternatives venga visitata sullo stesso percorso.

NOTA: non sono consentite catene di requisiti in cui un shipmentType dipende da se stesso.

requirementMode

enum (RequirementMode)

Modalità applicata al requisito.

RequirementMode

Modalità che definiscono l'aspetto delle spedizioni dipendenti su un percorso.

Enum
REQUIREMENT_MODE_UNSPECIFIED Modalità di 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 "richieste".
IN_SAME_VEHICLE_AT_PICKUP_TIME

Con la modalità IN_SAME_VEHICLE_AT_PICKUP_TIME, tutte le spedizioni "dipendenti" devono avere almeno una spedizione "obbligatoria" sul veicolo al momento del ritiro.

Un ritiro della spedizione "dipendente" deve quindi avere:

  • Una spedizione "obbligatoria" di sola consegna consegnata lungo il percorso dopo, oppure
  • Una spedizione "obbligatoria" ritirata sul percorso prima di questa e, se la spedizione "obbligatoria" ha una consegna, questa deve essere eseguita dopo il ritiro della spedizione "dipendente".
IN_SAME_VEHICLE_AT_DELIVERY_TIME Come prima, con la differenza 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 è 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 a eventi 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 spedizioni, altrimenti vengono ignorate.

Rappresentazione JSON
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
Campi
firstIsDelivery

boolean

Indica se il "primo" evento è una consegna.

secondIsDelivery

boolean

Indica se il "secondo" evento è una consegna.

offsetDuration

string (Duration format)

L'offset tra il "primo" e il "secondo" evento. Può essere negativo.

firstIndex

integer

Indice della spedizione del "primo" evento. Questo campo deve essere specificato.

secondIndex

integer

Indice della spedizione del "secondo" evento. Questo campo deve essere specificato.