W tym przewodniku znajdziesz możliwe zastosowania atrybutów przejścia. Dowiesz się z niego, jak modelować rzeczywiste scenariusze na 2 przykładach: uwzględnianie czasu parkowania pojazdu w zoptymalizowanych trasach i zapewnianie, że każda trasa kończy się wizytą w określonej lokalizacji.
Zanim zaczniesz
Atrybuty przejścia służą do dodawania kosztów i opóźnień związanych z konkretnym modelem do określonych przejść na zoptymalizowanych trasach. Te koszty i opóźnienia są dodawane do czasu przejazdu i kosztów obliczonych na podstawie danych mapy na podstawie parametrów używanego pojazdu.
Przejście to odcinek trasy łączący jedną lokalizację z następną.
Lokalizacja to dowolny z tych punktów na trasie pojazdu:
- Punkt początkowy trasy.
- Miejsce, w którym następuje odbiór lub dostawa.
- punkt końcowy trasy,
Wszystkie atrybuty przejścia dla modelu określasz, dodając je do listy
ShipmentModel.transition_attributes.
Każdy element listy definiuje jeden zestaw atrybutów przejścia i jest dopasowywany do przejść na trasach za pomocą tagów w lokalizacji początkowej i końcowej przejścia. Więcej informacji o atrybutach przejścia znajdziesz w dokumentacji referencyjnej TransitionAttributes.
Modelowanie scenariuszy z życia codziennego
W tej sekcji znajdziesz 2 krótkie przykłady wdrażania rzeczywistych ograniczeń biznesowych za pomocą atrybutów przejścia.
Rezerwowanie czasu parkowania
W tej sytuacji kierowca musi zaparkować pojazd, zanim będzie mógł odwiedzić lokalizację A. Lokalizacja B znajduje się w pobliżu, a kierowca może skorzystać z tego samego miejsca parkingowego podczas obu wizyt. Jeśli kierowca odwiedzi punkt B bezpośrednio po punkcie A, zaoszczędzi czas, ponieważ nie będzie musiał opuszczać miejsca parkingowego i ponownie parkować pojazdu. W interfejsie Route Optimization API możesz używać atrybutów przejścia, aby dodać dodatkowy czas na parkowanie pojazdu tylko wtedy, gdy kierowca przemieszcza się z jednego miejsca parkingowego na inne.
Jeśli czas parkowania jest modelowany oddzielnie od czasu trwania wizyt, trasy, na których wizyty korzystające z tego samego parkingu są zgrupowane, zajmują mniej czasu. Dzięki temu model jest dokładniejszy, a optymalizator preferuje trasy, na których wizyty są zgrupowane.
Aby to zrobić w żądaniu interfejsu Route Optimization API, wykonaj te czynności:
Używaj
VisitRequest.durationtylko przez czas potrzebny na wizytę. Na przykład przekazać paczkę i zebrać podpis klienta.W przypadku każdego odrębnego miejsca parkingowego użytego w modelu użyj nowego tagu, który nie jest używany do niczego innego w modelu, np.
PARKING_123.Dodaj ten tag do tych elementów:
VisitRequest.tagswe wszystkich żądaniach wizyt, które korzystają z tego miejsca parkingowego.Vehicle.start_tagsjeśli pojazd rozpoczyna trasę w tym miejscu parkingowym.Vehicle.end_tagsjeśli pojazd rozpoczyna lub kończy trasę na tym parkingu.
Dla każdego nowego tagu parkowania dodaj wpis do
ShipmentModel.transition_attributesktóry dodaje opóźnienie parkowania w przypadku przyjazdu z innego miejsca parkingowego, wykonując te czynności:Ustaw
TransitionAttributes.excluded_src_tagiTransitionAttributes.dst_tagnaPARKING_123.Ustaw wartość
TransitionAttributes.delayna czas potrzebny na zaparkowanie pojazdu.
Jeśli na przykład tag lokalizacji to
PARKING_123, a zaparkowanie pojazdu zajmuje 150 sekund, dodaj doShipmentModel.transition_attributesten wpis:{ "excluded_src_tag": "PARKING_123", "dst_tag": "PARKING_123", "delay": "150s" }
Obowiązkowe sprzątanie na końcu trasy
W tym scenariuszu pojazd musi zostać wyczyszczony na końcu trasy, z uwzględnieniem tych dodatkowych ograniczeń:
- Czyszczenie odbywa się w specjalistycznym zakładzie, a następnie pojazd wraca do zajezdni. Zoptymalizowana trasa korzysta z najlepszego punktu czyszczenia na podstawie jego lokalizacji oraz lokalizacji odbioru i dostawy wykonanych przez pojazd.
- Po zakończeniu sprzątania pojazd nie może wykonywać żadnych dodatkowych odbiorów ani dostaw.
- Czas dojazdu i czyszczenia pojazdu wlicza się do godzin pracy kierowcy i musi mieścić się w maksymalnym czasie trwania trasy.
Ten wymóg modelujesz, zezwalając tylko na trasy, które są puste lub których ostatnim punktem jest myjnia. W interfejsie Route Optimization API możesz to zrobić, zabraniając przejść do końcowego punktu pośredniego trasy z dowolnego miejsca z wyjątkiem punktu początkowego trasy lub punktu początkowego trasy:
- Wybierz 2 nowe tagi, które nie są używane w modelu, np.
CLEANEDiROUTE_END. Pierwszy z nich dotyczy miejsc, w których pojazd jest lub staje się czysty, a drugi – końca trasy. - W przypadku każdego pojazdu dodaj nową przesyłkę tylko z dostawą, która reprezentuje wizytę w myjni, z tymi atrybutami:
- Każda lokalizacja pralni powinna być reprezentowana jako prośba o wizytę w ramach dostawy tego transportu.
- Dodaj
CLEANEDdoVisitRequest.tagskażdej prośby o wizytę w przypadku przesyłki z zakładu czyszczącego. Sygnalizuje, że pojazd opuszczający tę lokalizację jest czysty. Inne żądania wizyt w modelu nie powinny używać tego tagu, aby pojazd był uznawany za „nieczysty” po opuszczeniu tych miejsc. - Zezwól optymalizatorowi na pominięcie tej dostawy, gdy pojazd nie jest używany w inny sposób, ustawiając jego wartość
penalty_costna małą liczbę.
Do każdego pojazdu dodaj
CLEANEDdoVehicle.start_tags. Służy do oznaczenia pojazdu jako czystego przed rozpoczęciem odbioru lub dostawy, przy założeniu, że został on wyczyszczony pod koniec poprzedniego dnia roboczego, i umożliwia mu przejazd z początkowego punktu trasy bezpośrednio do punktu końcowego. Nawet jeśli takie trasy nie są w praktyce możliwe, dopuszczenie tego scenariusza pomaga optymalizatorowi skuteczniej wyszukiwać zoptymalizowane trasy.Do każdego pojazdu dodaj
ROUTE_ENDdoVehicle.end_tags.Dodaj nowy wpis do
ShipmentModel.transition_attributes, który zabrania pojazdom docierania do punktu końcowego trasy, jeśli nie są czyste. Wpis powinien mieć te właściwości:Ustaw
TransitionAttributes.excluded_src_tagnaCLEANED.Ustaw
TransitionAttributes.dst_tagnaROUTE_END.Ustaw
TransitionAttributes.delayna dużą wartość. Jeśli ustawisz opóźnienie dłuższe niż maksymalny czas trwania trasy, uniemożliwisz optymalizatorowi użycie tego przejścia na trasie.
Jeśli na przykład skala czasowa modelu to 1 dzień roboczy, możesz użyć opóźnienia wynoszącego 24 godziny (86 400 sekund), aby zabronić przejścia do końca trasy z dowolnego miejsca z wyjątkiem punktu czyszczenia i początku trasy:
{ "excluded_src_tag": "CLEANED", "dst_tag": "ROUTE_END", "delay": "86400s" }
Jak wybrać między opóźnieniami a kosztami
Wybór między opóźnieniami a kosztami zależy od charakteru wdrożonej logiki biznesowej i ograniczeń. Ustawienie
TransitionAttributes.delay
jest najlepsze do wdrażania sztywnych ograniczeń lub wyrażania kompromisu w zakresie
czasu.
TransitionAttributes.cost
lepiej sprawdza się w przypadku wdrażania preferencji miękkich lub kompromisów wyrażonych jako dodatkowy koszt. Możesz dowolnie łączyć opóźnienia i koszty, jeśli chodzi o czas i koszty.
W przykładzie czyszczenia pojazdu użyto bardzo długiego opóźnienia, ponieważ wyczyszczenie pojazdu na końcu trasy jest wymagane, a długie opóźnienie uniemożliwia optymalizatorowi zignorowanie tego wymagania. Jeśli ustawisz tylko koszt, optymalizator może pominąć czyszczenie, jeśli znajdzie sposób na zrekompensowanie kosztów w inny sposób, np. dostarczając więcej przesyłek w czasie „zaoszczędzonym” dzięki nieczyszczeniu pojazdu.
W przykładzie dotyczącym parkowania użyto krótkiego opóźnienia, które odpowiada dodatkowemu czasowi potrzebnemu na zaparkowanie pojazdu. Możesz też użyć atrybutu costs w połączeniu z atrybutem delays, jeśli kierowca zatrzymuje się na płatnym parkingu.
Jak dodać atrybut przejścia, który pasuje do wszystkich żądań wizyt
W przykładach powyżej użyto atrybutów przejścia, które pasują do lokalizacji z danym tagiem lub bez niego. Ale co, jeśli chcesz dodać atrybuty przejścia, które mają zastosowanie do wszystkich przejść?
Nie możesz po prostu pominąć tagów, ponieważ każdy komunikat musi zawierać jeden z tagów TransitionAttributes, TransitionAttributes.src_tag i TransitionAttributes.excluded_src_tag oraz jeden z tagów TransitionAttributes.dst_tag i TransitionAttributes.excluded_dst_tag.
Możesz jednak dopasować wszystkie tagi, ustawiając
TransitionAttributes.excluded_src_tag
lub
TransitionAttributes.excluded_dst_tag
na tag, który nie jest nigdzie używany w modelu. Będzie to pasować do wszystkich lokalizacji, które nie mają tego tagu, ale ponieważ celowo wybrano tag, który nie jest używany przez żadną lokalizację, te atrybuty przejścia będą pasować do wszystkich lokalizacji.