Dostawa ostatniej mili z wielu magazynów w Pythonie

Modelowanie matematyczne, rozwiązania i wizualizacja za pomocą PuLP i VeRoViz

Photo by Marcin Jóźwiak on Unsplash

Wraz z szybkim rozwojem zakupów online, firmy stają w obliczu stale rosnących wymagań dotyczących szybkiej i taniej dostawy. Dostawa ostatniej mili odnosi się do końcowego etapu łańcucha dostaw, w którym paczki są dostarczane z magazynu do drzwi klienta. Jest to złożony problem taktyczny, który polega na wspólnym ustaleniu, w jaki sposób przydzielać paczki ciężarówkom i jak kierować ciężarówki do klientów. Jest to również bardzo kosztowny problem, z ostatnie szacunki umieszczając dostawę ostatniej mili na poziomie 53% całkowitego kosztu wysyłki. Podkreśla to potrzebę opracowania efektywnych planów dostaw.

Klasyczna forma tego problemu dotyczy pojedynczego magazynu (zwykle magazynu), z którego ładowane są wszystkie ciężarówki i wysyłane z dostawami. Bardziej złożona wersja obejmuje wiele magazynów położonych blisko siebie – na przykład, gdy sieci handlowe dostarczają towary z lokalizacji sklepów. W takim przypadku dany klient może być obsługiwany przez więcej niż jedną filię, dlatego też firma musi określić, które filie będą realizować wysyłki do jakich klientów. Czasami w żadnym pojedynczym magazynie nie będą dostępne wszystkie pozycje z zamówienia klienta, co wymaga rozdzielenia zamówienia pomiędzy wiele magazynów.

Poniżej omówimy, jak modelować i rozwiązywać ten bardziej złożony formularz problemu z wieloma magazynami za pomocą programowanie całkowite (IP). Problem ten ma następujące aspekty:

  1. Istnieje zestaw ciężarówek, magazynów, klientów i produktów.
  2. Każdy klient zamówił określoną ilość każdego produktu, a w każdym magazynie dostępna jest określona ilość każdego produktu.
  3. Każda ciężarówka stoi dokładnie w jednym magazynie (co oznacza, że ​​jej trasa zawsze zaczyna się i kończy w jej bazie). Co więcej, ciężarówki nie muszą być identyczne — każda ciężarówka może mieć inną pojemność i koszt za milę.

Celem jest jednoczesne określenie: 1) produktów, które mają zostać wysłane z każdego magazynu do każdego klienta, 2) sposobu przypisywania paczek do ciężarówek oraz 3) sposobu trasowania każdej ciężarówki do klientów, a wszystko to w taki sposób, aby osiągnąć najniższą sumę możliwy koszt dostawy.

Wdrożymy i rozwiążemy model IP z Miazga I użyć VerRoViz do wizualizacji tras ciężarówek. Na początek importujemy niezbędne biblioteki:

Przykładowy scenariusz

Firma meblarska ma dwa składy w rejonie Fredericksburga w stanie Wirginia, w których ma zostać dostarczonych osiem zamówień klientów. Poniżej znajdują się dane i mapa. Uwaga: Połączenia tablica węzłów zmienna została przygotowana za pomocą Narzędzie do szkicowania VeRoViz, który umożliwia graficzne tworzenie danych lokalizacyjnych i eksport do Pythona.

Mapa scenariusza: Niebieskie znaczniki wskazują magazyny, a pomarańczowe znaczniki wskazują klientów.

Modelowanie problemu

Chociaż istnieje wiele sposobów podejścia do tego problemu, zbudujemy i rozwiążemy model programowania liczb całkowitych. Daje to precyzyjną matematyczną specyfikację problemu i pozwala na optymalne rozwiązywanie przypadków problemów o średniej wielkości przy użyciu gotowych rozwiązań (chociaż wykracza to poza nasz zakres, większych przypadków często nie da się szybko rozwiązać za pomocą gotowych rozwiązań i wymagają one specjalnie -zaprojektowane algorytmy rozwiązań). Zaczynamy od danych wejściowych modelu:

Następnie definiujemy nasze zmienne decyzyjne:

Na koniec definiujemy model optymalizacyjny:

W tym modelu funkcja celu (1), którą chcemy zminimalizować, jest po prostu sumą wszystkich poniesionych kosztów podróży. Ograniczenia w (2) zapewniają, że w przypadku każdej lokalizacji, jeśli konkretna ciężarówka dotrze do lokalizacji, ciężarówka również odjedzie. Ograniczenia w (3) zapewniają, że żadna ciężarówka nie odjedzie z magazynu, który nie jest jej bazą. Ograniczenia w (4) zapewniają, że każdy klient otrzyma wszystkie zamówione produkty. Ograniczenia w (5) zapewniają, że na żadnej trasie nie występują żadne podobwody. Ponieważ grupa lokalizacji tworzących obwód będzie miała taką samą liczbę krawędzi jak węzły, zapobiegamy temu w każdym możliwym niepustym podzbiorze klientów dla każdej ciężarówki. Ograniczenia w (6) zapewniają, że dla każdego magazynu i produktu łączna liczba jednostek produktu załadowanych na ciężarówki i wysłanych do klientów z tego magazynu nie przekracza dostępności w magazynie. Ograniczenia w (7) zapewniają, że żadna jednostka żadnego produktu nie zostanie załadowana na ciężarówkę i wysłana do klienta, chyba że ciężarówka odwiedzi klienta. Ograniczenia w (8) zapewniają, że dla każdej ciężarówki łączna objętość produktów załadowanych na pokład nie przekroczy jej ładowności. Wreszcie ograniczenia w (9–10) określają domeny zmiennych decyzyjnych (binarne dla x zmienne; nieujemna liczba całkowita dla u zmienne).

Dla ułatwienia i możliwości ponownego użycia utworzymy funkcję Pythona do konstruowania instancji tego modelu dla określonych danych wejściowych Miazga:

Rozwiązywanie przykładowego problemu scenariuszowego

Teraz, gdy mamy już sformułowany model, możemy go użyć do znalezienia optymalnego rozwiązania dla naszego scenariusza. Poniżej używamy dołączonego solwera CBC Miazga. Znalezienie optymalnego rozwiązania może zająć 15–45 sekund. Jeśli masz dostęp do mocniejszego CPLEX Solver, możesz zamiast tego użyć skomentowanych linii, aby uzyskać rozwiązanie znacznie szybciej.

Uruchomienie tego daje nam następujący komunikat wyjściowy:

Wyodrębnianie i przeglądanie tras ciężarówek

Teraz musimy wyodrębnić trasy ciężarówek ze zmiennych decyzyjnych w rozwiązanym modelu. W przypadku każdej ciężarówki chcemy znać przystanki i produkty, które należy dostarczyć na każdym przystanku. Aby uzyskać te informacje, musimy przesiać niezerowe zmienne decyzyjne.

W ten sposób powstają następujące trasy ciężarówek:

Należy pamiętać, że klienta C1 odwiedzają dwie ciężarówki (T2 i T4) – stąd zamówienie podzielone. Biorąc pod uwagę jednoczesne wymagania klientów i dostępne zasoby, okazuje się to optymalną decyzją. Może to być również konieczne, gdy np. zamówienie zawiera zestaw artykułów, których nie ma w żadnym pojedynczym magazynie.

Wizualizacja tras ciężarówek

Jako nasz ostatni krok używamy VerRoViz aby stworzyć ładną wizualizację tras dla ciężarówek:

Wnioski

Chociaż możliwych jest wiele odmian tego problemu, ten przykład ilustruje, jak możemy modelować i rozwiązywać taki problem za pomocą programowania liczb całkowitych. Pokazuje także, jak można wykorzystać Pythona do sklejenia potężnych komponentów, takich jak Miazga i VerRoViz do szybkiego tworzenia przydatnych systemów wspomagania decyzji. Miłego dostarczania!

Kod źródłowy można przeglądać w notatniku tutaj lub pobrany tutaj.

Dostawa ostatniej mili z wielu magazynów w języku Python została ponownie opublikowana ze źródła https://towardsdatascience.com/last-mile-delivery-from-multiple-depots-in-python-26c4325407b4?source=rss—-7f60cf5620c9—4 przez https:// kierunkudatascience.com/feed

<!–

->

Znak czasu:

Więcej z Konsultanci Blockchain