Giao hàng dặm cuối từ nhiều kho bằng Python

Mô hình hóa, giải pháp và trực quan hóa toán học bằng PuLP và VeRoViz

Photo by Marcin Jozwiak on Unsplash

Với sự phát triển nhanh chóng của mua sắm trực tuyến, các công ty đang phải đối mặt với nhu cầu ngày càng tăng về việc giao hàng nhanh chóng, chi phí thấp. Giao hàng dặm cuối cùng đề cập đến giai đoạn cuối cùng của chuỗi cung ứng, nơi các gói hàng được chuyển từ kho đến tận nhà khách hàng. Đây là một vấn đề chiến thuật phức tạp liên quan đến việc cùng nhau xác định cách phân bổ gói hàng cho xe tải và cách định tuyến xe tải đến khách hàng. Đây cũng là một vấn đề rất tốn kém, với ước tính gần đây đặt giao hàng chặng cuối ở mức 53% tổng chi phí vận chuyển. Điều này nhấn mạnh sự cần thiết phải tạo ra các kế hoạch phân phối hiệu quả.

Hình thức cổ điển của vấn đề này liên quan đến một kho duy nhất (thường là một nhà kho) mà từ đó tất cả các xe tải sẽ được chất hàng và gửi đi khi giao hàng. Một phiên bản phức tạp hơn bao gồm nhiều kho gần nhau - ví dụ: khi các chuỗi bán lẻ giao hàng từ các địa điểm cửa hàng. Trong trường hợp này, một khách hàng nhất định có thể được phục vụ bởi nhiều kho hàng, do đó công ty cũng phải xác định kho hàng nào sẽ vận chuyển cho khách hàng nào. Đôi khi không có một kho nào có sẵn tất cả các mặt hàng trong đơn đặt hàng của khách hàng, yêu cầu đơn hàng phải được chia cho nhiều kho.

Dưới đây chúng ta sẽ thảo luận về cách mô hình hóa và giải quyết dạng bài toán đa kho phức tạp hơn này bằng cách sử dụng Lập trình số nguyên (IP). Vấn đề này có các khía cạnh sau:

  1. Có một bộ xe tải, kho hàng, khách hàng và sản phẩm.
  2. Mỗi khách hàng đã đặt hàng một số lượng cụ thể của từng sản phẩm và mỗi kho đều có sẵn một số lượng nhất định cho từng sản phẩm.
  3. Mỗi xe tải có trụ sở tại chính xác một kho (có nghĩa là tuyến đường của nó luôn bắt đầu và kết thúc tại căn cứ). Hơn nữa, các xe tải không cần phải giống hệt nhau - mỗi xe tải có thể có dung tích và chi phí mỗi dặm khác nhau.

Mục tiêu là xác định đồng thời 1) sản phẩm sẽ được vận chuyển từ mỗi kho đến từng khách hàng, 2) cách phân bổ gói hàng cho xe tải và 3) cách định tuyến từng xe tải đến khách hàng, tất cả theo cách đạt được tổng chi phí thấp nhất chi phí giao hàng có thể.

Chúng tôi sẽ triển khai và giải quyết mô hình IP với bột giấy Và sử dụng VeRoViz để hình dung các tuyến đường xe tải. Để bắt đầu, chúng tôi nhập các thư viện cần thiết:

Một kịch bản ví dụ

Một công ty nội thất có hai kho ở khu vực Fredericksburg, VA với tám đơn đặt hàng của khách hàng sẽ được giao. Dữ liệu và bản đồ được hiển thị dưới đây. Lưu ý: Sản phẩm nútMảng biến đã được chuẩn bị với Công cụ phác thảo VeRoViz, cho phép tạo dữ liệu vị trí bằng đồ họa và xuất sang Python.

Bản đồ Kịch bản: Điểm đánh dấu màu xanh lam biểu thị kho hàng và điểm đánh dấu màu cam biểu thị khách hàng.

Mô hình hóa vấn đề

Mặc dù có một số cách để tiếp cận vấn đề này nhưng chúng ta sẽ xây dựng và giải một mô hình lập trình số nguyên. Điều này đưa ra đặc tả toán học chính xác của bài toán và cho phép giải quyết các trường hợp vấn đề có kích thước vừa phải một cách tối ưu bằng cách sử dụng các bộ giải có sẵn (mặc dù nằm ngoài phạm vi của chúng tôi, các trường hợp lớn hơn thường không thể giải quyết nhanh chóng bằng các bộ giải có sẵn và yêu cầu đặc biệt). - thuật toán giải được thiết kế). Chúng tôi bắt đầu với các đầu vào mô hình:

Tiếp theo, chúng tôi xác định các biến quyết định của mình:

Cuối cùng, chúng tôi xác định mô hình tối ưu hóa:

Trong mô hình này, hàm mục tiêu (1) mà chúng ta muốn giảm thiểu chỉ đơn giản là tổng của tất cả các chi phí đi lại phát sinh. Các ràng buộc ở (2) đảm bảo rằng đối với mỗi địa điểm, nếu một xe tải cụ thể đến địa điểm đó thì xe tải đó cũng khởi hành. Các ràng buộc ở (3) đảm bảo rằng không có xe tải nào khởi hành từ một kho không phải là căn cứ của nó. Các ràng buộc ở (4) đảm bảo rằng mỗi khách hàng nhận được tất cả các sản phẩm họ đặt hàng. Các ràng buộc trong (5) đảm bảo không có mạch phụ nào xảy ra ở bất kỳ tuyến đường nào. Vì một nhóm vị trí tạo thành một mạch sẽ có cùng số cạnh như các nút, nên chúng tôi ngăn điều này xảy ra ở mọi tập hợp con khách hàng khác trống có thể có của mỗi xe tải. Các ràng buộc trong (6) đảm bảo rằng đối với mỗi kho và sản phẩm, tổng số đơn vị sản phẩm được chất lên xe tải và vận chuyển đến khách hàng từ kho đó không vượt quá khả năng sẵn có tại kho. Các ràng buộc trong (7) đảm bảo rằng không có đơn vị sản phẩm nào được chất lên xe tải và vận chuyển đến khách hàng trừ khi xe tải đến thăm khách hàng. Các ràng buộc ở (8) đảm bảo rằng đối với mỗi xe tải, tổng khối lượng sản phẩm được chất lên xe không vượt quá khả năng của nó. Cuối cùng, các ràng buộc trong (9–10) xác định miền cho các biến quyết định (nhị phân cho x biến; số nguyên không âm cho u biến).

Để dễ dàng và có thể sử dụng lại, chúng ta sẽ tạo một hàm Python để xây dựng các phiên bản của mô hình này cho dữ liệu đầu vào cụ thể bằng cách sử dụng bột giấy:

Giải quyết vấn đề tình huống ví dụ

Bây giờ chúng ta đã xây dựng được mô hình, chúng ta có thể sử dụng nó để tìm ra giải pháp tối ưu cho kịch bản của mình. Dưới đây chúng tôi sử dụng bộ giải CBC đi kèm với bột giấy. Việc này có thể mất 15–45 giây để tìm ra giải pháp tối ưu. Nếu bạn có quyền truy cập vào mạnh mẽ hơn CPLEX người giải quyết, thay vào đó bạn có thể sử dụng các dòng nhận xét để có được giải pháp nhanh hơn nhiều.

Việc chạy này sẽ cho chúng ta thông báo đầu ra sau:

Trích xuất và xem hành trình xe tải

Bây giờ chúng ta cần trích xuất hành trình xe tải từ các biến quyết định trong mô hình đã giải. Đối với mỗi xe tải, chúng tôi muốn biết điểm dừng của nó và sản phẩm nào sẽ được giao tại mỗi điểm dừng. Để có được thông tin này, chúng ta cần sàng lọc các biến quyết định khác 0.

Điều này xây dựng các hành trình xe tải sau:

Lưu ý rằng khách hàng C1 được hai xe tải (T2 và T4) ghé thăm - do đó, đơn hàng được chia nhỏ. Với nhu cầu đồng thời của khách hàng và nguồn lực sẵn có, đây hóa ra là một quyết định tối ưu. Điều này cũng có thể cần thiết, chẳng hạn như khi một đơn hàng chứa một tập hợp các mặt hàng không được tìm thấy ở bất kỳ kho hàng nào.

Hình dung các tuyến đường xe tải

Bước cuối cùng, chúng tôi sử dụng VeRoViz để tạo hình ảnh trực quan đẹp mắt cho các tuyến đường xe tải:

Kết luận

Mặc dù có thể có nhiều biến thể của bài toán này, nhưng ví dụ này minh họa cách chúng ta có thể mô hình hóa và giải quyết bài toán như vậy bằng cách sử dụng lập trình số nguyên. Nó cũng cho thấy cách Python có thể được sử dụng để gắn kết các thành phần mạnh mẽ lại với nhau như bột giấyVeRoViz để tạo ra các hệ thống hỗ trợ quyết định hữu ích một cách nhanh chóng. Chúc mừng giao hàng!

Mã nguồn có thể được xem trong sổ tay tại đây hoặc đã tải xuống tại đây.

Giao hàng chặng cuối từ nhiều kho bằng Python Được xuất bản lại từ nguồn https://towardsdatascience.com/last-mile-delivery-from-multiple-depots-in-python-26c4325407b4?source=rss—-7f60cf5620c9—4 qua https:// hướng tớidatascience.com/feed

<!–

->

Dấu thời gian:

Thêm từ Tư vấn chuỗi khối