Przedziały czasu

Przedziały czasowe są obecne w elementach `ShipmentModel`, `Shipment` w obiektach odbiorów i dostaw oraz w elemencie `Vehicle`.

Okna czasowe określają czas zdarzeń na trasie. Mogą one obejmować rozpoczęcie i zakończenie trasy kierowcy, zaplanowane godziny odbioru i dostawy lub czas trwania całej trasy.

Okna czasowe mogą pomagać w osiąganiu celów takich jak:

  • Priorytetem jest odbiór i dostawa w określonych terminach.
  • Planuj trasy w taki sposób, aby mieściły się w ogólnych godzinach otwarcia firmy.
  • Sprawdzaj, czy pojazdy rozpoczynają i kończą trasy w określonych przedziałach czasowych.

Struktura

Jak widać na diagramie, przedziały czasowe mają następującą strukturę:

  • globalStartTimeglobalEndTime to właściwości ShipmentModel
  • timeWindows są właściwościami:
    • pickups w Shipment.
    • deliveries w Shipment.
  • startTimeWindowsendTimeWindows to właściwości elementu Vehicle.

Lista kontrolna Essentials

Właściwości

W tej tabeli opisujemy właściwości globalnego okna czasowego.

Właściwość Format Opis
globalStartTime Timestamp Najwcześniejsza godzina dowolnego wydarzenia.
globalEndTime Timestamp Najpóźniejsza godzina dowolnego zdarzenia.

W tabeli poniżej opisano właściwości przedziału czasowego w przypadku przesyłek i pojazdów.

Rodzic Właściwość Format Opis
Shipment.pickups timeWindows Tablica TimeWindow typów wiadomości. Określa przedziały czasowe odbioru przesyłki.
Shipment.deliveries timeWindows Określa przedziały czasowe dostawy przesyłki.
Vehicle startTimeWindows Określa godzinę rozpoczęcia harmonogramu pracy pojazdu.
endTimeWindows Określa godzinę zakończenia harmonogramu pracy pojazdu.

W tej tabeli opisujemy właściwości typu wiadomości TimeWindow.

Właściwość Format Opis
startTime Ciąg znaków (format RFC3339 UTC „Zulu”) Początek przedziału czasu.
endTime Ciąg znaków (format RFC3339 UTC „Zulu”) Koniec przedziału czasu.

Przykłady

W tej sekcji znajdziesz 3 rodzaje przykładów:

Przykładowe fragmenty kodu

W sekcjach poniżej znajdziesz przykłady kodu różnych typów przedziałów czasowych.

Globalne przedziały czasu

Poniższy przykładowy kod pokazuje strukturę globalnych przedziałów czasowych:

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

Przedziały czasowe odbioru i dostawy

Poniższy przykładowy kod pokazuje strukturę przedziałów czasowych odbiorów i dostaw w przypadku przesyłki:

{
  "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": [ ... ]
  }
}

Przedziały czasowe pojazdów

Poniższy przykładowy kod pokazuje strukturę przedziałów czasowych pojazdu:

{
  "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"
          }
        ]
      }
    ]
  }
}

Przykładowy scenariusz

W tej sekcji używamy scenariusza dotyczącego firmy zajmującej się opieką nad psami. W tym przykładzie trasy są optymalizowane pod kątem odbioru i odwozu psów z 2 różnych domów, a właściciele mają te same przedziały czasu odbioru i odwozu. Optymalizator powinien uwzględniać godziny otwarcia przedszkola, konkretne przedziały czasu odbioru i odwozu dzieci oraz godziny pracy kierowcy.

W tym przykładzie wartości właściwości w żądaniu są następujące:

Rodzic Właściwość Wartość Scenariusz
ShipmentModel globalStartTime 2023-01-13T07:00:00Z Reprezentuje godzinę otwarcia Twojego przedszkola dla psów. Przed tym czasem nie można odbierać ani dostarczać przesyłek.
ShipmentModel globalEndTime 2023-01-13T19:00:00Z Reprezentuje godzinę zamknięcia Twojego przedszkola dla psów. Do tego czasu wszystkie odbiory i dostawy muszą zostać zrealizowane.
Shipment.pickups timeWindows startTime:
2023-01-13T07:30:00Z
Określa dopuszczalne okno czasowe odbioru psa z domu klienta. W tym przykładzie poinformowano obu klientów, że odbiór będzie możliwy między 7:30 a 9:00.
endTime:
2023-01-13T09:00:00Z
Shipment.deliveries timeWindows startTime:
2023-01-13T17:00:00Z
Określa dopuszczalne okno czasowe na odwiezienie psa do domu klienta. W tym przykładzie poinformowano obu klientów, że ich psy zostaną odwiezione między 17:00 a 18:30.
endTime:
2023-01-13T18:30:00Z
Vehicle startTimeWindows startTime:
2023-01-13T07:00:00Z
endTime:
2023-01-13T07:15:00Z
Określa dopuszczalne okno czasowe rozpoczęcia (7:00–7:15) i zakończenia (17:00–17:15) jazdy.
endTimeWindows startTime:
2023-01-13T18:45:00Z
endTime:
2023-01-13T19:00:00Z

Poniższy diagram ilustruje przedziały czasowe wpływające na tę trasę.

Kilka osi czasu reprezentuje globalne okno czasowe, okna czasowe odbioru i dostawy, okna czasowe rozpoczęcia i zakończenia pracy pojazdu oraz godziny pracy pojazdu.

W tym scenariuszu, jak pokazano na diagramie, przedziały czasowe działają w ten sposób:

  • Globalny przedział czasu reprezentuje godziny otwarcia dziennego ośrodka opieki nad psami, a wszystkie pozostałe przedziały czasu muszą się w nim mieścić.
  • Odbiory i dostawy mają własne timeWindows na początku i na końcu dnia.
  • startTimeWindows pojazdu określają przedział czasu, w którym operator pojazdu musi rozpocząć pracę, a endTimeWindows wyznaczają kolejny przedział czasu, w którym musi ją zakończyć.
  • Godzina rozpoczęcia pierwszego startTimeWindow i godzina zakończenia ostatniego endTimeWindow określają godziny pracy pojazdu, które w tym przypadku są takie same jak globalne okno czasowe.

Przykładowe żądanie

Poniższy przykład pokazuje strukturę żądania optimizeTours z wartościami przedziałów czasowych z przykładowego scenariusza.

{
  "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"
          }
        ]
      }
    ]
  }
}

Elastyczne przedziały czasu

Okresy mogą być używane jako ograniczenia miękkie przez zdefiniowanie wartości softStartTimesoftEndTime w typie wiadomości TimeWindow. Pozwala to optymalizatorowi odchylać się od określonego przedziału czasu przy określonym koszcie, priorytetowo traktując ogólną optymalizację zamiast ścisłego przestrzegania ram czasowych, gdy jest to korzystne.

Elastyczne przedziały czasowe mają te ograniczenia dotyczące wykorzystania:

  • Nie można ich stosować w przypadku globalStartTimeglobalEndTime, ponieważ nie używają one typu wiadomości TimeWindow.
  • Mają one zastosowanie tylko wtedy, gdy na liście znajduje się tylko 1 TimeWindow.

Właściwości

W poniższej tabeli opisano właściwości miękkich ograniczeń dla przedziałów czasowych.

Nazwa usługi Format Opis nieruchomości
softStartTime Sygnatura czasowa Określa początek miękkiego okna czasowego. Jeśli zdarzenie wystąpi przed tym czasem, zostanie naliczony koszt.
softEndTime Sygnatura czasowa Określa koniec miękkiego przedziału czasu. Jeśli zdarzenie wystąpi po tym czasie, poniesiesz koszt.
costPerHourBeforeSoftStartTime liczba Koszt za godzinę poniesiony, gdy wydarzenie rozpoczyna się przed godziną softStartTime. Ta właściwość jest wymagana, gdy używasz zasady softStartTime. Więcej informacji o wdrażaniu kosztów znajdziesz w sekcji Model kosztów.
costPerHourAfterSoftEndTime liczba Koszt za godzinę poniesiony, gdy wydarzenie zakończy się po softEndTime. Ta właściwość jest wymagana, gdy używasz zasady softEndTime. Więcej informacji o wdrażaniu kosztów znajdziesz w sekcji Model kosztów.

Przykładowy kod

Poniższy przykład pokazuje strukturę właściwości miękkiego ograniczenia typu wiadomości TimeWindow:

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