Finestre temporali

Le finestre temporali sono presenti in `ShipmentModel`, in `Shipment` negli oggetti di ritiri e consegne 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 consegna pianificati o la durata di un intero percorso.

Le finestre temporali possono supportare obiettivi come:

  • Dare la priorità al completamento di ritiri e consegne entro intervalli di tempo specificati.
  • Pianificare i percorsi in modo che rientrino negli orari di apertura complessivi dell'attività.
  • Assicurarsi che i veicoli inizino e terminino i percorsi entro intervalli di tempo specificati.

Struttura

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

Elenco di controllo degli elementi essenziali

Il seguente elenco di controllo descrive le conoscenze essenziali che prevengono potenziali errori relativi alle finestre temporali. Questo elenco può aiutarti a convalidare la richiesta e 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ù recente per qualsiasi evento.
globalEndTime Timestamp L'ora più recente per qualsiasi evento.

La tabella seguente descrive le proprietà della finestra temporale nelle spedizioni e nei veicoli.

Genitore Proprietà Formato Descrizione
Shipment.pickups timeWindows Array di TimeWindow tipi di messaggi. 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 della pianificazione operativa di un veicolo.
endTimeWindows Specifica l'ora di fine della pianificazione operativa di un veicolo.

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

Proprietà Formato Descrizione
startTime Stringa (formato "Zulu" UTC RFC3339) L'inizio di una finestra temporale.
endTime Stringa (formato "Zulu" UTC RFC3339) La fine di una finestra temporale.

Esempi

Questa sezione tratta 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 di ritiri e consegne

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 di attività di asilo per cani. L'esempio ottimizza i percorsi per il ritiro e la consegna dei cani da due case diverse e i proprietari hanno le stesse finestre temporali di ritiro e consegna. L'ottimizzatore deve rispettare gli orari di apertura dell'asilo, le finestre di ritiro e consegna specifiche per i clienti e gli orari 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. Prima di questo orario non è possibile effettuare ritiri o consegne.
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 accettabile per il ritiro di un cane dalla casa di un cliente. In questo esempio, hai chiesto a entrambi i clienti di essere disponibili per il ritiro tra le 7:30 e le 9:00.
endTime:
2023-01-13T09:00:00Z
Shipment.deliveries timeWindows startTime:
2023-01-13T17:00:00Z
Definisce la finestra 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 7:00 alle 7:15) e la fine (dalle 17:00 alle 17:15) del percorso 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 i tempi di consegna, le finestre temporali di inizio e fine del veicolo e l'orario di lavoro del veicolo.

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

  • La finestra temporale globale rappresenta gli orari di apertura dell'asilo per cani e tutte le altre finestre temporali devono rientrare in questa finestra temporale.
  • I ritiri e le consegne hanno le proprie timeWindows rispettivamente all'inizio e alla fine della giornata.
  • startTimeWindows del veicolo fornisce all'operatore del veicolo un intervallo di tempo in cui deve iniziare a lavorare, mentre endTimeWindows fornisce un altro intervallo di tempo in cui deve terminare la giornata.
  • L'ora di inizio della prima startTimeWindow e l'ora di fine dell' ultima endTimeWindow definiscono l'orario di apertura del veicolo, che in questo caso, coincidono con la finestra temporale globale.

Esempio di richiesta

L'esempio seguente mostra la struttura di una optimizeTours richiesta 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ò discostarsi dalla finestra temporale specificata a un costo specificato, dando la priorità all'ottimizzazione complessiva rispetto al rispetto rigoroso degli intervalli di tempo quando è 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 di softStartTime. Questa proprietà è obbligatoria quando si utilizza 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 softEndTime. Questa proprietà è obbligatoria quando si utilizza 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 TimeWindow tipo di messaggio:

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