Finestre temporali

Le finestre temporali sono presenti in `ShipmentModel`, in `Shipment` negli oggetti di ritiro e consegna e in `Vehicle`.

Le finestre temporali specificano la tempistica degli eventi su un percorso. Questi eventi possono includere l'inizio e la fine del percorso di un conducente, gli orari di ritiro e i tempi di consegna programmati o la durata di un intero percorso.

Le finestre temporali possono supportare obiettivi come:

  • Dai la priorità al completamento dei ritiri e delle consegne entro i periodi di tempo specificati.
  • Pianifica i percorsi in modo che rientrino nell'orario di apertura complessivo.
  • Assicurati che i veicoli inizino e terminino i percorsi entro i periodi di tempo specificati.

Struttura

Come mostrato nel diagramma, le finestre temporali sono strutturate come segue:

Elenco di controllo di Essentials

Il seguente elenco di controllo descrive le conoscenze essenziali per evitare potenziali errori relativi alle finestre temporali. Questo elenco può aiutarti a convalidare la tua richiesta e a risolvere i problemi relativi alla risposta.

Proprietà

La tabella seguente descrive le proprietà della finestra temporale globale.

Proprietà Formato Descrizione
globalStartTime Timestamp L'ora più remota per un evento.
globalEndTime Timestamp L'ora più recente per qualsiasi evento.

La tabella seguente descrive le proprietà delle finestre temporali per spedizioni e veicoli.

Genitore Proprietà Formato Descrizione
Shipment.pickups timeWindows Array di tipi di messaggi TimeWindow. Specifica gli intervalli di tempo per il ritiro di una spedizione.
Shipment.deliveries timeWindows Specifica gli intervalli di tempo per la consegna di una spedizione.
Vehicle startTimeWindows Specifica l'ora di inizio del programma di funzionamento di un veicolo.
endTimeWindows Specifica l'ora di fine del programma di funzionamento di un veicolo.

La tabella seguente descrive le proprietà di un tipo di messaggio TimeWindow.

Proprietà Formato Descrizione
startTime Stringa (formato "Zulu" UTC RFC3339) L'inizio di un intervallo di tempo.
endTime Stringa (formato "Zulu" UTC RFC3339) La fine di un intervallo di tempo.

Esempi

Questa sezione illustra tre tipi di esempi:

Esempi di codice

Le sezioni seguenti mostrano esempi di codice di diversi tipi di finestre temporali.

Finestre temporali globali

Il seguente esempio di codice mostra la struttura delle finestre temporali globali:

{
  "model": {
    "globalStartTime": "YYYY-MM-DDTHH:MM:SSZ",
    "globalEndTime": "YYYY-MM-DDTHH:MM:SSZ",
    "shipments": [ ... ],
    "vehicles": [ ... ]
  }
}

Finestre temporali per ritiri e tempi di consegna

Il seguente esempio di codice mostra la struttura delle finestre temporali nei ritiri e nelle consegne di una spedizione:

{
  "model": {
    "shipments": [
      {
        "pickups": [
          {
            "timeWindows": [
              {
                "startTime": "YYYY-MM-DDTHH:MM:SSZ",
                "endTime": "YYYY-MM-DDTHH:MM:SSZ"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "timeWindows": [
              {
                "startTime": "YYYY-MM-DDTHH:MM:SSZ",
                "endTime": "YYYY-MM-DDTHH:MM:SSZ"
              }
            ]
          }
        ]
      }
    ],
    "vehicles": [ ... ]
  }
}

Finestre temporali dei veicoli

Il seguente esempio di codice mostra la struttura delle finestre temporali di un veicolo:

{
  "model": {
    "shipments": [ ... ],
    "vehicles": [
      {
        "startTimeWindows": [
          {
            "startTime": "YYYY-MM-DDTHH:MM:SSZ",
            "endTime": "YYYY-MM-DDTHH:MM:SSZ"
          }
        ],
        "endTimeWindows": [
          {
            "startTime": "YYYY-MM-DDTHH:MM:SSZ",
            "endTime": "YYYY-MM-DDTHH:MM:SSZ"
          }
        ]
      }
    ]
  }
}

Scenario di esempio

Questa sezione utilizza uno scenario aziendale di asilo per cani. L'esempio ottimizza i percorsi per il ritiro e la consegna di cani da due case diverse e i proprietari hanno le stesse finestre temporali di ritiro e consegna. L'ottimizzatore deve rispettare l'orario di apertura dell'asilo, le finestre specifiche di ritiro e consegna per i clienti e l'orario di lavoro del conducente.

Per questo esempio, i valori delle proprietà nella richiesta sono i seguenti:

Genitore Proprietà Valore Scenario
ShipmentModel globalStartTime 2023-01-13T07:00:00Z Rappresenta l'orario di apertura del tuo asilo per cani. Non è possibile effettuare ritiri o consegne prima di questo orario.
ShipmentModel globalEndTime 2023-01-13T19:00:00Z Rappresenta l'orario di chiusura del tuo asilo per cani. Tutti i ritiri e le consegne devono essere completati entro questo orario.
Shipment.pickups timeWindows startTime:
2023-01-13T07:30:00Z
Definisce la finestra temporale accettabile per andare a prendere un cane a casa di un cliente. In questo esempio, hai chiesto a entrambi i clienti di essere disponibili per il ritiro tra le 07:30 e le 09:00.
endTime:
2023-01-13T09:00:00Z
Shipment.deliveries timeWindows startTime:
2023-01-13T17:00:00Z
Definisce la finestra temporale accettabile per la consegna di un cane a casa di un cliente. In questo esempio, hai comunicato a entrambi i clienti che i loro cani verranno consegnati tra le 17:00 e le 18:30.
endTime:
2023-01-13T18:30:00Z
Vehicle startTimeWindows startTime:
2023-01-13T07:00:00Z
endTime:
2023-01-13T07:15:00Z
Definisce la finestra accettabile per l'inizio (dalle 07:00 alle 07:15) e la fine (dalle 17:00 alle 17:15) del viaggio del veicolo.
endTimeWindows startTime:
2023-01-13T18:45:00Z
endTime:
2023-01-13T19:00:00Z

Il seguente diagramma illustra le finestre temporali che interessano questo percorso.

Diverse cronologie rappresentano la finestra temporale globale, le finestre temporali di ritiro e tempi di consegna, le finestre temporali di inizio e fine del veicolo e l'orario di lavoro del veicolo.

In questo scenario, come illustrato dal diagramma, le finestre temporali funzionano come segue:

  • La finestra temporale globale rappresenta l'orario di apertura dell'asilo per cani e tutte le altre finestre temporali devono rientrare in questa finestra temporale.
  • I ritiri e le consegne hanno i propri timeWindows rispettivamente all'inizio e alla fine della giornata.
  • I startTimeWindows del veicolo forniscono all'operatore del veicolo un periodo di tempo entro il quale deve iniziare a lavorare, mentre i endTimeWindows forniscono un altro periodo di tempo entro il quale deve terminare la giornata.
  • L'ora di inizio del primo startTimeWindow e l'ora di fine dell'ultimo endTimeWindow definiscono l'orario di apertura del veicolo, che in questo caso corrisponde alla finestra temporale globale.

Esempio di richiesta

L'esempio seguente mostra la struttura di una richiesta optimizeTours che incorpora i valori delle finestre temporali dello scenario di esempio.

{
  "model": {
    "globalStartTime": "2023-01-13T07:00:00Z",
    "globalEndTime": "2023-01-13T19:00:00Z",
    "shipments": [
      {
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.8024,
              "longitude": -122.4058
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T07:30:00Z",
                "endTime": "2023-01-13T09:00:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.759773,
              "longitude": -122.427063
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:00:00Z",
                "endTime": "2023-01-13T18:30:00Z"
              }
            ]
          }
        ]
      },
      {
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.7359,
              "longitude": -122.5011
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T07:30:00Z",
                "endTime": "2023-01-13T09:00:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.759773,
              "longitude": -122.427063
            },
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:00:00Z",
                "endTime": "2023-01-13T18:30:00Z"
              }
            ]
          }
        ]
      }
    ],
    "vehicles": [
      {
        "startLocation": {
          "latitude": 37.759773,
          "longitude": -122.427063
        },
        "endLocation": {
          "latitude": 37.759773,
          "longitude": -122.427063
        },
        "costPerHour": 27,
        "startTimeWindows": [
          {
            "startTime": "2023-01-13T07:00:00Z",
            "endTime": "2023-01-13T07:15:00Z"
          }
        ],
        "endTimeWindows": [
          {
            "startTime": "2023-01-13T18:45:00Z",
            "endTime": "2023-01-13T19:00:00Z"
          }
        ]
      }
    ]
  }
}

Finestre temporali flessibili

Le finestre temporali possono essere utilizzate come vincoli flessibili definendo softStartTime e softEndTime in un tipo di messaggio TimeWindow. In questo modo, l'ottimizzatore può deviare dalla finestra temporale specificata a un costo specificato, dando la priorità all'ottimizzazione complessiva rispetto al rispetto rigoroso dei periodi di tempo, se vantaggioso.

Le finestre temporali flessibili presentano le seguenti limitazioni di utilizzo:

Proprietà

La tabella seguente descrive le proprietà dei vincoli flessibili per le finestre temporali.

Nome proprietà Formato Descrizione della proprietà
softStartTime Timestamp Specifica l'inizio della finestra temporale flessibile. Se un evento si verifica prima di questo orario, viene addebitato un costo.
softEndTime Timestamp Specifica la fine della finestra temporale flessibile. Se un evento si verifica dopo questo orario, viene addebitato un costo.
costPerHourBeforeSoftStartTime numero Il costo orario sostenuto quando un evento inizia prima del giorno softStartTime. Questa proprietà è obbligatoria quando utilizzi softStartTime. Per saperne di più su come implementare i costi, consulta il concetto chiave Modello di costo.
costPerHourAfterSoftEndTime numero Il costo orario sostenuto quando un evento termina dopo il giorno softEndTime. Questa proprietà è obbligatoria quando utilizzi softEndTime. Per saperne di più su come implementare i costi, consulta il concetto chiave Modello di costo.

Esempio di codice

L'esempio seguente mostra la struttura delle proprietà dei vincoli flessibili di un tipo di messaggio TimeWindow:

    {
      "softStartTime": "SOFT_START_TIME",
      "softEndTime": "SOFT_END_TIME",
      "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME,
      "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME
    }