PuLP-MiA: الملحق متعدد الفهرس لـ PuLP (مكتبة البرمجة الخطية Python)

مرحبا هبر! الآن سيكون هناك منشور صغير بدون سطر واحد من التعليمات البرمجية لأولئك الذين يتعاملون مع مشاكل LP (البرمجة الخطية) متعددة الفهارس في Python ويحلونها باستخدام مكتبة منفذ PuLP ... إنها ليست طويلة :-)



عند صياغة مشاكل LP ، غالبًا ما يتعين على المرء التعامل مع المتغيرات متعددة المؤشرات. عند التعامل مع مشاكل ذات أبعاد كبيرة ، فإن هذا ، بصراحة ، شيء شائع.



العلاقات المتبادلة لهذه المتغيرات متعددة المؤشرات في الوظيفة الموضوعية (الشكل الخطي هو أيضًا معيار التحسين الخطي) والقيود (في شكل المساواة الخطية وعدم المساواة) يجب أن يتم إنشاؤها برمجيًا. عند العمل مع PuLP (منفذ مكتبة LP للبايثون) ، يتم استخدام طريقتين رئيسيتين لهذا الجيل:



  1. إنشاء مصفوفة A (مصفوفة قيود) باستخدام مولدات قائمة Python بشكل صريح. على سبيل المثال ، مثل هذا: مشكلة سودوكو
  2. توليد متغيرات رمزية مع ربط الفهارس من خلال القواميس بشكل ضمني. يمكن القيام بذلك يدويًا عبر dict أو باستخدام مكون إضافي PuLP


يمكن صياغة مشكلة LP الكلاسيكية لأي بُعد تقريبًا بسهولة بأي من هذه الطرق ، ولكن عند تطوير هياكل جديدة للقيود (خاصة عندما يصبح منطق العلاقات المتبادلة للمتغيرات أكثر تعقيدًا ، تظهر متغيرات جديدة في المعنى ، يتم التخلي عن بعض المؤشرات أو يتم تقديم مؤشرات جديدة) يتطلب تجميع / تحلل مجموعات المتغيرات ، وما إلى ذلك) تتبعًا سهلاً للمتغيرات متعددة الفهارس في كود Python نفسه ، والذي يكون غائبًا بشكل مباشر في الأساليب المذكورة أعلاه.



لحل هذه المشكلة ، يُقترح استخدام الوظيفة الإضافية PuLP-MiA (رابط إلى المستودع مع وصف موجز للوظيفة).



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



  • يحدث الإنشاء / الارتباط بالمتغيرات الموجودة تلقائيًا
  • الارتباط الصريح لاسم المتغير ومؤشراته
  • اسم المتغير - سلسلة عشوائية
  • الفهارس - القيم الرقمية
  • عدد الفهارس غير محدود بشروط (قد لا توجد فهارس على الإطلاق)
  • يتم عرض نتائج حل مشكلة LP في شكل قاموس ، حيث تكون المفاتيح متغيرات غير صفرية متعددة الفهارس (يمكن تغيير السلوك)


ربما تكون الوظيفة الإضافية مفيدة جدًا لشخص ما في بحث طويل المدى للعمليات. رخصة MIT. يتم تثبيته تقليديًا عبر النقطة .



ملاحظة بالنسبة لأولئك الذين أنهوا القراءة ، ستظل صغيرة



مثال على تشكيل سلسلة من القيود))
from itertools import product
from pulp_mia import Task, Constraint

i_set = list(range(5))
j_set = list(range(5))
m_set = list(range(2))
g_set = list(range(4))
s_set = list(range(5))
k_set = list(range(5))

task = Task(debug=True)
for i, m, g, s, k in product(i_set, m_set, g_set, s_set, k_set):
    a_new = Constraint('<=')
    for j in j_set:
        a_new.setCoeff(('x', i, j, m, g, s, k), 1)
    a_new.setBValue(1)
    task.addConstraint(a_new)

print(task)
#TASK info:
#    NAME: test-task
#    SIZE: 5000 x 1000
      
      







(بالنسبة للباقي ، راجع الوصف الموجز للملحق )



PPS نعم ، في مكان ما عميقًا تحت الغطاء يعيش قاموس عادي.



All Articles