Interpreta la risposta dell'API Route Optimization… con i cani

Sviluppatori dello Spazio economico europeo (SEE)

Nota per la produzione

Per semplicità, questa guida utilizza REST e JSON. Tuttavia, per l'ambiente di produzione, il consiglio generale è utilizzare gRPC e le librerie client per ottenere prestazioni migliori. Per saperne di più, consulta le librerie client dell'API Route Optimization.

Dopo aver inviato la richiesta in Effettua la tua prima richiesta, l'ottimizzatore restituisce un OptimizeToursResponse. Questa risposta è il piano di percorso che il conducente deve seguire. Questa guida ti mostra come leggerlo.

Riepilogo del piano di percorso

Per lo scenario dell'asilo per cani, l'ottimizzatore assegna il bovaro del bernese e il chihuahua al tuo furgone e salta il pastore tedesco. Il piano del percorso del tuo conducente è il seguente:

  • Inizia il turno alle 07:55 presso l'asilo nido.
  • Andare a prendere il bovaro del bernese vicino alla Coit Tower alle 08:20.
  • Prendi il chihuahua al South Sunset Playground Park alle 08:58.
  • Torna all'asilo alle 09:24 e aspetta fino all'apertura della finestra di consegna alle 09:30.
  • Porta il bovaro del bernese alle 09:30.
  • Lascia il chihuahua alle 09:35.
  • Termina il turno alle 09:40.

Il piano di percorso costa 147,22 $, inclusa una penale di 100 $per aver saltato il pastore tedesco.

Per controllare i risultati, confronta la tua risposta con quella dell'esempio completo. I risultati potrebbero differire leggermente perché i tempi di percorrenza e le distanze dipendono dai dati stradali attuali.

Esempio di risposta completa

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T15:55:04Z",
      "vehicleEndTime": "2024-02-13T17:40:00Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T16:20:00Z",
          "detour": "0s",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2024-02-13T16:58:12Z",
          "detour": "2600s",
          "shipmentLabel": "Chihuahua",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          "startTime": "2024-02-13T17:30:00Z",
          "detour": "2297s",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "DELIVER_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          "startTime": "2024-02-13T17:35:00Z",
          "detour": "656s",
          "shipmentLabel": "Chihuahua",
          "visitType": "DELIVER_SHIPMENT"
        }
      ],
      "transitions": [
        {
          "travelDuration": "1496s",
          "travelDistanceMeters": 7082,
          "waitDuration": "0s",
          "totalDuration": "1496s",
          "startTime": "2024-02-13T15:55:04Z"
        },
        {
          "travelDuration": "1992s",
          "travelDistanceMeters": 16589,
          "waitDuration": "0s",
          "totalDuration": "1992s",
          "startTime": "2024-02-13T16:25:00Z"
        },
        {
          "travelDuration": "1252s",
          "travelDistanceMeters": 7860,
          "waitDuration": "356s",
          "totalDuration": "1608s",
          "startTime": "2024-02-13T17:03:12Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2024-02-13T17:35:00Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2024-02-13T17:40:00Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "4740s",
        "waitDuration": "356s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "6296s",
        "travelDistanceMeters": 31531,
        "performedShipmentPenaltyCostSum": 2000
      },
      "routeCosts": {
        "model.vehicles.cost_per_hour": 47.22
      },
      "routeTotalCost": 47.22,
      "vehicleFullness": {
        "maxFullness": 0.3497777777777778,
        "activeSpan": 0.3497777777777778
      }
    }
  ],
  "skippedShipments": [
    {
      "index": 2,
      "label": "German shepherd",
      "penaltyCost": 100
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "4740s",
      "waitDuration": "356s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "6296s",
      "travelDistanceMeters": 31531,
      "performedShipmentPenaltyCostSum": 2000
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2024-02-13T15:55:04Z",
    "latestVehicleEndTime": "2024-02-13T17:40:00Z",
    "totalCost": 147.22,
    "costs": {
      "model.vehicles.cost_per_hour": 47.22,
      "model.shipments.penalty_cost": 100
    }
  }
}
    

Struttura della risposta

OptimizeToursResponse ha un oggetto ShipmentRoute con un tipo di messaggio visits e un oggetto Metrics con aggregatedRouteMetrics e totalCost.

OptimizeToursResponse contiene due componenti principali:

  • routes: il piano di percorso per ogni veicolo della tua flotta, inclusi l'ordine e gli orari di ogni ritiro e consegna. Hai un furgone, quindi c'è un piano di percorso.
  • metrics: un riepilogo dell'intero piano di percorso, inclusi il costo totale, la durata e la distanza.

Poiché l'ottimizzatore ignora il pastore tedesco, la risposta include anche skippedShipments.

Le sezioni seguenti mostrano dove trovare ogni dettaglio del riepilogo del piano di percorso nella risposta.

Quale veicolo percorre quale percorso?

L'ottimizzatore genera un piano di percorso (l'array routes) che corrisponde all'ordine di vehicles nella richiesta.

Il campo vehicleIndex identifica ogni veicolo in base alla sua posizione con base zero, che per il tuo furgone è 0. I campi vehicleStartTime e vehicleEndTime indicano al conducente quando iniziare e terminare il turno.

L'API Route Optimization restituisce i timestamp in formato UTC, contrassegnati dal suffisso Z, indipendentemente dall'offset nella richiesta. Per ottenere l'ora di San Francisco, sottrai 8 ore. Per il tuo furgone, il turno va dalle 07:55 alle 09:40, come mostrato nel seguente esempio di codice.

{
"routes": [
    {
    // "vehicleIndex": 0, // Omitted in actual JSON response because it's 0
    "vehicleStartTime": "2024-02-13T15:55:04Z",
    "vehicleEndTime": "2024-02-13T17:40:00Z",
    ...
    }
  ]
  ...
}

Qual è l'ordine di ritiro e consegna?

All'interno di ogni percorso, l'array visits contiene ogni ritiro e consegna per il veicolo assegnato in ordine cronologico.

Il valore shipmentIndex di ogni visita è la posizione della spedizione basata su zero nella tua richiesta: 0 è il bovaro del bernese e 1 è il chihuahua. Il campo shipmentLabel mostra l'etichetta impostata per ogni spedizione.

Per distinguere tra un ritiro e una consegna, puoi controllare i campi visitType o isPickup:

  • visitType: definisce esplicitamente l'azione di visita.
    • Ritiro: visitType = "PICKUP_SHIPMENT"
    • Consegna: visitType = "DELIVER_SHIPMENT"
  • isPickup: un campo helper booleano.
    • Ritiro: isPickup = true
    • Pubblicazione: isPickup = false (omesso in JSON)

Per determinare la sequenza esatta degli eventi e l'ora di arrivo prevista in ogni località, leggi l'array visits in ordine. La tabella seguente mostra l'azione del piano di route in base all'ordine e ai valori dei campi shipmentIndex, isPickup o visitType e startTime.

Sequenza Valore shipmentIndex Valore isPickup o visitType Valore startTime (UTC) Azione
Prima visita 0 (omesso in JSON) Vero o PICKUP_SHIPMENT 2024-02-13T16:20:00Z Ritiro del bovaro del bernese alle ore 08:20.
Seconda visita 1 Vero o PICKUP_SHIPMENT 2024-02-13T16:58:12Z Prendi il Chihuahua alle 08:58.
Terza visita 0 (omesso in JSON) False (omesso) o DELIVER_SHIPMENT 2024-02-13T17:30:00Z Porta il bovaro del bernese all'asilo per cani alle 09:30.
Quarta visita 1 False (omesso) o DELIVER_SHIPMENT 2024-02-13T17:35:00Z Porta il chihuahua all'asilo per cani alle 09:35.

Il seguente esempio di codice mostra come la risposta fornisce questa sequenza:

{
  "routes": [
    {
      "visits": [
        {
          // "shipmentIndex": 0, // Omitted in actual JSON response because it's 0
          "isPickup": true,
          "startTime": "2024-02-13T16:20:00Z",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2024-02-13T16:58:12Z",
          "shipmentLabel": "Chihuahua",
          "visitType": "PICKUP_SHIPMENT"
        },
        {
          // "shipmentIndex": 0, // Omitted in actual JSON response because it's 0
          // "isPickup": false, // Omitted in actual JSON response because it's false
          "startTime": "2024-02-13T17:30:00Z",
          "shipmentLabel": "Bernese mountain dog",
          "visitType": "DELIVER_SHIPMENT"
        },
        {
          "shipmentIndex": 1,
          // "isPickup": false, // Omitted in actual JSON response because it's false
          "startTime": "2024-02-13T17:35:00Z",
          "shipmentLabel": "Chihuahua",
          "visitType": "DELIVER_SHIPMENT"
        }
      ]
    }
  ]
}

Ogni visita ha anche un visitRequestIndex, ovvero la posizione in base zero dell'opzione di ritiro o consegna scelta dall'ottimizzatore per la spedizione. Ogni cane in questo scenario ha una sola opzione di ritiro e una sola opzione di consegna, quindi visitRequestIndex è sempre 0 e la risposta lo omette.

Cosa succede tra una visita e l'altra?

All'interno di ogni percorso, l'array transitions elenca i dettagli di viaggio tra le visite. Sebbene visits e transitions siano elenchi separati, si alternano nel tempo come segue:

  1. transitions[0] (Guida dall'inizio alla prima visita)
  2. visits[0] (Prima visita)
  3. transitions[1] (In auto dalla prima alla seconda visita)
  4. visits[1] (seconda visita)
  5. ...
  6. visits[N-1] (ultima visita, dove N è il numero totale di visite)
  7. transitions[N] (In auto dall'ultima visita alla fine)

Puoi seguire la sequenza temporale del percorso esaminando il campo startTime in entrambi gli array. Il valore startTime di una transizione indica quando il conducente inizia a viaggiare, mentre il valore startTime di una visita indica quando il conducente inizia il ritiro o la consegna.

Ogni transizione mostra il tempo di percorrenza e la distanza previsti tra le località. La tabella seguente mappa i campi transitions e visits alle azioni del percorso cronologico per lo scenario dell'asilo per cani.

Sequenza Nome campo Valore startTime (UTC) Dettagli Azione
Prima transizione transitions[0] 2024-02-13T15:55:04Z travelDuration: 1496s
travelDistanceMeters: 7082
Guida per 7 km per 25 minuti dal centro diurno per andare a prendere il bovaro del bernese. Il turno inizia alle 07:55.
Prima visita visits[0] 2024-02-13T16:20:00Z shipmentIndex: 0 (omesso in JSON)
isPickup: True
Prendi il bovaro del bernese a partire dalle 08:20. La visita dura 5 minuti.
Seconda transizione transitions[1] 2024-02-13T16:25:00Z travelDuration: 1992s
travelDistanceMeters: 16589
Guida per 17 km per 33 minuti dalla Coit Tower per andare a prendere il chihuahua a partire dalle 08:25.
Seconda visita visits[1] 2024-02-13T16:58:12Z shipmentIndex: 1
isPickup: True
Prendi il chihuahua a partire dalle 08:58. La visita dura 5 minuti.
Terza transizione transitions[2] 2024-02-13T17:03:12Z travelDuration: 1252s
travelDistanceMeters: 7860
waitDuration: 356s
Percorri 8 km per 21 minuti dal parco giochi South Sunset per tornare all'asilo nido a partire dalle 09:03. Arriva alle 09:24 e aspetta 6 minuti per l'apertura della finestra di consegna.
Terza visita visits[2] 2024-02-13T17:30:00Z shipmentIndex: 0 (omesso in JSON)
isPickup: False (omesso in JSON)
Porta il bovaro del bernese all'asilo per cani a partire dalle 09:30. La visita dura 5 minuti.
Quarta transizione transitions[3] 2024-02-13T17:35:00Z travelDuration: 0s
travelDistanceMeters: 0 (omesso in JSON)
Non guidare. Pronto a lasciare il chihuahua al centro diurno alle 09:35.
Quarta visita visits[3] 2024-02-13T17:35:00Z shipmentIndex: 1
isPickup: False (omesso in JSON)
Lascia il chihuahua al centro diurno per cani a partire dalle 09:35. La visita dura 5 minuti.
Quinta transizione transitions[4] 2024-02-13T17:40:00Z travelDuration: 0s
travelDistanceMeters: 0 (omesso in JSON)
Non guidare. Il conducente termina il turno alle 09:40.

Il seguente esempio di codice mostra come la risposta fornisce questa sequenza per transitions[0] e transitions[1]:

{
  "routes": [
    {
      "transitions": [
        {
          "travelDuration": "1496s",
          "travelDistanceMeters": 7082,
          "waitDuration": "0s",
          "totalDuration": "1496s",
          "startTime": "2024-02-13T15:55:04Z"
        },
        {
          "travelDuration": "1992s",
          "travelDistanceMeters": 16589,
          "waitDuration": "0s",
          "totalDuration": "1992s",
          "startTime": "2024-02-13T16:25:00Z"
        },
        ...
      ]
    }
  ]
}

Quanto costa il percorso?

Puoi esaminare diversi campi della risposta a seconda che tu abbia bisogno del costo di un veicolo specifico o del costo totale dell'intera flotta.

La tabella seguente elenca tutti i modi in cui puoi trovare le informazioni sui costi nella risposta:

Genitore Parametro Ambito Descrizione
ShipmentRoute routeCosts Per route Una suddivisione dei componenti di costo specifici (ad esempio il costo orario) per quel percorso specifico.
routeTotalCost Per route Il costo totale calcolato per quel percorso specifico.
Metrics totalCost Totale (tutti i percorsi) Il costo totale aggregato di tutti i percorsi della soluzione.
costs Totale (tutti i percorsi) Una suddivisione dei componenti di costo aggregati per tutti i percorsi della soluzione.

I costi specificati in routeCosts e costs riflettono i vincoli di costo specificati nella richiesta. Per saperne di più, consulta il documento Concetto chiave del modello di costo.

In questo scenario di asilo per cani, poiché hai una spedizione saltata, il costo per percorso e il costo totale aggregato sono diversi. Il costo del percorso include solo i costi associati a quel percorso specifico (la retribuzione del conducente), mentre il costo totale aggregato include anche la penalità per la spedizione saltata. Il seguente esempio di codice mostra dove trovare questi valori nella risposta:

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T15:55:04Z",
      "vehicleEndTime": "2024-02-13T17:40:00Z",
      ...
      "routeCosts": {
        "model.vehicles.cost_per_hour": 47.22
      },
      "routeTotalCost": 47.22
    }
  ],
  "metrics": {
    "totalCost": 147.22,
    "costs": {
      "model.shipments.penalty_cost": 100,
      "model.vehicles.cost_per_hour": 47.22
    },
    ...
  }
}

In base al piano del percorso, il conducente guida il furgone dalle 07:55 alle 09:40, ovvero per circa 1 ora e 45 minuti (6296 secondi). Alla tariffa definita di 27 $l'ora, il costo del percorso è di 47,22 $. Poiché l'ottimizzatore ha saltato la spedizione del pastore tedesco, aggiunge un costo di penalità di 100 $, portando il costo totale aggregato a 147,22 $.

Perché una spedizione è stata saltata?

L'ottimizzatore elenca tutte le spedizioni che non esegue nell'array skippedShipments. Il motivo per cui una spedizione viene saltata dipende dal fatto che tu abbia impostato un penaltyCost:

  • Spedizioni obbligatorie (nessun penaltyCost): l'ottimizzatore non le salta mai solo perché sono costose da eseguire. Ne salta una solo se non riesce a inserire la spedizione in nessun percorso, ad esempio perché la sua finestra temporale è in conflitto con altre spedizioni.
  • Spedizioni facoltative (con un penaltyCost): l'ottimizzatore può anche saltare queste spedizioni quando l'esecuzione costa più della penalità. Puoi impostare costi di penalità diversi per dare la priorità ad alcune spedizioni rispetto ad altre.

In questo scenario, la finestra di ritiro del pastore tedesco è in conflitto con quella del bovaro del bernese. La Coit Tower e Land's End distano 25 minuti, quindi il conducente non può effettuare entrambi i ritiri entro la finestra di 20 minuti. L'ottimizzatore deve saltarne uno. Poiché il pastore tedesco ha il costo di penalità più basso (100 $ rispetto ai 1000 $del cliente normale), l'ottimizzatore lo salta e incorre nella penalità di 100 $.

Il seguente esempio di codice mostra l'oggetto skippedShipments nella risposta:

{
  ...
  "skippedShipments": [
    {
      "index": 2,
      "label": "German shepherd",
      "penaltyCost": 100
    }
  ],
  ...
}

L'oggetto skippedShipments nella risposta contiene i seguenti campi:

  • index: l'indice in base zero della spedizione nella richiesta (2 per la terza spedizione).
  • label: l'etichetta specificata nella richiesta ("German shepherd").
  • penaltyCost: il costo della penalità specificato nella richiesta, che l'API aggiunge al costo totale.

Per evitare che l'ottimizzatore salti una spedizione, allenta il vincolo che causa il conflitto. Ad esempio, chiedi al proprietario del pastore tedesco una finestra di ritiro più flessibile, quindi aggiorna il valore timeWindows per quel ritiro nella tua richiesta.

Campi di risposta nell'esempio

La tabella seguente descrive tutti i campi di risposta restituiti nel OptimizeToursResponse dello scenario di esempio. Anche se non è necessario utilizzare tutti i campi per comprendere il piano di percorso, puoi analizzarli per determinare come modificare OptimizeToursRequest in base alle tue esigenze aziendali. Per saperne di più, consulta Ciclo di vita del piano di percorso.

Puoi filtrare i contenuti per elemento principale o tramite ricerca testuale.

Genitore Parametro Tipo di proprietà Descrizione
OptimizeToursResponse routes Array di oggetti (ShipmentRoute) Contiene l'elenco dei percorsi calcolati per ogni veicolo (uno per veicolo). Per questo scenario di asilo per cani, contiene il piano di percorso dettagliato per il tuo unico furgone.
metrics Oggetto (Metrics) Contiene le metriche complessive della soluzione, aggregate per tutti i percorsi. Per questo scenario di asilo per cani, questo è il riepilogo dei costi e delle durate operative della giornata.
skippedShipments Array di oggetti (SkippedShipment) Contiene l'elenco delle spedizioni che sono state ignorate nella soluzione. In questo scenario, il terzo cane (pastore tedesco) viene saltato.
ShipmentRoute vehicleStartTime Timestamp Si tratta dell'ora in cui il veicolo inizia il suo percorso. Per questo scenario di asilo per cani, il conducente inizia a guidare il furgone alle 07:55.
vehicleEndTime Timestamp Si tratta dell'ora in cui il veicolo termina il suo percorso. In questo scenario di asilo per cani, il conducente termina di guidare il furgone alle 09:40.
visits Array di oggetti (Visit) Questo è l'elenco ordinato dei ritiri e delle consegne lungo il percorso. Per questo scenario di asilo per cani, questa è la sequenza di ritiro e consegna dei due cani.
transitions Array di oggetti (Transition) Questo è l'elenco ordinato di distanza, tempo di viaggio e tempo di attesa tra le visite. Per questo scenario di asilo per cani, vengono mostrati i dettagli della distanza e del tempo di percorrenza tra la Coit Tower, il South Sunset Playground Park e l'asilo.
metrics Oggetto (AggregatedMetrics) Queste sono le metriche specifiche per questa singola route. Per questo scenario di asilo per cani, queste sono le statistiche per questo furgone specifico. Queste metriche si basano sui costi specificati nella richiesta. Per maggiori dettagli, consulta il documento Concetto chiave del modello di costo.
routeCosts Oggetto (mappa) Questa è una suddivisione dei costi specifici per questo percorso. Per questo scenario di asilo per cani, viene mostrato il costo calcolato in base alla retribuzione del conducente di 27 $l'ora.
routeTotalCost Numero Questo è il costo totale per questo percorso specifico. Per questo scenario di asilo per cani, il costo totale è di 47.22 per il percorso di questo furgone.
vehicleFullness Oggetto (VehicleFullness) Si tratta di un'analisi di quanto il veicolo si avvicina ai suoi limiti operativi, come tempo, distanza e carico. Per questo scenario di asilo per cani, solo gli orari di inizio e fine del turno vincolano il conducente, quindi l'ottimizzatore calcola vehicleFullness come la frazione della durata effettiva del percorso e il tempo massimo disponibile per il turno del conducente.
Visit shipmentIndex Numero intero Questo è l'indice in base zero della spedizione nella richiesta originale. Per questo scenario di asilo per cani, 0 rappresenta il bovaro del bernese e 1 rappresenta il chihuahua.
isPickup Booleano Questo campo è true se questa visita è un ritiro. Per questo scenario di asilo per cani, è true quando si ritira un cane e false (o mancante) quando si lascia un cane all'asilo.
startTime Timestamp Questa è l'ora di inizio stimata della visita. Per questo scenario di asilo per cani, questo è il momento in cui il conducente bussa alla porta.
detour Durata Questo è il tempo aggiuntivo che l'ottimizzatore aggiunge al percorso di questa spedizione specifica. Una deviazione è la differenza tra il piano di percorso effettivo e il percorso diretto ideale se il conducente non ha altre spedizioni o attività da completare.

Per questo scenario di asilo per cani, la prima visita, che consiste nel ritiro del bovaro del bernese, ha una deviazione pari a 0 perché il conducente va direttamente dall'asilo per cani a questo ritiro. Per il ritiro del Chihuahua, la deviazione è di 43 minuti perché il conducente ritira prima il Bovaro del Bernese (e impiega 5 minuti per caricarlo).
shipmentLabel Stringa Questa è l'etichetta della richiesta per ogni spedizione. Per questo scenario di asilo per cani, le etichette sono "Chihuahua" o "Bovaro del bernese".
visitType Stringa (Enum) Indica il tipo di visita, che può essere PICKUP_SHIPMENT per i ritiri o DELIVER_SHIPMENT per le consegne. Per questo scenario, è PICKUP_SHIPMENT o DELIVER_SHIPMENT.
Transition travelDuration Durata Questo è il tempo impiegato per spostarsi durante questa transizione tra le visite. Ad esempio, in questo scenario di asilo per cani, il conducente impiega circa 25 minuti per andare dall'asilo alla Coit Tower per andare a prendere il bovaro del bernese.
travelDistanceMeters Numero intero Questa è la distanza percorsa in metri durante questa transizione. Ad esempio, in questo scenario di asilo per cani, il conducente percorre 7 chilometri dall'asilo alla Coit Tower per andare a prendere il bovaro del bernese.
waitDuration Durata Si tratta del tempo trascorso in attesa prima del ritiro o della consegna successivi. Per questo scenario di asilo per cani, il valore è di 6 minuti (356 secondi) per la terza transizione, perché il conducente arriva all'asilo prima dell'apertura della finestra di consegna alle 09:30. Per le altre transizioni, questo valore è 0.
totalDuration Durata Si tratta della durata totale della transizione, inclusi i tempi di guida e di attesa. Ad esempio, il conducente impiega 25 minuti (25 minuti di guida e 0 minuti di attesa) per la prima transizione e 27 minuti (21 minuti di guida e 6 minuti di attesa) per la terza transizione di ritorno all'asilo nido.
startTime Timestamp Questa è l'ora in cui inizia il viaggio. Corrisponde all'ora di completamento della visita precedente (o, per la prima transizione, all'ora di inizio del veicolo). Per lo scenario dell'asilo per cani, la prima transizione inizia alle 07:55, quando il conducente lascia l'asilo, e la seconda transizione inizia alle 08:25, quando il conducente lascia la Coit Tower.
Metrics aggregatedRouteMetrics Oggetto (AggregatedMetrics) Questa è la somma delle metriche di tutti i percorsi. Per questo scenario di asilo per cani, queste sono le metriche totali per il tuo furgone.
usedVehicleCount Numero intero Questo è il numero di veicoli utilizzati nella soluzione. Per questo scenario di asilo per cani, utilizzi un solo furgone.
earliestVehicleStartTime Timestamp Questa è l'ora di inizio più anticipata tra tutti i veicoli. Per questo scenario di asilo per cani, il percorso del furgone inizia alle 07:55.
latestVehicleEndTime Timestamp Questa è l'ora di fine più recente tra tutti i veicoli. Per questo scenario di asilo per cani, il percorso del furgone termina alle 09:40.
totalCost Numero Questo è il costo totale della soluzione. Per questo scenario di asilo per cani, l'intero piano di percorso costa 147.22 per la giornata (inclusi 47.22 di salario del conducente e 100 di penalità per la spedizione saltata).
costs Oggetto (mappa) Si tratta di una suddivisione del costo totale per categoria. Per questo scenario di asilo per cani, l'ottimizzatore ha calcolato il costo del percorso in base al costo orario e al costo della penalità per il pastore tedesco saltato.
AggregatedMetrics performedShipmentCount Numero intero Questo è il numero di spedizioni instradate correttamente. Per questo scenario di asilo per cani, il conducente trasporta due cani.
travelDuration Durata Questo è il tempo totale trascorso in viaggio. In questo scenario di asilo per cani, il conducente viaggia per 79 minuti.
waitDuration Durata Questo è il tempo totale trascorso in attesa. In questo scenario di asilo per cani, il conducente rimane inattivo per 6 minuti (356 secondi) presso l'asilo in attesa dell'apertura della finestra di consegna.
delayDuration Durata Si tratta della durata aggiuntiva che definisci utilizzando gli attributi di transizione, ad esempio il tempo riservato al parcheggio. Per questo scenario di asilo per cani, non hai definito alcun attributo di transizione nella richiesta, quindi questo valore è zero.
breakDuration Durata Questo è il tempo totale trascorso in pausa. Per questo scenario di asilo per cani, non sono previste pause.
visitDuration Durata Questo è il tempo totale trascorso nell'esecuzione dei servizi durante le visite. Per questo scenario di asilo per cani, il tempo è di 20 minuti (5 minuti per visita per 4 visite).
totalDuration Durata È la somma di tutti i componenti della durata. Per questo scenario di asilo per cani, la durata totale è di 105 minuti (6296 secondi).
travelDistanceMeters Numero intero Questa è la distanza totale percorsa in metri. Per questo scenario di asilo per cani, il conducente percorre una distanza totale di 31,5 km.
performedShipmentPenaltyCostSum Doppio Si tratta della somma dei costi di penalità di tutte le spedizioni eseguite. In questo scenario, il valore è 2000 perché il conducente ha preso il bovaro del bernese e il chihuahua (ciascuno con un costo di penalità di 1000).
VehicleFullness maxFullness Numero Questo è il rapporto di utilizzo più elevato tra tutti i campi VehicleFullness. Per questo scenario di asilo per cani, il valore è 0,35 perché il conducente guida il furgone solo per 105 minuti dell'intero turno mattutino, che hai definito come 5 ore nella richiesta.
activeSpan Numero Questo è il rapporto tra la durata totale del turno del conducente e l'orario di apertura del piano di percorso. Un numero inferiore indica che il conducente trascorre meno tempo della giornata lavorativa alla guida del veicolo. Per questo scenario di asilo per cani, il valore è 0,35 perché il conducente guida il furgone per 105 minuti durante il turno di 5 ore.
SkippedShipment index Numero intero Questo è l'indice in base zero della spedizione nella richiesta originale. In questo scenario, 2 rappresenta il pastore tedesco.
label Stringa Questa è l'etichetta che hai specificato per la spedizione nella richiesta.
penaltyCost Numero Questo è il costo della penalità che sostieni quando l'ottimizzatore salta questa spedizione. Corrisponde al valore penaltyCost specificato nella richiesta.