Okna czasowe określają czas zdarzeń na trasie. Zdarzenia te mogą obejmować początek i koniec trasy kierowcy, zaplanowane godziny odbioru i dostawy lub czas trwania całej trasy.
Okna czasowe mogą pomóc w osiągnięciu takich celów jak:
- Skup się na realizacji odbiorów i dostaw w określonych terminach.
- Planuj trasy tak, aby były realizowane w godzinach otwarcia.
- Upewnij się, że pojazdy rozpoczynają i kończą trasy w określonych przedziałach czasowych.
Struktura
Jak widać na diagramie, przedziały czasu mają następującą strukturę:
globalStartTimeiglobalEndTimeto właściwości obiektuShipmentModeltimeWindowsto właściwości:pickupswShipment.deliverieswShipment.
startTimeWindowsiendTimeWindowsto właściwościVehicle.
Lista kontrolna Essentials
Poniższa lista kontrolna zawiera najważniejsze informacje, które pomogą Ci uniknąć potencjalnych błędów związanych z oknami czasowymi. Ta lista może pomóc Ci sprawdzić żądanie i rozwiązać problemy z odpowiedzią.
Właściwości
W tabeli poniżej opisano właściwości globalnego okna czasowego.
| Właściwość | Format | Opis |
|---|---|---|
globalStartTime |
Timestamp |
Najwcześniejsza godzina dowolnego wydarzenia. |
globalEndTime |
Timestamp |
Najpóźniejszy czas dowolnego zdarzenia. |
W tabeli poniżej opisano właściwości okna czasowego w przesyłkach i pojazdach.
| Ma dzieci | 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 czas rozpoczęcia harmonogramu działania pojazdu. | |
endTimeWindows |
Określa czas zakończenia harmonogramu działania pojazdu. |
W tabeli poniżej opisano 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 kody ilustrujące strukturę okien czasowych.
- Przykładowy scenariusz, który pokazuje, jak można wykorzystać okna czasowe 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ładowe kody różnych typów okien czasowych.
Globalne przedziały czasu
Poniższy przykładowy kod pokazuje strukturę globalnych okien czasowych:
{ "model": { "globalStartTime": "YYYY-MM-DDTHH:MM:SSZ", "globalEndTime": "YYYY-MM-DDTHH:MM:SSZ", "shipments": [ ... ], "vehicles": [ ... ] } }
Przedziały czasowe odbiorów i dostaw
Poniższy przykładowy kod pokazuje strukturę okien czasowych w odbiorach i dostawach 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 czasu pojazdów
Poniższy przykładowy kod pokazuje strukturę okien 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 biznesowego dotyczącego hotelu dla psów. W tym przykładzie optymalizujemy trasy odbioru i odwożenia psów z 2 różnych domów, a właściciele mają takie same przedziały czasowe odbioru i odwożenia. Optymalizator powinien uwzględniać godziny otwarcia żłobka, konkretne okna odbioru i odwożenia dzieci oraz godziny pracy kierowcy.
W tym przykładzie wartości właściwości w żądaniu są następujące:
| Ma dzieci | Właściwość | Wartość | Scenariusz |
|---|---|---|---|
ShipmentModel |
globalStartTime |
2023-01-13T07:00:00Z |
Reprezentuje godzinę otwarcia świetlicy dla psów. Przed tym terminem nie można odbierać ani dostarczać przesyłek. |
ShipmentModel |
globalEndTime |
2023-01-13T19:00:00Z |
Reprezentuje godzinę zamknięcia świetlicy dla psów. Wszystkie odbiory i dostawy muszą zostać zrealizowane do tego czasu. |
Shipment.pickups |
timeWindows |
startTime:2023-01-13T07:30:00Z |
Określa akceptowalny przedział czasowy na odebranie psa z domu klienta. W tym przykładzie obaj klienci zostali poinformowani, że odbiór 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 akceptowalny przedział czasowy na dostarczenie psa do domu klienta. W tym przykładzie obaj klienci otrzymali informację, ż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:00ZendTime:2023-01-13T07:15:00Z |
Określa akceptowalny przedział czasu, w którym pojazd może rozpocząć (7:00–7:15) i zakończyć (17:00–17:15) pracę. |
endTimeWindows |
startTime:2023-01-13T18:45:00ZendTime:2023-01-13T19:00:00Z |
Poniższy diagram przedstawia przedziały czasowe, które mają wpływ na tę trasę.
W tym scenariuszu, jak pokazano na diagramie, przedziały czasowe działają w następujący sposób:
- Globalne okno czasowe reprezentuje godziny otwarcia hotelu dla psów, a wszystkie inne okna czasowe muszą mieścić się w tym oknie czasowym.
- Odbiory i dostawy mają własne
timeWindowsodpowiednio na początku i na końcu dnia. startTimeWindowspojazdu określają przedział czasu, w którym operator pojazdu musi rozpocząć pracę, aendTimeWindowsokreślają przedział czasu, w którym musi zakończyć pracę.- Czas rozpoczęcia pierwszej
startTimeWindowi czas zakończenia ostatniejendTimeWindowokreś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, które zawiera przykładowe wartości okien czasowych.
{ "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 ograniczenia miękkie przez zdefiniowanie softStartTime i softEndTime w typie wiadomości TimeWindow. Dzięki temu optymalizator może odbiegać od określonego przedziału czasu przy określonym koszcie, dając priorytet ogólnej optymalizacji nad ścisłym przestrzeganiem przedziałów czasu, gdy jest to korzystne.
Elastyczne okna czasowe mają te ograniczenia:
- Nie można ich zastosować do
globalStartTimeiglobalEndTime, ponieważ nie używają typu wiadomościTimeWindow. - Mają zastosowanie tylko wtedy, gdy na liście znajduje się pojedynczy element
TimeWindow.
Właściwości
W tabeli poniżej opisano właściwości ograniczeń miękkich dotyczących okien czasowych.
| Nazwa usługi | Format | Opis miejsca zakwaterowania |
|---|---|---|
softStartTime |
Sygnatura czasowa | Określa początek elastycznego przedziału czasu. 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, zostanie naliczony koszt. |
costPerHourBeforeSoftStartTime |
liczba | Koszt za godzinę naliczany, gdy wydarzenie rozpoczyna się przed softStartTime. Ta właściwość jest wymagana, gdy używasz softStartTime. Więcej informacji o implementowaniu kosztów znajdziesz w artykule o modelu kosztów. |
costPerHourAfterSoftEndTime |
liczba | Koszt za godzinę naliczany, gdy wydarzenie kończy się po softEndTime. Ta właściwość jest wymagana, gdy używasz softEndTime. Więcej informacji o implementowaniu kosztów znajdziesz w artykule o modelu kosztów. |
Przykładowy kod
Poniższy przykład pokazuje strukturę właściwości ograniczenia miękkiego typu wiadomości TimeWindow:
{ "softStartTime": "SOFT_START_TIME", "softEndTime": "SOFT_END_TIME", "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME, "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME }