التحسين هو أداة أساسية تستخدم في كل مجالات الصناعة والمجالات الأخرى للقيام بأفضل القرارات فيما يتمتع بالقيود. سواء كان تخفيض التكاليف في السلسلة الموردية أو تحسين الكفاءة في الأنظمة الطاقية أو ايجاد المادات الأفضل في نماذج التعلم المائي, تقنيات التحسين مهمة.
أي بوتسوانا، الذي يشهد بسهولة وتنوع كبير، يوفر مجموعات قوية للمشاكل التحسينية. وفي مجموعتها، يبرز Pyomo كمجموعة شاملة ومرنة تسمح للمستخدمين بتعريف وحل نماذج التحسين المعقدة بسهولة كبيرة.
سوف نقوم في هذا التورية باستكشاف من أساس من يمكنك استخدام Pyomo. سوف نتغير من تثبيت وإعداد المحللات إلى تشكيل وحل مشاكل التحسين المختلفة!
تستكشاف الحلول الممكنة في البحث الخطي. صورة بواسطة المؤلف.
ما هو Pyomo؟
بيومو هي مكتبة بواسطة المعلومات المفتوحة لبناء وحل نماذج التحكم الأولي باستخدام بيانات البت. إنها تسمح لك بتعريف النماذج التحكمية بطريقة تكون دقيقة رياضياً وسهلة الجملة للمبرمجين البت. وتدعم مجموعة واسعة من أنواع المشاكل، بما في ذلك:
- البحث الخطي (LP): LP يتضمن تحسين معيار خطي بواسطة قيود متجانسة وغير متجانسة خطية. وهو يستخدم بشكل واسع للتوزيع على الموارد، والبرنامج الزمني، والبرنامج المالي.
- البحث اللاخطأ الخامل (NLP): NLP يتعلق بتحسين منهجية غير خطأ لمعايير غير خطئية مع قيود غير خطئية. وهو يستخدم عادةً في الهندسة والاقتصاد للأنظمة الأكثر تعقيدًا التي لا تعتمد على العلاقات الخطئية.
- البحث التحكمي في مجموعة من الأعداد المزدوجة (MIP): MIP يتضمن مشاكل البحث التحكمي التي تحدد بعض المتغيرات بأن تكون أعداد من المتغيرات الأخرى قابلة للتساوي. هذا الأمر مفيد في محاظات مثل تصميم السلسلة الموردية أو تنظيم المشاريع حيث يمكن أن تكون القرارات تقاسمية (على سبيل المثال، موافق/منع).
- البرمجيات التخطيطية العشوائية: البرمجيات التخطيطية العشوائية تقوم بتنظيم المشاكل التحكمية حيث بعض العناصر غير مؤكدة وتمثل بالمتغيرات العشوائية. وتطبق عامًا في المالية وإدارة السلسلة المواردية لتحسين القرارات تحت التشكيل.
- تحسين ديناميكي: تحسين ديناميكييتركز على تحسين المتغيرات القرارية عبر الوقت، وهو غالبًا يشمل أنظمة تتطور بشكل ديناميكي. يستخدم في مجالات مثل مراقبة العمليات، الروبوتات، والاقتصاد لإدارة عمليات تعتمد على الوقت.
ميزات بيومو
حالما أكبر فهمنا لبيومو، دعونا ننظر إلى بعض أهم ميزاته.
المرونة والقابلية للتوسعة
تلاءم بيومو يأتي من قابليته لتشكيل العلاقات المعقدة باستخدام البنيات الأساسية للبيانات البتشاركية. ويتم دمجه مع المحللات المفتوحة المصدر والتجارية متنوعة، مما يجعله سهلاً جداً حل العديد من المشاكل المحاسبية.
النمط البيثوني
والنماذج البيومو تقوم على البيانات البتشاركية وتكتب باستخدام النمط البيثوني الاساسي. هذا يجعل منحنية تعلمه سهلة لأولئك الذين مهووسون بالبيانات البتشاركية ويسمح لكم باستخدام مكتبات البيانات البيثونية الواسعة داخل مناحيكم.
مجموعة واسعة ومتناولة للمجتمع والمسودة
ولبيومو مجموعة كاملة للمستخدمين ووثيقة شاملة، والتي تشمل أمثلة ودروس لمساعدة المستخدمين على جميع المستويات.
حالات استخدام بيومو
يوجد لبيومو مجموعة واسعة من التطبيقات العالمية. وهنا بعضها:
1. تحسين مناحي السلسلة المواردية.
تحسين جميع مناحي السلسلة التواريخية يشمل تحسين التنفيذ الموسمي، وإدارة مستويات المخزون، وإنشاء جدولات إنتاج فعالة.
قد يتضمن هذا تحديد تكاليف النقل القليلة أو تنظيم مواقع المستودعات أو توازن المطالبة والموارد.
على سبيل المثال، قد تتوجب عميل على إيجاد طريقة لتوفير المطالبة المتعلقة بالعملاء في مناطق متعددة بينما يقلل من تكاليف الشحن ويحافظ على مستويات المخزون في كل مركز توزيع.
2. النماذج المالية
في النماذج المالية، تساعد التحسين في توزيع الموارد ، مثل المال، لتحقيق الأرباح الأقصية بينما يقلل من الخطر.
قد يتضمن هذا تحسين المجموعة المالية، حيث يتوازن المستثمرون بين الخطر والمكافأة عن طريق تحديد مزيج من الأصول المختلفة والمخضرمة بقيود مثل حدود الميزانية، والrequirements التنظيمية أو مقدار التحمل الخاطئ.
تأمين النماذج المالية يتضمن توافق الاستراتيجيات المالية مع الأهداف الطويلة الأمد وفي الوقت نفسه يخفض خطورات ممكنة.
3. أنظمة الطاقة
التحسين في أنظمة الطاقة يركز على زيادة فاعلية إنتاج الطاقة وتوزيعها ومستهلكتها.
قد تتضمن هذا تحديد المزيد من المزيد من توازن المصادر الطاقية (على سبيل المثال، المتجددة versus الغير المتجددة) بحد ما ما يتعدى تكاليف الوقود وإلى أقصى مستوى يمكن إلقاء الهدايا وإلى تكاليف الأنشطة التي تتغير بشكل كبير.
هذا النوع من التحسين يلعب دور رئيسي في إدارة الشبكة وفي إدارة مصانع الكهرباء وفي خفض آثارها على البيئة.
4. التعلم الآلي والعلم البياني
توفر التحسين في العديد من المهام التعلم الآلي والعلم البياني من أجل ما يلي التنظيم التعديل الأوليات الخاصة وإختيار الميزات.
في ضبط المعلمات الفائقة، تساعد خوارزميات التحسين في العثور على أفضل تكوين للنموذج لتحسين الأداء التنبؤي.
اختيار الميزات، وهي مهمة حاسمة أخرى، تتضمن تحديد أهم الميزات التي تساهم في دقة النموذج، مما يساعد على تقليل التعقيد وتحسين الكفاءة.
الآن بعد أن تم تحديد السياق، دعونا نتعمق ونبدأ في تطبيق Pyomo على بعض مسائل النمذجة التجريبية!
إعداد Pyomo
قبل أن نغوص في النمذجة، نحتاج إلى إعداد بيئتنا من خلال تثبيت Pyomo واختيار محلل مناسب.
1. المتطلبات الأساسية
لاستخدام Pyomo، يجب أن يكون لديك Python 3.6 أو أعلى. يمكن تثبيت Pyomo عبر pip.
pip install pyomo
هذا التعليمات أنشأت باستخدام إصدار pyomo 6.8.0
.
import pyomo print(pyomo.__version__)
الخروج:
>>> 6.8.0
2. تحديد وتثبيت المحلل المناسب
في الoptimization، يعتبر المحللات أساسية لأنهم هم الخوارزميات التي تجد الحل الأفضل للمشكلة التي قد عندك. وتتوافر مختلف المحللات للحلول المناسبة وفقاً للنوع المختلف من المشاكل (على سبيل المثال، الخط الأولي، غير الخط الأولي، العددية). Pyomo هو أداة لتشكيل النماذج التي تعتمد على المحللات الخارجية للقيام بالحوسبة الفعالة.
دعونا ننظر إلى بعض أكثر المحللات الشهيرة.
المحللات المفتوحة المصدر
1. GLPK (GNU Linear Programming Kit)
GLPK هو أداة معروفة لحل المشاكل البناءة الخطية (LP) والبناءة الخطية المتكاملة للأعداد المتجاوزة (MIP).
إنه خيار ممتاز للمهام البناءة الخطية الأساسية ويستخدم بشكل واسع في التطبيقات الأكاديمية والصناعية.
التثبيت
- ويندوز: تحميل وتثبيت GLPK.
- ماك أوس:
brew install glpk
- لينكس:
sudo apt-get install glpk-utils
2. قاعدة حل CBC (Coin-or Branch and Cut)
CBC هي محلل مفتوح المصدر لمشكلات البحث الخطي والبحث الخطي ذات الأعداد المختلفة.
وتوفر خصائص متقدمة وأداء أفضل في بعض الحالات مقارنة بGLPK، مما يجعله خيار قوي لمهام البحث التكاملية الأكثر تعقيدًا.
يمكن تثبيت CBC من خلال مدير البساتين conda.
conda install -c conda-forge coincbc
3. IPOPT (Optimizer النقطة الداخلية)
IPOPT هو محلل قوي يتخذ من أجل المشاكل الكبيرة في البحث اللاخطأ اللاخطأ (NLP).
يعادل بشكل خاص لمعالجة النماذج اللاخطأ المعقدة، مما يجعله خيار جيد للمشاكل خارج البحث الخطأ الخطيء.
يمكن تثبيت IPOPT من خلال مدير البستنوات conda.
!conda install -c conda-forge ipopt
محليات المحاسن التجارية
1. CPLEX
CPLEX يعني محلل محاسن متقدم يتمكن بفعالية من معالجة مشاكل البرمجيات الخطية (LP), البرمجيات العددية المزدوجة (MIP), والبرمجيات الكمائية التكاملية (QP).
يتطلب ترخيص من شركة IBM ولكن يتوفر بالمجان للمستخدمين الأكاديميين، مما يجعله خيار ممتاز للبحث العلمي والأغراض التعليمية.
2. قاروربي
قاروربي هو حل المشاكل التجاري الرئيسي المعروف بسرعته وفاعليته في حل المشاكل الخطية البسيطة (LP), المشاكل المتعددة الحزمية (MIP), والمشاكل الكمبيوترية الكسرية (QP), والبحث في البرامج اللاخطية (NLP).
مثل (سيبلكس), يتوجب عليه ترخيص، ولكنه يعرض للمستخدمين الأكاديميين وصولًا مجانيًا. وبذلك، فهو أداة قياسية للتحكم المتقدم في البحث الأولي.
الحل المفتوح المصدر مقابل الحلول التجارية.
توفر محللات المصادر المفتوحة المصدر مثل GLPK و CBC مجانية وكافية لمعظم أحتياجات التنظيم الأساسي. إنها خيارات ممتازة لمشاريع الحجم الصغير والغرض التعليمي.
ومعظم المحللات التجارية مثل CPLEX و Gurobi تقدم أداء أفضل، وخاصة للمشاكل الأكبر والمعقدة. تتضمن هذه المحللات ميزات متقدمة بما فيها دعم برمجيات كما للتنظيمات التكاملية الرقمية وغير الخطيئة، وهي موجهة للتطبيقات الصناعية الكبيرة الحجم.
حينما تمكن محللات المصادر المفتوحة من معالجة العديد من المهام التنظيمية العادية، فإن المحللات التجارية غالبًا أفضل خيارًا حين التعامل مع متطلبات أكثر تعقيدًا وأعلى أداءً.
أخذ بعين الاعتبار أن المحللات التجارية تتطلب ترخيصًا، علمًا أنها متاحة مجانًا للمستخدمين الأكاديميين.
الآن، دعونا نرى كيف يمكن تكوين محلل في Pyomo. سأستخدم GLPK في هذه الحالة.
3. تكوين محلل في Pyomo
أولاً، تأكد من أن توجد تنفيذ المحلل في مسار PATH نظامك بعد التثبيت.
ومن ثم، قم بإنشاء 脚本 Python وأضف ما يلي:
from pyomo.environ import SolverFactory solver = SolverFactory('glpk')
لتأكد من أن Pyomo ومحللك منتشر بشكل صحيح، دعونا نحلل مشكلة تجريبية بسيطة.
مشكلة تجريبية: برنامج خطي بسيط
الهدف: تحديد القليل من Z=x+y
بشرط:
- x + 2y ≥ 4
- x – y ≤ 1
- x ≥ 0
- y معدل 0
هذه المشكلة تتعلق بإيجاد أقل قيمة ممكنة لZ, وهي مجموع شيء من المتغيرات, x وy. ومع ذلك, x وy يتوجب أن يatisfy معايير معينة.
أولاً، عندما تضيفx ومرتين y، يجب أن يكون النتيجة على الأقل 4. ثانياً، x خارجy يجب أن يكون أقل أو يساوي 1. أخيراً، كلاًx وy يجب أن يكونان أو أعداد إيجابية (لا يمكن أن يكونان سلبية).
الهدف هو إيجاد قيمات x و y التي ت满意 هذه الشروط بينما تصبح Z قليلة قدر الإمكان.
تنفيذ باستخدام Pyomo:
import pyomo.environ as pyo # خلق نموذج model = pyo.ConcreteModel() # تعريف المتغيرات model.x = pyo.Var(within=pyo.NonNegativeReals) model.y = pyo.Var(within=pyo.NonNegativeReals) # تعريف الغرا菲يد model.obj = pyo.Objective(expr=model.x + model.y, sense=pyo.minimize) # تحديد القيود model.con1 = pyo.Constraint(expr=model.x + 2 * model.y >= 4) model.con2 = pyo.Constraint(expr=model.x - model.y <= 1) # اختيار الحليد solver = pyo.SolverFactory('glpk') # حل المشكلة result = solver.solve(model) # عرض النتائج print('Status:', result.solver.status) print('Termination Condition:', result.solver.termination_condition) print('Optimal x:', pyo.value(model.x)) print('Optimal y:', pyo.value(model.y)) print('Optimal Objective:', pyo.value(model.obj))
إذا كان كل شيء يعمل بطريقة صحيحة، سيكون الناتج المتوقع هو:
Status: ok Termination Condition: optimal Optimal x: 0.0 Optimal y: 2.0 Optimal Objective: 2.0
دعونا نمشي خلال البرمجيات السابقة: أولاً، يحدد البرمجيات معدلتان، x و y التي يمكن أخذ قيم غير سلبية فقط. هدف النموذج هو تحديد القيم الأفضل ل x و y (x + y)، ويحدد البرمجيات محللاً glpk
لإيجاد قيم الأفضل ل x و y التي تحقق هذه القيود وتقلل الهدف المحدد.
بعد تشغيل البرمجية، نجد أن قيم المتغيرات الأفضل هيx = 0.0وy = 2.0، وهي التي تقلل من المادة الهدفيةZ = x + y.بالتالي، يمثل أقل قيمة للمادة الهدفية2.0
بناء النماذج بواسطة بيومو
علم كيفية تعريف المكونات الأساسية لنموذج التحكم الأولي بواسطة بيومو من الضروري لتأهل وحل مشاكل التحكم بالكفاءة بطريقة فعالة.
1. تعريف المتغيرات
تمثل المتغيرات القرارات التي يتوجب إنجازها في مشكلة التحكم. في بيومو، تمثل المتغيرات الكميات التي سيتم تنظيمها المحلل لتحسين الوظيفة المرئية بينما يتم إنجاز جميع القيود.
المتغيرات النقطية
تمثل المتغير النقطي مجموعة واحدة غير موجودة في أي مجموعة. لتعريف متغير نقطي في بيومو، يتم استخدام تصنيف Var
من مودulo pyomo.environ
.
from pyomo.environ import Var model.x = Var()
يتم أولاً توافر Var
وتخليق متغير x
باستخدام Var()
. تلك المتغيرة بدون قيود معينة، مما يعني أنها يمكن أخذ أي قيمة حقيقية إلا إذا تم ضبط آخر في النموذج.
إضافة قيود
يمكنك تحديد قيم المتغير التي يمكن أخذها من خلال تعيين الحدود. تعريف الحدود كمجموعة (lower_bound
, upper_bound
):
from pyomo.environ import Var model.x = Var(bounds=(0, None))
تحديد الأحصاءات
يقدم بيومو المجالات المحددة بالفراغ يمكنك استخدامها لتحديد نوع قيم المتغير الذي يمكن أخذها، مثل NonNegativeReals
, Integers
أو Binary
:
from pyomo.environ import Var, NonNegativeReals model.x = Var(domain=NonNegativeReals)
المتغيرات المدرجة
عندما يتعامل مع متغيرات متشابهة في الطبيعة، مثل المتغيرات التي تمثل الفترات المختلفة أو الأصناف، يكون فعال استخدام المتغيرات المدرجة. تعريف المتغيرات المدرجة هي المتغيرات التي يتم تعريفها فوق مجموعة.
import pyomo.environ as pyo model.I = pyo.Set(initialize=[1, 2, 3]) model.y = pyo.Var(model.I, domain=pyo.NonNegativeReals)
فلو كنت تقوم بالمحاكاة لكميات إنتاج الثلاثة من المنتجات. يمكنك تعريف:
model.Products = pyo.Set(initialize=['A', 'B', 'C']) model.production = pyo.Var(model.Products, domain=pyo.NonNegativeReals)
الآن، model.production['A']
، model.production['B']
و model.production['C']
تمثل كميات الإنتاج للمنتجات A، B و C بشكل منفصل.
2. تعريف الأهداف
يعني المعادلة الهدفية ما نحاول تحسينه (تجنبه أو زيادته). إنها تحدد الهدف من النموذج، مثل تجنب التكاليف أو زيادة الأرباح، وتمثل عاموديا رياضيا يتضمن المتغيرات القرارية.
تم تعريفها باستخدام تصنيف Objective
:
from pyomo.environ import ConcreteModel, Var, Objective, minimize, maximize, NonNegativeReals # إنشاء نموذج model = ConcreteModel() # تعريف المتغيرات model.x = Var(within=NonNegativeReals) model.y = Var(within=NonNegativeReals) # التحدد للتكاليف (الأقل) model.cost = Objective(expr=2 * model.x + 3 * model.y, sense=minimize) # عندما يكون الأرباح الزائدة - (يمكن وجود هدف واحد فقط في الوقت الواحد) # model.profit = Objective(expr=5 * model.x + 4 * model.y, sense=maximize)
3. إضافة القيود
تعريف القيود التي تحدد القيود أو الrequirement المطلوب للمشكلة:
from pyomo.environ import Constraint model.con1 = Constraint(expr=model.x + model.y >= 10)
المثال العلوي يحدد قيداً في نموذج Pyomo باستخدام تصنيف Constraint
. يقوم قيد القيم model.con1
ب especifying أن مجموع ما يزيد من المتغيرات x و y يجب أن يكون أكبر من أو يساوي على الأقل 10.
4. تخصيص النماذج
تعني أي قيم ثابتة تستخدم في النموذج لتمثل كميات معروفة أو معادلات لا تتغير أثناء عملية التحسين.
فهي تساعد في تعريف العلاقات بين المتغيرات والقيود، وتسمح للنموذج بالتكوين بواسطة البيانات العالمية أو المفاهيم:
from pyomo.environ import Param model.p = Param(initialize=5)
البرمجيات السطر الأعلى تحدد ما يزيد من المعيار p
في النموذج Pyomo باستخدام فئة Param
وتقديمه بقيمة ثابتة من5. يمكن استخدام المعيار p
الآن في النموذج لتمثل قيمة ثابتة لا تتغير أثناء عملية التحسين.
الآن، دعونا نعمل على مشكلة تحسين جميعية!
مثال من البداية إلى النهاية للتطبيقات التحسينية بـ Pyomo
دعونا نرى مثالا كاملا لحل مشكلة تحسين باستخدام Pyomo. سنقوم بالمحاكاة لمشكلة عالمية حيث ينتج مصنعاً منتجين على الإطلاق، والهدف هو زيادة المنفعة بعيداً عن القيود الزمنية للآلات.
1. عبارة المشكلة
ينتج المصنع منتجين على الإطلاق P1 و P2. المنفعة للوحدة هي:
- P1: $40
- P2: 50 دولار
الوقت المتاح للآلة:
- الآلة A: 100 ساعة
- الآلة B: 80 ساعة
- آلة C: 90 ساعة
الوقت المطلوب لكل وحدة:
المنتج |
آلة A (ساعات) |
آلة B (ساعات) |
آلة C (ساعات) |
P1 |
1 |
2 |
0 |
P2 |
2 |
1 |
3 |
الهدف: maximizing profit.
Decision variables:
- x₁: Units of P1 to produce.
- x₂: وحدات P2 للإنتاج.
2. تعريف رياضي
المعيار الهدفي:
الكسارة الأعلى ل Z = 40x₁ + 50x₂
القيود:
- توافر جهاز A: 1x₁ + 2x₂ ≤ 100
- معدة B الكفاءة: 2x₁ + 1x₂ ≤ 80
- معدة C الكفاءة: 3x₂ ≤ 90
- التجاوز السائد: x₁, x₂ ≥ 0
3. التطبيق
وفقاً للغرض والقيود المحددة للمشكلة، يوجد هنا البرمجيات البيتونية التي تمثل المشكلة مرة أخرى، وتستخدم GLPK.
# خطوة 1: تحميل المكتبات import pyomo.environ as pyo # خطوة 2: إنشاء نموذج مادي model = pyo.ConcreteModel() # خطوة 3: تعريف المتغيرات القرارية (وحدات P1 و P2 المنتجة) model.x1 = pyo.Var(within=pyo.NonNegativeReals) model.x2 = pyo.Var(within=pyo.NonNegativeReals) # خطوة 4: تعريف الوظيفة الهدفية (زيادة الأرباح) model.profit = pyo.Objective(expr=40 * model.x1 + 50 * model.x2, sense=pyo.maximize) # خطوة 5: تعريف القيود # قيمة ماكينة A المجازية: 1x1 + 2x2 <= 100 model.machine_a = pyo.Constraint(expr=1 * model.x1 + 2 * model.x2 <= 100) # قيمة ماكينة B المجازية: 2x1 + 1x2 <= 80 model.machine_b = pyo.Constraint(expr=2 * model.x1 + 1 * model.x2 <= 80) # قيمة ماكينة C المجازية: 3x2 <= 90 model.machine_c = pyo.Constraint(expr=3 * model.x2 <= 90) # خطوة 6: حل النموذج بواسطة محلل GLPK solver = pyo.SolverFactory('glpk') result = solver.solve(model) # خطوة 7: تحليل النتائج # عرض حالة المحلل وشروطه الانتهاء print('Solver Status:', result.solver.status) print('Termination Condition:', result.solver.termination_condition) # حصول وعرض أعلى قيم المتغيرات x1 و x2 والربح القصوى x1_opt = pyo.value(model.x1) x2_opt = pyo.value(model.x2) profit_opt = pyo.value(model.profit) print(f'Optimal production of P1 (x1): {x1_opt}') print(f'Optimal production of P2 (x2): {x2_opt}') print(f'Maximum Profit: ${profit_opt}')
إخراج:
>>> Solver Status: ok >>> Termination Condition: optimal >>> Optimal production of P1 (x1): 25.0 >>> Optimal production of P2 (x2): 30.0 >>> Maximum Profit: $2500.0
في الشفرة العلوية، نحن نعرف نموذج للتحكم الخطي ل maximizing المرابيح من إنتاج المنتجين الاثنين (P1 و P2). يُحدد المصدر الأساسي للمرابيح، حيث يساهم كل وحدة من P1 بـ $40 و كل وحدة من P2 بـ $50.
نحن نحدد ثلاث قيود تمثل الحدود الزمنية للآلات A, B, و C.
وأخيرًا، نستخدم محلل GLPK لحل المشكلة.
الإجابة النهائية هي إنتاج 25 وحدة من P1 و 30 وحدة من P2 حيث سيكون أقصى مرابيحنا 2500 دولار..
وتقنيات متقدمة في بيومو
في القسم السابق، رأينا كيف يمكن بسهولة تطبيق مشكلة تحسين جميعي بواسطة بيومو. ومع ذلك، فإن معظم المشاكل الحقيقية غير سهلة الحل.
في هذا القسم، سأعرض عليكم بعض الميزات المتقدمة التي يمكنكم استخدامها لحل مشاكل أكثر تعقيدًا.
1. تحسين التخزين اللاخطي
تحسين التخزين اللاخطي يقلل من أو يزيد من معدلة المعامل اللاخطي المحددة وفقاً للقيود اللاخطية. دعونا ننظر إلى مثال حيث نقلل من مجموع مختلف الاختلافات المضاعفة وفقاً للقيود الدائرية.
البيان القضية
تباين الهدف:Z = (x – 1)² + (y – 2)²
مقابل التحكم في:
- x² + y² ≤ 4
- x, y ≥ 0
في بيومو، يمكننا تعريف المتغيرات القراريةx وy بحدود0 لضمان الايجابية. ويكون المعامل الهدفي يكون مجموعة من الاختلافات المضاعفة من نقاط معينة، ويضمن القيمة التي تكون حل المشكلة في دائرة مع قطر2.
في هذه الحالة ، يعمل المحلل IPOPT مناسباً لقدرته على حل المشاكل المتغيرة بتحديد البوندين
import pyomo.environ as pyo model = pyo.ConcreteModel() # تعريف المتغيرات مع الحدود السفلية model.x = pyo.Var(bounds=(0, None)) model.y = pyo.Var(bounds=(0, None)) # وظيفة الهدف: تقليل (x - 1)² + (y - 2)² model.obj = pyo.Objective(expr=(model.x - 1)**2 + (model.y - 2)**2, sense=pyo.minimize) # القيود: x² + y² ≤ 4 (دوائر بقطر 2) model.circle = pyo.Constraint(expr=model.x**2 + model.y**2 <= 4) solver = pyo.SolverFactory('ipopt') result = solver.solve(model) print('Optimal x:', pyo.value(model.x)) print('Optimal y:', pyo.value(model.y)) print('Minimum Z:', pyo.value(model.obj))
2. برنامج بنديات متكاملة (MIP)
يستخدم برنامج بنديات متكاملة عندما يكون بعض المتغيرات التصميمية عدداً (غالباً تعددية) بينما تكون الأخرى مستمرة. إنه مهم للمشاكل التنظيمية مثل موقع المرافق وخطة الإنتاج.
العبارة المشكلية
يجب على الشركة أن تقرر إنشاء مستودعات في المواقع A, B, وC. الهدف هو تحديد التكاليف الإجمالية الأقل ممكنة، والتي تشمل التكاليف الثابتة لإنشاء المستودعات وتكاليف التنقل.
نبدأ بتكييف البيانات، بما في ذلك التكاليف الثابتة لإنشاء المستودعات، وتكاليف التنقل، وقيود الكapacity، والمطالعة الكلية:
locations = ['A', 'B', 'C'] FixedCost = {'A': 1000, 'B': 1200, 'C': 1500} TransportCost = {'A': 5, 'B': 4, 'C': 6} Capacity = {'A': 100, 'B': 80, 'C': 90} Demand = 150 model = pyo.ConcreteModel() # متغير بناري: 1 إذا كان المستودع مفتوحًا، 0 إلى العكس model.y = pyo.Var(locations, domain=pyo.Binary) # متغير مستمر: كمية البضائع التي تتم نقلها model.x = pyo.Var(locations, domain=pyo.NonNegativeReals) model.cost = pyo.Objective( expr=sum(FixedCost[i] * model.y[i] + TransportCost[i] * model.x[i] for i in locations), sense=pyo.minimize ) # قيد المطالعة الطلبي model.demand = pyo.Constraint(expr=sum(model.x[i] for i in locations) >= Demand) # قيود الكapacity def capacity_rule(model, i): return model.x[i] <= Capacity[i] * model.y[i] model.capacity = pyo.Constraint(locations, rule=capacity_rule) solver = pyo.SolverFactory('cbc') result = solver.solve(model) for i in locations: print(f"Warehouse {i}: Open={pyo.value(model.y[i])}, Transported={pyo.value(model.x[i])}") print('Minimum Total Cost:', pyo.value(model.cost))
يشمل النموذج نوعين من المتغيرات القرارية: متغير بناري y
الذي يمثل ما إذا كان المستودع مفتوحًا (1 إذا كان مفتوحًا، 0 إلى العكس)، ومتغير مستمر x
الذي يمثل كمية البضائع التي تتم نقلها من كل مستودع.
يقوم معيار الهدف بإضماء تكاليف المستودعات الثابتة وتكاليف النقل ويقلل من الإجمالي. القيود تتأكد من أن عدد المنتجات المنقلة تمارس بمقدار الطلب وأن تكون قدرات كل مستودع لا تتجاوز إذا كان مفتوحًا.
3. تعامل مع أهداف متعددين
في بعض الأحيان يتضمن المشاكل التحسينية أهداف متعددة قد تتعارض، مثلما يتم تحسين الأرباح بما يلزم تحديد التأثير البيئي. وتشمل أساليب التوافق الشائعة التكامل الموزع، حيث يتم تخصيص وزن لكل هدف لتوازن أهميته.
العبارة عن المشكلة
نحن نهدف إلى maximizing الأرباح و minimizing التأثير البيئي:
- الأرباح: Z₁ = 3x + 5y
- التأثير البيئي: Z₂ = 2x + y
يمكننا تراكم هذه الأهداف باستخدام w1=0.6
, w2=0.4
، حيث الأهداف العام يصبح مجموعة ponderada:
w1 = 0.6 w2 = 0.4 model.obj = pyo.Objective( expr=w1 * (3 * model.x + 5 * model.y) - w2 * (2 * model.x + model.y), sense=pyo.maximize )
في هذه الأهداف المتحدة، نحن ن maximizing الأرباح ون minimizing التأثير البيئي عن طريق تنظيم ال ponderaciones.
4. استخدام مصادر خارجية للبيانات
حين تعامل مع مجموعات كبيرة من البيانات، يمكنك أن تستخدم بيانات من مصادر خارجية مثل ملفات CSV. يعمل بيومو بشكل جيد مع بانداز لقراءة واستخدام البيانات الخارجية.
يمكننا قراءة ملف CSV بواسطة بانداز واستخدام البيانات لتكوين المجموعات والمparameters في نموذجنا:
import pandas as pd data = pd.read_csv('parameters.csv') # تعريف مجموعة من البيانات CSV model.I = pyo.Set(initialize=data['index'].unique()) # تعريف متغير يبدأ من البيانات CSV param_dict = data.set_index('index')['value'].to_dict() model.param = pyo.Param(model.I, initialize=param_dict)
نصوص وأفضل ممارسات لاستخدام بيومو
عندما تعمل بالبيومو، يهم أن تبقي نماذجك فعالة وموثوقة بشكل كافي، وسهلة تحليل المشاكل.
1. التصحيح والتحليل المشاكل
أثناء بناء نماذج التحكم الأولي في Pyomo، يمكن أن تصطدم بمشاكل مثل الحلول الغير ممكنة، فشل المحاسبين، أو نتائج خاطئة. هذه بعض الممارسات الأفضل للتصحيح:
- القيود التحكمية: قم بمراجعة قيودك إذا كان نموذجك لا ينتج حل ممكن. قيود كانت قاسية قد تجعل المشكلة غير ممكنة. قم باستخدام 方法
.display()
من Pyomo لطباعة قيم المتغيرات والقيود للتحقق من أنهم يتصرفون كما من المتوقع. - الخروج المحلول للمحلل: تمكن من تفعيل سجلات المحلل التفصيلية بمراجعة طريقة
solve()
معtee=True
. هذا قد يوفر معلومات عن أين قد يصارع المحلل، مثل المتغيرات الغير محدودة أو الغير ممكنية. - أختبر النماذج البسيطة أولاً: عند التعامل مع نماذج معقدة ، قم بتجربة نسخة مبسطة. هذا يمكن تحديد المشاكل المحتملة بدون تحمل المزيد من التكاليف من خلال النموذج المحدد بالكامل.
يصبح التحليل التقني أسهل بكثير إذا اتبعت طريقة تنظيمية ، وتحليل القيود والمعامل الأولي والمعلومات من المحاكد.
2. فاعلية النموذجة
يمكن أن تصبح المشاكل التحكمية مكلفة من النظر إلى الحوسبة بتكبير حجم النموذج. لضمان تنظيم النموذج بفاعلية ، انظر إلى التips التالية:
- إستخدام التناسق: تجنب التدور فوق المؤشرات الغير ضرورية أثناء تعريف القيود أو الأهداف. تسخير التناسق في مشكلتك يقلل من الوقت المستغرب.
- المتغيرات الثنائية مقابل المتغيرات المستمرة: حيث يمكن، قلل من عدد المتغيرات الثنائية أو الأعدادية. المتغيرات المستمرة أسهل لمعالجاتها إدارة، مما يؤدي إلى حلول أسرع.
- تشكيل القيود: حفظ القيود بأقل تعقيد ممكن، كلها في الشكل الرياضي والتنفيذي. تجنب التعقيدات غير الضرورية وتكسير قيود معقدة إلى أصغر وأسهل، والتي يمكن إدارتها.
النماذج الكفيفة تحل بسرعة أكبر وأسهل للتصحيح وال mantenimiento.
3. المستندات وال mantenimiento
يعتبر من الممارسات الجيدة إنشاء نماذج Pyomo موثقة بشكل جيد للاستخدام الطويل الأمد والتعاون. ويجعل المستندات الجيدة أسهل إعادة نظر إلى النماذج وتحديثها عبر الوقت:
- استخدم التعليقات الداخلية: تضمن دائمًا إضافة تعليقات لتفسير غرض المتغيرات والقوانين والوظيفة الأولية. وهذا مهم بالفعل في النماذج التحكمية التي قد لا تبدو بوضوح المنطق.
- تخزين برمجياتك: تجزأة نموذجك إلى أجزاء منطقية أو حتى وظائف منفصلة. هذا النهج المودعي يمكن أن يحسن القراءة ويجعل معالجة الأخطاء وتعديل أجزاء معينة من النموذج أسهل.
- تتبع التغيرات في النموذج: أبقه تاريخ تغيرات نموذجك، خاصةً إذا كان يتطور. استخدم أدوات توفير البحث عن التاريخ مثل Git لتتبع التغيرات وضمان أن أي تحديثات أو تحسينات يمكن تتبعها من جديد.
التوثيق المناسب والبرمجيات المنظمة ستجعل نماذجك في Pyomo أكثر وصولًا للمتعاونين المستقبليين وسيكون من السهل أكثر أن يتم تكبيرها أو تعديلها وفقًا لما يحتاج إليه مع الزمن.
الخلاصة
بيومو هو أداة قوية ومرنة لبناء وحل نماذج المحاسن في برنامج بتشوين. خلال هذا التوريد، بحثنا عن كيف يسمح بيومو للمستخدمين بالنماذج لمختلف مشاكل المحاسن من لوحدة البحث الخطي إلى البحث اللاخطي والبحث المختلف بالأعداد العشوائية.
مع نمطه السهل الاستخدام والادغام بالحلمات، يجعل بيومو تسهل تشكيل وحل مشاكل المحاسن العالمية للمبتدئين والمستخدمين المتقدمين.
إذا كنت مهتمًا بالتعلم عن حل مشاكل العالم بالمحاسن، قم بتحقيق تعلم المحاسن في برنامج بتشوين الدورة المجانية على DataCamp!