Okna 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 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ład
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 przedszkola dla psów, 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 kierowca musi rozpocząć pracę, aendTimeWindows
– 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
. Umożliwia to optymalizatorowi odchylenie się od określonego przedziału czasu przy określonym koszcie, co w przypadku korzyści z tego wynikających pozwala mu priorytetowo traktować ogólną optymalizację zamiast ścisłego przestrzegania ram czasowych.
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 }