PyCSP3-Scheduling: A Scheduling Extension for PyCSP3
تقدم هذه الورقة البحثية PyCSP3-Scheduling، وهي مكتبة توسع إطار عمل PyCSP3 بتجريدات جدولة أصلية مثل متغيرات الفترات والتسلسل، والتي تُترجم إلى قيود قياسية للحفاظ على الفصل بين النمذجة والمحلل مع إظهار نتائج أداء مختلطة تتضمن تسارعاً كبيراً في بعض عائلات المشكلات وتراجعاً ناتجاً عن العبء الإضافي في أخرى.
تخيل أنك رئيس طهاة ماهر يحاول تنظيم مأدبة ضخمة ومعقدة. لديك عشرات الأطباق لطهيها، ومواقد محدودة، وأوقات طهي محددة، وقواعد صارمة بشأن أي طبق يجب أن يكون جاهزاً قبل طبق آخر ليتم تقديمه.
المشكلة: المطبخ "اليدوي" حالياً، إذا أردت استخدام برنامج "PyCSP3" الشهير (وهو أداة قوية لحل الألغاز المنطقية المعقدة)، يتعين عليك وصف مطبخك بمصطلحات منخفضة المستوى للغاية. عليك إدراج كل قدر، وكل ثانية من وقت الطهي يدوياً، وكتابة قواعد طويلة ومملة مثل: "إذا كان القدر (أ) على الموقد، فلا يمكن للقدر (ب) أن يكون على الموقد إلا إذا انتهى القدر (أ)."
عليك بناء الجدول الزمني بأكرا، لبنة فوق أخرى، باستخدام الرياضيات الأساسية فقط. هذا يعمل، لكنه يشبه محاولة كتابة رواية باستخدام الحروف الفردية فقط دون أي كلمات أو قواعد لغوية. من السهل ارتكاب خطأ، وتصبح التعليمات عبارة عن جدار فوضوي من النصوص يصعب قراءته أو تغييره.
الحل: PyCSP3-Scheduling تقدم هذه الورقة البحثية "مساعد مطبخ" جديد يسمى PyCSP3-Scheduling. بدلاً من جعلك تكتب كل قاعدة عن القدور والمؤقتات، تمنحك هذه الأداة "مكونات ذكية" عالية المستوى:
متغيرات الفترات (الـ "قدر الذكي"): بدلاً من مجرد رقم للوقت، تحصل على كائن "قدر" يعرف وقت بدايته، ونهايته، ومدة الطهي المطلوبة. حتى أنه يعرف ما إذا كان اختيارياً (ربما لا تحتاج لطهي هذا الطبق اليوم).
متغيرات التسلسل (الـ "سير الناقل"): يمكنك تجميع القدور في خط واحد. الأداة تعرف تلقائياً أنه إذا كان القدر (أ) على السير، فلا يمكن للقدر (ب) أن يكون هناك في نفس الوقت. وهي تتعامل مع "أوقات التجهيز" (مثل غسل القدر بين الأطباق) تلقائياً.
المترجم: الأفضل من ذلك هو أن هذا المساعد لا يحاول استبدال رئيس الطهاة (المحلل/Solver). بل يأخذ تعليماتك عالية المستوى وسهلة القراءة ويقوم بترجمتها مرة أخرى إلى الرياضيات منخفضة المستوى والفوضوية التي يفهمها الكمبيوتر تماماً.
التجربة: هل نجح الأمر؟ اختبر المؤلف هذه الأداة الجديدة على 261 "وصفة" مختلفة (مشكلات جدولة) تتراوح من ورش العمل البسيطة إلى جدولة طاقم المستشفيات المعقدة وجدولة البطولات. وقارن بين الطريقة "اليدوية" وطريقة "المساعد الذكي".
إليك ما وجده:
النتائج متطابقة: عندما حل الكمبيوتر المشكلة بشكل مثالي، حصلت كلتا الطريقتين على نفس الإجابة تماماً. كانت الترجمة دقيقة بنسبة 100%.
السرعة متفاوتة:
النجاحات: في بعض المشكلات (مثل جدولة هبوط الطائرات أو بروفات المسرح)، كانت الأداة الجديدة أسرع بما يصل إلى 5.8 مرة. كان الأمر يشبه الانتقال من دراجة هوائية إلى سيارة رياضية.
الإخفاقات: في أنواع أخرى من المشكلات (مثل أنواع معينة من التصنيع أو ورش العمل المرنة)، كانت الأداة الجديدة في الواقع أبطأ.
لماذا؟ يوضح المؤلف أنه في بعض الأحيان، تضيف عملية "الترجمة" الكثير من الأعباء الإضافية. على سبيل المثال، إذا كانت المشكلة تتضمن مهاماً "اختيارية"، فقد تضطر الأداة أحياناً لكتابة آلاف القواعد الإضافية من نوع "إذا/إذن" لتغطية كل الاحتمالات، مما يبطئ الكمبيوتر. إنه يشبه تعبئة حقيبة سفر بطبقات إضافية من الغلاف البلاستيكي لمجرد الأمان؛ فهي تحمي العناصر، لكنها تجعل الحقيبة ثقيلة.
الخلاصة إن PyCSP3-Scheduling هو جسر. فهو يسمح للبشر بكتابة نماذج الجدولة بطريقة منطقية وطبيعية (باستخدام "الفترات" و"التسلسلات") دون قطع الاتصال بالمحللات القوية التي تقوم بالعمل الشاق.
هو مفتوح المصدر: يمكن لأي شخص استخدامه مجاناً.
إنه آمن: لا يقيدك ببرنامج كمبيوتر واحد محدد؛ بل يترجم نموذجك إلى تنسيق قياسي يمكن لأي محلل متوافق قراءته.
ليس حلاً سحرياً: بينما يجعل النمذجة أسهل وأسرع بكثير لبعض المشكلات، فإنه لا يجعل كل مشكلة أسرع تلقائياً. في بعض الحالات، تضيف "خطوات الترجمة" الإضافية بعض العبء الإضافي.
باختصار، تجعل هذه الأداة مهمة "رئيس الطهاة" (النموذج) أسهل بكثير وأقل عرضة للخطأ، حتى لو استغرق "المطبخ" (محلل الكمبيوتر) أحياناً بضع خطوات إضافية لمعالجة التعليمات الجديدة.
ملخص تقني: PyCSP3-Scheduling
بيان المشكلة
بينما توفر PyCSP3 بيئة منتجة لنمذجة المسائل التوافقية وتصديرها إلى معيار XCSP3، إلا أنها تفتقر إلى الدعم الأصلي لتجريدات الجدولة عالية المستوى. حالياً، يتعين على النمذجين استخدام متغيرات صحيحة منخفضة المستوى (أوقات البدء، المدد) وبناء قيود الأسبقية الحسابية والنزاعات (disjunctions) يدوياً للتعامل مع تعارضات الموارد. ورغم أن PyCSP3 توفر قيوداً عالمية مثل NoOverlap و Cumulative على مصفوفات الأعداد الصحيحة، إلا أنه يجب على النمذج إدارة مصفوفات أوقات البدء، وقوائم المدد، وارتفاعات الموارد بشكل صريح. هذا النهج يحجب الهيكل الجوهري للجدولة، ويعقد إضافة ميزات مثل الاختيارية (مهام قد تحدث أو لا تحدث) أو أوقات الإعداد المعتمدة على التسلسل، ويتطلب إعادة بناء الترميزات من الصفر لنماذج جديدة. توفر الأدوات الصناعية الموجودة (مثل CP Optimizer) كائنات جدولة، لكنها غالباً ما تربط النماذج بمحللات محددة، وهي أحياناً تجارية، بينما تفتقر لغات مثل MiniZinc إلى أنواع متغيرات الفترات (interval variable types) كعناصر أساسية.
المنهجية
تقدم الورقة البحثية PyCSP3-Scheduling، وهي مكتبة توسع PyCSP3 بطبقة جدولة مخصصة. تتضمن المنهجية الأساسية ما يلي:
طبقة التجريد: تقدم المكتبة نوعين رئيسيين من المتغيرات:
IntervalVar: يمثل مهمة ذات سمات للبدء، والنهاية، والحجم (المدة)، والوجود. وهو يدعم خمسة أنواع: ثابت (Fixed)، مرن (Flexible)، اختياري (Optional)، محدود (Bounded)، ومقياس (Scaled) (يربط المدة بملفات الكثافة).
SequenceVar: يجمع قائمة من متغيرات الفترات في تسلسل مرتب، يمثل عادةً مورداً تنافرياً (مثل آلة)، ويدعم أوقات الانتقال المعتمدة على النوع.
مخطط التجميع (Compilation Scheme): لا تقدم المكتبة خلفية محلل (solver backend) جديدة، بل تقوم بتجميع هذه التجريدات عالية المستوى إلى متغيرات وقيود PyCSP3 قياسية، والتي يتم تصديرها بعد ذلك كحالات XCSP3 قياسية.
الرسم المباشر (Direct Mapping): عندما تتطابق الأنماط مع القيود العالمية الموجودة (مثل الفترات الإلزامية بدون انتقالات)، تصدر المكتبة قيود XCSP3 عالمية قياسية مثل noOverlap و Cumulative.
التفكيك (Decomposition): في الحالات المعقدة (مثل الفترات الاختيارية مع حراس الوجود أو الإعدادات المعتمدة على التسلسل)، تقوم المكتبة بتفكيك التجريدات إلى قيود أولية. على سبيل المثال، فإن SeqNoOverlap مع الفترات الاختيارية يعود إلى قيود التنافر الثنائية O(n2) المحروسة بمتغيرات وجود (presence literals)، لأن معيار XCSP3 الحالي لا يدعم الفترات الاختيارية في القيود العالمية.
النمذجة الهجينة: طبقة التجريد مدمجة داخل PyCSP3، مما يسمح للنمذجين بالخلط بين إنشاءات الجدولة عالية المستوى وقيود PyCSP3 الخام (على سبيل المثال، استخدام presence_of لتفعيل منطق عد مخصص).
نظام التعبيرات: توفر المكتبة أدوات وصول (start_of، end_of، presence_of، إلخ) التي ترجع تعبيرات PyCSP3، مما يتيح عمليات حسابية ومنطقية معقدة مباشرة على سمات الفترة.
المساهمات الرئيسية
تقدم الورقة ثلاث مساهمات محددة:
واجهة برمجة تطبيقات للجدولة (Scheduling API): واجهة شاملة لـ PyCSP3 تتمحور حول تجريدات الفترة والتسلسل، وتدعم الاختيارية، ودوال الكثافة، والتسلسل المدرك للانتقال.
مخطط تجميع (Compilation Scheme): آلية تقوم بخفض هذه التجريدات إلى قيود PyCSP3/XCSP3 مستقلة عن المحلل مع الحفاظ على القابلية للإرضاء والتحسين.
التقييم التجريبي: مقارنة صارمة لـ 261 حالة مزدوجة (صياغة PyCSP3 الكلاسيكية مقابل صياغة الجدولة) عبر 17 عائلة من المسائل.
النتائج
أُجري التقييم على 261 حالة مزدوجة باستخدام محلل ACE مع مهلة زمنية قدرها 1200 ثانية. وتشمل النتائج الرئيسية ما يلي:
الصحة الدلالية: في الـ 72 حالة التي أثبتت فيها الصياغتان المثالية، تطابقت قيم الهدف تماماً (100%)، مما يؤكد أن التجميع لا يسبب أي تباعد دلالي.
الاتفاق على حالة المحلل: اتفقت الصياغتان على حالة المحلل (مثالي، مرضٍ، غير مرضٍ، انتهاء المهلة) في 80.8% من الأزواج. وكانت الخلافات ناتجة أساساً عن اختلافات التقدم في البحث المرتبطة بالمهلة الزمنية بدلاً من الأخطاء المنطقية.
تباين الأداء: تباين أداء وقت التشغيل بشكل كبير عبر العائلات:
المكاسب: أظهرت ثلاث عائلات تسارعاً واضحاً: MSPSP (5.82×)، و AircraftLanding (3.47×)، و Rehearsal (3.31×). عُزي المكسب في MSPSP إلى آثار ترتيب المتغيرات في إعلان متغير PyCSP3 بدلاً من التجريدات نفسها، بينما استفادت AircraftLanding و Rehearsal من تقليل حجم النموذج والالتقاط الهيكلي الأفضل.
التراجعات: تراجعت ثلاث عائلات: LotSizing (0.29×)، و MRCPSP (0.61×)، و FlexibleJobshopScen (0.89×).
تتبع التراجع في MRCPSP إلى تجميع الفترات الاختيارية الذي عاد إلى التنافر الثنائي بدلاً من إصدار قيد noOverlap عالمي، مما منع الانتشار الفعال.
رُبط التراجع في LotSizing بمشاكل التشفير على مستوى القيد وقوة الانتشار تحت المهلة الزمنية.
عانت FlexibleJobshopScen من تضخم هيكلي كبير (انفجار في المتغيرات والقيود) بسبب تكرار القرارات الاختيارية عبر السيناريوهات.
الأثر الهيكلي: أظهرت 8 من أصل 17 عائلة تضخماً هيكلياً ضئيلاً (أقل من 1%). أما بالنسبة للبقية، فقد أدت صياغة الجدولة أحياناً إلى تقليل حجم النموذج (مثل BACP، Rehearsal) وأحياناً إلى زيادته بشكل كبير (مثل FlexibleJobshopScen بنسبة +383.7% في القيود).
الأهمية والادعاءات
تضع الورقة PyCSP3-Scheduling كأول طبقة جدولة توفر تجريدات IntervalVar و SequenceVar كعناصر أساسية مع دعم الاختيارية والتسلسل المدرك للانتقال مع التجميع إلى معيار مستقل عن المحلل (XCSP3).
يؤكد المؤلفون أن المكتبة تحافظ على الفصل الكامل بين النمذجة والحل، وهو مبدأ أساسي في منظومة PyCSP3. وهذا يسمح للنماذج بالبقاء قابلة للاستخدام مع مجموعة واسعة من المحللات (ACE، Choco، CoSoCo، OR-Tools، CP Optimizer، إلخ) دون تعديل.
تتسم الورقة بالتواضع فيما يتعلق بادعاءات الأداء، مشيرة إلى أن مكاسب وقت التشغيل ليست عالمية وغالباً ما ترتبط بهياكل مسائل محددة أو خوارزميات البحث (مثل ترتيب المتغيرات). ويذكر المؤلفون صراحة أن التسارع الكبير في MSPSP هو على الأرجرج نتاج أنماط إعلان المتغيرات وليس التجريدات الخاصة بالجدولة. القيمة الأساسية هي القدرة التعبيرية وسهولة الصيانة لصياغة الجدولة، والتي تقلل من تعقيد الكود (على سبيل المثال، تقليل بنسبة 31% في عدد الأسطر لنموذج Job-shop مرن)، وتبسط إضافة ميزات مثل الاختيارية، حتى لو تسبب ذلك أحياناً في عبء تجميع يؤثر على أداء وقت التشغيل في عائلات مسائل معينة.
تم تحديد العمل المستقبلي في توسيع التجميع لإصدار قيود XCSP3 عالمية تدعم الاختيارية (لتجنب التفكيك الثنائي) وتحسين قواعد التجميع لتقليل العبء الهيكلي في العائلات الشاذة.