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

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

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

الدرس: تطبيق خوارزمية الحل الجشع في Python

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

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

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

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

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

📝 ملخص الصفحة

تقدم هذه الصفحة شرحًا لخوارزمية الحل الجشع (Greedy Algorithm) لتكوين فريق بناءً على المهارات المطلوبة والمتاحة لدى العمال. يتم عرض كود Python لدالة `greedy_solver` التي تحدد أصغر فريق يمكنه تغطية جميع المهارات المطلوبة.

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

يتم شرح وظيفة `intersections()` في مربع جانبي باللغة العربية، حيث توضح أن هذه الدالة تُرجع مجموعة جديدة تحتوي فقط على المهارات المشتركة بين مهارات العامل والمهارات المطلوبة التي لم تُستوفَ بعد.

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

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

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

def greedy_solver(problem):

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

def greedy_solver(problem): worker_skills = problem['worker_skills'] required_skills = problem['required_skills'] # skills that still have not been covered uncovered_required_skills = required_skills.copy() best_team = [] # remembers only the skills of each worker that are required but haven't been covered yet uncovered_worker_skills = {} for worker_id in worker_skills: # remembers only the required uncovered skills that this worker has uncovered_worker_skills[worker_id] = worker_skills[worker_id]. intersection(uncovered_required_skills) # while there are still required skills to cover while len(uncovered_required_skills) > 0: best_worker_id = None # the best worker to add next # number of uncovered skills required for the best worker to cover best_new_coverage = 0 for worker_id in uncovered_worker_skills: # uncovered required skills that this worker can cover my_uncovered_skills = uncovered_worker_skills[worker_id] # if this worker can cover more uncovered required skills than the best worker so far if len(my_uncovered_skills) > best_new_coverage: best_worker_id=worker_id # makes this worker the best worker best_new_coverage=len(my_uncovered_skills) if best_worker_id != None: # if a best worker was found best_team.append(best_worker_id) # adds the worker to the solution # removes the best worker's skills from the skills to be covered uncovered_required_skills = uncovered_required_skills - uncovered_worker_skills[best_worker_id] for worker_id in uncovered_worker_skills: # remembers only the required uncovered skills that this worker has uncovered_worker_skills[worker_id] = uncovered_worker_skills[worker_id].intersection(uncovered_required_skills) else: # no best worker has been found and some required skills are still uncovered return None # no solution could be found return best_team

تُظهر الدالة ()intersections

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

تُظهر الدالة ()intersections مجموعة جديدة تحتوي فقط على المهارات المشتركة من جميع مهارات العمال الموجودة في worker_skills، والمهارات المطلوبة التي لم تُستوفَ في uncovered_worker_skills.

نوع: METADATA

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

🔍 عناصر مرئية

تُظهر الدالة ()intersections

A blue-bordered box containing an Arabic explanation of the intersections() function. It clarifies that the function creates a new set containing only the common skills from 'worker_skills' and the required skills that have not yet been covered in 'uncovered_worker_skills'.

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

--- SECTION: def greedy_solver(problem): --- def greedy_solver(problem): worker_skills = problem['worker_skills'] required_skills = problem['required_skills']# skills that still have not been covered uncovered_required_skills = required_skills.copy() best_team = [] # remembers only the skills of each worker that are required but haven't been covered yet uncovered_worker_skills = {}for worker_id in worker_skills: # remembers only the required uncovered skills that this worker has uncovered_worker_skills[worker_id] = worker_skills[worker_id]. intersection(uncovered_required_skills)# while there are still required skills to cover while len(uncovered_required_skills) > 0: best_worker_id = None # the best worker to add next # number of uncovered skills required for the best worker to cover best_new_coverage = 0for worker_id in uncovered_worker_skills: # uncovered required skills that this worker can cover my_uncovered_skills = uncovered_worker_skills[worker_id]# if this worker can cover more uncovered required skills than the best worker so far if len(my_uncovered_skills) > best_new_coverage: best_worker_id=worker_id # makes this worker the best worker best_new_coverage=len(my_uncovered_skills)if best_worker_id != None: # if a best worker was found best_team.append(best_worker_id) # adds the worker to the solution# removes the best worker's skills from the skills to be covered uncovered_required_skills = uncovered_required_skills - uncovered_worker_skills[best_worker_id]for worker_id in uncovered_worker_skills: # remembers only the required uncovered skills that this worker has uncovered_worker_skills[worker_id] = uncovered_worker_skills[worker_id].intersection(uncovered_required_skills)else: # no best worker has been found and some required skills are still uncovered return None # no solution could be found return best_team--- SECTION: تُظهر الدالة ()intersections --- تُظهر الدالة ()intersections مجموعة جديدة تحتوي فقط على المهارات المشتركة من جميع مهارات العمال الموجودة في worker_skills، والمهارات المطلوبة التي لم تُستوفَ في uncovered_worker_skills.2023 - 1447--- VISUAL CONTEXT --- **HIGHLIGHT_BOX**: تُظهر الدالة ()intersections Description: A blue-bordered box containing an Arabic explanation of the intersections() function. It clarifies that the function creates a new set containing only the common skills from 'worker_skills' and the required skills that have not yet been covered in 'uncovered_worker_skills'. Context: This sidebar provides a crucial explanation in Arabic for a specific function, 'intersections()', used within the Python code for the greedy solver algorithm. It helps Arabic-speaking learners understand the purpose and output of this function in the context of skill management.

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

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

ما هو الدور الأساسي للدالة `greedy_solver(problem)` في حل مشكلات تخصيص العمال؟

الإجابة: تقوم الدالة `greedy_solver` بإنشاء فريق عمل بشكل تكراري عن طريق اختيار العامل الذي يغطي أكبر عدد من المهارات المطلوبة التي لم تُغطى بعد، وذلك في كل خطوة.

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

تلميح: ركز على استراتيجية الاختيار المتكرر للعامل الأنسب في كل مرحلة.

كيف تتعامل الدالة `greedy_solver` مع المهارات التي لا تزال مطلوبة ولم يتم تغطيتها؟

الإجابة: تحتفظ الدالة بقائمة `uncovered_required_skills` التي يتم تحديثها في كل خطوة، بإزالة المهارات التي يغطيها العامل المختار حديثًا. تستمر العملية حتى يتم تغطية جميع المهارات المطلوبة أو عدم إمكانية تغطيتها.

الشرح: المتغير `uncovered_required_skills` هو المفتاح لتتبع التقدم. يتم تقليصه في كل تكرار بعد اختيار أفضل عامل، مما يضمن التركيز على المهارات المتبقية.

تلميح: ابحث عن المتغير الذي يتتبع المهارات التي تحتاج إلى تغطية.

ماذا يحدث إذا لم تتمكن الدالة `greedy_solver` من تغطية جميع المهارات المطلوبة؟

الإجابة: إذا لم يتم العثور على عامل يمكنه تغطية أي من المهارات المطلوبة المتبقية (أي أن `best_worker_id` يبقى `None`)، فإن الدالة تعيد `None` للإشارة إلى عدم إمكانية إيجاد حل.

الشرح: هذا يمثل حالة عدم وجود حل ممكن ضمن القيود المفروضة، حيث لا يوجد عامل يمكنه سد الفجوات المتبقية في المهارات المطلوبة.

تلميح: ابحث عن شرط الفشل في الحلقة الرئيسية للبحث عن أفضل عامل.

اشرح وظيفة `worker_skills[worker_id].intersection(uncovered_required_skills)` داخل حلقة البحث عن أفضل عامل.

الإجابة: هذه العملية تقوم بحساب المهارات المشتركة بين مهارات العامل الحالي (`worker_skills[worker_id]`) والمهارات المطلوبة التي لم تُغطى بعد (`uncovered_required_skills`). النتيجة هي قائمة بالمهارات التي يمكن لهذا العامل المساهمة بها حاليًا.

الشرح: استخدام `intersection` هنا فعال جدًا لأنه يحدد بالضبط ما يمكن للعامل الحالي تقديمه لمعالجة المشكلة المتبقية (المهارات غير المغطاة).

تلميح: فكر في معنى 'intersection' في سياق مجموعات المهارات.

ما هو الهدف من إعادة حساب `uncovered_worker_skills` في كل تكرار للدالة `greedy_solver`؟

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

الشرح: بعد اختيار عامل وإزالة مهاراته من `uncovered_required_skills`، يجب تحديث `uncovered_worker_skills` لكل عامل آخر ليعكس فقط المهارات التي ما زالت مطلوبة. هذا يمنع احتساب المساهمات في المهارات التي تم تغطيتها بالفعل.

تلميح: لماذا نحتاج إلى تحديث قائمة المهارات التي يمكن للعامل تغطيتها في كل خطوة؟