خوارزمية البحث المحلي لمشكلة التباطؤ الموزون - كتاب الذكاء الإصطناعي - الصف 12 - الفصل 1 - المملكة العربية السعودية

الكتاب: كتاب الذكاء الإصطناعي - الصف 12 - الفصل 1 | المادة: الذكاء الإصطناعي | المرحلة: الصف 12 | الفصل الدراسي: 1

الدولة: المملكة العربية السعودية | المنهج: المنهج السعودي - وزارة التعليم

الدرس: أنتج خوارزمية حل البحث المحلي لمشكلة التباطؤ الموزون للآلة الواحدة

📚 معلومات الصفحة

الكتاب: كتاب الذكاء الإصطناعي - الصف 12 - الفصل 1 | المادة: الذكاء الإصطناعي | المرحلة: الصف 12 | الفصل الدراسي: 1

الدولة: المملكة العربية السعودية | المنهج: المنهج السعودي - وزارة التعليم

نوع المحتوى: example

مستوى الصعوبة: متوسط

📝 ملخص الصفحة

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

يتم تعريف الدالة `local_search_solver` التي تأخذ معلمات مثل المشكلة، والاستدلال الجشع، ومحدد التبديل، والحد الأقصى للتكرارات. تحتوي الدالة على خطوات لحساب عدد الوظائف، وإنشاء جدولة أولية، وتنفيذ حلقة بحث محلي لتحسين الجدولة من خلال مقارنة التباطؤ.

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

📋 المحتوى المنظم

📖 محتوى تعليمي مفصّل

4

نوع: QUESTION

أنتج خوارزمية حل البحث المحلي لمشكلة التباطؤ الموزون للآلة الواحدة، من خلال إكمال المقطع البرمجي التالي بحيث تستخدم الدالة البحث المحلي لإيجاد تبديل الجدولة الأمثل.

local_search_solver function

نوع: محتوى تعليمي

def local_search_solver(problem, greedy_heuristic, swap_selector, max_ iterations): # gets the information for this problem durations, weights, deadlines=problem['durations'], problem['weights'], problem['deadlines'] job_num = len(______________________)# gets the number of jobs # uses the greedy solver to get a first schedule. # this schedule will be then iteratively refined through local search greedy_sol = ____________________ (problem, greedy_heuristic) # remembers the best schedule so far best_schedule, best_tardiness, best_finish_times=greedy_ sol['schedule'],greedy_sol['tardiness'],greedy_sol['finish_times'] # local search for i in range(____________________): # for each of the given iterations # chooses which two positions to swap pos1,pos2=____________________ (best_schedule) new_schedule = best_schedule.____________________ ()# creates a copy of the schedule # swaps jobs at positions pos1 and pos2 new_schedule[pos1], new_schedule[pos2] = best_schedule[pos2], best_ schedule[pos1] # computes the new tardiness after the swap new_tardiness, new_finish_times = compute_schedule_tardiness(problem, new_schedule) # if the new schedule is better than the best one so far if new_tardiness < best_tardiness: # the new_schedule becomes the best one best_schedule = ____________________ best_tardiness = ____________________ best_finish_times=____________________ # returns the best solution return {'schedule':best_schedule, 'tardiness':best_tardiness, 'finish_times':best_finish_times}

نوع: METADATA

281

نوع: METADATA

وزارة التعليم Ministry of Education 2025 - 1447

📄 النص الكامل للصفحة

--- SECTION: 4 --- أنتج خوارزمية حل البحث المحلي لمشكلة التباطؤ الموزون للآلة الواحدة، من خلال إكمال المقطع البرمجي التالي بحيث تستخدم الدالة البحث المحلي لإيجاد تبديل الجدولة الأمثل.--- SECTION: local_search_solver function --- def local_search_solver(problem, greedy_heuristic, swap_selector, max_ iterations): # gets the information for this problem durations, weights, deadlines=problem['durations'], problem['weights'], problem['deadlines']job_num = len(______________________)# gets the number of jobs # uses the greedy solver to get a first schedule. # this schedule will be then iteratively refined through local search greedy_sol = ____________________ (problem, greedy_heuristic) # remembers the best schedule so far best_schedule, best_tardiness, best_finish_times=greedy_ sol['schedule'],greedy_sol['tardiness'],greedy_sol['finish_times']# local search for i in range(____________________): # for each of the given iterations # chooses which two positions to swap pos1,pos2=____________________ (best_schedule)new_schedule = best_schedule.____________________ ()# creates a copy of the schedule # swaps jobs at positions pos1 and pos2 new_schedule[pos1], new_schedule[pos2] = best_schedule[pos2], best_ schedule[pos1] # computes the new tardiness after the swap new_tardiness, new_finish_times = compute_schedule_tardiness(problem, new_schedule) # if the new schedule is better than the best one so far if new_tardiness < best_tardiness: # the new_schedule becomes the best one best_schedule = ____________________ best_tardiness = ____________________ best_finish_times=____________________# returns the best solution return {'schedule':best_schedule, 'tardiness':best_tardiness, 'finish_times':best_finish_times}2025 - 1447

✅ حلول أسئلة الكتاب الرسمية

عدد الأسئلة: 8

سؤال س:٤: job_num = len(______________________)# gets the number of jobs

الإجابة: durations

خطوات الحل:

  1. **الخطوة 1 (المفهوم):** نحتاج هنا إلى معرفة عدد المهام (jobs) المتاحة في البرنامج. عادةً ما يتم تخزين بيانات المهام في قائمة تحتوي على مدد زمنية لكل مهمة.
  2. **الخطوة 2 (التطبيق):** بما أن الدالة `len()` تُستخدم لحساب طول القائمة، فإننا نمرر لها القائمة التي تحتوي على أوقات المهام للحصول على عددها.
  3. **الخطوة 3 (النتيجة):** لذلك الإجابة هي: **durations**

سؤال س:٤: greedy_sol = ____________________ (problem, greedy_heuristic) # remembers the best schedule so far

الإجابة: greedy_solver

خطوات الحل:

  1. **الخطوة 1 (المفهوم):** نحتاج هنا إلى معرفة عدد المهام (jobs) المتاحة في البرنامج. عادةً ما يتم تخزين بيانات المهام في قائمة تحتوي على مدد زمنية لكل مهمة.
  2. **الخطوة 2 (التطبيق):** بما أن الدالة `len()` تُستخدم لحساب طول القائمة، فإننا نمرر لها القائمة التي تحتوي على أوقات المهام للحصول على عددها.
  3. **الخطوة 3 (النتيجة):** لذلك الإجابة هي: **durations**

سؤال س:٤: for i in range(____________________): # for each of the given iterations

الإجابة: max_iterations

خطوات الحل:

  1. **الخطوة 1 (المفهوم):** نحتاج هنا إلى معرفة عدد المهام (jobs) المتاحة في البرنامج. عادةً ما يتم تخزين بيانات المهام في قائمة تحتوي على مدد زمنية لكل مهمة.
  2. **الخطوة 2 (التطبيق):** بما أن الدالة `len()` تُستخدم لحساب طول القائمة، فإننا نمرر لها القائمة التي تحتوي على أوقات المهام للحصول على عددها.
  3. **الخطوة 3 (النتيجة):** لذلك الإجابة هي: **durations**

سؤال س:٤: pos1,pos2=____________________ (best_schedule)

الإجابة: swap_selector

خطوات الحل:

  1. **الخطوة 1 (المفهوم):** نحتاج هنا إلى معرفة عدد المهام (jobs) المتاحة في البرنامج. عادةً ما يتم تخزين بيانات المهام في قائمة تحتوي على مدد زمنية لكل مهمة.
  2. **الخطوة 2 (التطبيق):** بما أن الدالة `len()` تُستخدم لحساب طول القائمة، فإننا نمرر لها القائمة التي تحتوي على أوقات المهام للحصول على عددها.
  3. **الخطوة 3 (النتيجة):** لذلك الإجابة هي: **durations**

سؤال س:٤: new_schedule = best_schedule.____________________ ()# creates a copy of the schedule

الإجابة: copy

خطوات الحل:

  1. **الخطوة 1 (المفهوم):** نحتاج هنا إلى معرفة عدد المهام (jobs) المتاحة في البرنامج. عادةً ما يتم تخزين بيانات المهام في قائمة تحتوي على مدد زمنية لكل مهمة.
  2. **الخطوة 2 (التطبيق):** بما أن الدالة `len()` تُستخدم لحساب طول القائمة، فإننا نمرر لها القائمة التي تحتوي على أوقات المهام للحصول على عددها.
  3. **الخطوة 3 (النتيجة):** لذلك الإجابة هي: **durations**

سؤال س:٤: best_schedule = __________________

الإجابة: new_schedule

خطوات الحل:

  1. **الخطوة 1 (المفهوم):** نحتاج هنا إلى معرفة عدد المهام (jobs) المتاحة في البرنامج. عادةً ما يتم تخزين بيانات المهام في قائمة تحتوي على مدد زمنية لكل مهمة.
  2. **الخطوة 2 (التطبيق):** بما أن الدالة `len()` تُستخدم لحساب طول القائمة، فإننا نمرر لها القائمة التي تحتوي على أوقات المهام للحصول على عددها.
  3. **الخطوة 3 (النتيجة):** لذلك الإجابة هي: **durations**

سؤال س:٤: best_tardiness = __________________

الإجابة: new_tardiness

خطوات الحل:

  1. **الخطوة 1 (المفهوم):** نحتاج هنا إلى معرفة عدد المهام (jobs) المتاحة في البرنامج. عادةً ما يتم تخزين بيانات المهام في قائمة تحتوي على مدد زمنية لكل مهمة.
  2. **الخطوة 2 (التطبيق):** بما أن الدالة `len()` تُستخدم لحساب طول القائمة، فإننا نمرر لها القائمة التي تحتوي على أوقات المهام للحصول على عددها.
  3. **الخطوة 3 (النتيجة):** لذلك الإجابة هي: **durations**

سؤال س:٤: best_finish_times=____________________

الإجابة: new_finish_times

خطوات الحل:

  1. **الخطوة 1 (المفهوم):** نحتاج هنا إلى معرفة عدد المهام (jobs) المتاحة في البرنامج. عادةً ما يتم تخزين بيانات المهام في قائمة تحتوي على مدد زمنية لكل مهمة.
  2. **الخطوة 2 (التطبيق):** بما أن الدالة `len()` تُستخدم لحساب طول القائمة، فإننا نمرر لها القائمة التي تحتوي على أوقات المهام للحصول على عددها.
  3. **الخطوة 3 (النتيجة):** لذلك الإجابة هي: **durations**

📝 أسئلة اختبارية

عدد الأسئلة: 9

سؤال 4: new_schedule = best_schedule.____________________ ()

  • أ) copy
  • ب) clone
  • ج) duplicate
  • د) replicate

الإجابة الصحيحة: copy

الشرح: يجب استخدام الدالة copy() لإنشاء نسخة من الجدولة الحالية

تلميح: ما هي الدالة التي تنشئ نسخة من القائمة؟

سؤال 4: best_schedule = ____________________

  • أ) new_schedule
  • ب) best_schedule
  • ج) greedy_sol['schedule']
  • د) schedule

الإجابة الصحيحة: new_schedule

الشرح: يجب تعيين new_schedule كأفضل جدولة عندما تكون أفضل من السابقة

تلميح: ما هو المتغير الذي يحتوي على الجدولة الجديدة؟

سؤال 4: greedy_sol = ____________________ (problem, greedy_heuristic)

  • أ) greedy_solver
  • ب) brute_force_solver
  • ج) local_search_solver
  • د) compute_schedule_tardiness

الإجابة الصحيحة: greedy_solver

الشرح: يجب استدعاء الدالة greedy_solver للحصول على الجدولة الأولية

تلميح: ما اسم الدالة التي تحل المشكلة باستخدام الخوارزمية الجشعة؟

سؤال 4: for i in range(____________________):

  • أ) max_iterations
  • ب) job_num
  • ج) len(problem)
  • د) best_tardiness

الإجابة الصحيحة: max_iterations

الشرح: يجب استخدام max_iterations لتحديد عدد التكرارات في البحث المحلي

تلميح: ما هي المعلمة التي تحدد الحد الأقصى لعدد التكرارات؟

سؤال 4: pos1,pos2=____________________ (best_schedule)

  • أ) swap_selector
  • ب) greedy_heuristic
  • ج) compute_schedule_tardiness
  • د) local_search_solver

الإجابة الصحيحة: swap_selector

الشرح: يجب استدعاء الدالة swap_selector لاختيار المواقع التي سيتم تبديلها

تلميح: ما هي الدالة المسؤولة عن اختيار المواقع للتبديل؟

سؤال 4: أنتج خوارزمية حل البحث المحلي لمشكلة التباطؤ الموزون للآلة الواحدة، من خلال إكمال المقطع البرمجي التالي بحيث تستخدم الدالة البحث المحلي لإيجاد تبديل الجدولة الأمثل.

الإجابة الصحيحة: انظر الأسئلة الفرعية

الشرح: هذا سؤال رئيسي يحتوي على أسئلة فرعية تتعلق بإكمال الكود البرمجي

تلميح: راجع الأسئلة الفرعية أدناه لإكمال الأجزاء الناقصة في الكود

سؤال 4: job_num = len(______________________)

  • أ) durations
  • ب) weights
  • ج) deadlines
  • د) problem

الإجابة الصحيحة: durations

الشرح: يجب استخدام durations للحصول على عدد الوظائف لأنها تحتوي على مدة كل وظيفة

تلميح: ما هي القائمة التي تحتوي على معلومات جميع الوظائف؟

سؤال 4: best_tardiness = ____________________

  • أ) new_tardiness
  • ب) best_tardiness
  • ج) greedy_sol['tardiness']
  • د) tardiness

الإجابة الصحيحة: new_tardiness

الشرح: يجب تعيين new_tardiness كأفضل قيمة تأخير عندما تكون أفضل من السابقة

تلميح: ما هو المتغير الذي يحتوي على قيمة التأخير الجديدة؟

سؤال 4: best_finish_times=____________________

  • أ) new_finish_times
  • ب) best_finish_times
  • ج) greedy_sol['finish_times']
  • د) finish_times

الإجابة الصحيحة: new_finish_times

الشرح: يجب تعيين new_finish_times كأفضل أوقات الانتهاء عندما تكون أفضل من السابقة

تلميح: ما هو المتغير الذي يحتوي على أوقات الانتهاء الجديدة؟

🎴 بطاقات تعليمية للمراجعة

عدد البطاقات: 5 بطاقة لهذه الصفحة

في سياق الدالة `local_search_solver`، ما هو الغرض من `max_iterations`؟

الإجابة: المتغير `max_iterations` يحدد الحد الأقصى لعدد التكرارات التي سيقوم بها البحث المحلي في محاولة لتحسين الجدولة. هذا يمنع الخوارزمية من الدوران إلى ما لا نهاية ويضمن لها وقتاً محدوداً للتشغيل.

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

تلميح: فكر في سبب تحديد حد زمني أو عددي لعملية تكرارية.

ما هو الدور الرئيسي للدالة `local_search_solver` في سياق جدولة المهام؟

الإجابة: الدالة `local_search_solver` تُستخدم لإنتاج خوارزمية حل للبحث المحلي بهدف إيجاد تبديل جدولة أمثل لمشكلة التباطؤ الموزون للآلة الواحدة، وذلك عن طريق تحسين جدولة أولية تم الحصول عليها باستخدام خوارزمية جشعة.

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

تلميح: فكر في الهدف الأساسي من استخدام البحث المحلي لتحسين النتائج الأولية.

كيف تحصل الدالة `local_search_solver` على جدولة أولية؟

الإجابة: تحصل الدالة `local_search_solver` على جدولة أولية باستخدام "الدالة الجشعة" (greedy_heuristic) التي يتم تمريرها كمعامل لها.

الشرح: البحث المحلي غالباً ما يبدأ من حل أولي، وفي هذه الحالة، يتم الاعتماد على دالة استدلال جشعة لإنشاء هذا الحل الأولي قبل البدء في عملية التحسين التكراري.

تلميح: ارجع إلى كيفية بدء عملية التحسين في البحث المحلي.

ما هو الهدف الأساسي من استدعاء الدالة `compute_schedule_tardiness` داخل حلقة البحث المحلي؟

الإجابة: الهدف هو حساب مقدار التأخير الإجمالي (`new_tardiness`) وأوقات الانتهاء (`new_finish_times`) للجدولة الجديدة بعد إجراء تبديل في المواقع. هذا يسمح بمقارنة هذه الجدولة الجديدة مع أفضل جدولة تم العثور عليها حتى الآن.

الشرح: التأخير هو المقياس الرئيسي الذي تحاول خوارزمية البحث المحلي تقليله. لذلك، من الضروري حساب التأخير بدقة لكل جدولة جديدة يتم إنشاؤها.

تلميح: ما هي المعيار الذي نستخدمه لتقييم جودة الجدولة؟

في دالة `local_search_solver`، ما هي المعلومات التي يتم الحصول عليها من متغير `problem`؟

الإجابة: يتم الحصول على معلومات حول المدة الزمنية (`durations`)، والأوزان (`weights`)، والمواعيد النهائية (`deadlines`) من متغير `problem`.

الشرح: يتم استخراج قيم `durations`، `weights`، و `deadlines` مباشرةً من القاموس `problem` باستخدام مفاتيحها.

تلميح: راجع السطر الأول من الدالة `local_search_solver`

التصنيف: مفهوم جوهري | المستوى: متوسط