Przedziały czasu

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

Przedziały czasowe określają czas zdarzeń na trasie. Mogą one obejmować początek i koniec 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 realizacja odbiorów i dostaw 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ę:

Lista kontrolna Essentials

Poniższa lista kontrolna zawiera podstawowe informacje, które pozwolą uniknąć potencjalnych błędów związanych z oknami czasowymi. Ta lista pomoże Ci sprawdzić poprawność żądania i rozwiązać problemy z odpowiedzią.

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 wydarzenia.

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 typów wiadomości TimeWindow. 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 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 czasu 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ład

W tej sekcji używamy scenariusza dotyczącego firmy zajmującej się opieką dzienną 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 czasowe 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 może nastąpić 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 przedstawia przedziały czasowe mające wpływ 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:

  • Globalne okno czasowe reprezentuje godziny otwarcia przedszkola dla psów, a wszystkie pozostałe okna czasowe 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 zakończyć dzień pracy.
  • 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

Okna czasowe mogą być używane jako miękkie ograniczenia przez zdefiniowanie wartości softStartTimesoftEndTime w typie wiadomości TimeWindow. Umożliwia to optymalizatorowi odchylenie się od określonego przedziału czasowego przy określonym koszcie, co w przypadku korzyści z takiego działania pozwala mu traktować optymalizację ogólną jako priorytetową w stosunku do ścisłego przestrzegania ram czasowych.

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

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 usługi
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 softStartTime. Ta właściwość jest wymagana, gdy używasz elementu 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 elementu 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ękkich ograniczeń typu wiadomości TimeWindow:

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