📋 المحتوى المنظم
📖 محتوى تعليمي مفصّل
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'.
🎴 بطاقات تعليمية للمراجعة
عدد البطاقات: 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` لكل عامل آخر ليعكس فقط المهارات التي ما زالت مطلوبة. هذا يمنع احتساب المساهمات في المهارات التي تم تغطيتها بالفعل.
تلميح: لماذا نحتاج إلى تحديث قائمة المهارات التي يمكن للعامل تغطيتها في كل خطوة؟