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ę:
globalStartTimeiglobalEndTimeto właściwościShipmentModeltimeWindowsto właściwości:pickupswShipment.deliverieswShipment.
startTimeWindowsiendTimeWindowsto właściwościVehicle.
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 , które ilustrują strukturę przedziałów czasu.
- Przykładowy scenariusz , który pokazuje, jak używać przedziałów czasu do osiągania celów biznesowych.
- Przykład żądania , który zawiera wartości ustawione w przykładowym scenariuszu.
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:00ZendTime: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:00ZendTime:2023-01-13T19:00:00Z |
Poniższy diagram ilustruje przedziały czasu wpływające na tę trasę.
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
timeWindowsodpowiednio na początku i na końcu dnia. startTimeWindowspojazdu 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
startTimeWindowi godzina zakończenia ostatniegoendTimeWindowokreś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:
- Nie można ich stosować do
globalStartTimeiglobalEndTime, ponieważ nie używają typu wiadomościTimeWindow. - Można ich używać tylko wtedy, gdy na liście znajduje się tylko 1 element
TimeWindow.
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 }