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 autista, gli orari di ritiro e consegna pianificati o la durata di un intero percorso.

Le finestre temporali possono supportare obiettivi quali:

  • Dai la priorità al completamento dei ritiri e delle consegne entro i tempi specificati.
  • Pianifica gli itinerari in modo da operare entro l'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 nel seguente modo:

  • globalStartTime e globalEndTime sono proprietà di ShipmentModel
  • timeWindows sono proprietà di:
    • pickups all'interno di Shipment.
    • deliveries all'interno di Shipment.
  • startTimeWindows e endTimeWindows sono proprietà di Vehicle.

Elenco di controllo di Essentials

Proprietà

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

Proprietà Formato Descrizione
globalStartTime Timestamp L'ora più mattiniera 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 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 della programmazione operativa di un veicolo.
endTimeWindows Specifica l'ora di fine dell'orario di funzionamento di un veicolo.

La seguente tabella 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 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 per 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 del veicolo

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 un asilo nido per cani. L'esempio ottimizza i percorsi per il ritiro e l'accompagnamento di cani da due case diverse e i proprietari hanno le stesse fasce orarie di ritiro e accompagnamento. L'ottimizzatore deve rispettare l'orario di apertura dell'asilo nido, le finestre temporali specifiche per il ritiro e l'accompagnamento dei 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 nido per cani. Nessun ritiro o consegna può avvenire prima di questo orario.
ShipmentModel globalEndTime 2023-01-13T19:00:00Z Rappresenta l'orario di chiusura dell'asilo nido per cani. Tutti i ritiri e le consegne devono essere completati entro questo orario.
Shipment.pickups timeWindows startTime:
2023-01-13T07:30:00Z
Definisce l'intervallo di tempo accettabile per il ritiro di un cane dalla casa di un cliente. In questo esempio, hai comunicato 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 l'intervallo di tempo accettabile per lasciare 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 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 questa rotta.

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

In questo scenario, come illustrato nel 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 una propria timeWindows all'inizio e alla fine della giornata, rispettivamente.
  • Il startTimeWindows del veicolo indica all'operatore del veicolo un periodo di tempo in cui deve iniziare a lavorare, mentre il endTimeWindows indica un altro periodo di tempo in cui deve terminare la giornata.
  • L'ora di inizio del primo startTimeWindow e l'ora di fine dell'ultimo endTimeWindow definiscono l'orario di servizio del veicolo, che in questo caso è lo stesso della 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 soft

Le finestre temporali possono essere utilizzate come vincoli flessibili definendo softStartTime e softEndTime in un tipo di messaggio TimeWindow. Ciò consente all'ottimizzatore di discostarsi dalla finestra temporale specificata a un costo specificato, dando la priorità all'ottimizzazione complessiva rispetto al rispetto rigoroso dei periodi di tempo quando è vantaggioso.

Le finestre temporali flessibili presentano le seguenti limitazioni di utilizzo:

  • Non possono essere applicati a globalStartTime e globalEndTime perché non utilizzano il tipo di messaggio TimeWindow.
  • Sono applicabili solo quando in un elenco è presente un solo TimeWindow.

Proprietà

La tabella seguente descrive le proprietà del vincolo flessibile per le finestre temporali.

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

Esempio di codice

L'esempio seguente mostra la struttura delle proprietà del vincolo flessibile di un tipo di messaggio TimeWindow:

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