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ę:
globalStartTime
iglobalEndTime
to właściwościShipmentModel
timeWindows
są właściwościami:pickups
wShipment
.deliveries
wShipment
.
startTimeWindows
iendTimeWindows
to właściwości elementuVehicle
.
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łady kodu ilustrujące strukturę przedziałów czasowych.
- Przykładowy scenariusz, który pokazuje jeden ze sposobów wykorzystania przedziałów czasowych do osiągnięcia celu biznesowego.
- Przykładowe żądanie, które zawiera wartości ustawione w przykładowym scenariuszu.
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ę.
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ę, aendTimeWindows
wyznaczają kolejny przedział czasu, w którym musi ją zakończyć.- Godzina rozpoczęcia pierwszego
startTimeWindow
i godzina zakończenia ostatniegoendTimeWindow
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 softStartTime
i softEndTime
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
globalStartTime
iglobalEndTime
, ponieważ nie używają one typu wiadomościTimeWindow
. - 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 }