Modelowanie logiki biznesowej za pomocą atrybutów przejścia

W tym przewodniku pokazujemy możliwe zastosowania atrybutów przejścia. Dowiesz się, jak modelować rzeczywiste scenariusze na 2 przykładach: uwzględniania czasu na zaparkowanie pojazdu w zoptymalizowanych trasach i zapewniania, ż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 niektórych przejść na zoptymalizowanych trasach. Te koszty i opóźnienia są dodawane do czasu trwania i kosztów przejazdu obliczonych na podstawie danych mapy i parametrów używanego pojazdu.

Przejście to odcinek trasy, który łączy jedną lokalizację z następną.

Lokalizacja odnosi się do dowolnego 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 TransitionAttributes.

Modelowanie scenariuszy z życia codziennego

W tej sekcji znajdziesz 2 krótkie przykłady pokazujące, jak wdrożyć rzeczywiste ograniczenia biznesowe za pomocą atrybutów przejścia.

Zarezerwuj czas 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 podczas obu wizyt. Jeśli kierowca odwiedzi punkt B zaraz po punkcie A, zaoszczędzi czas, ponieważ nie będzie musiał opuszczać miejsca parkingowego i ponownie parkować pojazdu. W 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 trwania wizyt, trasy, na których wizyty korzystające z tego samego parkingu są zgrupowane, zajmują mniej czasu. Zwiększasz precyzję modelu, a także sprawiasz, że optymalizator preferuje trasy, na których wizyty są pogrupowane.

Aby to zrobić w żądaniu do interfejsu Route Optimization API, wykonaj te czynności:

  1. Używaj VisitRequest.duration tylko przez czas potrzebny do przeprowadzenia wizyty. Na przykład przekazanie paczki i uzyskanie podpisu klienta.

  2. Dla 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.

  3. Dodaj ten tag do tych elementów:

    1. VisitRequest.tags we wszystkich prośbach o wizytę, które korzystają z tego miejsca parkingowego.

    2. Vehicle.start_tags, jeśli pojazd rozpoczyna trasę na tym miejscu parkingowym.

    3. Vehicle.end_tags, jeśli pojazd rozpoczyna lub kończy trasę na tym miejscu parkingowym.

  4. Dla każdego nowego tagu parkowania dodaj wpis do pliku ShipmentModel.transition_attributes, który dodaje opóźnienie parkowania, gdy pojazd przyjeżdża z innego miejsca parkingowego. Aby to zrobić:

    1. Ustaw TransitionAttributes.excluded_src_tag i TransitionAttributes.dst_tag na PARKING_123.

    2. Ustaw TransitionAttributes.delay na czas potrzebny na zaparkowanie pojazdu.

    Jeśli na przykład tag lokalizacji to PARKING_123, a zaparkowanie pojazdu zajmuje 150 sekund, dodaj do pliku ShipmentModel.transition_attributes ten wpis:

    {
      "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 następującymi dodatkowymi ograniczeniami:

  • Czyszczenie odbywa się w specjalistycznym zakładzie przed powrotem do zajezdni. Zoptymalizowana trasa korzysta z najlepszej myjni na podstawie jej lokalizacji oraz lokalizacji odbiorów i dostaw realizowanych 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.

Możesz spełnić ten wymóg, zezwalając tylko na trasy, które są puste lub których ostatnia wizyta odbywa się 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 punktu czyszczenia lub punktu początkowego trasy:

  1. Wybierz 2 nowe tagi, które nie są używane w żadnym miejscu w modelu, na przykład CLEANED i ROUTE_END. Pierwszy dotyczy lokalizacji, w których pojazd jest lub staje się czysty, a drugi – końca trasy.
  2. Dla każdego pojazdu dodaj nową przesyłkę obejmującą tylko dostawę, która reprezentuje wizytę w myjni, z tymi atrybutami:
    1. Każda lokalizacja zakładu czyszczącego powinna być reprezentowana jako prośba o wizytę dostawy tej przesyłki.
    2. Dodaj CLEANED do VisitRequest.tags każdej prośby o wizytę dotyczącej przesyłki do placówki czyszczenia. Sygnalizuje, ż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” po ich opuszczeniu.
    3. Zezwól optymalizatorowi na pominięcie tej przesyłki, gdy pojazd nie jest używany, ustawiając jego penalty_cost na małą liczbę.
  3. W przypadku każdego pojazdu dodaj CLEANED do Vehicle.start_tags. Służy do oznaczania pojazdu jako czystego przed rozpoczęciem odbioru lub dostawy, przy założeniu, że został on wyczyszczony na koniec poprzedniego dnia roboczego, i umożliwia mu przejazd z początkowego punktu na trasie bezpośrednio do końcowego punktu na trasie. Nawet jeśli takie trasy nie występują w praktyce, zezwolenie na ten scenariusz pomaga optymalizatorowi skuteczniej wyszukiwać zoptymalizowane trasy.

  4. W przypadku każdego pojazdu dodaj ROUTE_END do Vehicle.end_tags.

  5. Dodaj do ShipmentModel.transition_attributes nowy wpis, który uniemożliwia pojazdom dotarcie do punktu końcowego, gdy nie są czyste. Użyj tych właściwości:

    1. Ustaw TransitionAttributes.excluded_src_tag na CLEANED.

    2. Ustaw TransitionAttributes.dst_tag na ROUTE_END.

    3. Ustaw dużą wartość TransitionAttributes.delay. Jeśli ustawisz opóźnienie dłuższe niż maksymalny czas trwania trasy, skutecznie uniemożliwisz 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 wynoszącego 24 godziny (86 400 sekund), aby uniemożliwić przejście 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 najlepiej sprawdza się w przypadku wdrażania twardych ograniczeń lub wyrażania kompromisu w zakresie poświęconego czasu. TransitionAttributes.cost lepiej sprawdza się przy wdrażaniu preferencji miękkich lub kompromisów wyrażonych jako dodatkowy koszt. Jeśli chodzi o czas i koszty, możesz dowolnie łączyć opóźnienia i koszty.

W przykładzie czyszczenia pojazdu użyto bardzo długiego opóźnienia, ponieważ czyszczenie 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 innym miejscu, np. przez dostarczenie większej liczby przesyłek w czasie „zaoszczędzonym” dzięki temu, że pojazd nie był czyszczony.

W przykładzie z parkowaniem użyto krótkiego opóźnienia, które odpowiada dodatkowemu czasowi potrzebnemu na zaparkowanie pojazdu. Możesz też użyć kosztów w połączeniu z opóźnieniami, jeśli kierowca zatrzyma się na płatnym parkingu.

Jak dodać atrybut przejścia, który pasuje do wszystkich żądań wizyty

W powyższych przykładach 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ż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 TransitionAttributes.excluded_src_tag lub TransitionAttributes.excluded_dst_tag na tag, który nie jest używany nigdzie 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.

Więcej informacji