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.
Postępując 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.
- Wdrożenie w środowisku produkcyjnym: wdróż plan tras, uwzględniając 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 Twoje 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: zanim zaczniesz korzystać z interfejsu API, określ i uporządkuj cele, zasoby, zadania i ograniczenia, aby mieć pełny obraz swoich działań.
- 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.
Określanie 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ć przesyłki po zamknięciu sklepu. | Są to preferencje, które można w razie potrzeby naruszyć, 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 elementów, które pojazd może przewozić.
- 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 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 odbioru |
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 jedno i drugie. |
| Lokalizacja zadania |
pickups[].arrivalWaypointdeliveries[].arrivalWaypoint
|
Położenie geograficzne, w którym 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. |
| Ograniczenia dotyczące pojazdów | 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ć daną 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 celów
| 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 kierowców. 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 kierowaniem 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 dostaw. | 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 poniesieniem „kosztu”, a nie z niepowodzeniem zadania. |
| 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. dodając 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 uwzględnienia przesyłek dodanych 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 parametr
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 reprezentujący zoptymalizowane zarządzanie zasobami i zadaniami przy jednoczesnym przestrzeganiu ograniczeń i celów. Zintegruj ten plan trasy ze swoim systemem, aby używać go w codziennej działalności. Zwykle obejmuje to wizualizację planu trasy dla menedżerów floty i wysyłanie kierowcom szczegółowych wskazówek dojazdu.
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 Route Optimization typu open source, aby zobaczyć, jak interfejs API przekształca dane w fizyczne ścieżki na mapie. Ta aplikacja internetowa służy jako narzędzie do eksploracji, które umożliwia tworzenie scenariuszy, dostosowywanie 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 przejrzeć 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ę kierowcy 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 udostępnić precyzyjne linki do aplikacji Mapy Google dla konsumentów.
- Navigation SDK: jeśli masz niestandardową aplikację dla kierowców, możesz zintegrować Navigation SDK na Androida lub iOS, aby udostępniać w aplikacji szczegółowe wskazówki dojazdu.
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ą planowanej trasy do oceny, a Fleet Engine łączy zaplanowaną sekwencję wizyt ze śledzeniem pojazdu na żywo.