Na tej stronie opisujemy cykl życia planu trasy przy użyciu interfejsu Route Optimization API, zaczynając od określenia potrzeb związanych z wyznaczaniem trasy, a kończąc na zintegrowanym planie trasy w systemie.
Jeśli będziesz postępować zgodnie z etapami planu, możesz osiągnąć te cele:
- Mapowanie operacji floty: przełóż fizyczną flotę, złożone ograniczenia i cele biznesowe na kod interfejsu API.
- Optymalizowanie planów tras pod kątem potrzeb firmy: dowiedz się, jak ulepszyć plan trasy, aby osiągnąć cele i usprawnić codzienne działania.
- Wdrażanie w środowisku produkcyjnym: wdrożenie planu tras przez uwzględnienie go w codziennych działaniach.
Poniższy diagram przedstawia cykl życia planu trasy.
Faza wdrażania planu trasy ma miejsce, gdy po raz pierwszy integrujesz interfejs API lub gdy wymagania biznesowe ulegają znacznej zmianie. Obejmuje etapy od 1 do 5.
Faza codziennych działań jest mniej wymagająca, a ulepszenia są minimalne. Obejmuje etapy od 2 do 4.
Etapy cyklu życia trasy:
- Określ zakres problemu: zidentyfikuj i uporządkuj cele, zasoby, zadania i ograniczenia, aby uzyskać pełny obraz działań, zanim zaczniesz korzystać z interfejsu API.
- Mapowanie danych: przełóż realia biznesowe na parametry interfejsu API, aby plan trasy odzwierciedlał sposób działania floty.
- Utwórz żądanie i uzyskaj plan trasy: wpisz dane w interfejsie API i uzyskaj zoptymalizowany plan trasy.
- Dopracuj plan trasy: przetestuj plan trasy i wprowadź w nim zmiany, dostosowując ograniczenia i cele, aby mieć pewność, że spełnia on wszystkie Twoje potrzeby.
- Zintegruj plan trasy: połącz plan trasy z istniejącymi systemami, aby zapewnić przydatne wskazówki nawigacyjne.
Określanie zakresu problemu
Zanim zaczniesz korzystać z interfejsu API, musisz uporządkować szczegóły codziennych operacji w przejrzyste kategorie danych. Dzięki temu możesz rozpocząć proces wdrażania, mając jasność co do bieżących zasobów i zadań, ograniczeń oraz celów, które chcesz osiągnąć za pomocą floty.
Identyfikowanie zasobów i zadań
Ważnym krokiem podczas planowania trasy jest określenie zasobów i zadań, czyli pojazdów i przesyłek.
| pojazdy, | Przesyłki |
|---|---|
|
|
Określanie ograniczeń
Ograniczenia to limity i restrykcje dotyczące sposobu korzystania z pojazdów i obsługi przesyłek. To one decydują o większości operacji i są kluczowe przy tworzeniu zoptymalizowanego planu trasy.
Ograniczenia dzielą się zwykle na 2 kategorie:
| Ograniczenia bezwarunkowe | Ograniczenia miękkie |
|---|---|
| Są to limity, których nie można przekroczyć. Na przykład ciężarówka nie może przewozić więcej ładunku, niż wynosi jej maksymalna ładowność, a kierowca nie może odebrać towaru po zamknięciu sklepu. | Są to preferencje, które można naruszyć w razie potrzeby, zwykle za opłatą karną. Możesz na przykład preferować załadowanie ciężarówki tylko do 80% pojemności lub dostarczenie przesyłki przed czasem docelowym, ale możesz przekroczyć te limity, aby uzyskać lepszą trasę. |
Typowe ograniczenia:
- Limity pojemności: maksymalna waga, objętość lub liczba produktów, które może przewozić pojazd.
- Okna czasowe: konkretne przedziały czasowe, w których lokalizacja jest otwarta dla odwiedzających, lub konkretne godziny pracy kierowcy.
- Koszty: koszt przejazdu pojazdu lub pominięcia dostawy. Jednym z głównych celów interfejsu API jest generowanie opłacalnego planu trasy.
- Przerwy kierowcy: okresy odpoczynku kierowcy, które są zwykle wymagane przez przepisy prawa pracy po określonej liczbie godzin pracy.
Określanie celów biznesowych
Gdy określisz zasoby i zadania oraz ich ograniczenia, nadejdzie czas na ustalenie, które dane są najważniejsze dla Twojej firmy. Te cele idą w parze z ograniczeniami i pomagają zdecydować, co jest najważniejsze podczas planowania trasy.
Oto kilka przykładów celów biznesowych:
| Rozmiar floty | Odległość | Godzina | Koszt |
|---|---|---|---|
| Czy chcesz zminimalizować liczbę używanych pojazdów, czy wykorzystać całą flotę, aby wcześniej zakończyć dzień pracy? | Czy chcesz wybrać najkrótszą trasę, aby zaoszczędzić na paliwie, czy wolisz szybszą trasę, która może być dłuższa ze względu na korzystanie z autostrad? | Czy chcesz zminimalizować łączną liczbę godzin pracy, czy też priorytetem jest przybycie na miejsce o określonych godzinach, co może wydłużyć czas spędzony na trasie? | Czy chcesz zminimalizować koszty operacyjne, takie jak wynagrodzenia i paliwo, czy też zaakceptować wyższe koszty, aby dotrzymać rygorystycznych terminów? |
Mapowanie danych
Po zebraniu danych zmapuj je, aby pasowały do właściwości interfejsu API. Dzięki temu optymalizator ma wszystkie informacje potrzebne do zwrócenia planu trasy, który uwzględnia realia Twojej firmy.
Użyj parametrów z następnych tabel, aby zmapować zasoby, zadania, ograniczenia i cele zmapowane w sekcji Określanie zakresu problemu.
Mapowanie zmiennych
| Pojęcie z życia codziennego | Parametr interfejsu API | Opis |
|---|---|---|
| Kierowca lub pojazd | model.vehicles[] |
Reprezentuje pojedynczy pojazd we flocie. |
| Lokalizacje punktów |
vehicles[].startWaypointvehicles[].endWaypoint
|
Lokalizacja, w której pojazd rozpoczyna i kończy trasę. |
| Godziny otwarcia Twojej firmy |
model.globalStartTimemodel.globalEndTime
|
Najwcześniejszy czas rozpoczęcia i najpóźniejszy czas zakończenia działania całej floty. |
| Zadanie lub pakiet | model.shipments[] |
Reprezentuje zadanie. Może to być pickup, delivery lub oba te elementy. |
| Lokalizacja zadania |
pickups[].arrivalWaypointdeliveries[].arrivalWaypoint
|
Lokalizacja geograficzna, w której odbywa się praca. |
| Czas obsługi |
pickups[].durationdeliveries[].duration
|
Czas spędzony w lokalizacji na wykonaniu zadania (np. rozładunku), bez czasu podróży. |
Mapowanie ograniczeń
| Ograniczenie w świecie rzeczywistym | Parametr interfejsu API | Opis |
|---|---|---|
| Ładowność pojazdu | vehicles[].loadLimits |
Ustawia twardy lub miękki limit ładowności pojazdu. Jeśli loadDemand przesyłki przekracza pozostały limit, nie zostanie ona przypisana. |
| Rozmiar pakietu | shipments[].loadDemands |
Ilość ładowności pojazdu, którą zajmuje przesyłka. |
| Ograniczenie dotyczące pojazdu | shipments[].allowedVehicleIndices |
Ogranicza przesyłkę, tak aby mogła zostać odebrana lub dostarczona tylko przez określone pojazdy lub kierowców. |
| Godziny otwarcia | shipments[].pickups[].timeWindows lub shipments[].deliveries[].timeWindows |
Ustawia godziny, w których można odwiedzić lokalizację. Jeśli pojazd nie może dotrzeć w tym przedziale czasowym, przesyłka jest pomijana. |
| Limit długości zmiany | vehicles[].routeDurationLimit |
Ustawia twardy lub miękki limit czasu pracy konkretnego kierowcy (np. maksymalnie 8 godzin), niezależnie od globalnego czasu zakończenia. |
| Przerwy kierowcy | vehicles[].breakRule |
Egzekwuje określone zasady dotyczące odpoczynku, takie jak obowiązkowe przerwy po określonej liczbie godzin pracy. |
| Ograniczenia na drodze | vehicles[].travelMode |
Określa środek transportu (np. DRIVE lub BICYCLE). Ogranicza to trasę do dróg, po których można się poruszać, i określa prędkości używane do obliczania czasu podróży. |
Mapowanie celu
| Cel w świecie rzeczywistym | Parametr interfejsu API | Opis |
|---|---|---|
| Minimalizowanie rozmiaru floty | vehicles[].fixedCost |
Stosuje jednorazowy koszt korzystania z pojazdu. Wysoki koszt stały wymusza na trasie priorytetowe traktowanie mniejszej liczby pojazdów, a nie zwiększanie łącznego dystansu lub czasu pracy. |
| Minimalizowanie odległości | vehicles[].costPerKilometer |
Naliczanie kosztu za każdy przejechany kilometr. Priorytetem są krótsze trasy, co pozwala oszczędzać paliwo i zmniejszać zużycie pojazdu. |
| Zminimalizuj łączny czas | vehicles[].costPerHour |
Stosuje koszt za każdą godzinę, przez którą pojazd jest aktywny (w tym czas podróży i czasy oczekiwania). Priorytetem jest szybsze ukończenie. |
| Zminimalizuj czas jazdy | vehicles[].costPerTraveledHour |
Stosuje koszt związany z czasem spędzonym na przemieszczaniu się. Pozwala to odróżnić stanie w korku (kosztowne) od oczekiwania na przystanku(potencjalnie tańsze). |
| Nadawanie priorytetu określonym zadaniom | shipments[].penaltyCost |
Naliczanie kosztu, jeśli określona dostawa zostanie pominięta. Ustawienie wysokiego priorytetu zapewnia, że zadania krytyczne będą traktowane priorytetowo w stosunku do zadań opcjonalnych. |
Tworzenie żądania i uzyskiwanie odpowiedzi
Aby wygenerować plan trasy za pomocą interfejsu Route Optimization API, wykonaj te czynności:
- Skonfiguruj środowisko: skonfiguruj projekt Google Cloud, włącz interfejs API i skonfiguruj uwierzytelnianie. Instrukcje znajdziesz w sekcji Pierwsze kroki. Wystarczy wykonać ten krok tylko raz.
- Wyślij żądanie: utwórz treść żądania, korzystając z mapowania danych zdefiniowanego w poprzedniej sekcji. Informacje o punktach końcowych, nagłówkach i formatowaniu żądań znajdziesz w artykule Wysyłanie żądania do interfejsu API.
- Zrozumienie odpowiedzi: gdy otrzymasz odpowiedź z interfejsu API, zapoznaj się z planem trasy i znaczeniem poszczególnych parametrów. Zobacz Interpretowanie odpowiedzi.
Dostosowywanie planu trasy
Przełożenie rzeczywistej logistyki na koszty i ograniczenia interfejsu API jest złożonym zadaniem. Początkowy plan trasy może nie odpowiadać Twoim celom biznesowym lub oczekiwaniom kierowcy. Dostosowywanie planu trasy to iteracyjny proces testowania zwróconych tras i dostosowywania parametrów, aż znajdziesz konfigurację, która pozwoli Ci osiągnąć cele.
Dostosowywanie celów i ograniczeń
Jeśli wygenerowany plan trasy nie spełnia Twoich potrzeb, możesz zmodyfikować niektóre parametry, aby uzyskać inne wyniki. Zaostrzenie lub złagodzenie parametrów zmienia sposób rozwiązywania sprzecznych celów w planie trasy, a złagodzenie parametrów jest skutecznym sposobem na wykrycie parametrów, które powodują błędy w planach tras.
W tabeli poniżej znajdziesz typowe problemy z trasowaniem i parametry, które możesz dostosować, aby je rozwiązać.
| Scenariusz | Parametr | Korekta | Opis |
|---|---|---|---|
| Ważna przesyłka została pominięta | shipments[].penaltyCost |
Zwiększ jego wartość lub dodaj koszty karne do innych przesyłek | Jeśli dostawa jest opcjonalna, zwiększ jej koszt kary, aby nadać jej priorytet. Jeśli dostawa jest obowiązkowa (nie ma kosztu kary), dodaj koszty kary do innych, mniej krytycznych dostaw. Dzięki temu są one opcjonalne, co pozwala zaoszczędzić czas i miejsce w pojeździe na ważne przesyłki. |
| Dostawa została pominięta ze względu na czas | softStartTime/softEndTime |
Dodawanie elastycznych okien czasowych | W przypadku sztywnych okien czasowych zadania, które są spóźnione nawet o minutę, są odrzucane. Elastyczne okna czasowe pozwalają kierowcy przyjechać nieco poza harmonogramem, co wiąże się z „kosztem”, ale nie powoduje niepowodzenia przypisania. |
| Dostawa została pominięta ze względu na wagę | loadLimits[].softMaxLoad i costPerUnitAbove |
Dodaj wymagania dotyczące łagodnego obciążenia | Umożliwia nieznaczne przekroczenie idealnej ładowności pojazdu (za karę) zamiast pozostawienia paczki. |
| Dostawa została pominięta z powodu przeciążenia floty | model.vehicles[] lub shipments[].timeWindows |
Dodaj pojazdy lub wydłuż przedziały czasowe | Jeśli jest zbyt wiele dostaw dla obecnej floty, zwłaszcza w godzinach największego zapotrzebowania, dodaj więcej pojazdów lub wydłuż okna dostawy, aby rozłożyć obciążenie. |
| Trasy są zbyt długie lub nieefektywne | vehicles[].costPerKilometer/costPerHour |
Dodawanie kosztów lub zwiększanie ich wartości | Informuje interfejs API, że podróż jest kosztowna, co zachęca go do pomijania odległych, odizolowanych przystanków w celu tworzenia bardziej zwartych tras dla floty. |
| Zmiany kierowców są zbyt długie | vehicles[].routeDurationLimit lub model.vehicles[] |
Dodaj limity czasu trwania lub dodaj pojazdy i limity | Wymusza bezwzględny limit (np. 8 godzin) łącznego czasu, jaki kierowca może spędzić na drodze. Samo dodanie pojazdów nie skróci tras, chyba że zastosujesz też limity czasu trwania, aby wymusić na solverze rozłożenie obciążenia na większą flotę. |
Aktualizowanie planu trasy
Często trzeba zaktualizować plan trasy, zachowując tę samą bazę, np. dodać odbiór do harmonogramu aktywnego kierowcy. Aby to zrobić, użyj parametrów wstrzykiwania, które zapewniają interfejsowi API punkt początkowy na podstawie poprzedniego rozwiązania, co pozwala mu zmodyfikować istniejący plan, zamiast obliczać nowy od zera.
Oto różne sposoby aktualizowania planu trasy za pomocą parametrów wstrzykiwania:
- Przekaż trasy z poprzedniej odpowiedzi do pola
injectedFirstSolutionRoutesnowego żądania. Przyspiesza to wyszukiwanie optymalizacji i jest przydatne do ponownego planowania przed rozpoczęciem codziennych operacji, np. do integracji przesyłek w ostatniej chwili. - Kontroluj stopień zmiany za pomocą pola
injectedSolutionConstraint. Jest to przydatne, gdy operacje są już w toku, ponieważ pozwala zachować bieżącą sekwencję kierowcy lub naprawić części planu, które zostały już wykonane. - Upewnij się, że zaktualizowana trasa pozostaje przypisana do prawidłowego pojazdu, ustawiając
interpretInjectedSolutionsUsingLabelsnatrue. Jest to przydatne podczas eksperymentowania z dodawaniem lub usuwaniem przesyłek i pojazdów, ponieważ dopasowuje trasy za pomocą etykiet, a nie indeksów. Wymaga to, aby wszystkie etykiety pojazdów i przesyłek były unikalne.
Integracja planu trasy
Sfinalizowany plan trasy to obiekt danych, który reprezentuje zoptymalizowane zarządzanie zasobami i zadaniami przy jednoczesnym przestrzeganiu ograniczeń i celów. Używaj tego planu trasy w codziennych operacjach, integrując go ze swoim systemem. Zwykle obejmuje to wizualizację planu trasy dla menedżerów floty i wysyłanie szczegółowych wskazówek dojazdu do kierowców.
Wizualizacja
Aby umożliwić menedżerom floty weryfikowanie i monitorowanie planu trasy, możesz go wizualizować na te sposoby:
Aby umożliwić menedżerom floty weryfikowanie i monitorowanie planu trasy, możesz wyświetlić go na mapie w panelu. W zależności od bieżącego etapu rozwoju możesz wizualizować plan trasy na te sposoby:
- Odkrywanie bez kodu: możesz użyć aplikacji open source Route Optimization, aby zobaczyć, jak interfejs API przekłada Twoje dane na fizyczne ścieżki na mapie. Ta aplikacja internetowa służy jako narzędzie do eksploracji, które umożliwia tworzenie scenariuszy, dostrajanie parametrów ograniczeń i wizualne renderowanie wynikowych planów tras przed napisaniem kodu.
- Wyświetlanie kolejności wizyt: możesz wyświetlić sekwencję wizyt jako ponumerowane punkty na mapie, aby ocenić optymalizację i plany wysyłki we własnym systemie. Aby to zrobić, znajdź tablicę
visitsw każdej trasie w odpowiedzi interfejsu API. Elementy w tej tablicy są uporządkowane dokładnie tak, jak kierowca powinien je realizować. Możesz przejść przez tę listę, użyćshipmentIndex, aby pobrać współrzędne lokalizacji każdego przystanku, i użyć biblioteki mapowania, aby wyrenderować ponumerowane znaczniki na mapie na podstawie ich kolejności na liście. - Rysowanie trasy fizycznej: możesz zwizualizować dokładną zaplanowaną ścieżkę na mapie, aby zrozumieć, dlaczego optymalizator wybrał konkretną sekwencję. Ta linia łamana reprezentuje zamierzoną ścieżkę do planowania i oceny, a nie trasę, którą kierowca jedzie w czasie rzeczywistym. Ustaw
populatePolylines: truew żądaniu, aby uzyskać poleencodedPolylinedla każdej trasy, i zdekoduj je za pomocą metodygoogle.maps.geometry.encoding.decodePath()z Maps JavaScript API.
Wysyłanie do kierowców
Możesz zintegrować szczegółowe wskazówki dojazdu z aplikacją dla kierowców, korzystając z pakietu Navigation SDK, lub podać precyzyjne linki do aplikacji Mapy Google dla użytkowników.
- Navigation SDK: jeśli masz niestandardową aplikację dla kierowców, możesz zintegrować Navigation SDK na Androida lub iOS, aby udostępniać szczegółowe wskazówki dojazdu w aplikacji.
Możesz zintegrować informacje o zadaniu z odpowiedzi interfejsu API ze swoim systemem i używać pakietu SDK do nawigacji. Aby przekazać trasy z odpowiedzi interfejsu API do pakietu SDK, ustaw w żądaniu parametr
populateTransitionPolylines: true. Spowoduje to wygenerowanierouteTokendla każdego przejścia w odpowiedzi. - Fleet Engine: w celu zaawansowanego zarządzania flotą możesz zaimportować plan trasy wygenerowany przez interfejs API do Fleet Engine, aby monitorować realizację trasy w czasie rzeczywistym. Interfejs API udostępnia łamaną zamierzonej trasy do oceny, a Fleet Engine łączy zaplanowaną sekwencję wizyt ze śledzeniem pojazdów na żywo.