Przedziały czasu

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

Przedziały czasu określają czas zdarzeń na trasie. Te zdarzenia mogą obejmować początek i koniec trasy kierowcy, zaplanowane godziny odbioru i dostawy lub czas trwania całej trasy.

Przedziały czasu mogą obsługiwać takie cele jak:

  • Priorytetowe realizowanie odbiorów i dostaw w określonych ramach czasowych.
  • Planowanie tras w godzinach otwarcia firmy.
  • Zapewnienie, że pojazdy rozpoczynają i kończą trasy w określonych ramach czasowych.

Struktura

Jak pokazano na diagramie, przedziały czasu mają taką strukturę:

Lista kontrolna najważniejszych informacji

Poniższa lista kontrolna zawiera najważniejsze informacje, które pomogą Ci uniknąć potencjalnych błędów związanych z przedziałami czasu. Ta lista może pomóc w sprawdzeniu żądania i rozwiązaniu problemów z odpowiedzią.

Właściwości

W tabeli poniżej opisano właściwości globalnego przedziału czasu.

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

W tabeli poniżej opisano właściwości przedziału czasu w dostawach i pojazdach.

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

W tabeli poniżej opisano właściwości typu wiadomości TimeWindow message type.

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

Ta sekcja zawiera 3 typy przykładów:

Przykłady kodu

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

Globalne przedziały czasu

Poniższy przykład kodu pokazuje strukturę globalnych przedziałów czasu:

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

Przedziały czasu odbiorów i dostaw

Poniższy przykład kodu pokazuje strukturę przedziałów czasu odbiorów i dostaw w dostawie:

{
  "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 czasu pojazdów

Poniższy przykład kodu pokazuje strukturę przedziałów czasu 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 firmy zajmującej się opieką nad psami. Przykład optymalizuje trasy odbioru i odwożenia psów z 2 różnych domów, a właściciele mają te same przedziały czasu odbioru i odwożenia. Optymalizator powinien uwzględniać godziny otwarcia placówki, konkretne przedziały czasu odbioru i odwożenia dla klientów 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 placówki opieki nad psami. Przed tą godziną nie można realizować odbiorów ani dostaw.
ShipmentModel globalEndTime 2023-01-13T19:00:00Z Reprezentuje godzinę zamknięcia placówki opieki nad psami. Do tej godziny należy zrealizować wszystkie odbiory i dostawy.
Shipment.pickups timeWindows startTime:
2023-01-13T07:30:00Z
Określa dopuszczalny przedział czasu odbioru psa z domu klienta. W tym przykładzie poinformowaliśmy obu klientów, że pies zostanie odebrany między 7:30 a 9:00.
endTime:
2023-01-13T09:00:00Z
Shipment.deliveries timeWindows startTime:
2023-01-13T17:00:00Z
Określa dopuszczalny przedział czasu odwożenia psa do domu klienta. W tym przykładzie poinformowaliśmy obu klientów, że pies zostanie odwieziony 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 dopuszczalny przedział czasu rozpoczęcia (od 7:00 do 7:15) i zakończenia (od 17:00 do 17:15) pracy pojazdu.
endTimeWindows startTime:
2023-01-13T18:45:00Z
endTime:
2023-01-13T19:00:00Z

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

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

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

  • Globalny przedział czasu reprezentuje godziny otwarcia placówki opieki nad psami, a wszystkie inne przedziały czasu muszą się w nim mieścić.
  • Odbiory i dostawy mają własne timeWindows odpowiednio na początku i na końcu dnia.
  • startTimeWindows pojazdu określają przedział czasu , w którym kierowca musi rozpocząć pracę, a endTimeWindows – przedział czasu , w którym musi ją zakończyć.
  • Godzina rozpoczęcia pierwszego startTimeWindow i godzina zakończenia ostatniego endTimeWindow określają godziny otwarcia pojazdu, które w tym przypadku są takie same jak globalny przedział czasu.

Przykład żądania

Poniższy przykład pokazuje strukturę żądania optimizeTours zawierającego wartości przedziałów czasu 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

Przedziały czasu można stosować jako elastyczne ograniczenia, definiując softStartTime i softEndTime w typie wiadomości TimeWindow. Dzięki temu optymalizator może odchylać się od określonego przedziału czasu za określoną cenę, priorytetowo traktując ogólną optymalizację zamiast ścisłego przestrzegania ram czasowych, gdy jest to korzystne.

Elastyczne przedziały czasu mają te ograniczenia dotyczące użycia:

Właściwości

W tabeli poniżej opisano właściwości elastycznego ograniczenia dla przedziałów czasu.

Nazwa usługi Format Opis właściwości
softStartTime Sygnatura czasowa Określa początek elastycznego przedziału czasu. Jeśli zdarzenie wystąpi przed tą godziną, zostanie naliczony koszt.
softEndTime Sygnatura czasowa Określa koniec elastycznego przedziału czasu. Jeśli zdarzenie wystąpi po tej godzinie, zostanie naliczony koszt.
costPerHourBeforeSoftStartTime liczba Koszt na godzinę naliczany, gdy zdarzenie rozpocznie się przed softStartTime. Ta właściwość jest wymagana, gdy używasz softStartTime. Więcej informacji o tym, jak wdrożyć koszty, znajdziesz w artykule Kluczowe pojęcia dotyczące modelu kosztów.
costPerHourAfterSoftEndTime liczba Koszt na godzinę naliczany, gdy zdarzenie zakończy się po softEndTime. Ta właściwość jest wymagana, gdy używasz softEndTime. Więcej informacji o tym, jak wdrożyć koszty, znajdziesz w artykule Kluczowe pojęcia dotyczące modelu kosztów.

Przykład kodu

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

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