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.
| Cecha | Zlecenie przyjęte | Prognoza popytu |
|---|---|---|
| Natura danych | fakt z adresem i oknem czasowym | wartość oczekiwana z przedziałem błędu |
| Skutek pomyłki | reklamacja, kara za spóźnienie | zbędny przebieg lub brak rezerwy |
| Dopuszczalna zmiana trasy | tylko wstawienie lub zamiana przystanku | przesunięcie rezerwy pojazdów |
| Częstość aktualizacji | przy każdym zdarzeniu | cyklicznie, 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.

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 kursu | Zmiana przez system | Powód |
|---|---|---|
| Przystanek bieżący | zablokowana | kierowca jest w drodze lub na miejscu |
| Przystanek następny z potwierdzonym oknem | zablokowana | odbiorca zarezerwował rampę na konkretną godzinę |
| Dalsze przystanki bez potwierdzenia | dozwolona | brak zobowiązania wobec odbiorcy |
| Kurs jeszcze niewydany | dozwolona | kierowca 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.

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źnik | Co mierzy | Sygnał ostrzegawczy |
|---|---|---|
| Puste kilometry na kurs | udział przebiegu bez ładunku | brak spadku mimo zmian tras |
| Punktualność w oknie | odsetek dostaw w oknie odbiorcy | spadek po wdrożeniu przeplanowania |
| Zmiany na kurs | liczba korekt planu w ciągu dnia | więcej niż jedna korekta na kilka przystanków |
| Odrzucone zmiany | korekty 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.




