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

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

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

الدرس: استخدام الدوال random.randint و create_problem_instance في توليد مشاكل جدولة المهام

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

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

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

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

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

📝 ملخص الصفحة

تشرح هذه الصفحة كيفية استخدام الدالة `random.randint(x,y)` في Python لتوليد أعداد صحيحة عشوائية بين قيمتين محددتين، مع توضيح طريقة استخدامها مع القوائم أو المجموعات باستخدام الرمز `*`. كما تقدم مثالاً عملياً لتوليد 5 أعداد عشوائية بين 1 و 10.

يتم تقديم دالة `create_problem_instance` التي تُستخدم لإنشاء نسخة لمشكلة جدولة مهام، حيث تتضمن كل نسخة عشرة مهام. تحدد هذه الدالة نطاقات زمنية للمهام (بين 5 و20 وحدة زمنية)، ومواعيد نهائية (بين 5 و50 ساعة)، وأوزان (بين 1 و3). يتم عرض مثال على مخرجات الدالة التي تحتوي على قيم المدة والمواعيد النهائية والأوزان.

تشرح الصفحة أيضاً دالة `compute_schedule_tardiness` التي تُستخدم لتقييم جودة جدول المهام من خلال حساب التباطؤ الموزون الإجمالي. تقوم هذه الدالة بمعالجة المهام بترتيب جدولتها، وتحسب أوقات الانتهاء، وتضيف التباطؤ لكل مهمة بعد ضربه في وزنها. يتم تقديم كود Python لهذه الدالة مع شرح خطوات العملية.

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

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

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

تُستخدم الدالة random.randint (x,y) لتوليد عدد صحيح عشوائي بين X و Y. وهناك طريقة مختلفة لاستخدام هذه الدالة تتمثل في توفير قائمة [X,Y] أو مجموعة (X,Y). وفي هذه الحالة لا بد من كتابة الرمز * قبل القائمة، كما هو موضح في الدالة السابقة، على سبيل المثال:

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

for i in range(5): # prints 5 random integers between 1 and 10 print(random.randint(*[1, 10]))

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

6 5 5 10 1

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

يُستخدم المقطع البرمجي التالي دالة ()create_problem_instance لتوليد نسخة لمشكلة يتوفر فيها ما يلي:

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

• تشتمل كل نسخة على عشرة مهام. • يمكن لكل مهمة أن تستمر ما بين 5 وحدات زمنية و 20 وحدة زمنية، وسيتم افتراض أن الساعة هي الوحدة الزمنية المستخدمة فيما تبقى من هذا الدرس. • كل مهمة لها موعد نهائي يتراوح ما بين 5 ساعات و 50 ساعة، وتبدأ ساعة الموعد النهائي من لحظة بدء المهمة الأولى في استخدام الآلة، على سبيل المثال: إذا كان الموعد النهائي لمهمة ما يساوي عشر ساعات، فهذا يعني أنه لا بد من إكمال المهمة في غضون عشر ساعات من بداية المهمة الأولى في الجدول. • وزن كل مهمة هو عدد صحيح يتراوح بين 1 و 3.

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

create_problem_instance(10, [5, 20], [5, 50], [1, 3])

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

{'durations': [18, 17, 6, 9, 6, 20, 12, 9, 19], 'deadlines': [39, 31, 6, 42, 48, 10, 39, 16, 34, 35], 'weights': [2, 2, 3, 2, 1, 3, 2, 1, 1]}

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

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

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

# computes the total weighted tardiness of a given problem instance def compute_schedule_tardiness(problem, schedule): # gets the information for this problem durations, weights, deadlines=problem['durations'], problem['weights'], problem['deadlines'] job_num = len(schedule) # gets the number of jobs finish_times = [0] * job_num # stores the finish time for each job schedule_tardiness = 0 # initializes the weighted tardiness of the overall schedule to 0 for pos in range(job_num): # goes over the jobs in scheduled order

نوع: METADATA

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

نوع: METADATA

270

🔍 عناصر مرئية

مخطط توضيحي لدالة create_problem_instance

A diagram illustrating the input parameters for the `create_problem_instance` function. It shows four labeled boxes connected by lines to the corresponding arguments in the function call.

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

تُستخدم الدالة random.randint (x,y) لتوليد عدد صحيح عشوائي بين X و Y. وهناك طريقة مختلفة لاستخدام هذه الدالة تتمثل في توفير قائمة [X,Y] أو مجموعة (X,Y). وفي هذه الحالة لا بد من كتابة الرمز * قبل القائمة، كما هو موضح في الدالة السابقة، على سبيل المثال:for i in range(5): # prints 5 random integers between 1 and 10 print(random.randint(*[1, 10]))يُستخدم المقطع البرمجي التالي دالة ()create_problem_instance لتوليد نسخة لمشكلة يتوفر فيها ما يلي:• تشتمل كل نسخة على عشرة مهام. • يمكن لكل مهمة أن تستمر ما بين 5 وحدات زمنية و 20 وحدة زمنية، وسيتم افتراض أن الساعة هي الوحدة الزمنية المستخدمة فيما تبقى من هذا الدرس. • كل مهمة لها موعد نهائي يتراوح ما بين 5 ساعات و 50 ساعة، وتبدأ ساعة الموعد النهائي من لحظة بدء المهمة الأولى في استخدام الآلة، على سبيل المثال: إذا كان الموعد النهائي لمهمة ما يساوي عشر ساعات، فهذا يعني أنه لا بد من إكمال المهمة في غضون عشر ساعات من بداية المهمة الأولى في الجدول. • وزن كل مهمة هو عدد صحيح يتراوح بين 1 و 3.create_problem_instance(10, [5, 20], [5, 50], [1, 3]){'durations': [18, 17, 6, 9, 6, 20, 12, 9, 19], 'deadlines': [39, 31, 6, 42, 48, 10, 39, 16, 34, 35], 'weights': [2, 2, 3, 2, 1, 3, 2, 1, 1]}يُمكن استخدام الدالة التالية لتقييم جودة أي جدول أنتجته إحدى الخوارزميات لنسخة مشكلة محددة. حيث تقبل الدالة نسخة المشكلة وجدولاً لمهامها، ثم تمر على كل المهام بترتيب جدولتها نفسه حتى تُحسب أزمنة إنجازها ومجموع التباطؤ الموزون لكامل الجدول. ويُحسب هذا التباطؤ بحساب تباطؤ كل مهمة (مع مراعاة الموعد النهائي لها) وضربه في وزن المهمة وإضافة الناتج إلى المجموع:# computes the total weighted tardiness of a given problem instance def compute_schedule_tardiness(problem, schedule): # gets the information for this problem durations, weights, deadlines=problem['durations'], problem['weights'], problem['deadlines'] job_num = len(schedule) # gets the number of jobs finish_times = [0] * job_num # stores the finish time for each job schedule_tardiness = 0 # initializes the weighted tardiness of the overall schedule to 0 for pos in range(job_num): # goes over the jobs in scheduled order2023 - 1447--- VISUAL CONTEXT --- **DIAGRAM**: مخطط توضيحي لدالة create_problem_instance Description: A diagram illustrating the input parameters for the `create_problem_instance` function. It shows four labeled boxes connected by lines to the corresponding arguments in the function call. Key Values: عدد المهام المراد إنشاؤها (Number of tasks to be created) -> 10, نطاق مدة المهمة (Task duration range) -> [5, 20], نطاق الموعد النهائي (Deadline range) -> [5, 50], مدى أهمية الوزن (Weight importance range) -> [1, 3] Context: This diagram visually explains the meaning and order of the parameters passed to the `create_problem_instance` function, which is used to generate a specific problem instance for task scheduling.

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

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

ما هي الوظيفة الأساسية للدالة `random.randint(x, y)`؟

الإجابة: تُستخدم لتوليد عدد صحيح عشوائي ضمن النطاق المحدد بين X و Y (بما في ذلك X و Y).

الشرح: هذه الدالة هي طريقة شائعة في العديد من لغات البرمجة لتوليد قيم رقمية غير متوقعة ضمن نطاق معين.

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

متى يجب استخدام الرمز `*` قبل قائمة أو مجموعة عند استخدام الدالة `random.randint`؟

الإجابة: يجب استخدام الرمز `*` قبل القائمة `[X, Y]` أو المجموعة `(X, Y)` التي تمثل نطاق الأعداد العشوائية، وذلك لفصل عناصر القائمة/المجموعة وجعلها وسائط منفصلة للدالة.

الشرح: بدون الرمز `*`، قد تفسر الدالة القائمة أو المجموعة كوُسط واحد بدلاً من نطاق محدد من القيم.

تلميح: فكّر في كيفية معالجة الدوال للقوائم أو المجموعات كوحدة واحدة مقابل معالجتها كعناصر فردية.

ما هو الغرض من الدالة `create_problem_instance` في سياق جدولة المهام؟

الإجابة: تُستخدم لتوليد نسخة لمشكلة جدولة مهام، حيث تحدد خصائص كل مهمة مثل عدد المهام، نطاق مدتها، نطاق موعدها النهائي، ونطاق وزنها.

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

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

إذا كانت مدة مهمة ما هي 10 وحدات زمنية، وموعدها النهائي يبدأ من لحظة بدء المهمة الأولى في الجدول، فماذا يعني موعد نهائي يساوي 20 ساعة لهذه المهمة؟

الإجابة: يعني أنه يجب إكمال هذه المهمة في غضون 20 ساعة من لحظة بدء المهمة الأولى في الجدول، وليس بعد 20 ساعة من بداية المهمة نفسها.

الشرح: الموعد النهائي هنا هو مقياس بالنسبة لبداية الجدول الكلي، وليس بداية المهمة الفردية.

تلميح: ركز على نقطة البداية المرجعية لحساب المواعيد النهائية.

كيف يُحسب "التباطؤ الموزون" (weighted tardiness) لكامل الجدول باستخدام الدالة `compute_schedule_tardiness`؟

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

الشرح: هذه العملية تمنح أهمية أكبر للمهام ذات الوزن الأكبر عند حساب إجمالي التباطؤ.

تلميح: ما هي العوامل الثلاثة الرئيسية التي تؤثر في تقييم جودة الجدول وفقًا لهذه الدالة؟