Z tego przewodnika dowiesz się, jak można używać atrybutów przejściowych. Nauczysz się modelować scenariusze z życia wzięte na podstawie 2 przykładów: uwzględniania czasu parkowania pojazdu w optymalizowanych trasach i zapewnienia, aby każda trasa kończyła się wizytą w konkretnej lokalizacji.
Zanim zaczniesz
Używasz atrybutów przejścia, aby dodać koszty i opóźnienia związane z konkretnym modelem dla niektórych przejść na zoptymalizowanych trasach. Te koszty i opóźnienia są dodawane do czasu trwania przejazdu i kosztów obliczanych na podstawie danych z mapy na podstawie parametrów używanego pojazdu.
Przejście to segment trasy łączący jedną lokalizację z kolejną.
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 na liście definiuje jeden zestaw atrybutów przejścia i jest dopasowywany do przejść na trasach za pomocą tagów na początku i końcu przejścia. Więcej informacji o atrybutach przejścia znajdziesz w dokumentacji TransitionAttributes
.
Modelowanie scenariuszy z życia codziennego
W tej sekcji znajdziesz 2 krótkie przykłady implementowania rzeczywistych ograniczeń biznesowych za pomocą atrybutów przejściowych.
Rezerwowanie czasu na parkowanie
W tym scenariuszu kierowca musi zaparkować pojazd, zanim odwiedzi lokalizację A. Lokalizacja B znajduje się w pobliżu, a kierowca może korzystać z tego samego miejsca parkingowego podczas obu wizyt. Jeśli kierowca odwiedzi B bezpośrednio po 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 zaparkowanie pojazdu tylko wtedy, gdy kierowca przemieszcza się z jednego miejsca parkingowego na inne.
Jeśli czas parkowania modelujesz oddzielnie od czasu wizyty, trasy, na których wizyty korzystają z tego samego miejsca parkingowego, będą zajmować mniej czasu. Sprawiasz, że model staje się dokładniejszy, a także sprawiasz, że optymalizator preferuje trasy, na których wizyty są grupowane.
Aby to zrobić, wykonaj te czynności w prośbie do interfejsu Route Optimization API:
Używaj
VisitRequest.duration
tylko przez czas potrzebny do wykonania wizyty. Na przykład, aby przekazać przesyłkę i uzyskać podpis klienta.W przypadku każdego 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:
VisitRequest.tags
w przypadku wszystkich żądań wizyty, które korzystają z tego miejsca parkingowego.Vehicle.start_tags
jeśli pojazd rozpoczyna trasę na tym parkingu.Vehicle.end_tags
jeśli pojazd rozpoczyna lub kończy swoją trasę na tym parkingu.
W przypadku każdego nowego tagu parkingowego dodaj wpis do pliku
ShipmentModel.transition_attributes
, który dodaje opóźnienie parkowania po przyjeździe z innego miejsca parkingowego. W tym celu:Ustaw
TransitionAttributes.excluded_src_tag
iTransitionAttributes.dst_tag
naPARKING_123
.Ustaw wartość
TransitionAttributes.delay
na czas potrzebny na zaparkowanie pojazdu.
Jeśli np. tag lokalizacji to
PARKING_123
i zaparkowanie pojazdu zajmuje 150 sekund, dodaj ten wpis do plikuShipmentModel.transition_attributes
:{ "excluded_src_tag": "PARKING_123", "dst_tag": "PARKING_123", "delay": "150s" }
Obowiązkowe sprzątanie na końcu trasy
W tym przypadku pojazd musi zostać wyczyszczony na końcu trasy, przy czym obowiązują te dodatkowe ograniczenia:
- Czyszczenie odbywa się w specjalistycznym zakładzie czyszczącym przed powrotem do bazy. Zoptymalizowana trasa korzysta z najlepszej firmy sprzątającej na podstawie jej lokalizacji oraz lokalizacji odbioru i dostawy wykonywanych przez pojazd.
- Po czyszczeniu pojazd nie może wykonywać żadnych dodatkowych odbiorów ani dostaw.
- Czas potrzebny na przejazd i wyczyszczenie pojazdu jest wliczany do czasu pracy kierowcy i musi mieścić się w maks. czasie trwania trasy.
Możesz to modelować, zezwalając tylko na trasy, które są puste lub których ostatnia wizyta to wizyta w zakładzie czyszczącym. W interfejsie Route Optimization API możesz to zrobić, zakazując przejść do punktu końcowego trasy z dowolnej lokalizacji oprócz myjni lub punktu początkowego trasy:
- Wybierz 2 nowe tagi, które nie są nigdzie używane w modelu, np.
CLEANED
iROUTE_END
. Pierwszy z nich dotyczy lokalizacji, w których pojazd jest lub staje się czysty, a drugi – końca trasy. - W przypadku każdego pojazdu dodaj nową przesyłkę z dostawą, która będzie reprezentować wizytę w myjni samochodowej. Podaj te atrybuty:
- Każda lokalizacja firmy sprzątającej powinna być reprezentowana jako prośba o wizytę w ramach dostawy.
- Dodaj
CLEANED
doVisitRequest.tags
każdej prośby o wizytę w ramach dostawy do ośrodka sprzątania. oznacza, że pojazd, który opuszcza tę lokalizację, jest czysty. Inne żądania wizyty w danym modelu nie powinny używać tego tagu, aby pojazd był uważany za „nieczysty” po opuszczeniu go przez klienta. - Pozwól optymalizatorowi pominąć tę dostawę, gdy pojazd jest nieużywany, ustawiając dla niego wartość
penalty_cost
na małą liczbę.
W przypadku każdego pojazdu dodaj
CLEANED
doVehicle.start_tags
. Służy on do oznaczenia pojazdu jako czystego przed wykonaniem odbioru lub dostawy, przy założeniu, że pojazd został wyczyszczony pod koniec poprzedniego dnia roboczego. Pozwala to pojazdowi przejść z punktu docelowego początkowego bezpośrednio do punktu docelowego końcowego. Nawet jeśli w praktyce takie trasy nie występują, uwzględnienie tego scenariusza pomaga optymalizatorowi skuteczniej wyszukiwać zoptymalizowane trasy.W przypadku każdego pojazdu dodaj
ROUTE_END
doVehicle.end_tags
.Dodaj nowy wpis do
ShipmentModel.transition_attributes
, który uniemożliwia pojazdom dotarcie do punktu końcowego, gdy nie są czyste. Wpis musi mieć te właściwości:Ustaw
TransitionAttributes.excluded_src_tag
naCLEANED
.Ustaw
TransitionAttributes.dst_tag
naROUTE_END
.Ustaw wartość
TransitionAttributes.delay
na dużą wartość. Jeśli opóźnienie jest dłuższe niż maksymalny czas trwania trasy, skutecznie uniemożliwiasz optymalizatorowi użycie tego przejścia na trasie.
Jeśli na przykład skala czasowa modelu wynosi 1 dzień roboczy, możesz użyć opóźnienia 24 godzin (86 400 sekund), aby zabronić przejścia do końca trasy z dowolnego miejsca, z wyjątkiem miejsca 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 zaimplementowanej logiki biznesowej i ograniczeń. Ustawienie wartości TransitionAttributes.delay
jest najlepsze do stosowania sztywnych ograniczeń lub do wyrażenia kompromisu w zakresie poświęconego czasu.
TransitionAttributes.cost
jest bardziej odpowiednia do stosowania w przypadku preferencji nieformalnych lub kompromisów wyrażonych jako dodatkowe koszty. Opóźnienia i koszty możesz łączyć dowolnie, jeśli chodzi o czas i koszty.
Przykład czyszczenia pojazdu używa bardzo długiego opóźnienia, ponieważ czyszczenie pojazdu na końcu trasy jest twardym wymogiem, a długie opóźnienie uniemożliwia optymalizatorowi zignorowanie tego wymogu. Jeśli ustawisz tylko koszt, optymalizator może pominąć czyszczenie, jeśli znajdzie sposób na pokrycie kosztów w inny sposób, na przykład poprzez dostarczenie większej liczby przesyłek w czasie „zaoszczędzonym” na nieczyszczeniu pojazdu.
Przykład z parkingiem używa krótkiego opóźnienia odpowiadającego dodatkowemu czasowi potrzebnemu na zaparkowanie pojazdu. Możesz też użyć atrybutu costs w połączeniu z atrybutem opóźnienia, jeśli kierowca zatrzymuje się na płatnym parkingu.
Jak dodać atrybut przejścia pasujący do wszystkich żądań wizyty
Powyższe przykłady używają atrybutów przejścia, które pasują do lokalizacji z danym tagiem lub bez niego. Co jednak, jeśli musisz dodać atrybuty przejścia, które mają zastosowanie do wszystkich przejść?
Nie możesz pominąć tagów, ponieważ każda wiadomość TransitionAttributes
musi zawierać jeden z tagów: 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 wartość TransitionAttributes.excluded_src_tag
lub TransitionAttributes.excluded_dst_tag
, aby wskazać tag, który nigdzie w modelu nie jest używany. Dopasuje to wszystkie lokalizacje, które nie mają tego tagu, ale ponieważ celowo wybrano tag, którego nie używa żadna lokalizacja, te atrybuty przejścia będą pasować do wszystkich lokalizacji.