Przeskocz do treści

Delta mi!

Z życia managera magazynu, czyli jak składać optymalne zamówienia?

Spróbuj, drogi Czytelniku, wyobrazić sobie, że zarządzasz wielkim magazynem z milionami różnych towarów na półkach. W Twoim magazynie znajdują się części zamiennie do koparek, samochodów i motocykli, śrubki, silniki, narzędzia, odzież specjalistyczna, smary i oleje napędowe, oraz inne motoryzacyjne cuda. Jeżeli wczułeś się już w swoją rolę, pozwól, że zadam Ci pytanie. W jaki sposób zarządzasz towarami? Skąd wiesz, kiedy złożyć zamówienie?

obrazek

Czy masz ustalony grafik i zamawiasz na początku każdego miesiąca, mimo tego, że niektóre części piętrzą się aż po sufit? A może zamawiasz dopiero wtedy, gdy zabraknie Ci towaru na półce? A co, jeżeli dostawa trwa dwa miesiące, a przed drzwiami magazynu rozentuzjazmowany tłum harleyowców domaga się nowego modelu skórzanych kurtek? Być może, zamawiasz, gdy ilość towaru jest odpowiednio mała? Ale co to znaczy odpowiednio mała? Czy 5 śrubek to wystarczająco mało? A 5 silników do supernowoczesnego, rzadkiego modelu koparki? Poszukiwanie odpowiedzi na podobne pytania to codzienność w Syncronie - moim miejscu pracy. Nasz główny produkt jest aplikacją, dzięki której sieć magazynów może zaoszczędzić pieniądze poprzez m.in. minimalizację ilości przechowywanych towarów, optymalizację procesu składania zamówień i efektywne zarządzanie łańcuchem dostaw. W niniejszym artykule opowiem o małym wycinku jednej z funkcjonalności, to znaczy o strategii zamawiania |(R,Q). Zasada działania tej strategii jest bardzo prosta - składasz zamówienie o wielkości Q, kiedy zauważysz, że ilość towaru spadnie do poziomu |R.

Ile zamawiać?

Teoretyczne opracowania na temat strategii |(R,Q) nie określają jasno, ile zamawiać. Ważne jest natomiast, aby wielkość zamówienia nie zmieniała się istotnie w czasie. Przy wyborze odpowiedniego Q możemy kierować się minimalizacją istotnych kosztów, np. kosztów zamawiania (transport, rozładunek) i przechowywania (koszty związane z zamrożeniem kapitału, składowaniem, potencjalnym zniszczeniem towaru). W praktyce precyzyjne oszacowanie poszczególnych kosztów jest skomplikowane, dlatego też w ramach alternatywy możemy zastosować nieco prostszą formułę, |Q = D/N, gdzie |D to oczekiwany roczny popyt, a N to planowana liczba zamówień w roku.

Kiedy zamawiać?

Przyjmijmy na początek, że popyt i czas dostawy są deterministyczne. Przy znanym popycie możemy dokładnie przewidzieć, kiedy sprzedamy wszystko to, co mamy obecnie w magazynie. Ponieważ czas dostawy jest ustalony, możemy złożyć zamówienie odpowiednio wcześniej - na tyle wcześnie, aby dostawa wypadła w dniu, gdy klient kupuje ostatnią sztukę towaru. Formalizując nieco te rozmyślania,

R = wielkośćpopytu w czasie oczekiwania na dostawę.

W rzeczywistości popyt nie jest deterministyczny, dlatego też porzucamy to założenie. Dla ustalenia uwagi przyjmujemy, że mamy do czynienia ze zmienną losową o rozkładzie normalnym X ∼ N(µ,σ 2), gdzie |µ to oczekiwany popyt w czasie oczekiwania na dostawę, a σ to niepewność naszej prognozy. Podobnie jak poprzednio, moglibyśmy złożyć zamówienie w momencie, gdy ilość towaru w magazynie jest równa µ . Zauważmy jednak, że takie postępowanie daje nam tylko 50% szans, że wszyscy klienci zostaną obsłużeni (rozkład normalny jest symetryczny względem średniej). Ta niepewność prognozy sprawia, że powinniśmy mieć dodatkową pulę towaru na "wszelki wypadek", czyli, innymi słowy, złożyć zamówienie nieco wcześniej. Czy dużo wcześniej? To zależy od poziomu obsługi, który chcemy zapewnić naszym klientom. Pozwólcie, że na moment zboczę nieco z tematu i wtrącę kilka słów o miarach poziomu obsługi, których najczęściej używa się w praktyce.

  • CSL (ang. Cycle Service Level) - prawdopodobieństwo zaspokojenia całego popytu w okresie pomiędzy dostawami wyrażone w procentach,
  • IFR (ang. Item Fill Rate) - procent zaspokojonego popytu,
  • OFR (ang. Order Fill Rate) - procent zamówień zrealizowanych w całości.

Aby doświadczyć różnicy pomiędzy powyższymi miarami, rozważmy scenariusz, w którym zamówienie o wielkości 99 dostarczane jest regularnie pierwszego dnia miesiąca. Popyt jest stały i wynosi |100 sztuk miesięcznie. Oczywiste jest, że IFR = 99% i CSL = 0% (bo w każdym okresie zabraknie jednej sztuki). OFR zależy od charakterystyki popytu. Jeżeli jeden klient zamówił 100 sztuk, to OFR = 0%. Jeżeli dwóch klientów złożyło po jednym zamówieniu na 50 sztuk, to OFR = 50%, ponieważ tylko jedno z dwóch zamówień zostało w całości zrealizowane.

Wróćmy do ustalenia satysfakcjonującej wartości R. Załóżmy, że chcemy zapewnić poziom obsługi CSL równy |n%. Szukamy zatem takiego |R, że popyt w czasie oczekiwania na dostawę nie przekroczy tej wartości z prawdopodobieństwem |n/100, czyli

P (X ⩽ R) = n/100.

Znając rozkład zmiennej losowej X, łatwo znajdujemy odpowiednią wartość |R. Trochę więcej gimnastyki wymaga wyznaczenie R, które zapewni z góry zadany poziom IFR. Zgodnie z definicją,

 niezaspokojony-popyt-- IFR = (1− oczekiwany ( popyt )) ⋅100%.

Jednak w praktyce stosuje się dosyć dobre przybliżenie, z którym łatwiej pracować

 oczekiwany niezaspokojony popyt IFR = (1− --------------------------------) ⋅100%, oczekiwany popyt

my w dalszej części będziemy stosować ten właśnie wzór.

Oczekiwany popyt w okresie pomiędzy zamówieniami jest równy | Q, a wartość oczekiwana niezaspokojonego popytu zależy od | R i jest modelowana przez funkcję straty

 ∞ Gµ,σ (R) = q (x − R) fµ,σ (x)dx, R

gdzie  fµ,σ oznacza gęstość rozkładu normalnego o średniej |µ i odchyleniu standardowym σ. Przy odrobinie cierpliwości można wykazać, że funkcja |Gµ,σ jest ściśle malejąca, istnieje zatem funkcja do niej odwrotna, dzięki czemu R może być jednoznacznie wyznaczone. Odpowiednia wartość |R uzyskiwana jest numerycznie. Dużym ułatwieniem przy obliczeniach jest standaryzacja rozkładu, która prowadzi do zależności

 R − µ Gµ,σ (R) = σG0,1(----) σ

oraz formuła G (R) = f (R) − R(1− Φ (R)), 0,1 0,1 którą można otrzymać z wyjściowego wzoru ( Φ (R) to dystrybuanta rozkładu N(0,1) ).

Przykład. Załóżmy, że popyt w czasie oczekiwania na dostawę modelowany jest rozkładem normalnym o średniej µ = 120 i odchyleniu standardowym |σ= 40. Czas oczekiwania na dostawę wynosi 1 tydzień, a zamówienie składane jest |24 razy w roku. Naszym zadaniem jest wyznaczenie strategii |(R,Q), która zapewni CSL = 80%. Jaki jest oczekiwany poziom IFR dla takiej strategii? Obliczmy najpierw wielkość zamówienia:

Q = D/N = (120/7 ⋅365)/24≈ 261.

Zgodnie z definicją CSL szukamy kwantyla rzędu |0,8 dla zmiennej losowej |X o rozkładzie |N(120,402), tzn. takiej wartości |R, że |P(X ⩽ R) = 0,8. Korzystając z tablic lub dowolnego pakietu statystycznego, otrzymujemy

R = 153,6648 ≈154.

Szukana strategia to | (154,261). Teraz sprawdźmy, jaki jest oczekiwany IFR dla wyliczonej strategii

G120,40(154) = 40G0,1(0,85) = 40( f0,1(0,85)− 0,85(1− Φ(0,85)))≈ 4,4.

A zatem,

IFR = 1 −4,4/120 ≈93,33%.

obrazek

W niniejszym artykule przyjęliśmy kilka założeń ułatwiających zrozumienie badanego procesu i ułatwiających same obliczenia, np. popyt nie zawsze może być modelowany rozkładem normalnym. W przypadku towarów, które sprzedają się rzadko i w nieregularny sposób, konieczne jest użycie rozkładów dyskretnych, np. rozkładu Poissona lub ujemnego dwumianowego. To wiąże się nie tylko z zamianą rozkładu w obliczeniach, ale także ze zmianą sposobu, w jaki podchodzimy do problemu, np. przy rozkładach dyskretnych nie możemy oczekiwać, że istnieje moment, w którym ilość towaru w magazynie wynosi dokładnie R. Najczęstszą konsekwencją takiego założenia jest zbyt późne zamawianie względem modelu i nieosiąganie zadanych poziomów obsługi klienta.

W zespole Data Science naszym głównym zadaniem jest modyfikowanie bazowych modeli poprzez ulepszanie i rozwijanie pożądanych funkcjonalności. Dla modelu optymalnego zamawiania są to m.in. uwzględnienie zmienności czasu dostawy, modelowanie opóźnień w centralnych magazynach, rozpatrywanie wielu różnych dostawców, agregacja oraz redystrybucja zamówień i wiele innych. Kluczem jest wymyślenie (lub znalezienie w literaturze) takiego modelu, który balansuje teoretyczne wyrafinowanie z praktycznymi możliwościami implementacyjnymi i dostępnymi danymi. Czasami warto wybrać mniej dokładny model, który pozwala na prostsze i szybsze obliczenia. Warto uświadomić sobie tutaj rozmiar danych, z którymi mamy do czynienia - są to dziesiątki milionów zależnych od siebie części z kilkuletnią historią.