Prognoza popytu i trasa - dwa różne horyzonty

Prognoza popytu odpowiada na pytanie, ile zleceń pojawi się w danym rejonie w najbliższych godzinach. Trasa odpowiada na inne pytanie: w jakiej kolejności pojazd obsłuży zlecenia już przyjęte. Obie wartości mają inny horyzont i inną cenę błędu, więc połączenie ich w jednym kroku „prognoza zmienia trasę” wymaga jawnej reguły, a nie decyzji podejmowanej ad hoc przez dyspozytora.

Horyzont prognozy a horyzont kursu

Prognoza dzienna jest zwykle liczona dla przedziałów kilkugodzinnych i dla obszarów, na przykład stref odbioru. Kurs w toku ma horyzont mierzony w przystankach: kierowca ma za sobą część trasy, a przed sobą kilka punktów z oknami czasowymi. Jeśli prognoza dotyczy południa, a kurs kończy się za godzinę, nowa informacja o popycie nie zmieni tego kursu, tylko następny.

Różnicę widać w samych danych. Zlecenie przyjęte ma adres z oknem czasowym oraz masę ładunku, a prognoza ma wartość oczekiwaną i przedział niepewności. Pierwsze jest faktem, drugie hipotezą, więc silnik trasowania nie powinien traktować ich jednakowo.

Przedział błędu zamiast jednej liczby

Prognoza bez przedziału błędu wprowadza w błąd. Wartość „12 zleceń w strefie północnej między 10:00 a 12:00” może oznaczać od 8 do 16 zleceń, a decyzja o wysłaniu pustego pojazdu w tamtą stronę zależy od tego, który koniec przedziału jest bliższy prawdy. Reguła przeplanowania powinna więc czytać dolną granicę przedziału, gdy koszt pomyłki jest wysoki, i wartość środkową, gdy pomyłka kosztuje niewiele.

CechaZlecenie przyjętePrognoza popytu
Natura danychfakt z adresem i oknem czasowymwartość oczekiwana z przedziałem błędu
Skutek pomyłkireklamacja, kara za spóźnieniezbędny przebieg lub brak rezerwy
Dopuszczalna zmiana trasytylko wstawienie lub zamiana przystankuprzesunięcie rezerwy pojazdów
Częstość aktualizacjiprzy każdym zdarzeniucyklicznie, w stałych odstępach

Reguła: prognoza może przesunąć rezerwę pojazdów, ale nie może zmienić kolejności przystanków, które mają potwierdzone okno u odbiorcy.

Taki podział upraszcza architekturę. Moduł prognoz zapisuje wynik jako zalecenie dla rezerwy, a silnik trasowania zmienia wyłącznie kursy, w których pojawiło się realne zlecenie lub zdarzenie na drodze.

Kobieta przy monitorze z kalendarzem okien czasowych transportów do magazynu
Kalendarz okien czasowych: to on wyznacza granice, w których prognoza w ogóle może zmienić plan kursu

Wyzwalacze przeplanowania tras w ciągu dnia

Zdarzenie i prognoza - dwa typy wyzwalaczy

Wyzwalacz zdarzeniowy reaguje na fakt: nowe zlecenie, anulowanie, awaria pojazdu, zamknięta droga albo opóźnienie przy rozładunku. Wyzwalacz prognostyczny reaguje na przewidywanie, na przykład takie, że liczba zleceń w strefie przekroczy pojemność floty. Pierwszy jest deterministyczny i można go uruchamiać od razu. Drugi wymaga progu, ponieważ prognoza zawsze się waha.

Oba typy trafiają zwykle do jednej kolejki zdarzeń. Silnik trasowania odbiera komunikat z typem zdarzenia i znacznikiem czasu, a reguły rozstrzygają, czy komunikat wywoła pełne przeliczenie kursów, czy tylko wstawienie jednego przystanku. Spójność tej kolejki zależy od kodowania czasu w UTC i od identyfikatora komunikatu, który pozwala odrzucić duplikat.

Próg wejścia i próg wyjścia

Prognoza zmienia się przy każdym nowym pomiarze. Jeśli reguła brzmi „przelicz, gdy prognoza odbiega od planu o więcej niż X procent”, wartość oscylująca wokół X uruchomi przeliczenie wielokrotnie w ciągu godziny. Kierowca dostanie kilka zmian planu pod rząd, a dyspozytor przestanie im ufać.

Rozwiązaniem jest histereza, czyli dwa progi. Pierwszy uzbraja wyzwalacz i uruchamia przeliczenie, a drugi, niższy, zwalnia go dopiero wtedy, gdy odchylenie wyraźnie zmaleje. Poniższy przykład w C# pokazuje samą regułę, bez zależności od konkretnego silnika.

public sealed class ReplanGate
{
    private readonly double _enter; // próg wejścia, np. 0.20
    private readonly double _exit;  // próg wyjścia, np. 0.10
    private bool _armed;

    public ReplanGate(double enter, double exit)
    {
        _enter = enter;
        _exit = exit;
    }

    // deviation = |prognoza - plan| / plan
    public bool ShouldReplan(double forecast, double planned)
    {
        if (planned <= 0) return false;
        double deviation = Math.Abs(forecast - planned) / planned;

        if (!_armed && deviation >= _enter)
        {
            _armed = true;
            return true;
        }
        if (_armed && deviation <= _exit)
        {
            _armed = false;
        }
        return false;
    }
}

Wartości 0,20 i 0,10 są poglądowe. Rzeczywiste progi dobiera się na danych historycznych danej firmy, porównując liczbę niepotrzebnych zmian z liczbą pominiętych okazji.

  • Próg wejścia - odchylenie prognozy od planu, po którym system uruchamia przeliczenie.
  • Próg wyjścia - odchylenie, poniżej którego reguła znowu się uzbraja.
  • Czas ochronny - minimalny odstęp między kolejnymi przeliczeniami tego samego kursu.
  • Minimalny zysk - najmniejsza oszczędność minut lub kilometrów, która uzasadnia zmianę trasy.

Okno zamrożone i koszt zmiany trasy

Które przystanki wolno ruszać

Okno zamrożone obejmuje najbliższe przystanki kursu, których silnik nie może zmienić. Kierowca jest już w drodze do pierwszego z nich, odbiorca dostał potwierdzenie z godziną, a zmiana kolejności oznaczałaby cofanie pojazdu albo unieważnienie okna rozładunku. Zwykle zamraża się przystanek bieżący i następny, a resztę kursu zostawia się do optymalizacji.

Zamrożenie ma także wymiar dokumentowy. Po wydaniu kierowcy dokumentów przewozowych na konkretny adres zmiana punktu wymaga nowego zlecenia albo aneksu, więc automat nie powinien jej wykonywać bez udziału człowieka.

Element kursuZmiana przez systemPowód
Przystanek bieżącyzablokowanakierowca jest w drodze lub na miejscu
Przystanek następny z potwierdzonym oknemzablokowanaodbiorca zarezerwował rampę na konkretną godzinę
Dalsze przystanki bez potwierdzeniadozwolonabrak zobowiązania wobec odbiorcy
Kurs jeszcze niewydanydozwolonakierowca nie ma dokumentów ani planu

Koszt zmiany trasy poza kilometrami

Kilometry stanowią tylko część rachunku. Zmiana trasy oznacza nowy komunikat do kierowcy, ponowne potwierdzenie z odbiorcą, korektę czasu dojazdu i często przesunięcie okna rozładunku, a każdy z tych kroków obciąża ludzi po obu stronach. Jeśli obliczona oszczędność mieści się w błędzie pomiaru, zmiana nie powinna nastąpić.

Reguła: przeplanowanie jest opłacalne dopiero wtedy, gdy oszczędność przekracza łączny koszt zmiany, a nie samą różnicę w kilometrach.

Do tego rachunku wchodzi także kierowca. Trasa zmieniana co kilkanaście minut obniża zaufanie do systemu, a kierowcy zaczynają ją ignorować, co w praktyce wyłącza cały mechanizm. Dlatego parametr „czas ochronny” bywa ważniejszy niż sam algorytm optymalizacji.

Ciężarówka z nakładką z danymi trasy i tabletem obok, obrazująca planowanie tras na podstawie danych
Trasa w trakcie realizacji jest wynikiem wielu ograniczeń jednocześnie, a nie jednej optymalizacji

Wstawianie przystanku do trwającego kursu

Heurystyka najtańszego wstawienia

Silnik trasowania nie musi budować kursu od zera. Dla nowego zlecenia sprawdza każdą pozycję w każdym kursie i liczy przyrost kosztu: dodatkowe kilometry i minuty jazdy, a także ryzyko przekroczenia okna. Wybiera wstawienie o najmniejszym przyroście, o ile spełnia ograniczenia twarde. Ta heurystyka, zwana wstawianiem najtańszym, działa w ułamku sekundy nawet dla dużej floty, dlatego nadaje się do pracy w ciągu dnia, w odróżnieniu od pełnej optymalizacji nocnej.

Formalnie problem nazywa się trasowaniem pojazdów z oknami czasowymi. Opis klasycznego sformułowania i metod jego rozwiązywania znajduje się w dokumentacji narzędzia OR-Tools dla problemu z oknami czasowymi. Firmy transportowe rzadko piszą własny solver, natomiast warto rozumieć, jakie ograniczenia solver dostaje na wejściu.

Zapas czasu przed oknem odbiorcy

Warunkiem wstawienia jest zapas, czyli różnica między planowanym przyjazdem a końcem okna. Zapytanie poniżej, oparte na przykładowym schemacie, wybiera dla kursów w trasie najbliższy planowany przystanek i jego zapas w minutach. Nazwy tabel i kolumn są ilustracyjne.

SELECT k.KursId,
       k.PojazdId,
       s.Lp AS NastepnyPrzystanek,
       DATEDIFF(MINUTE, s.EtaPlan, s.OknoDo) AS ZapasMin
FROM dbo.Kurs AS k
CROSS APPLY (
    SELECT TOP (1) p.Lp, p.EtaPlan, p.OknoDo
    FROM dbo.Przystanek AS p
    WHERE p.KursId = k.KursId
      AND p.Status = 'planowany'
    ORDER BY p.Lp
) AS s
WHERE k.Status = 'w_trasie';

Wynik służy jako filtr wstępny. Kursy z zapasem mniejszym niż czas dodatkowego przystanku odpadają, zanim silnik zacznie liczyć koszty, co skraca przeliczenie i zmniejsza liczbę zmian, które i tak zostałyby odrzucone.

Przeliczenie lokalne i pełne

Przeliczenie lokalne dotyka jednego kursu, więc kończy się szybko i nie zmienia planu pozostałych kierowców. Przeliczenie pełne obejmuje całą flotę i uruchamia się rzadko, na przykład po zamknięciu ważnej drogi albo po awarii kilku pojazdów naraz. Rozdzielenie obu trybów zachowuje stabilność planu w ciągu dnia i zostawia furtkę na duże zmiany.

Wybór trybu zapisuje się w regule, a nie w decyzji operatora. Zdarzenie o niskim priorytecie kończy się lokalnym wstawieniem, a zdarzenie oznaczone jako awaria infrastruktury uruchamia przeliczenie pełne z nowym oknem zamrożonym.

Ograniczenia twarde - czas pracy kierowcy i okna odbiorców

Okna czasowe jako warunek brzegowy

Odbiorca, który awizuje dostawy, ma na rampie ograniczoną liczbę miejsc w każdej godzinie. Przeplanowanie, które przesuwa przyjazd o pół godziny, nie zawsze mieści się w innym oknie, więc prognoza popytu ma sens tylko wtedy, gdy silnik zna rzeczywiste obłożenie ramp. Zagadnienie to opisuje artykuł o tym, jak zsynchronizować trasy z oknami czasowymi magazynów, a organizację kalendarza od strony przewoźnika omawia tekst o kalendarzu dla firmy transportowej.

W praktyce silnik dostaje okno jako parę: początek i koniec, z jawnym rozróżnieniem okna twardego od miękkiego. Przekroczenie okna twardego oznacza odmowę rozładunku, a przekroczenie miękkiego generuje karę w funkcji kosztu, ale kurs pozostaje dopuszczalny.

Zgodność z czasem pracy kierowcy

Drugą grupą ograniczeń twardych jest czas prowadzenia pojazdu. Po 4,5 godziny jazdy kierowca ma obowiązek przerwy trwającej co najmniej 45 minut. Dzienne i tygodniowe limity jazdy wynikają z unijnych przepisów o czasie pracy kierowców. Algorytm sprawdza te warunki dla każdego wstawienia: jeśli dodatkowy przystanek wymusiłby przerwę w miejscu bez parkingu albo przekroczenie limitu, wstawienie odpada.

Dane o dostępnym czasie pracy pochodzą z tachografu i z aplikacji kierowcy. Sposób ich zbierania opisuje artykuł o aplikacji dla kierowcy, a wpływ ograniczeń trasy na koszt paliwa - tekst o routingu uwzględniającym emisję CO2.

Przepływ danych między prognozą a systemami ERP i WMS

Skąd prognoza bierze dane

Wejściem prognozy krótkoterminowej są zamówienia z ERP, historia zleceń z tego samego dnia tygodnia oraz kalendarz akcji sprzedażowych. Na stronie magazynu ten sam typ danych wykorzystuje się do planowania obłożenia, co opisuje tekst o prognozowaniu popytu w magazynie. Warto dbać o to, by obie prognozy pochodziły z jednego źródła, bo rozbieżne liczby w transporcie i w magazynie prowadzą do sprzecznych decyzji.

Komunikaty i idempotencja

Wynik przeplanowania trafia do innych systemów jako komunikat. Każdy komunikat ma identyfikator zlecenia i numer wersji planu, dzięki czemu ponowne wysłanie tego samego zdarzenia aktualizuje istniejący rekord, a nie tworzy drugiego. Bez takiego klucza sieć z gorszym łączem potrafi zdublować kurs i wysłać kierowcy dwie sprzeczne instrukcje.

Moduł awizacji Studio VSS.net pobiera awizacje z systemu ERP i przekazuje je do WMS, a każdy etap od wjazdu pojazdu po rozładunek jest rejestrowany. Opis modułu znajduje się w artykule o awizacjach VSS.net i na stronie produktu Studio VSS.net, który jest oferowany w modelu SaaS. Ogólne zasady łączenia systemów transportowych z ERP i WMS omawia artykuł o integracji TMS z ERP i WMS.

Pomiar skutku przeplanowania

Bez pomiaru nie da się ocenić, czy reguły są dobrze ustawione. Wskaźniki muszą być liczone dla tej samej grupy kursów przed zmianą i po niej, w tym samym dniu tygodnia, bo popyt ma wyraźną sezonowość tygodniową.

WskaźnikCo mierzySygnał ostrzegawczy
Puste kilometry na kursudział przebiegu bez ładunkubrak spadku mimo zmian tras
Punktualność w oknieodsetek dostaw w oknie odbiorcyspadek po wdrożeniu przeplanowania
Zmiany na kursliczba korekt planu w ciągu dniawięcej niż jedna korekta na kilka przystanków
Odrzucone zmianykorekty odrzucone przez kierowcę lub odbiorcęrosnący udział wskazuje zbyt niski próg wejścia

Ostatni wskaźnik jest najbardziej użyteczny przy strojeniu progów. Pozostałe trzy pokazują skutek biznesowy, a ten pokazuje, czy ludzie akceptują to, co proponuje system. Rosnący odsetek odrzuconych zmian oznacza, że system proponuje korekty, których ludzie nie uznają za sensowne, więc progi trzeba podnieść albo wydłużyć czas ochronny.

Uzupełnieniem jest monitoring realizacji, opisany w tekście o oknach dostaw i alertach o opóźnieniu, oraz ogólne zasady planowania transportu. Podstawowy zakres funkcji programu do zleceń przedstawia artykuł o oprogramowaniu dla transportu, a proces w module TMS można obejrzeć w opisie linkway.TMS na stronie producenta.