Z tego przewodnika dowiesz się, jak korzystać z atrybutów przejścia. Nauczysz się, jak modelować rzeczywiste scenariusze na 2 przykładach: uwzględniania czasu parkowania pojazdu w zoptymalizowanych trasach oraz zapewnienia, że każda trasa kończy się wizytą w określonej lokalizacji.
Zanim zaczniesz
Atrybuty przejścia służą do dodawania do zoptymalizowanych tras kosztów i opóźnień specyficznych dla modelu w przypadku niektórych przejść. Koszty i opóźnienia są dodawane do czasu trwania przejścia i kosztów obliczonych na podstawie danych mapy na podstawie parametrów używanego pojazdu.
Przejście to odcinek trasy, który łączy jedną lokalizację z drugą.
Lokalizacja to dowolny z tych punktów na trasie pojazdu:
- punkt początkowy trasy,
- przystanek, na którym następuje odbiór lub dostawa,
- punkt końcowy trasy.
Wszystkie atrybuty przejścia dla modelu definiujesz, dodając je do listy
ShipmentModel.transition_attributes.
Każdy element listy definiuje 1 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 dla
TransitionAttributes.
Modelowanie rzeczywistych scenariuszy
W tej sekcji znajdziesz 2 krótkie przykłady wdrażania rzeczywistych ograniczeń biznesowych za pomocą atrybutów przejścia.
Rezerwowanie czasu na parkowanie
W tym scenariuszu 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 w przypadku obu wizyt. Jeśli kierowca odwiedzi lokalizację B bezpośrednio po lokalizacji 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 drugie.
Gdy modelujesz czas parkowania oddzielnie od czasu trwania wizyty, trasy, na których wizyty korzystające z tego samego parkingu są grupowane, zajmują mniej czasu. Dzięki temu model jest dokładniejszy, a optymalizator preferuje trasy, na których wizyty są grupowane.
Aby to zrobić w żądaniu do interfejsu Route Optimization API:
Używaj
VisitRequest.durationtylko w przypadku czasu potrzebnego na wizytę. Na przykład na przekazanie paczki i zebranie podpisu od klienta.W przypadku każdego odrębnego miejsca parkingowego używanego 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 wizyty, które korzystają z tego miejsca parkingowego.Vehicle.start_tags, jeśli pojazd rozpoczyna trasę w tym miejscu parkingowym.Vehicle.end_tags, jeśli pojazd kończy trasę w tym miejscu parkingowym.
W przypadku każdego nowego tagu parkowania dodaj wpis do
ShipmentModel.transition_attributesktóry dodaje opóźnienie na parkowanie, gdy przyjeżdżasz z innego miejsca parkingowego, wykonując te czynności:Ustaw
TransitionAttributes.excluded_src_tagiTransitionAttributes.dst_tagnaPARKING_123.Ustaw
TransitionAttributes.delayna czas potrzebny na parkowanie pojazdu.
Jeśli na przykład tag lokalizacji to
PARKING_123, a parkowanie pojazdu zajmuje 150 sekund, dodaj ten wpis doShipmentModel.transition_attributes:{ "excluded_src_tag": "PARKING_123", "dst_tag": "PARKING_123", "delay": "150s" }
Obowiązkowe czyszczenie 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 specjalistycznej myjni przed powrotem do zajezdni. Zoptymalizowana trasa korzysta z najlepszej myjni na podstawie jej lokalizacji oraz lokalizacji odbioru i dostawy wykonanych przez pojazd.
- Po czyszczeniu 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.
To wymaganie modelujesz, zezwalając tylko na trasy, które są puste lub których ostatnia wizyta jest w myjni. W interfejsie Route Optimization API możesz to zrobić, zabraniając przejść do końcowego punktu pośredniego trasy z dowolnej lokalizacji z wyjątkiem myjni lub punktu początkowego trasy:
- Wybierz dwa nowe tagi, które nie są używane nigdzie w modelu, np.
CLEANEDiROUTE_END. Pierwszy tag jest przeznaczony dla lokalizacji, w których pojazd jest lub staje się czysty, a drugi – dla 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 myjni powinna być reprezentowana jako żądanie wizyty dostawy w ramach tej przesyłki.
- Dodaj
CLEANEDdoVisitRequest.tagskażdego żądania wizyty w ramach przesyłki do myjni. Sygnalizuje to, że pojazd opuszczający tę lokalizację jest czysty. Inne żądania wizyty w modelu nie powinny używać tego tagu, aby pojazd był uznawany za „nieczysty” podczas opuszczania tych lokalizacji. - Zezwól optymalizatorowi na pominięcie tej przesyłki, gdy pojazd nie jest używany, ustawiając jej
penalty_costna małą liczbę.
W przypadku każdego pojazdu dodaj
CLEANEDdoVehicle.start_tags. Służy to do oznaczania pojazdu jako czystego przed wykonaniem odbioru lub dostawy, przy założeniu, że został on wyczyszczony na koniec poprzedniego dnia roboczego, i umożliwia mu przejście z początkowego punktu pośredniego bezpośrednio do punktu końcowego. Nawet jeśli takie trasy nie występują w praktyce, zezwolenie na ten scenariusz pomaga optymalizatorowi skuteczniej wyszukiwać zoptymalizowane trasy.W przypadku każdego pojazdu dodaj
ROUTE_ENDdoVehicle.end_tags.Dodaj nowy wpis do
ShipmentModel.transition_attributesktóry zabrania pojazdom docierania do końcowego punktu pośredniego, gdy nie są czyste, z tymi właściwościami:Ustaw
TransitionAttributes.excluded_src_tagnaCLEANED.Ustaw
TransitionAttributes.dst_tagnaROUTE_END.Ustaw
TransitionAttributes.delayna dużą wartość. Gdy ustawisz opóźnienie dłuższe niż maksymalny czas trwania trasy, skutecznie zabronisz optymalizatorowi używania tego przejścia na trasie.
Jeśli na przykład skala czasu modelu to 1 dzień roboczy, możesz użyć opóźnienia wynoszącego 24 godziny (86 400 sekund), aby zabronić przejścia na koniec trasy z dowolnego miejsca z wyjątkiem myjni 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
najlepiej sprawdza się w przypadku wdrażania twardych ograniczeń lub wyrażania kompromisu w zakresie
czasu spędzonego.
TransitionAttributes.cost
lepiej pasuje do wdrażania miękkich preferencji lub kompromisów wyrażonych jako dodatkowy koszt. Możesz dowolnie łączyć opóźnienia i koszty, gdy chodzi o czas spędzony i koszty.
W przykładzie czyszczenia pojazdu używamy bardzo długiego opóźnienia, ponieważ czyszczenie pojazdu na końcu trasy jest twardym wymaganiem, 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 kosztu w innym miejscu, np. dostarczając więcej przesyłek w czasie "zaoszczędzonym" przez nieczyszczenie pojazdu.
W przykładzie parkowania używamy krótkiego opóźnienia, które odpowiada dodatkowemu czasowi potrzebnemu na parkowanie pojazdu. Możesz też używać kosztów w połączeniu z opóźnieniami, jeśli kierowca zatrzymuje się na płatnym parkingu.
Jak dodać atrybut przejścia, który pasuje do wszystkich żądań wizyty
W powyższych przykładach używamy atrybutów przejścia, które pasują do lokalizacji z danym tagiem lub lokalizacji bez tagu. Ale co, jeśli musisz dodać atrybuty przejścia, które mają zastosowanie do wszystkich przejść?
Nie możesz po prostu pominąć tagów, ponieważ każdy
TransitionAttributes
komunikat musi zawierać jeden z
TransitionAttributes.src_tag
i
TransitionAttributes.excluded_src_tag
oraz jeden z
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 używany w modelu. Spowoduje to dopasowanie 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.