تسليم الميل الأخير من مستودعات متعددة في بايثون

النمذجة الرياضية والحل والتصور باستخدام PuLP وVeRoViz

تصوير مارسين جوزوياك on Unsplash

مع النمو السريع للتسوق عبر الإنترنت، تواجه الشركات طلبات متزايدة على التسليم السريع ومنخفض التكلفة. تسليم الميل الأخير يشير إلى المرحلة النهائية من سلسلة التوريد، حيث يتم تسليم الطرود من المستودع إلى باب العميل. هذه مشكلة تكتيكية معقدة تتضمن تحديدًا مشتركًا لكيفية تخصيص الطرود للشاحنات وكيفية توجيه الشاحنات إلى العملاء. إنها أيضًا مشكلة مكلفة للغاية التقديرات الأخيرة وضع تسليم الميل الأخير بنسبة 53٪ من إجمالي تكلفة الشحن. وهذا يؤكد الحاجة إلى وضع خطط تسليم فعالة.

يتضمن الشكل الكلاسيكي لهذه المشكلة مستودعًا واحدًا (مستودعًا عادةً) يتم من خلاله تحميل جميع الشاحنات وإرسالها عند تسليمها. يتضمن الإصدار الأكثر تعقيدًا مستودعات متعددة على مقربة من بعضها البعض - على سبيل المثال، عندما تقوم سلاسل البيع بالتجزئة بالتوصيل من مواقع المتاجر. في هذه الحالة، قد تتم خدمة عميل معين من خلال أكثر من مستودع واحد، لذلك يجب على الشركة أيضًا تحديد المستودعات التي ستقوم بالشحن إلى أي عملاء. في بعض الأحيان، لن يتوفر في أي مستودع واحد جميع العناصر الموجودة في طلب العميل، مما يتطلب تقسيم الطلب بين مستودعات متعددة.

سنناقش أدناه كيفية تصميم نموذج المشكلة الأكثر تعقيدًا متعدد المستودعات وحله باستخدام برمجة صحيحة (الملكية الفكرية). ولهذه المشكلة الجوانب التالية:

  1. هناك مجموعة من الشاحنات والمستودعات والعملاء والمنتجات.
  2. لقد طلب كل عميل كمية محددة من كل منتج، ولكل مستودع كمية معينة من كل منتج متاح.
  3. تتمركز كل شاحنة في مستودع واحد بالضبط (بمعنى أن مسارها يبدأ دائمًا وينتهي عند قاعدتها). علاوة على ذلك، لا يلزم أن تكون الشاحنات متطابقة - فقد يكون لكل شاحنة سعة تخزينية مختلفة وتكلفة مختلفة لكل ميل.

الهدف هو تحديد 1) المنتجات التي سيتم شحنها من كل مستودع إلى كل عميل في الوقت نفسه، 2) كيفية تخصيص الطرود للشاحنات، و3) كيفية توجيه كل شاحنة إلى عملائها، كل ذلك بطريقة تحقق أقل إجمالي تكلفة التسليم ممكن.

سنقوم بتنفيذ وحل نموذج IP باستخدام PuLP واستخدامها فيروفيز لتصور طرق الشاحنات. للبدء، نقوم باستيراد المكتبات اللازمة:

سيناريو مثال

تمتلك إحدى شركات الأثاث مستودعين في منطقة فريدريكسبيرغ بولاية فرجينيا، حيث سيتم تسليم ثمانية طلبات للعملاء. البيانات والخريطة موضحة أدناه. ملحوظة:nodesArray تم إعداد المتغير باستخدام أداة رسم VeRoViz، والذي يتيح إنشاء رسوم بيانية لبيانات الموقع وتصديرها إلى Python.

خريطة السيناريو: تشير العلامات الزرقاء إلى المستودعات وتشير العلامات البرتقالية إلى العملاء.

نمذجة المشكلة

على الرغم من وجود عدد من الطرق التي يمكن للمرء من خلالها التعامل مع هذه المشكلة، إلا أننا سنقوم ببناء نموذج برمجة للأعداد الصحيحة وحله. وهذا يعطي مواصفات رياضية دقيقة للمشكلة ويسمح بحل مثيلات المشكلة ذات الحجم المتوسط ​​على النحو الأمثل باستخدام أدوات الحل الجاهزة (على الرغم من أنها خارج نطاقنا، غالبًا ما لا يمكن حل الحالات الأكبر بسرعة باستخدام أدوات الحل الجاهزة وتتطلب بشكل خاص - خوارزميات الحل المصممة). نبدأ بمدخلات النموذج:

بعد ذلك، نحدد متغيرات القرار لدينا:

وأخيرا، نحدد نموذج التحسين:

في هذا النموذج، الوظيفة الهدف (1) التي نريد تقليلها هي ببساطة مجموع جميع تكاليف السفر المتكبدة. تضمن القيود في (2) أنه بالنسبة لكل موقع، إذا وصلت شاحنة معينة إلى الموقع، فإن الشاحنة تغادر أيضًا. تضمن القيود في (3) عدم مغادرة أي شاحنة من مستودع ليس قاعدتها. تضمن القيود في (4) حصول كل عميل على جميع المنتجات التي طلبها. تضمن القيود في (5) عدم حدوث دوائر فرعية في أي طريق. نظرًا لأن مجموعة المواقع التي تشكل دائرة سيكون لها نفس عدد الحواف مثل العقد، فإننا نمنع حدوث ذلك في كل مجموعة فرعية غير فارغة محتملة من العملاء لكل شاحنة. تضمن القيود الواردة في (6) أنه بالنسبة لكل مستودع ومنتج، فإن إجمالي وحدات المنتج المحملة على الشاحنات والمشحونة إلى العملاء من هذا المستودع لا تتجاوز التوفر في المستودع. تضمن القيود في (7) عدم تحميل أي وحدات من أي منتج على الشاحنة وشحنها إلى العميل ما لم تزور الشاحنة العميل. تضمن القيود في (8) أن الحجم الإجمالي للمنتجات المحملة على متن كل شاحنة لا يتجاوز قدرتها. أخيرًا، تحدد القيود في (9-10) مجالات متغيرات القرار (ثنائية لـ x المتغيرات؛ عدد صحيح غير سالب ل u المتغيرات).

من أجل السهولة وقابلية إعادة الاستخدام، سنقوم بإنشاء دالة بايثون لإنشاء مثيلات لهذا النموذج لبيانات إدخال محددة باستخدام PuLP:

حل مشكلة السيناريو المثال

الآن بعد أن انتهينا من صياغة النموذج، يمكننا استخدامه لإيجاد الحل الأمثل للسيناريو الذي لدينا. أدناه نستخدم أداة حل CBC المضمنة PuLP. قد يستغرق هذا من 15 إلى 45 ثانية للعثور على الحل الأمثل. إذا كان لديك الوصول إلى أقوى CPLEX بدلاً من ذلك، يمكنك استخدام السطور التي تم التعليق عليها للحصول على حل بشكل أسرع.

تشغيل هذا يعطينا رسالة الإخراج التالية:

استخراج وعرض مسارات الشاحنة

نحتاج الآن إلى استخراج مسارات الشاحنة من متغيرات القرار في النموذج الذي تم حله. بالنسبة لكل شاحنة، نريد أن نعرف محطات توقفها والمنتجات التي يجب تسليمها في كل محطة. للحصول على هذه المعلومات، نحتاج إلى التدقيق في متغيرات القرار غير الصفرية.

يؤدي ذلك إلى إنشاء مسارات الشاحنات التالية:

لاحظ أن العميل C1 تتم زيارته بواسطة شاحنتين (T2 وT4) - ومن ثم، يتم طلب تقسيم. ونظرًا لمتطلبات العملاء المتزامنة والموارد المتاحة، فقد تبين أن هذا هو القرار الأمثل. قد يكون هذا ضروريًا أيضًا، على سبيل المثال، عندما يحتوي الطلب على مجموعة من العناصر غير الموجودة في أي مستودع واحد.

تصور طرق الشاحنات

كخطوة أخيرة، نستخدم فيروفيز لإنشاء تصور جميل لطرق الشاحنات:

وفي الختام

على الرغم من إمكانية وجود العديد من الاختلافات حول هذه المشكلة، إلا أن هذا المثال يوضح كيف يمكننا تصميم مثل هذه المشكلة وحلها باستخدام برمجة الأعداد الصحيحة. ويوضح أيضًا كيف يمكن استخدام بايثون لربط المكونات القوية معًا مثل PuLP و فيروفيز لإنشاء أنظمة دعم القرار مفيدة بسرعة. تسليم سعيد!

يمكن الاطلاع على كود المصدر في دفتر الملاحظات هنا أو تحميلها هنا.

تسليم الميل الأخير من مستودعات متعددة في بايثون أعيد نشره من المصدر https://towardsdatascience.com/last-mile-delivery-from-multiple-depots-in-python-26c4325407b4?source=rss—-7f60cf5620c9—4 عبر https:// نحو datascience.com/feed

<!–

->

الطابع الزمني:

اكثر من مستشارو Blockchain