مقرر الذكاء الاصطناعي

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 170

‫قـــــررت وزارة الـــتــعلـيــــم تــدريـــ�س‬

‫اﻟﻤﻤﻠﻜﺔ اﻟﻌﺮﺑﻴﺔ اﻟﺴﻌﻮدﻳﺔ‬


‫هـــذا الــكــتــاب وطــبــعــه عــلــى نفقـتـها‬

‫الذكاء اال�صطناعي‬
‫التعليم الثانوي ‪ -‬نظام امل�صارات‬
‫ال�صنة الثالثة‬

‫طبعة ‪2023-1445‬‬
‫قـــــررت وزارة الـــتــعلـيــــم تــدريـــ�س‬
‫اﻟﻤﻤﻠﻜﺔ اﻟﻌﺮﺑﻴﺔ اﻟﺴﻌﻮدﻳﺔ‬
‫هـــذا الــكــتــاب وطــبــعــه عــلــى نفقـتـها‬
‫ه�‬ ‫وزارة التعليم‪،‬‬
‫فهرسة مكتبـة امللـك فهد الوطنيـة أثنـاء النـشـر‬
‫وزارة التعلـيـم‬
‫الذكاء االصطناعي ‪ -‬املرحلة الثانوية ‪ -‬نظام املسارات ‪ -‬السنة‬
‫الثالثة ‪ / .‬وزارة التعليم ‪ - .‬الرياض‪ 1444 ،‬هـ‬
‫‪ 341‬ص ؛ ‪ 25.5 x 21‬سم‬
‫ردمـك ‪978-603-511-495-0 :‬‬
‫‪ - 1‬التعليم ‪ -‬مناهج ‪ -‬السعودية أ ‪ .‬العنوان‬
‫‪1444 / 11122‬‬ ‫‪375.009531‬‬
‫‪375‬‬ ‫ديـوي ‪009531‬‬

‫‪-‬‬ ‫‪-‬‬
‫رقم األإيداع ‪:‬‬
‫ردم ‪- - :‬‬
‫الذكاء األ�سطناعي‬
‫التعليم الثانو ‪ -‬نظام امل�سارات‬
‫ال�سنة الثالثة‬

‫طبعة ‪2023-1445‬‬
‫مقدمة‬
‫اإن تق��دم ال��دول وتطوره��ا يقا���ص مب��دى قدرته��ا عل��ى اال�س��تثمار يف التعلي��م‪ ،‬وم��دى ا�س��تجابة نظامه��ا التعليم��ي ملتطلب��ات الع�س��ر‬
‫وحر�سا من وزارة التعليم على دمُيومة تطوير اأنظمتها التعليمية‪ ،‬وا�س��تجابة لروؤية اململكة العربية ال�س��عودية ‪ 2030‬فقد‬ ‫ً‬ ‫ومتغراته‪.‬‬
‫بادرت الوزارة اإىل اعتماد نظام م�س��ارات التعليم الثانوي بهدف اإحداث تغير فاعل و�س��امل يف املرحلة الثانوية‪.‬‬
‫أمنوذج��ا تعليم ًي��ا متمي��زً ا وحدي ًث��ا للتعلي��م الثان��وي باململك��ة العربي��ة ال�س��عودية ي�س��هم‬
‫اإن نظ��ام م�س��ارات التعلي��م الثان��وي يق��دم ا ً‬
‫بكف��اءة يف‪:‬‬ ‫‪2022/0003‬‬
‫ تعزي��ز قي��م االنتم��اء لوطنن��ا اململك��ة العربي��ة ال�س��عودية‪ ،‬وال��والء لقيادت��ه الر�س��يدة حفظه��م ا ‪ ،‬انطال ًق��ا م��ن عقي��دة �سافي��ة‬ ‫‪2023‬‬
‫م�س��تندة عل��ى التعالي��م االإ�س��المية ال�س��محة‪.‬‬
‫ تعزي��ز قي��م املواطن��ة م��ن خ��الل الرتكي��ز عليه��ا يف امل��واد الدرا�س��ية واالأن�س��طة‪ ،‬ات�س��ا ًقا م��ع مطال��ب التنمي��ة امل�س��تدامة‪ ،‬واخلط��ط‬
‫التنموي��ة يف اململك��ة العربي��ة ال�س��عودية الت��ي توؤك��د عل��ى تر�س��يخ ثنائي��ة القيم والهوية‪ ،‬والقائمة على تعاليم االإ�س��الم والو�س��طية‪.‬‬
‫ تاأهيل الطلبة مبا يتوافق مع التخ�س�سات امل�ستقبلية يف اجَلامعات والكليات اأو املهن املطلوبة؛ ل�سمان ات�ساق خُمرجات التعليم‬
‫مع متطلبات �سوق العمل‪.‬‬
‫‪Binary‬‬
‫ متكني الطلبة من متابعة التعليم يف امل�سار املف�سل لديهم يف مراحل مبكرة‪ ،‬وفق ميولهم وقدراتهم‪.‬‬
‫ متكني الطلبة من االلتحاق بالتخ�س�سات العلمية واالإدارية النوعية املرتبطة ب�سوق العمل‪ ،‬ووظائف امل�ستقبل‪.‬‬
‫ دم��ج الطلب��ة يف بيئ��ة تعليمي��ة ممتع��ة وحمف��زة داخل املدر�س��ة قائمة على فل�س��فة بنائية‪ ،‬وممار�س��ات تطبيقي��ة �سمن منا تعليمي‬
‫ن�سط‪.‬‬
‫ نق��ل الطلب��ة ع��رب رحل��ة تعليمي��ة متكامل��ة ب��د ًءا م��ن املرحل��ة االبتدائي��ة حت��ى نهاي��ة املرحل��ة الثانوي��ة‪ ،‬وتُ�س�هِّل عملي��ة انتقاله��م اإىل‬
‫مرحل��ة م��ا بعد التعلي��م العام‪.‬‬
‫ تزويد الطلبة باملهارات التقنية وال�سخ�سية التي ت�ساعدهم على التعامل مع احلياة‪ ،‬والتجاوب مع متطلبات املرحلة‪.‬‬
‫ تو�سيع الفر�ص اأمام الطلبة اخلريجني عرب خيارات متنوعة اإ�سافة اإىل اجَلامعات مثل‪ :‬احل�سول على �سهادات مهنية‪ ،‬وااللتحاق‬
‫بالكليات التطبيقية‪ ،‬واحل�سول على دبلومات وظيفية‪.‬‬
‫ويتكون نظام امل�سارات من ت�سعة ف�سول درا�سية تُدرّ�ص يف ثالث �سنوات‪ ،‬تت�سمن �سنة اأوىل م�سرتكة يتلقى فيها الطلبة الدرو�ص‬
‫يف جماالت علمية واإن�سانية متنوعة‪ ،‬تليها �سنتان تخ�س�سيتان‪ ،‬يُ�س ّكن الطلبة بها يف م�سار عام واأربعة م�سارات تخ�س�سية تت�سق مع‬
‫ميولهم وقدراتهم‪ ،‬وهي‪ :‬امل�سار ال�سرعي‪ ،‬م�سار اإدارة االأعمال‪ ،‬م�سار علوم احلا�سب والهند�سة‪ ،‬م�سار ال�سحة واحلياة‪ ،‬وهو ما يجعل‬
‫هذا النظام هو االأف�سل للطلبة من حيث‪:‬‬
‫ وج��ود م��واد درا�س��ية جدي��دة تتواف��ق م��ع متطلب��ات الث��ورة ال�سناعي��ة الرابع��ة واخلط��ط التنموي��ة‪ ،‬وروؤي��ة اململك��ة ‪ ،2030‬ته��دف‬
‫لتنمية مهارات التفكر العليا وحل امل�س��كالت‪ ،‬واملهارات البحثية‪.‬‬
‫ برام��ج املج��ال االختي��اري الت��ي تت�س��ق م��ع احتياج��ات �س��وق العمل وميول الطلبة‪ ،‬حيث ُمُي ّكن الطلبة م��ن االلتحاق مبجال اختياري‬
‫حمدد وفق م�سفوفة مهارات وظيفية حمددة‪.‬‬
‫ مقيا�ص ميول ي�سمن حتقيق كفاءة الطلبة وفاعليتهم‪ ،‬وي�ساعدهم يف حتديد اجتاهاتهم وميولهم‪ ،‬وك�سف مكامن القوة لديهم‪،‬‬
‫مما يعزز من فر�ص جناحهم يف امل�ستقبل‪.‬‬
‫خ�سي�سا مبا يت�س��ق مع فل�س��فة الن�س��اط يف املدار���ص‪ ،‬ويعد اأحد متطلبات التخرج؛ مما ي�س��اعد‬ ‫ً‬ ‫ العمل التطوعي امل�سمم للطلبة‬
‫على تعزيز القيم االإن�سانية‪ ،‬وبناء املجتمع وتنميته ومتا�سكه‪.‬‬
‫ التج�سر الذي مُيكن الطلبة من االنتقال من م�سار اإىل اآخر وفق اآليات حمددة‪.‬‬
‫ ح�س���ص االإتق��ان الت��ي يت��م م��ن خالله��ا تطوي��ر امله��ارات وحت�س��ني امل�س��توى التح�سيل��ي‪ ،‬م��ن خالل تق��دمي ح�س�ص اإتق��ان اإثرائية‬
‫وعالجية‪.‬‬
‫ خيارات التعليم املدمج‪ ،‬والتعلم عن بعد‪ ،‬والذي بُني يف نظام امل�سارات على اأ�س�ص من املرونة‪ ،‬واملالءمة والتفاعل والفعالية‪.‬‬
‫ م�سروع التخرج الذي ي�ساعد الطلبة على دمج اخلربات النظرية مع املمار�سات التطبيقية‪.‬‬
‫مهام حمددة‪ ،‬واختبارات معينة بال�سراكة مع جهات تخ�س�سية‪.‬‬ ‫ �سهادات مهنية ومهارية متنح للطلبة بعد اإجنازهم َّ‬
‫وبالتايل فاإن م�س ��ار عل ��وم احلا�س ��ب والهند�س ��ة كاأحد امل�س ��ارات امل�س ��تحدثة ف ��ي املرحلة الثانوي ��ة ي�س ��هم يف حتقي ��ق اأف�سل‬
‫املمار�سات عرب اال�ستثمار يف راأ�ص املال الب�س ��ري‪ ،‬وحتوي ��ل الطالب إال ��ى فرد م�س ��ارك ومنت ��ج للعل ��وم واملعارف‪ ،‬مع اإك�س ��ابه امله ��ارات‬
‫واخلربات الالزمة ال�ستكمال درا�س ��ته يف تخ�س�س ��ات تتنا�س ��ب مع ميول ��ه وقدراته اأو االلتحاق ب�س ��وق العم ��ل‪.‬‬
‫وتعد مادة الذكاء اال�سطناعي اأحد املواد الرئي�س��ة يف م�س��ار علوم احلا�س��ب والهند�س��ة‪ ،‬حيث ت�س��هم يف تو�سيح مفاهيم الذكاء‬
‫اال�سطناعي والتقنيات املرتبطة بها مبا ي�ساعد على توظيف هذه التقنيات يف عدة جماالت حياتية مثل املدن الذكية والتعليم والزراعة‬
‫والطب وغرها من املجاالت االقت�سادية املتنوعة‪ .‬وتهدف املادة اإىل تعريف الطالب باأهمية الذكاء اال�سطناعي ودوره يف اجَليل الرابع‬
‫من ال�سناعة‪ .‬وكذلك تركز على اللبنات االأ�سا�سية لتقنيات الذكاء اال�سطناعي‪ ،‬ثم تتع َّر�ص ب�سكل تف�سيلي للتطبيقات املتقدمة التي‬
‫تتعلق باالأنظمة القائمة على القواعد واأنظمة معاجَلة اللغات الطبيعية‪ .‬كما ت�ستمل هذه املادة على م�ساريع ومتارين تطبيقية ملا يتعلمه‬
‫الطالب؛ حلل م�ساكل واقعية حتاكي م�ستوياته املعرفية‪ ،‬بتوجيه واإ�سراف من املعلم‪.‬‬
‫ويتمي��ز كت��اب ال��ذكاء اال�سطناع��ي باأ�س��اليب حديث��ة‪ ،‬تتواف��ر في��ه عنا�س��ر اجَل��ذب والت�س��ويق‪ ،‬والت��ي جتع��ل الطلب��ة يقبل��ون عل��ى‬
‫تعلم��ه والتفاع��ل مع��ه‪ ،‬م��ن خ��الل م��ا يقدم��ه م��ن تدريب��ات واأن�س��طة متنوع��ة‪ ،‬كم��ا يوؤك��د ه��ذا الكت��اب على جوان��ب مهمة يف تعلي��م الذكاء‬
‫اال�سطناع��ي وتعلم��ه‪ ،‬تتمث��ل يف‪:‬‬
‫ الرتابط الوثيق بني املحتويات واملواقف وامل�سكالت احلياتية‪.‬‬
‫ تنوع طرائق عر�ص املحتوى ب�سورة جذابة وم�سوقة‪.‬‬
‫ اإبراز دور املتعلم يف عمليات التعليم والتعلم‪.‬‬
‫ً‬
‫متكامال‪.‬‬ ‫ االهتمام برتابط حمتوياته مما يجعل منه ًّ‬
‫كال‬
‫ االهتمام بتوظيف التقنيات املنا�سبة يف املواقف املختلفة‪.‬‬
‫ االهتمام بتوظيف اأ�ساليب متنوعة يف تقومي الطلبة مبا يتنا�سب مع الفروق الفردية بينهم‪.‬‬
‫وملواكب��ة التط��ورات العاملي��ة يف ه��ذا املج��ال‪ ،‬ف�اإن كت��اب م��ادة ال��ذكاء اال�سطناع��ي �س��وف يوفر للمعلم جمموع��ة متكاملة من املواد‬
‫التعليمية املتنوعة التي تراعي الفروق الفردية بني الطلبة‪ ،‬باالإ�سافة اإىل الربجميات واملواقع التعليمية‪ ،‬التي توفر للطلبة فر�سة توظيف‬
‫التقنيات احلديثة والتوا�سل املبني على املمار�سة؛ مما يوؤكد دوره يف عملية التعليم والتعلم‪.‬‬

‫ونح��ن اإذ نق��دم ه��ذا الكت��اب الأعزائن��ا الطلب��ة‪ ،‬ناأم��ل اأن ي�س��تحوذ عل��ى اهتمامه��م‪ ،‬ويُلب��ي متطلباته��م‪ ،‬ويجع��ل تع ّلمه��م له��ذه امل��ادة اأكرث‬
‫متعة وفائدة‪.‬‬

‫وا ويل التوفيق‬


‫الفهر�ص‬
‫الج ء الثاني‬ ‫الج ء األأول‬
‫التعرف على ال�سور ‪196 ..................‬‬
‫ّ‬ ‫‪.4‬‬ ‫‪10 ........‬‬ ‫‪ .1‬اأ�سا�سيات الذكاء األ�سطناعي‬
‫الدر�س اإلأول‬ ‫الدر�س اإلأول‬
‫التعلُّم الموجَّ ه لتحليل ال�ضور‪197 .............................‬‬ ‫مقدمة في الذكاء اإل�ضطناعي‪11 ............................‬‬
‫تمرينات‪21 .....................................................‬‬
‫تمرينات‪218 .....................................................‬‬
‫الدر�س الثاني‬
‫الدر�س الثاني‬ ‫هياكل البيانات في الذكاء اإل�ضطناعي ‪23 .................‬‬
‫التعلُّم غير الموجَّ ه لتحليل ال�ضور‪220 ........................‬‬ ‫تمرينات ‪50 ..............................................‬‬
‫تمرينات‪234 .....................................................‬‬
‫الدر�س الثالث‬
‫الدر�س الثالث‬ ‫هياكل البيانات غير الخطيَّة ‪53 ...........................‬‬
‫توليد البيانات المرئية ‪236 ....................................‬‬ ‫تمرينات ‪63 ..............................................‬‬
‫تمرينات‪246 .....................................................‬‬ ‫الم�ضرو ‪68 ..............................................‬‬

‫اجل ء األأول‬ ‫الم�ضرو ‪248 ....................................................‬‬


‫خوارزميات الذكاء األ�سطناعي‪70 .......‬‬ ‫‪.2‬‬
‫خوارزميات التح�سين واتخاذ القرار‪250 ...‬‬ ‫‪.5‬‬ ‫الدر�س اإلأول‬
‫الوحدة األأوىل‬ ‫الدر�س اإلأول‬ ‫اإل�ضتدعاء الذاتي ‪71 .....................................‬‬
‫تمرينات ‪77 ..............................................‬‬
‫اأ�سا�سيات الذكاء اال�سطناعي‬ ‫م�ضكلة تخ�ضي�س الموارد ‪251 ..................................‬‬
‫تمرينات‪264 .....................................................‬‬ ‫الدر�س الثاني‬
‫الوحدة الثانية‬ ‫الدر�س الثاني‬
‫خوارزمية البحث باأولوية العمق‬
‫والبحث باأولوية اإلت�ضا ‪79 ...............................‬‬
‫خوارزميات الذكاء اال�سطناعي‬ ‫م�ضكلة جدولة الموارد ‪267 .....................................‬‬ ‫تمرينات ‪86 ..............................................‬‬
‫تمرينات‪279 .....................................................‬‬ ‫الدر�س الثالث‬
‫الوحدة الثالثة‬ ‫اتخاذ القرار القائم على القواعد ‪89 ........................‬‬
‫معاجَلة اللغات الطبيعية‬ ‫الدر�س الثالث‬ ‫تمرينات ‪105 ..............................................‬‬
‫م�ضكلة تح�ضين الم�ضار‪283 .....................................‬‬
‫تمرينات‪294 .....................................................‬‬
‫الدر�س الرابع‬
‫خوارزميات البحث الم�ضتنيرة ‪107 ...........................‬‬
‫الم�ضرو ‪298 ....................................................‬‬
‫تمرينات ‪128 ..............................................‬‬
‫الم�ضرو ‪130 ..............................................‬‬
‫‪300 .......‬‬ ‫‪ .6‬الذكاء األ�سطناعي والمجتمع‬
‫الدر�س اإلأول‬ ‫‪132 ............‬‬ ‫‪ .3‬معالجة اللغات الطبيعية‬
‫مقدمة في اأخاًلقيات الذكاء اإل�ضطناعي ‪301 ................‬‬ ‫الدر�س اإلأول‬
‫تمرينات‪310 .....................................................‬‬ ‫التعلُّم الموجَّ ه ‪133 ........................................‬‬
‫الدر�س الثاني‬ ‫تمرينات ‪152 ..............................................‬‬
‫التطبيقات الروبوتية ‪312 .................................... 1‬‬ ‫الدر�س الثاني‬
‫التعلُّم غير الموجَّ ه ‪154 ....................................‬‬
‫تمرينات‪326 .....................................................‬‬
‫تمرينات ‪170 ..............................................‬‬
‫الدر�س الثالث‬ ‫الدر�س الثالث‬
‫التطبيقات الروبوتية ‪328 .................................... 2‬‬ ‫توليد الن�س ‪172 ..........................................‬‬
‫تمرينات‪336 .....................................................‬‬ ‫تمرينات ‪189 ..............................................‬‬
‫الم�ضرو ‪338 ..............................................‬‬ ‫الم�ضرو ‪192 ..............................................‬‬
‫مقدمة يف الذكاء األ�سطناعي‬
‫الدر�ص األأول‬
‫‪ .1‬اأ�سا�س��يات الذكاء األ�سطناعي‬
‫�سيتعرّ ف الطالب يف هذه الوحدة على تاري الذكاء األ�سطناعي (‪) rti cial ntelli ence - AI‬‬
‫وتطبيقات� ‪ .‬كم��ا �س��يتعلّم امل ي��د ح��ول هي��اكل البيان��ات املتقدم��ة‪ ،‬مث��ل الطواب��ري‪ ،‬واملُكدّ �س��ات‪،‬‬
‫ما الذكاء األ�سطناعي‬ ‫والقوائم املرتابطة‪ ،‬واملُخططات‪ ،‬واألأ س��جار الثنائية‪ ،‬و�سيَ�س��تخدِ م هذه الرتاكيب ألحقًا ألإن�ساء‬
‫وكالء الذكاء األ�سطناعي‬
‫م�ساريع الذكاء األ�سطناعي‪.‬‬
‫(‪:)AI a ents‬‬ ‫(‪hat is rti cial ntelli ence )AI‬‬
‫وكي��ل ال��ذكاء اال�سطناع��ي ه��و‬ ‫ال��ذكاء اإل�ضطناع��ي (‪ )AI‬ه��و اأح��د جم��االت عل��وم احلا�س��ب االآيل الت��ي تُعن��ى‬
‫برنام��ج يعم��ل نياب� ًة ع��ن املُ�س��تخدِ م‬ ‫بت�سمي��م وتطبي��ق الربام��ج القادرة على حماكاة القدرات املعرفية الب�س��رية‪ .‬تُظهِ ر‬
‫اأو النظ��ام يف اإدراك بيئت��ه‪ ،‬و�سن��ع‬
‫الق��رارات‪ ،‬واتخ��اذ االإجراءات وفقًا‬
‫هذه الربامج اخل�سائ�ص التي ت َِ�سف ال�س��لوك الب�س��ري عادةً‪ ،‬مثل حل امل�س��كالت‪،‬‬
‫والتعلُّم‪ ،‬و�سنع القرارات‪ ،‬واال�ستدالل‪ ،‬والتخطيط‪ ،‬واتخاذ القرارات‪ ،‬اإلخ‪.‬‬
‫اأهداف التعلُّم‬
‫له��ا‪ ،‬وق��د يك��ون الوكي��ل ب�س��يطً ا اأو‬ ‫بنهاية هذه الوحدة �سيكون الطالب قادرًا على اأن‪:‬‬
‫ُمعق� ً�دا‪ ،‬ذات��ي التح ّك��م اأو �س��به ذاتي‬
‫التح ّك��م‪ ،‬اأو يعم��ل يف بيئات متنوعة‪،‬‬ ‫ يَذكُ ر معامل تاري الذكاء األ�سطناعي (‪.)AI‬‬
‫مثل املُ�س��تندة اإىل الويب‪ ،‬اأو املاديّة‪،‬‬ ‫ ُيعَدِّ د اأمثلة لتطبيقات الذكاء األ�سطناعي (‪.)AI‬‬
‫اأو االفرتا�س ّية‪.‬‬
‫وكاًلء الذكاء‬ ‫ ي َِ�سف عمليات هيكل بيانات املُكدّ �ص‪.‬‬
‫اإل�ضطناعي‬ ‫ ي َِ�سف عمليات هيكل بيانات الطابور‪.‬‬
‫ال�سبكات الع�سبية‬ ‫التعلُّم‬ ‫ال�ضبكات‬ ‫ يُحدِّ د األختال ات بني هيكل بيانات املُكدّ �ص وهيكل بيانات الطابور‪.‬‬
‫(‪:) eural net or s‬‬ ‫العميق‬ ‫الع�ضبية‬
‫ ي َِ�سف العمليات الرئي�سة املُطبقة على البيانات يف القائمة املرتابطة‪.‬‬
‫ال�س��بكات الع�سبي��ة ه��ي ن��وع م��ن‬
‫برام��ج احلا�س��ب املُ�س َّمم��ة ملح��اكاة‬ ‫ يَ�سر ا�ستخدام هيكل بيانات ال�سجرة‪.‬‬
‫طريق��ة عم��ل الدم��ا الب�س��ري‪ .‬وهي‬ ‫الذكاء‬ ‫ يُحدِّ د األختال ات بني هيكل بيانات ال�سجرة وهيكل بيانات املُخطط‪.‬‬
‫مكون��ة م��ن خالي��ا وطبق��ات ع�سبية‬ ‫اإل�ضطناعي‬
‫مُيكنها معاجَلة املعلومات ونقلها‪.‬‬ ‫معاجلة اللغات‬ ‫روؤية‬ ‫ يَ�ستخدِ م لغة برجمة البايثون (‪ )Python‬أل�ستك�ساف هياكل البيانات املُعقدة‪.‬‬
‫الطبيعية‬ ‫احلا�ضب‬

‫تعلُّم‬ ‫الروبوتية‬
‫اإلآلة‬ ‫األأدوات‬
‫ مفكرة جوبيرت (‪)Jupyter Notebook‬‬
‫�سكل ‪ :1.1‬بع�ص جماالت الذكاء اال�سطناعي‬

‫‪11‬‬ ‫‪10‬‬
‫‪urin‬‬ ‫‪est‬‬ ‫اختبار تورن‬ ‫‪AI and Other Fields‬‬ ‫الذكاء األ�سطناعي واملجاألت األأخر‬
‫اختبار تورن (‪:) urin est‬‬ ‫ق��د يك��ون اختب��ار تورن��غ ه��و الطريق��ة االأك��رث �س��هرة لتعري��ف ال��ذكاء اال�سطناع��ي‪ ،‬ويع��ود‬ ‫يرتبط الذكاء اإل�ضطناعي (‪ )AI‬ارتباطً ا وثيق ال�سلة بعدة جماالت اأخرى ت�سمل‪:‬‬
‫تاري��خ اقرتاح��ه اإىل ع��ام ‪ ،1950‬حي��ث اأج��رى الع��امل تورن��غ جترب��ة ملعرِ ف��ة م��ا اإذا كان‬ ‫الفل�ض��فة (‪ :)Philosophy‬هي اأ�سل العلوم احلديثة‪ ،‬وتُعنى بدرا�س��ة امل�س��كالت التي متثّل اأ�س���ص الذكاء اال�سطناعي‪،‬‬
‫يقي���ص اختب��ار تورن��غ ق��درة االآل��ة عل��ى‬ ‫احلا�سب ذكيًا اأم ال‪.‬‬
‫اإظه��ار �س��لوك ذك��ي مكاف��ئ ل�س��لوك‬ ‫مث��ل اأ�س��ل ِ‬
‫املعرف��ة ومتثيله��ا‪ ،‬واال�س��تدالل املُ�س��تنِد اإىل القواع��د واملنط��ق‪ ،‬والتحلي��ل القائ��م عل��ى االأه��داف‪ ،‬وال�سل��ة ب��ني‬
‫االإن�سان اأو غر قابل للتمييز عنه‪.‬‬ ‫واأثناء االختبار ‪ ،‬يتوجب على احلا�س��ب اأن يجيب عن بع�ص االأ�س��ئلة املكتوبة التي يقدمها‬ ‫والت�سرف‪.‬‬
‫ُّ‬ ‫املعرِ فة‬
‫امل ُوجِّ ��ه الب�ض��ري (‪ .)Human Respondent‬يعت��رب االختب��ار ناجحً ��ا اإذا مل يتمك��ن‬ ‫الريا�ضي��ات (‪ :)Mathematics‬ه��ي جوه��ر ال��ذكاء اال�سطناع��ي‪ ،‬حي��ث تُقدم له لبِنات البناء االأ�سا�س��ية مثل‪ :‬املنطق‪،‬‬
‫ُوجه من معرفة ما اإذا كانت االإجابة مكتوبة بوا�سطة اإن�سان اأم بوا�سطة احلا�سب‪.‬‬ ‫امل ِّ‬ ‫واحلو�سبة‪ ،‬ونظرية االحتماالت‪.‬‬
‫الجتياز االختبار بنجاح‪ ،‬يجب اأن يتمتع احلا�سب باالإمكانات املو�سحة يف اجَلدول التايل‪:‬‬ ‫نظري��ة الق��رار (‪ :)Decision Theory‬تُعن��ى بدرا�س��ة اخل�سائ���ص املنطقي��ة والريا�سي��ة لعملي��ة �سن��ع الق��رار‪ ،‬حي��ث‬
‫حت ّل��ل عمل ّي��ة اتخ��اذ الق��رارات يف نظ��ام تك��ون في��ه بيئ��ة الق��رار غ��ر وا�سح��ة‪ ،‬وتُط َّب��ق االأُطُ ر واالأ�س��اليب النظري��ة يف هذا‬
‫احلا�ضب امل ُجيب‬ ‫املجال با�ستمرار حل ّل م�سكالت الذكاء اال�سطناعي‪.‬‬
‫عل��م اإلأع�ض��اب (‪ُ :)Neuroscience‬يعن��ى بدرا�س��ة اجَله��از الع�سب��ي الب�س��ري‪ ،‬وق��د تو�س��ل عل��م االأع�س��اب اإىل نتيج��ة‬
‫اإلإن�ضان امل ُجيب‬ ‫رئي�س��ة عمل��ت كمب��داأ اإر�س��ادي لل��ذكاء اال�سطناع��ي‪ ،‬وه��ي اأن جمموع��ة م��ن اخلالي��ا الب�س��يطة مُيك��ن اأن ت�وؤدي اإىل نتائ��ج‬
‫ُمعق��دة مث��ل‪ :‬الفك��ر‪ ،‬والعم��ل‪ ،‬والوع��ي‪ .‬كم��ا اأن ال�س��بكات الع�سبي��ة اال�سطناعي��ة ُحتاك��ي البُني��ات الع�سبي��ة املوج��ودة يف‬
‫الدما الب�سري‪.‬‬
‫عل��م النف���س املع��ريف (‪ :)Cognitive Psychology‬ه��و اأح��د ف��روع عل��م النف���ص‪ ،‬ويُعن��ى بدرا�س��ة طريق��ة تفك��ر الب�س��ر‪.‬‬
‫امل ُوجِّ ه الب�ضري‬ ‫ولطامل��ا كان الف�س��ل يف حتقي��ق االجن��ازات والتق�دّم يف جمال الذكاء ال�سناعي راجعًا اإىل االكت�س��افات التي ّمت حتقيقها‬
‫يف هذا املجال‪ ،‬والتي �ساعدت على توفر الروؤى التي ت�ساعد اأجهزة احلا�سب على حماكاة التفكر الب�سري‪.‬‬
‫عل��وم احلا�ض��ب والهند�ض��ة (‪ :)Computer Science and Engineering‬تعت��رب عل��وم احلا�س��ب والهند�س��ة حج��ر‬
‫االأ�سا���ص لتوف��ر الربجمي��ات واالأجه��زة الالزم��ة لل��ذكاء اال�سطناع��ي لالنتق��ال م��ن املب��اد النظري��ة اإىل التطبيق��ات‬
‫العملية‪ .‬وقد واكَب التقدم يف الذكاء اال�سطناعي با�ستمرار التطورات يف اأنظمة الت�سغيل‪ ،‬والربجمة‪ ،‬واللغات‪ ،‬وال�سعة‬
‫التخزينية‪ ،‬والذاكرة‪ ،‬وقوة ُمعاجَلة البيانات‪.‬‬
‫علم التحكم اإلآيل (‪ُ :)Cybernetics‬يعنى بدرا�س��ة االأنظمة التي حتقق احلالة املرجوة با�س��تالم املعلومات من بيئتها‬
‫وتعدي��ل �س��لوكها وف ًق��ا لذل��ك‪ .‬الف��رق الرئي���ص ب��ني عل��م التح ّك��م االآيل وب��ني ال��ذكاء اال�سطناع� ّ�ي ه��و اأن االأول ي�س��تخدم‬
‫الريا�سي��ات لنمذج��ة االأنظم��ة املُغلق��ة الت��ي مُيك��ن و�سفه��ا بالكامل با�س��تخدام متغرات ُحم� َّددة‪ ،‬بينما ي�س��تخدم الذكاء‬
‫اال�سطناعي اال�ستدالل املنطقي واحلو�سبة للتغلب على هذه القيود ودرا�سة امل�سكالت املُعقَّدة مثل‪ :‬فهم اللغة واملعلومات‬
‫املرئية وتوليدهما‪.‬‬
‫عل��م اللُغوي��ات (‪ :)Linguistics‬ه��و الدرا�س��ة العلمي��ة للغ��ة الب�س��رية‪ ،‬فلطامل��ا كان فه��م اللغ��ة الب�س��ريّة وتوليده��ا جم� ً�اال‬
‫رئي�سً ��ا يف تطبيق��ات ال��ذكاء اال�سطناع��ي‪ ،‬كم��ا اأدى اإىل ن�س��وء حق��ول فرعي��ة مث��ل‪ :‬معاجل��ة اللغ��ات الطبيعي��ة‬
‫(‪ )Natural Language Processing - NLP‬واللغويات احلا�ضوبية (‪.)Computational Linguistics‬‬
‫عل��م الروؤي��ة (‪ :)Vision Science‬ه��و الدرا�س��ة العلمي��ة ل�الإدراك الب�س��ري‪ .‬و ُيع� ّد تعلي��م اأجه��زة احلا�س��ب كيفي��ة فه��م‬
‫املُجيب اإلأول‬ ‫ال�س��ور‪ ،‬والر�س��وم املتحرك��ة‪ ،‬ومقاط��ع الفيدي��و وتوليده��ا اأح��د اأك� ِرث تطبيق��ات ال��ذكاء اال�سطناع��ي اإث��ارة‪ ،‬وحتدي��دً ا يف‬
‫املُجيب الثاين‬ ‫املجاالت الفرعية للتعلُّم العميق وروؤية احلا�سب‪.‬‬
‫معلومة‬
‫ا�ضتُخدِ م م�ضطل الذكاء اإل�ضطناعي ر�ضميًا للمرة اإلأوىل يف عام ‪ ,1956‬ا يجعله اأحد اأحدث املجاإلت العلمية ن�ضبيًا‪.‬‬

‫�سكل ‪ :1.2‬متثيل اختبار تورنغ‬


‫‪13‬‬ ‫‪12‬‬
‫الذكاء األ�سطناعي‪ :‬تاري ُ تد لت�سعة عقود‬ ‫جدول  ‪ :1.1‬اإمكانات احلا�سب ألجتياز اختبار تورن‬
‫‪rti cial ntelli ence: 9 ecades of History‬‬
‫بالرغ��م م��ن اأن عم��ر ال��ذكاء اال�سطناع��ي ال يتج��اوز ‪ 100‬ع��ام‪ ،‬اإال اأن��ه يتمتع بتاريخ غني َمُيتد منذ االأربعيني��ات من القرن املا�سي حتى‬ ‫معاجَلة اللغات الطبيعية؛ لتمكني احلا�سب من فهم االأ�سئلة والرد عليها‪.‬‬ ‫‪1‬‬
‫اليوم‪ .‬وفيما يلي ا�ستعرا�ص لالإجنازات البارزة يف جمال الذكاء اال�سطناعي يف كل ِعقد‪.‬‬

‫‪ :1987-1993‬تُعرف هذه الفرتة با�س��م ثاين �س��تاء للذكاء اال�سطناعي‪.‬‬ ‫اإلأربعينيات‪ :‬البداية واأول خلية ع�ضبية ا�ضطناعية‬ ‫متثيل املعرفة لتنظيم املعلومات وتخزينها وا�سرتجاعها خالل اأداء االختبار‪.‬‬ ‫‪2‬‬
‫‪ُ :1943‬اق��رتح النم��وذج االأول املبن��ي عل��ى اخلالي��ا الع�سبي��ة اال�سطناعي��ة فطبيع��ة اأنظم��ة ال��ذكاء اال�سطناع��ي يف املراحل املُبكرة كانت م�س��تندة على‬
‫بحي��ث مُيك��ن ل��كل خلي��ة ع�سبي��ة اأن تك��ون يف حال��ة ن�س��طة (ت�س��غيل) اأو غ��ر القواع��د‪ ،‬والت��ي بدوره��ا قي��دت م��ن قابليته��ا للتطبي��ق وجعلته��ا غ��ر ق��ادرة‬
‫ن�س��طة (اإيق��اف) وذل��ك وف��ق املح��اكاة الت��ي تتلقاه��ا م��ن اخلالي��ا الع�سبي��ة على حل م�ساكل احلياة الواقعية الرئي�سة‪.‬‬ ‫اال�ستدالل املُوؤمتت؛ ال�ستخدام املعلومات املُخزَّنة لالإجابة عن االأ�سئلة‪.‬‬ ‫‪3‬‬
‫االأخرى املجاورة واملت�سلة بها‪.‬‬
‫‪ :1997‬حتق��ق الف��وز االأول لربنام��ج ال��ذكاء اال�سطناع��ي عل��ى بط��ل العامل‬
‫‪ :1948‬يف ه��ذا الع��ام ظه��ر روبوت��ان‪ :‬اإمل��ر واإل�ض��ي (‪ )Elmer and Elsie‬يف ال�س��طر ‪ ،‬حيث جنح احلا�س��ب العمالق ديب بلو (‪ )Deep Blue‬يف‬ ‫تعلُّ��م االآل��ة للتك ّي��ف م��ع هي��اكل اللغ��ات اجَلدي��دة مث��ل‪ :‬بن��اء جُ م��ل خُمتلف��ة‪ ،‬اأو اإيجاد مف��ردات لغوي��ة خُمتلفة‪،‬‬ ‫‪4‬‬
‫وهم��ا روبوت��ان ذاتي��ا التح ُّك��م‪ ،‬مُيكنهم��ا التنق��ل ح��ول العقب��ات با�س��تخدام هزمُية بطل العامل يف ال�سطر جاري كا�ضبارو (‪.)Gary Kasparov‬‬ ‫مل يرها من قبل‪ ،‬اأو لي�ست خُمزّنة �سمن املعلومات‪.‬‬
‫اإلألفيني��ات‪ :‬ف��رتة اإلنت�ض��ار وا�ض��ع ال ّنط��اق‪ ,‬والدع��م الكب��ري للمك ّون��ات‬ ‫ال�سوء واللم�ص‪.‬‬
‫املادية والربجمية‪ ,‬وتطورها‬ ‫خم�ضينات القرن املا�ضي‪ :‬ن�ضاأة الذكاء اإل�ضطناعي‬
‫‪ :1950‬ظهر اختبار تورنغ وهو اختبار يحدِّ د قدرة االآلة على اإظهار �سلوك ‪ :2005‬ط � َّورت جامع��ة �ض��تانفورد (‪ )Stanford University‬ال�س��يارة‬
‫روؤي��ة احلا�س��ب؛ حت��ى يتمك��ن م��ن اال�س��تجابة لالإ�س��ارات الب�سري��ة الت��ي يتلقّاها م��ن املُوجِّ ه عرب و�س��ائط نقل‬ ‫‪5‬‬
‫ذكي مكافئ ل�سلوك االإن�سان اأو َي�س ُعب متييزه عنه‪ .‬اإىل جانب ظهور العديد ذاتية القيادة �ض��تانلي (‪ )STANLEY‬التي فازت يف حتدي ال�س��يارات ذاتية‬ ‫ال�سور والفيديو‪.‬‬
‫م��ن مفاهي��م ال��ذكاء اال�سطناع��ي الرئي�س��ة مث��ل تعلُّ��م ا آالل��ة‪ ،‬واخلوارزميات القيادة‪ .‬كما بداأ اجَلي�ص االأمريكي اال�ستثمار يف الروبوتات ذاتية التحكّم‪.‬‬
‫اجَلينية‪ ،‬والتعلُّم املعزَّز‪.‬‬
‫‪ :2009‬ا�ستُخدمت وحدات معاجلة الر�ضومات‬ ‫الروبوتية؛ حتّى يتمكّن من ا�ستقبال االأ�سياء التي يتلقّاها من املُوجِّ ه عرب املنفذ ويعاجَلها‪.‬‬ ‫‪6‬‬
‫( ‪ )Graphics Processing Units - GPUs‬لتدري��ب ال�س��بكات‬ ‫�وائي‬ ‫�‬‫ض‬ ‫الع�‬ ‫�ي‬ ‫�‬ ‫ب‬ ‫الع�ض‬ ‫�ري‬ ‫�‬ ‫ظ‬ ‫التنا‬ ‫�ز‬ ‫�‬ ‫ي‬ ‫التعز‬ ‫�ب‬ ‫�‬ ‫‪�ُ :1951‬سم��م حا�ض‬
‫(‪ )Stochastic Neural Analog Reinforcement Computer-SNARC‬الع�سبي��ة للتعلُّ��م العمي��ق للم��رة االأوىل‪ .‬اأدى ا�س��تخدام املكون��ات املادي��ة‬
‫املتخ�س�س��ة اإىل ت�س��ارع وت��رة تدري��ب ال�س��بكات املُع َّق��دة عل��ى جمموع��ات‬ ‫كاأول حا�سب يعمل بال�سبكات الع�سبية‪.‬‬
‫خ�سي�س��ا كب��رة ج��دً ا م��ن البيان��ات‪ ،‬مم��ا اأدى ب��دوره اإىل ع�س��رٍ جدي��د م��ن التعلُّ��م‬ ‫تغط ���ي االإمكان ���ات املو�سح ���ة باالأعل ���ى ج ���زءًا كب ��رًا م ���ن جم ���ال ال ���ذكاء اال�سطناع ���ي الوا�س ���ع‪� .‬سن�س ���تعر�ص ه ���ذه‬
‫ً‬ ‫‪ :1958‬طُ ��ورت لغ��ة لي�ض��ب (‪ ،)Lisp‬وه��ي لغ��ة برجم��ة ُم�س َّمم��ة‬ ‫االإمكانات فيما يلي‪:‬‬
‫لل��ذكاء اال�سطناع��ي‪ .‬ويف الع��ام نف�س��ه‪ُ ،‬ن�س��رت ورق��ة بحثي��ة ح��ول متلق��ي العميق والذكاء اال�سطناعي‪.‬‬
‫امل�ض��ورة اإلفرتا�ض��ي (‪ ،)Hypothetical Advice Taker‬وه��و نظ��ام العِقدي��ن الث��اين والثال��ث م��ن الق��رن احل��ادي والع�ض��رين‪ :‬الع�ض��ر‬ ‫معاجل��ة اللغ��ات الطبيعي��ة (‪ )NLP‬ه��و اأح��د ف��روع ال��ذكاء اال�سطناع��ي ال��ذي َمُين��ح اأجه��زة احلا�س��ب الق��درة عل��ى فهم‬
‫الذهبي‬ ‫الذكاء اال�سطناعي القادر على التعلُّم من التجربة متامً ا مثل الب�سر‪.‬‬ ‫االإن�سان واللغة الطبيعية‪.‬‬
‫ال�ض��تينيات وال�ض��بعينيات م��ن الق��رن املا�ض��ي‪ :‬اأول �ض��تاء لل��ذكاء ‪ :2011‬ه��زم نظ��ام االإجاب��ة عل��ى االأ�س��ئلة املع��روف با�س��م وات�ض��ون‬ ‫ثي��ل املع ِرف��ة (‪ )Knowledge Representation‬يف ال��ذكاء اال�سطناع��ي ي�س��ر اإىل عملي��ة ترمي��ز املعرفة الب�س��رية‬
‫(‪ )Watson‬اأف�س��ل العب��ني يف الع��امل يف برنام��ج امل�س��ابقات االأمرك��ي‬ ‫اإل�ضطناعي‬ ‫يف �س��كل مق��روء اآل ًي��ا لتتمك��ن االأنظم��ة املُ�س��تنِدة اإىل ال��ذكاء اال�سطناع��ي م��ن معاجَلتها وا�س��تخدامها‪ .‬تاأتي ه��ذه املعرِ فة‬
‫‪ :1964‬ظه��ر برنام��ج اإلي��زا (‪ )ELIZA‬وه��و اأول برنام��ج ملعاجَل��ة اللغ��ات جيوباردي (‪ ،)Jeopardy‬حيث متكّن وات�س��ون من فهم االأ�س��ئلة واالإجابة‬ ‫يف �سو ٍر عدة ت�سمل‪ :‬احلقائق‪ ،‬والقواعد‪ ،‬واملفاهيم‪ ،‬والعالقات‪ ،‬والعمليات‪.‬‬
‫عليه��ا بنج��اح‪ ،‬مم��ا �س �كّل طف��رة يف ا�س��تخدام ال��ذكاء اال�سطناع��ي ِلفه��م‬ ‫تفرع منه جميع روبوتات الدرد�سة اليوم‪.‬‬ ‫الطبيعية وهي االأ�سل الذي ّ‬
‫اللغة الطبيعية‪.‬‬ ‫اإل�ض��تدإلل املُوؤ ��ت (‪ )Automated Reasoning‬يُ�س��ر اإىل ق��درة االأنظم��ة املُ�س��ت ِندة اإىل ال��ذكاء اال�سطناع��ي عل��ى‬
‫‪ُ :1974-1980‬تع�رف ه�ذه الف�رتة با�س�م اأول �س�تاء لل�ذكاء اال�سطناع�ي‪.‬‬ ‫ا�ستنتاج املعرفة اجَلديدة وتقدمي اال�ستنتاجات املنطقية وفقًا ملجموعة من القواعد والفر�سيات املُقدَ مة‪.‬‬
‫حي�ث انخف��ص متوي�ل م�س�روعات ال�ذكاء اال�سطناع�ي يف ه�ذه الف�رتة نظ ًرا ‪ :2012‬ظه��ر نظ��ام ال��ذكاء اال�سطناع��ي ال��ذي ُيرتجِ ��م فور ًي��ا اللغ��ة‬
‫لقل�ة التق�دم املُح�رز يف ه�ذا املج�ال‪ ،‬وانخفا��ص تاأث�ره يف تطبيق�ات احلي�اة االإجنليزية املنطوقة اإىل اللغة ال�سينية املنطوقة‪.‬‬ ‫روؤية احلا�ضب (‪ )Computer Vision‬هي جمال الذكاء اال�سطناعي الذي ُمُيكِّن احلا�سب من تف�سر وفهم املعلومات‬
‫املرئية من العامل احلقيقي‪ ،‬مثل ال�سور ومقاطع الفيديو‪.‬‬
‫اليومية‪ .‬اأحد االنتقادات الرئي�سة كانت عدم قدرة تقنيات الذكاء اال�سطناعي ‪ :2021‬ظه��ر نظ��ام القي��ادة الذاتي��ة الكام��ل ال��ذي يَ�س��تخدِ م ال�س��بكات‬
‫على معاجَلة م�س�كلة االنفجار التوافقي التي جعلت قابلية تطبيقها حمدودة الع�سبية املُدرَّبة على �سلوك مئات االآالف من ال�سائقني‪.‬‬ ‫الروبوتي��ة (‪ )Robotics‬ه��ي ف��رع ال��ذكاء اال�سطناع��ي ال��ذي ُيعن��ى بت�سمي��م الروب��وت‪ ،‬وبنائه‪ ،‬وا�س��تخدامه‪ .‬ويت�سمن‬
‫على بع�ص امل�سكالت وجمموعات البيانات ال�سغرة للغاية‪.‬‬ ‫اجَلم��ع ب��ني التقني��ات املتنوع��ة مث��ل‪ :‬تعلُّ��م االآل��ة‪ ،‬وروؤي��ة احلا�س��ب‪ ،‬واأنظم��ة التح ّك��م البت��كار اآالت ذكي��ة ذاتي��ة التح ُّك��م اأو‬
‫الثمانيني��ات والت�ض��عينيات م��ن الق��رن املا�ض��ي وث��اين �ض��تاء لل��ذكاء ‪ :2022‬ظه��ر روب��وت درد�ض��ة (املُح �وِّل التولي��دي مُ�ض��بق التدري��ب)‬ ‫تتطلب احلد االأدنى من التوجيه الب�سري‪.‬‬
‫(‪ )Generative Pre-trained Transformer - ChatGPT‬وه��و‬ ‫اإل�ضطناعي‬
‫روب��وت الدرد�س��ة املبن��ي عل��ى جمموع��ة كب��رة م��ن النم��اذج اللغوي��ة‪ .‬ه��ذه‬
‫‪ :1980‬اُطل��ق اأول نظ��ام خب��ر جت��اري ناج��ح ُم�س َّم��م ملح��اكاة الق��درة على النماذج ُمهيئَّة بدقة با�ستخدام كلٍ من تقنيات التعلّم املُوجّ ه واملُعزّز ملحاكاة‬
‫املحادثات الب�سرية‪.‬‬ ‫ُ�سنع القرار مثل االإن�سان‪.‬‬
‫‪15‬‬ ‫‪14‬‬
‫اإنّ اأح��د اأق��دم االأمثل��ة عل��ى تطبي��ق ال��ذكاء اال�سطناع��ي يف الروبوتية هو تطوير روبوتات امل�سانع املُ�س��تخدَ مة يف اأداء املهام‬ ‫تطبيقات الذكاء األ�سطناعي ‪pplications of AI‬‬
‫مث��ل‪ :‬اللح��ام‪ ،‬والدهان��ات‪ ،‬والتجمي��ع‪ .‬من��ذ ذل��ك احل��ني‪ ،‬تط� َّور ا�س��تخدام ال��ذكاء اال�سطناع��ي يف الروبوتي��ة اإىل حد كبر‪،‬‬
‫مع تطور اخلوارزميات املتقدمة وا�ستخدام تعلُّم االآلة لتح�سني اأداء الروبوت‪ .‬وكانت اإحدى االإجنازات البارزة يف ا�ستخدام‬ ‫ال��ذكاء اال�سطناع��ي ه��و تقني��ة �س��ريعة التط��ور لديه��ا الق��درة عل��ى حت� ُّول جمموع��ة وا�س��عة من القطاع��ات وال�سناع��ات‪ .‬يف هذه‬
‫ال��ذكاء اال�سطناع��ي يف الروبوتي��ة تطوي��ر الروبوت��ات الب�س��رية‪ ،‬مث��ل‪ :‬روب��وت هون��دا اأ�ض��يمو (‪ )Honda's ASIMO‬وق��د‬ ‫الوح��دة �ست�ستك�س��ف تطبيق��ات ال��ذكاء اال�سطناع��ي املتنوع��ة‪ ،‬وكيفي��ة ا�س��تخدامها يف اإج��راء حت�س��ينات وابت��كارات يف جمموع��ة‬
‫ُ�س� ّمي بذل��ك اخت�س��ارًا ملفه��وم اخلط��وة املتقدم��ة يف النق��ل اإلإبداع��ي (‪)Advanced Step in Innovative Mobility‬‬ ‫متنوعة من القطاعات وال�سناعات‪.‬‬
‫والذي ق ُِّدم للمرة االأوىل يف عام ‪ 2000‬وكان قاد ًرا على ال�سر واأداء املهام االأ�سا�سية‪.‬‬ ‫رتا�سيني ‪irtual ssistants‬‬ ‫امل�ساعدين األ‬
‫الروبوتات ال�سبيهة بالب�سر ‪Humanli e o ots‬‬
‫واحدة من اأ�س��هر تطبيقات الذكاء اال�سطناعي هي تطبيقات امل�س��اعدين االفرتا�سيني الذين‬
‫ُ�ستخدمني عرب التفاعالت الن�سيّة اأو ال�سوتية‪ ،‬ومُيكن الو�سول اإليهم‬ ‫مُيكنهم التوا�سل مع امل ِ‬
‫ط � ّورت �س��ركة الدب��ران روبوتك���س (‪ )Aldebaran Robotics‬الروبوت��ان ال�س��بيهان‬ ‫ع��رب االأجه��زة املادي��ة مث��ل‪ :‬الهوات��ف الذكي��ة‪ ،‬واالأجهزة اللوحي��ة‪ ،‬اأو مكربات ال�س��وت الذكية‪،‬‬
‫بالب�س��ر بي��رب (‪ )Pepper‬ون��او (‪ ،)Nao‬ال ّل��ذانِ ُ�س ّمم��ا الأغرا���ص البح��ث والتطوي��ر يف‬ ‫ومُيك��ن ا�س��تخدامهم الأداء جمموع��ة وا�س��عة م��ن امله��ام مث��ل‪ :‬اإعداد التذك��رات‪ ،‬واالإجابة على‬
‫جمال التفاعل بني االإن�سان والروبوت‪ ،‬وقد ا�ستخدما على نطاق وا�سع يف جماالت البحث‪،‬‬ ‫االأ�س��ئلة‪ ،‬وت�س��غيل الو�س��ائط ال�سوتية‪ ،‬وطلب املنتجات اأو اخلدمات‪ .‬اأحد االأمثلة االأكرث �سهرة‬
‫والتعلي��م‪ ،‬والرتفي��ه‪ .‬اأمّ ��ا بي��رب (‪ )Pepper‬فه��و روب��وت اجتماع��ي ُم�س َّم��م للتفاع��ل م��ع‬ ‫على تطبيقات الذكاء اال�سطناعي يف هذا املجال هو �ضريي (‪)Siri‬من �سركة اآبل (‪.)Apple‬‬
‫االأ�سخا�ص ب�سورة طبيعية با�ستخدام كامرا‪ ،‬وميكروفونات‪ ،‬وم�ست�سعرات اللم�ص الإدراك‬ ‫وهن��اك �س��ركات اأخ��رى ط�وّرت م�س��اعدين افرتا�سي��ني‪ :‬مث��ل األيك�ض��ا (‪ )Alexa‬التاب��ع ل�س��ركة‬
‫البيئة من حوله‪ ،‬واال�ستجابة لت�سرفات وعواطف االأ�سخا�ص من حوله‪ .‬يتمتع هذا الروبوت‬ ‫اأم��ازون (‪ ،)Amazon‬وامل�ض��اعد اإلفرتا�ض��ي لقوق��ل (‪ ،)Google's Assistant‬وكورتان��ا‬
‫بالعديد من اخل�سائ�ص التي ت�س��مح له بالتع ّرف على الوجوه‪ ،‬وفهم الكالم‪ ،‬واال�س��تجابة‬ ‫(‪ )Cortana‬التاب��ع ل�س��ركة مايكرو�ض��وفت (‪ .)Microsoft‬ومب��رور الوق��ت تط � َّورت ق��درة‬
‫لالإمُي��اءات‪ .‬ال�س��كل ‪ 1.5‬يعر���ص �س��ورة للروب��وت بي��رب‪ .‬اأ ّما ناو (‪ )Nao‬فه��و روبوت ُمدمج‬ ‫هذه التطبيقات على الفهم واال�ستجابة لعدد متزايد من االأوامر واال�ستف�سارات والرد عليها‪.‬‬
‫اأ�سغر حجمًا ُم�س َّمم للتفاعل مع الب�سر‪ .‬ويحتوي هذا الروبوت مثل ال�سابق على جمموعة‬ ‫عل��ى �س��بيل املث��ال‪ ،‬مُيك��ن ا�س��تخدام امل�س��اعد االفرتا�س��ي للتحك��م يف االأجهزة املنزلي��ة الذكية‬
‫م��ن امل�ست�س��عرات الت��ي ت�س��مح ل��ه ب �اإدراك البيئ��ة م��ن حول��ه‪ ،‬اإىل جان��ب الكام��رات‪،‬‬ ‫مث��ل‪ :‬التحك��م يف درج��ة احل��رارة‪ ،‬واالإ�س��اءة‪ ،‬واالأجه��زة الكهربائي��ة‪ .‬وق��د يتمث��ل امل�س��اعد‬
‫وامليكروفون��ات للتع� ّرف عل��ى ال��كالم والوجوه‪ .‬ومُيتاز هذا الروب��وت باأنّه قابل للتخ�سي�ص‬ ‫االفرتا�سي يف �سورة روبوتات الدرد�سة املتخ�س�سة املُ�س َّممة عاد ًة لتقدمي املعلومات واالإجابة‬
‫والربجم��ة بدرج��ة توافقي��ة عالي��ة‪ ،‬مم��ا يجعل��ه اخلي��ار االأمثل للباحث��ني والدار�س��ني الذين‬ ‫�ستخدم روبوتات‬
‫على االأ�سئلة يف جمال حم َّدد‪ ،‬على �سبيل املثال‪ ،‬يف تطبيقات خدمة العمالء ُت َ‬
‫يرغبون يف درا�سة وتطوير تطبيقات جديدة للروبوتات ال�سبيهة بالب�سر‪.‬‬ ‫الدرد�سة املبنية على تقنية الذكاء اال�سطناعي يف االإجابة على اأ�سئلة العمالء حول املنتجات‬
‫�سكل ‪ :1.3‬املحادثة مع روبوت الدرد�سة‬
‫اأو اخلدم��ات‪ ،‬وحتدي��د امل�س��كالت وعالجه��ا‪ ،‬وتق��دمي املعلوم��ات ح��ول طلباته��م وح�س��اباتهم‪.‬‬
‫يف عام ‪ 2017‬كانت الروبوت �ضوفيا (‪ ) ophia‬اأول روبوت يح�ضل على‬ ‫�سكل ‪ :1.5‬الروبوت بيرب‬
‫مُيك��ن الو�س��ول اإىل روبوت��ات الدرد�س��ة ع��رب جمموع��ة وا�س��عة من القن��وات مثل‪ :‬مواق��ع الويب‪،‬‬
‫اجلن�ضية ال�ضعودية‪ ,‬ويف عام ‪ 2023‬طورت اململكة العربية ال�ضعودية‬ ‫وتطبيق��ات املرا�س��لة‪ ،‬وو�س��ائل التوا�س��ل االجتماع��ي‪ ،‬ومُيكنه��ا تق��دمي خدم��ات امل�س��اعدة عل��ى‬
‫�ضارة (‪ ,) arah‬وهي الروبوت التفاعلي اإلأول من نوعه‪.‬‬ ‫مدار ال�س��اعة طوال اأيام االأ�س��بوع‪ .‬مُيكنك االطالع على مثال الأحد تطبيقات روبوت الدرد�س��ة‬
‫يف ال�سكل ‪.1.3‬‬
‫‪el - ri in‬‬ ‫ال�سيارات ذاتية القيادة ‪ars‬‬
‫الروبوتية ‪o otics‬‬
‫كان االإجناز املهم االآخر هو تطوير ال�سيارات ذاتية القيادة كما يف ال�سكل ‪1.6‬‬
‫وه�ي �س�يارات تَ�س�تخدِ م ال�ذكاء اال�سطناع�ي لالنتق�ال عرب الط�رق واتخاذ‬ ‫ارتب��ط ال��ذكاء اال�سطناع��ي من��ذ بدايات��ه بالروبوتي��ة‪ ،‬ف�اإذا كان الروب��وت ه��و الت�سوي��ر املادي للكائ��ن اال�سطناعي‪ ،‬ف�اإنّ الذّكاء‬
‫القرارات حول كيفية التفاعل االآمن مع املركبات االأخرى ومع املُ�ساة‪ .‬اأحد‬ ‫اال�سطناع��ي مُيث��ل دم��ا الروب��وت‪َ ،‬ومُينح��ه الق��درة عل��ى ال�س��عور بالبيئ��ة م��ن حول��ه‪ ،‬واتخ��اذ الق��رارات‪ ،‬والتكي��ف م��ع الظ��روف‬
‫املتطلبات الرئي�سة لهذه التطبيقات هو القدرة على معاجَلة البيانات املرئية‬ ‫املتغرة‪ .‬كما مُيكن للروبوتات الذكية تطبيق هذه االإمكانات والقدرات الأداء جمموعة وا�س��عة من املهام دون التدخل الب�س��ري‪،‬‬
‫مث�ل ال�س�ور ومقاط�ع الفيدي�و وفهمه�ا‪ ،‬وي�س�ار اإىل ذل�ك ع�ادة با�س�م روؤي�ة‬ ‫مث��ل‪ :‬مه��ام الت�سني��ع‪ ،‬واال�ستك�س��اف‪ ،‬والبح��ث واالإنق��اذ‪ ،‬والعدي��د من املهام االأخرى‪ .‬ال�س��كل ‪ 1.4‬يو�سح خ��ط جتميع روبوتي يف‬
‫احلا�ض�ب (‪ ،)Computer Vision‬و مُيك�ن ا�س�تخدام خوارزمي�ات روؤي�ة‬ ‫م�سنع �سيارات‪.‬‬
‫احلا�س�ب للتع� ُّرف عل�ى الكائن�ات‪ ،‬واالأ�س�خا�ص‪ ،‬واخل�سائ��ص االأخ�رى يف‬
‫ال�س�ور ومقاط�ع الفيدي�و‪ ،‬اإىل جان�ب فه�م �س�ياق املحت�وى ومعن�اه‪ .‬وله�ذا‬
‫املج�ال العدي�د م�ن التطبيق�ات غ�ر الروبوتي�ة مث�ل‪ :‬التع� ُّرف عل�ى الوج�ه‪،‬‬
‫واإدارة املحت�وى‪ ،‬وحتلي�ل الو�س�ائط‪ .‬وكان اأح�د ا إالجن�ازات الب�ارزة يف‬
‫ا�س�تخدام ال�ذكاء اال�سطناع�ي يف حتلي�ل ال�س�ور ومقاط�ع الفيدي�و تطوي�ر‬
‫خوارزمي�ات التعلُّ�م العمي�ق‪ ،‬الت�ي ُمُيكنها حتليل كمي�ات كبرة من البيانات‬
‫وحتديد االأمناط املُع َّقدة يف ال�سور ومقاطع الفيديو‪.‬‬
‫�سكل ‪� :1.6‬سيارة ذاتية القيادة‬ ‫�سكل ‪ :1.4‬خط جتميع روبوتي يف م�سنع �سيارات‬
‫‪17‬‬ ‫‪16‬‬
‫‪riculture and limate Modelin‬‬ ‫ال راعة والنمذجة املناخية‬ ‫‪ndustries‬‬ ‫رّ ت بالذكاء األ�سطناعي ‪ected by AI‬‬ ‫املجاألت التي ت أا‬
‫ُي�س��تخدَ م الذكاء اال�سطناعي يف الزراعة لتح�س��ني اإنتاج املحا�سيل الزراعية ورفع كفاءة املمار�س��ات الزراعية‪ .‬ويتحقق‬ ‫التعليم ‪ducation‬‬
‫ذل��ك بالتحلي��ل امل�س��تمر للبيان��ات ح��ول حال��ة الرتب��ة‪ ،‬واأمن��اط الطق���ص‪ ،‬والعوام��ل االأخ��رى للتنب�وؤ باأف�س��ل وق��ت لزراع��ة‬
‫�تخدم ال��ذكاء اال�سطناع��ي يف مراقب��ة املحا�سي��ل ط��وال الوق��ت وحتديد‬ ‫على مدى العقود القليلة املا�سية‪ ،‬كانت هناك العديد من االإجنازات الرئي�سة‬
‫املحا�سي��ل الزراعي��ة ور َّيه��ا وح�ساده��ا‪ .‬كم��ا ُي�س� َ‬ ‫مزايا الذكاء اإل�ضطناعي يف التعليم‬ ‫ال�س��تخدام ال��ذكاء اال�سطناع��ي يف التعلي��م‪ .‬مب��ا يف ذل��ك تطوي��ر اأنظم��ة‬
‫امل�سكالت التي قد ت�سيبها مثل‪ :‬االآفات اأو االأمرا�ص‪ ،‬مما ي�سمح للمزارعني باتخاذ الالزم قَبل اأن توؤثر تلك امل�سكالت‬
‫عل��ى ج��ودة املحا�سي��ل الزراعي��ة‪ ،‬واأح��د االأمثل��ة املُبتك��رة عل��ى تطبيق��ات ال��ذكاء اال�سطناع��ي يف الزراع��ة ه��و ا�س��تخدام‬ ‫‪AI ene its in education‬‬ ‫التدري���ص القائم��ة عل��ى ال��ذكاء اال�سطناع��ي الت��ي ت�س��تخدم تقني��ات معاجَل��ة‬
‫خوارزمي��ة ُ�سن��ع الق��رارات الب�س��يطة لتح�س��ني مواعي��د ال��ري‪ .‬وم��ن االإجن��ازات الرئي�س��ة ا أالخ��رى ا�س��تخدام �س��بكات‬ ‫يو ّف ��ر وق ��ت املُع ِّلم ��ني واالأ�س ��اتذة‬ ‫•‬
‫اللغ��ات الطبيعي��ة للتفاع��ل م��ع الطلب��ة وتق��دمي املالحظ��ات ح��ول اأعمالهم‪ .‬ثم‬
‫امل�ست�س��عرات ملراقب��ة املحا�سي��ل الزراعي��ة‪ ،‬ومعاي��رة التطبيق��ات العالجي��ة الرئي�س��ة مثل االأ�س��مدة واملبي��دات‪ .‬ويف االآونة‬ ‫اجَلامعيني‪.‬‬ ‫من�س��ات التعلُّ��م التك ُّيف��ي الت��ي تَ�س��تخدِ م خوارزمي��ات تعلُّ��م االآل��ة‬
‫ظه��رت ّ‬
‫ُخدمت ال�س��ور املُلتقط��ة بالطائ��رات املُ�س� َّ�رة واالأقم��ار ال�سناعي��ة لتحلي��ل املحا�سي��ل الزراعي��ة على نطاق‬ ‫االأخ��رة‪ ،‬ا�س�ت ِ‬ ‫لتخ�سي���ص العملي��ة التعليمي��ة ل��كل طال��ب ا�س��تنادًا اإىل نق��اط قوت��ه و�سعف��ه‪.‬‬
‫ُمُيك��ن مل ُع ِّلم��ي ال��ذكاء اإل�ضطناع��ي‬ ‫•‬ ‫بعده��ا‪ ،‬طُ �وِّرت اأنظم��ة الت�سحي��ح القائم��ة عل��ى ال��ذكاء اال�سطناع��ي الت��ي‬
‫�ستخدم لت�سميد اأحد احلقول‪.‬‬‫�سرة ُت َ‬ ‫وا�سع‪ ،‬كما يف ال�سكل ‪ 1.8‬الذي يعر�ص طائرة ُم َّ‬ ‫(‪ )AI tutors‬م�ساعدة الطلبة‪.‬‬ ‫تَ�س��تخدِ م خوارزمي��ات معاجَل��ة اللغ��ات الطبيعي��ة وتعلُّ��م االآل��ة لت�سحي��ح‬
‫ي�س��اعد املُع ِّل��م عل��ىاأن ي�سب��ح مع ّل ًم��ا‬ ‫•‬ ‫الواجب��ات املكتوب��ة وتق��دمي املالحظ��ات‪ .‬ويف االآون��ة االأخ��رة‪ ،‬ح��دث دم��ج بني‬
‫حمفّزً ا‪.‬‬ ‫امل�ساعدين االفرتا�سيني وروبوتات الدرد�سة يف جمال التعليم لتقدمي الدعم‬
‫ُتق ��دِّ م الوظائ ��ف املُ�س ��ت ِندة عل ��ى‬ ‫•‬ ‫املخ�س���ص للطلب��ة واالإجاب��ة عل��ى اأ�س��ئلتهم ب�س��كل ف��وري‪ .‬مُيك��ن ا�س��تخدام‬
‫ال ��ذكاء اال�سطناع ��ي املالحظ ��ات‬ ‫ال��ذكاء اال�سطناع��ي لتحلي��ل البيان��ات حول اأداء الطلب��ة‪ ،‬وخياراتهم املف�سلة‬
‫لكل من الطلبة واملُعلِّمني‪.‬‬ ‫يف التعلي��م‪ ،‬وغره��ا م��ن العوام��ل االأخ��رى الالزم��ة لو�س��ع خط��ط تعليمي��ة‬
‫خُم�س�س��ة للطلب��ة‪ ،‬وتق��دمي التو�سي��ات ب�س �اأن امل��واد اأو االأن�س��طة الت��ي م��ن‬
‫املرجح اأن تفيدهم بفعالية‪.‬‬
‫الرعاية ال�سحية ‪Healthcare‬‬
‫الرعاي��ة ال�سحي��ة ه��ي جم��ال اآخ��ر ح َّق��ق تقدمً ��ا كب�رًا بف�س��ل ال��ذكاء اال�سطناع��ي‪ .‬كان��ت االبت��كارات االأوىل يف �س��ورة‬
‫االأنظم��ة الت�س��خي�سية القائم��ة عل��ى ال��ذكاء اال�سطناع��ي وا�س��تخدامه يف اكت�س��اف االأدوي��ة‪ .‬ث��م دجم��ه م��ع ال�س��جالت‬
‫ال�سحي��ة االإلكرتوني��ة ال�س��تخراج املعلوم��ات ذات ال�سل��ة‪ ،‬ويف ال ِعقد الثاين من القرن احلادي والع�س��رين‪ُ ،‬ط ِّورت اأنظمة‬
‫التطبي��ب ع��ن ُبع��د القائم��ة عل��ى ال��ذكاء اال�سطناع��ي‪ .‬والي��وم‪ُ ،‬ي�س��اعد ال��ذكاء اال�سطناع��ي احلدي��ث يف اإن�س��اء خط��ط‬
‫عالجي��ة ُخُم�س�س��ة للمري���ص‪ ،‬وا�س��تخدام اأجه��زة تقني��ة يرتديه��ا ملتابع��ة حالت��ة ال�سحي��ة‪ .‬ويلع��ب ال��ذكاء اال�سطناع��ي‬
‫دورًا كب�رًا يف جم��ال الرعاي��ة ال�سحي��ة‪ ،‬فه��و ُمُي ِّك��ن االأطب��اء ومق ّدم��ي خدم��ات الرعاي��ة ال�سحي��ة االآخري��ن م��ن حتلي��ل‬
‫كميات كبرة من البيانات واتخاذ القرارات حول رعاية املر�سى‪ .‬قد تاأتي البيانات من م�سادر متنوعة مثل‪ :‬ال�سجالت‬
‫�ستخدم خوارزميات روؤية‬‫الطبية‪ ،‬والفحو�سات املعملية‪ ،‬وكذلك ال�سور مثل‪ :‬االأ�سعة ال�سينية اأو االأ�سعة املقطعية‪ ،‬كما ُت َ‬
‫احلا�سب احلديثة ب�سورة متكررة للك�سف عن الت�سوهات وامل�ساعدة يف الت�سخي�ص الطبي‪.‬‬

‫�سكل ‪ :1.8‬الت�سميد با�ستخدام الطائرات امل َّ‬


‫ُ�سرة‬
‫أامّا النمذجة املُناخية فهي جمال اآخر يرتبط ارتباطً ا وثيقًا بالزراعة‪ ،‬وقد تاأثر كثرًا بالذّكاء اال�سطناعي الذي بداأت‬
‫تطبيقات��ه يف ه��ذا املج��ال يف وق��ت ُمبك��ر‪ ،‬م��ع تطوي��ر اأنظم��ة التنب�وؤ بالطق���ص القائم��ة علي��ه‪ .‬والح ًق��ا‪ ،‬ا�س� ُت ِ‬
‫خدم ال��ذكاء‬
‫اال�سطناعي لتحليل كميات كبرة من البيانات حول التغرات املُناخية والتنبوؤ باالأمناط امل�ستقبلية‪ ،‬وتاأتي هذه البيانات‬
‫من م�سادر متنوعة‪ ،‬مبا يف ذلك �سور االأقمار ال�سناعية‪ ،‬ومالحظات حمطات الطق�ص‪ ،‬واملحاكاة احلا�سوبية‪ .‬واليوم‪،‬‬
‫�تخدم ال��ذكاء اال�سطناع��ي يف جمموع��ة وا�س��عة م��ن تطبيق��ات النمذجة املُناخية مث��ل‪ :‬التنبوؤ باآثار التغ��رات املُناخية‬ ‫ُي�س� َ‬
‫على مناطق حم َّددة‪ ،‬وحتليل وفهم اأ�س��باب الظواهر اجَلوية املتطرفة وفهمها‪ ،‬وو�سع اال�س��رتاتيجيات الف ّعالة للتخفيف‬
‫من التغرات املُناخية اأو التك ّيف معها‪.‬‬
‫�سكل ‪ :1.7‬حتليل البيانات ال�سحية‬
‫‪19‬‬ ‫‪18‬‬
‫مترينات‬ ‫الطاقة ‪ner y‬‬
‫اأ َّث��ر ال��ذكاء اال�سطناع��ي كث�رًا عل��ى جم��ال الطاق��ة‪ ،‬وذل��ك ع��ن طري��ق متك��ني ال�سّ ��ركات من تر�س��يد ا�س��تخدامها وتقلي��ل ال َه ْدر‪،‬‬
‫وحت�س��ني الكف��اءة‪ .‬اأح��د االأمثل��ة عل��ى ذل��ك ا�س��تخدام خوارزميات تعلُّم االآل��ة لتحليل البيانات حول ا�س��تخدامات الطاقة وحتديد‬
‫‪1‬‬ ‫طرق تقليل ال َه ْدر وتر�س��يد اال�س��تهالك‪ .‬يف الت�س��عينيات من القرن املا�سي‪ ،‬ا�س�تُخدِ م الذكاء اال�سطناعي للتنبوؤ مبوارد الطاقة‬
‫املُتج��ددة وحت�س��ني ا�س��تخدامها‪ .‬وكان تط��ورًا رئي�سً ��ا م َّك��ن �س��ركات الطاق��ة م��ن التخطي��ط ب�س��ورة اأف�س��ل لدم��ج م��وارد الطاق��ة‬
‫خاط ة‬ ‫�ضحيحة‬ ‫حدِّد اجلملة ال�ضحيحة واجلملة اخلاط ة فيما يلي‪:‬‬ ‫املتجددة يف عملياتها‪.‬‬
‫‪ .1‬و�سع علماء الريا�سيات االأُ�س�ص لفهم احلو�سبة واملنطق حول اخلوارزميات‪.‬‬

‫‪ُ .2‬ي ِّ‬


‫حدد اختبار تورنغ ما اإذا كان احلا�سب يتمتع ب�سلوك �سبيه باالإن�سان اأم ال‪.‬‬
‫‪ .3‬كان اإمل��ر (‪ )Elmer‬واإل�س��ي (‪ )Elsie‬اأول روبوت��ني يتنق��الن ح��ول العقب��ات با�س��تخدام‬
‫ال�سوء واللم�ص‪.‬‬
‫‪ .4‬ا�ستُخدِ م الذكاء اال�سطناعي فقط يف الروبوتات املُ�ستخدَ مة يف ال�سناعات التحويلية‪.‬‬
‫�سكل ‪ :1.9‬الطاقة الكهربائية النظيفة من االألواح الكهرو�سوئية ال�سم�سية‬
‫‪ .5‬مل يكن للذكاء اال�سطناعي اأي تاأثر ُيذكر يف جمال الطاقة‪.‬‬
‫�تخدم خوارزميات تعلُّم‬ ‫�س��هد ال ِعقد االأول من القرن احلادي والع�س��رين دمج الذكاء اال�سطناعي يف ال�س��بكات الذكية‪ ،‬التي ت�س� ِ‬
‫االآلة يف حتليل البيانات حول ا�ستخدام الطاقة و�سبط العر�ص والطلب طوال الوقت‪ ،‬حيث �ساهم ذلك يف حت�سني كفاءة توزيع‬
‫خدم الذكاء اال�سطناعي لتطوير اأنظمة تخزين‬ ‫الطاقة واحلد من الهدر‪ ،‬ويف ال ِعقد الثاين من القرن احلادي والع�س��رين‪ ،‬ا�س� ُت ِ‬
‫رئي�س��ا م َّك��ن �س��ركات الطاق��ة م��ن اإدارة‬
‫الطاق��ة الت��ي مُيكنه��ا تخزي��ن الطاق��ة الزائ��دة وا�س��تخدامها عن��د احلاج��ة‪ .‬وكان تط��و ًرا ً‬
‫‪ 2‬ما الذكاء اإل�ضطناعي (‪)AI‬؟‬ ‫اال�س��تخدام املُتقطِّ ��ع ب�س��كل اأف�س��ل مل��وارد الطاق��ة املتج��ددة مث��ل الطاق��ة ال�سم�س��ية وطاق��ة الري��اح‪ .‬يعر���ص ال�س��كل ‪ 1.9‬االأل��واح‬
‫خدم الذكاء اال�سطناعي لزيادة كفاءة ا�س��تخدام الطاقة بتحليل البيانات‬ ‫الكهرو�سوئية ال�سم�س��ية‪ ،‬ويف ال�س��نوات االأخرة‪ ،‬ا�س� ُت ِ‬
‫ح��ول ا�س��تخدام الطاق��ة وحتدي��د ط��رق احل��د م��ن اله��در‪ ،‬و�س��مل ذل��ك تطوي��ر االأنظم��ة املُ�س��ت ِندة عل��ى ال��ذكاء اال�سطناع��ي الت��ي‬
‫ُ�ستخدم يف حت�سني ا�ستخدام الطاقة يف املباين‪ ،‬وامل�سانع‪ ،‬ومن ِقبل كبار ُم�ستهلكي الطاقة‪ .‬كما ا�س ُتخدِ م الذكاء اال�سطناعي‬ ‫ت َ‬
‫يف �سناعة النفط والغاز لتحليل البيانات حول احلفر واالإنتاج وحت�سني العمليات‪.‬‬
‫‪a‬‬ ‫تطبيق القانون ‪n orcement‬‬
‫�ستخدم الذكاء اال�سطناعي بكثافة يف جمال تطبيق القانون للتنبوؤ باجَلرائم‬ ‫ُي َ‬
‫�تخدم ال��ذكاء اال�سطناع��ي‬‫واحليلول��ة دون وقوعه��ا‪ .‬وعل��ى وج��ه التحدي��د‪ُ ،‬ي�س� َ‬
‫لتحلي��ل البيان��ات م��ن م�س��ادر خُمتلف��ة‪ ،‬مث��ل‪� :‬س��جالت اجَلرائ��م‪ ،‬وو�س��ائل‬
‫وتوجهات االأن�س��طة‬
‫التوا�س��ل االجتماع��ي‪ ،‬وكام��رات املراقب��ة لتحدي��د اأمناط ُ‬
‫‪ 3‬ا�ضرح باإيجاز بع�س تطبيقات الذكاء اإل�ضطناعي امل ُ�ضتخدَمة يف احلياة اليومية‪.‬‬ ‫االإجرامية والتنبوؤ بها‪ .‬على �س��بيل املثال طُ ور الذكاء اال�سطناعي يف التع ُّرف‬
‫عل��ى الوج��وه (�س��كل ‪ .)1.10‬والح ًق��ا‪ُ ،‬د ِم��ج يف اأنظم��ة اإر�س��ال ق��وات ال�س��رطة‬
‫من�س��ات و�س��ائل التوا�سل االجتماعي بحثً��ا عن التهديدات‬ ‫وا�س� ُتخدم ملراقب��ة ّ‬
‫خدم الذكاء اال�سطناع��ي لتطوير طائرات‬ ‫املحتمل��ة‪ .‬ويف االآون��ة ا أالخ��رة‪ ،‬ا�س� ُت ِ‬
‫�سرة ملراقبة وحتليل ت�سجيالت الفيديو من الكامرات التي يرتديها �سباط‬ ‫ُم َّ‬
‫تطبي��ق القان��ون‪ .‬كم��ا ل ِع��ب ال��ذكاء اال�سطناع��ي دورًا كب�رًا يف متكني اجَلهات‬
‫امل�س�وؤولة م��ن حتلي��ل كمي��ات كب��رة من البيان��ات وحتديد االأمن��اط والتوجهات‬
‫واتخاذ القرارات املُ�ستنرة حول كيفية منع اجَلرمُية والت�سدي لها‪.‬‬
‫�سكل ‪ :1.10‬تقنيات التع ُّرف على الوجه وحتديد‬
‫الهوية ال�سخ�سية‬
‫‪21‬‬ ‫‪20‬‬
‫الدر�ص الثاين‬ ‫و�ض� بع���س اإلأح��داث التاريخي��ة الرئي�ض��ة الت��ي اأ ّث��رت يف تط��ور الذكاء اإل�ضطناعي يف اإلأربعينيات واخلم�ض��ينيات من‬
‫ِّ‬ ‫‪4‬‬
‫هياكل البيانات يف الذكاء األ�سطناعي‬ ‫القرن املا�ضي‪.‬‬

‫اأهمية هياكل البيانات يف الذكاء األ�سطناعي‬


‫‪The mportance of ata tructures in AI‬‬
‫للبيان��ات اأهمي��ة ك��ربى يف جم��االت ال��ذكاء اال�سطناع��ي الأنه��ا االأ�سا���ص املُ�س��تخدَ م يف‬
‫هياكل البيانات‬ ‫تدري��ب من��اذج تعلُّ��م االآل��ة حي��ث ُحت� ِّ�دد ج��ودة البيان��ات وكميّته��ا املتواف��رة دق��ة وفعالي��ة‬
‫(‪:) ata tructure‬‬ ‫من��اذج ال��ذكاء اال�سطناع��ي‪ .‬وب��دون بيان��ات كافي��ة وذات �سل��ة‪ ،‬ل��ن تتع ّل��م خوارزمي��ات‬
‫هي��اكل البيان��ات ه��ي تقني��ة‬ ‫الذكاء اال�سطناعي االأمناط‪ ،‬ولن تقوم بالتنبوؤات‪ ،‬ولن تتمكن من اأداء املهام بفاعلية‪.‬‬
‫لتخزي��ن وتنظي��م البيان��ات يف‬ ‫وبالت��ايل‪ ،‬تلع��ب البيان��ات دورًا رئي� ًس��ا يف ت�س��كيل ق��درات واإمكان��ات ُ�سن��ع الق��رار ل��دى‬
‫الذاكرة ال�ستخدامها بكفاءة‪.‬‬ ‫اأنظم��ة ال��ذكاء اال�سطناع��ي‪ .‬هي��اكل البيان��ات له��ا اأهمي��ة كب��رة يف ال��ذكاء اال�سطناعي‬
‫الأنه��ا توف��ر طريق��ة ف َّعال��ة لتنظي��م وتخزي��ن البيان��ات‪ ،‬كم��ا ت�س��مح با�س��رتجاع ومعاجَل��ة‬ ‫‪ 5‬ا�ض��رح كي��ف ا�ض��تخدمت التطبيق��ات التجاري��ة تقني��ات ال��ذكاء اإل�ضطناع��ي للم��رة اإلأوىل يف ال ِعق��د الث��اين م��ن الق��رن‬
‫البيان��ات بكف��اءة‪ .‬وكذل��ك‪ُ ،‬حت� ِّ�دد م��دى تعقي��د وكف��اءة اخلوارزمي��ات املُ�س��تخدَ مة يف معاجَل��ة البيان��ات‪ ،‬وبالت��ايل توؤث��ر مبا�س��ر ًة‬ ‫احلادي والع�ضرين‪.‬‬
‫للتو�س��ع‬
‫على اأداء اأنظمة الذكاء اال�سطناعي‪ .‬على �س��بيل املثال‪ ،‬مُيكن حت�س��ني �س��رعة وقابلية خوارزميات الذكاء اال�سطناعي ُّ‬
‫با�ستخدام هياكل البيانات املنا�سبة‪ ،‬مما يجعلها اأكرث مالءمة للتطبيقات يف العامل احلقيقي‪ .‬وكذلك‪ ،‬ت�ساعد هياكل البيانات‬
‫املُ�س َّممة جيدً ا يف تقليل ا�ستخدام الذاكرة وزيادة كفاءة اخلوارزميات‪ ،‬لتمكينها من معاجَلة جمموعات اأكرب من البيانات‪.‬‬
‫تُخزِّ ن اأجهزة احلا�سب البيانات وتُعاجَلها ب�سرعة ودقة فائقتني‪ .‬لذلك‪ ،‬من ال�سروري تخزين البيانات بكفاءة‪ ،‬وتوفر الو�سول‬
‫اإليها بطريقة �سريعة‪ .‬مُيكن ت�سنيف هياكل البيانات على النحو التايل‪:‬‬
‫يُطلّق على البيانات الب�ضيطة كذلك‬ ‫• هياكل البيانات االأوليّة‪.‬‬
‫البيانات اإلأوليّة‪ ,‬اأو اخلام‪ ,‬اأو اإلأ�ضا�ضية‪.‬‬ ‫• هياكل البيانات غر االأوليّة‪.‬‬
‫يو�سح املُخطَّ ط يف ال�سكل ‪ 1.11‬ت�سنيف هياكل البيانات‪.‬‬
‫هياكل البيانات‬
‫)‪(Data Structures‬‬

‫‪ 6‬خلِّ�س كيفية ا�ض��تخدام تطبيقات الذكاء اإل�ضطناعي يف الت�ضدي لتغريات امل ُنا عرب النمذجة امل ُناخية والتح�ض��ينات‬
‫هياكل البيانات غري اإلأوليّة‬ ‫هياكل البيانات اإلأوليّة‬ ‫يف جمال الطاقة‪.‬‬
‫)‪(Non-Primitive Data Structures‬‬ ‫)‪(Primitive Data Structures‬‬

‫هياكل البيانات غر اخلطيَّة‬ ‫ن�سية‬ ‫منطقية‬ ‫اأرقام ع�سرية‬ ‫اأعداد �سحيحة‬


‫)‪(Non-Linear Data Structures‬‬ ‫)‪(Boolean) (Character‬‬ ‫)‪(Float‬‬ ‫)‪(Integer‬‬

‫)‪(Trees‬‬ ‫ال�سجرة‬ ‫)‪(Graphs‬‬ ‫املخطط‬ ‫هياكل البيانات اخلطيَّة )‪(Linear Data Structures‬‬

‫القائمة‬ ‫امل�سفوفة‬ ‫ال�سف‬ ‫القامو�ص‬ ‫املُك ّد�ص‬ ‫الطابور‬ ‫القائمة املرتابطة‬


‫)‪(List‬‬ ‫)‪(Array‬‬ ‫)‪(Tuple‬‬ ‫)‪(Dictionary‬‬ ‫)‪(Stack‬‬ ‫)‪(Queue‬‬ ‫)‪(Linked List‬‬
‫�سكل ‪ُ :1.11‬خُمطَّ ط هياكل البيانات‬
‫‪23‬‬ ‫‪22‬‬
‫العمليات يف املُكدّ �ص ‪Operations on the stac‬‬ ‫هياكل البيانات األأوليّة ‪rimiti e ata tructures‬‬
‫هناك عمليتان رئي�ستان يف املُكدّ�ص‪:‬‬ ‫يُ�س��ار اإىل هي��اكل البيان��ات االأول ّي��ة با�س��م هي��اكل البيان��ات االأ�سا�س��ية يف لغ��ة البايث��ون‪ ،‬ويحت��وي ه��ذا‬
‫• اإ�ضافة عن�ضر (‪ :)Push‬تُ�ستخدَ م العملية الإ�سافة عن�سر يف قمة املُكدّ�ص‪.‬‬ ‫ُرتجم بن��وع البيانات‬
‫الن��وع م��ن الهي��اكل عل��ى قي��م ب�س��يطة للبيانات‪ُ .‬تخ��رب اأنواع البيانات الب�س��يطة امل ِّ‬
‫• حذف عن�ضر (‪ :)Pop‬تُ�ستخدَ م العملية حلذف عن�سر من قمة املُكدّ�ص‪.‬‬ ‫خزنها‪ .‬هياكل البيانات االأولية يف لغة البايثون هي‪:‬‬ ‫التي ُي ِّ‬

‫عملية اإ�ضافة عن�ضر ‪ush operation‬‬ ‫تُ�ضتخدَم اأنوا خمتلفة من‬ ‫اإلأرقام (‪ :)Numbers‬تُ�ستخدَ م االأرقام لتمثيل البيانات الرقمية وهي‪:‬‬ ‫•‬
‫هياكل البيانات لتطبيقات‬
‫يُط َل��ق عل��ى عملي��ة اإ�ساف��ة عن�س��ر جدي��د اإىل املُك ّد���ص ا�س��م اإ�ضاف��ة عن�ض��ر‬ ‫احلا�ضب ومهامّه املختلفة‬ ‫‪ -‬االأعداد ال�سحيحة‬
‫اإ�ضافة عن�ضر‬ ‫بنا ًء على ما يتطلبه‬
‫اإىل امل ُكدّ�س‬ ‫العن�ضر‬ ‫(‪.)Push‬‬ ‫‪ -‬االأرقام الع�سرية‬
‫عند القمة‬ ‫امل�ضرو والقيود املفرو�ضة‬
‫يَ�س��تخدِ م املُك ّد���ص موؤ�سّ �رًا ُيطل��ق علي��ه موؤ�س��ر اإلأعل��ى (‪ ،)Top‬ويُ�س��ر اإىل‬ ‫على الذاكرة‪.‬‬ ‫ال�ضاًل�ضل الن�ضيّة (‪ :)Strings‬ال�سال�سل الن�سيّة هي جمموعات من االأحرف والكلمات‪.‬‬ ‫•‬
‫العن�ضر‬
‫عند القمة‬ ‫العن�سر املوجود يف قمة املُكدّ�ص‪ ،‬وعند اإ�سافة عن�سر جديد اإىل املُكدّ�ص‪:‬‬ ‫البيانات املنطقية (‪ :)Boolean‬تكون قيم البيانات املنطقية اإما �سحيحة اأو خاطئة‪.‬‬ ‫•‬
‫‪E‬‬ ‫‪E‬‬ ‫• ت��زداد قيم��ة موؤ�س��ر االأعل��ى بقيم��ة واح��دة الإظه��ار املوق��ع اجَلدي��د ال��ذي‬
‫�س ُي�ساف العن�سر فيه‪.‬‬
‫‪D‬‬ ‫‪D‬‬ ‫‪D‬‬ ‫هياكل البيانات ري األأوليّة ‪Non- rimiti e ata tructures‬‬
‫• يُ�ساف العن�سر اجَلديد اإىل قمة املُكدّ�ص‪.‬‬
‫‪C‬‬ ‫‪C‬‬ ‫‪C‬‬ ‫ُربمج وال‬
‫هي��اكل البيان��ات غ��ر االأول ّي��ة ه��ي هي��اكل متخ�س�س��ة ُتخ��زِّ ن جمموع��ة من القي��م‪ .‬يكتبه��ا امل ِّ‬
‫َفيْ�س امل ُكدّ�س ‪tac O er lo‬‬
‫تُع َّرف بلغة البايثون مثل هياكل البيانات االأوليّة‪.‬‬
‫‪B‬‬ ‫‪B‬‬ ‫‪B‬‬
‫يتميز املُكدّ�ص ب�سعة تخزينية ُحمدَّدة تعتمد على ذاكرة احلا�سب‪ .‬اإذا‬ ‫مُيكن تق�سيم هياكل البيانات غر االأوليّة كذلك اإىل نوعني‪:‬‬
‫‪A‬‬ ‫‪A‬‬ ‫‪A‬‬
‫كانت الذاكرة ممتلئة‪ ،‬فاإن اإ�سافة عن�سر جديد �سينتج عنها م�سكلة‬
‫املُكدّ�ص االأ ّويل‬ ‫املُكدّ�ص النهائي‬ ‫َفيْ�س امل ُكدّ�س (‪ .)Stack Overflow‬ويق�سد بها جتاوز ال�سعة؛ لذا‬ ‫هي��اكل البيان��ات اخلط ّي��ة اأو امل ُت�ضل�ض��لة (‪:)Linear or sequential data structures‬‬ ‫•‬
‫يجب التحقق من امتالء ذاكرة املُكدّ�ص قبل اإ�سافة اأي عن�سر جديد‪.‬‬ ‫معني‪.‬‬
‫تُخزِّ ن هياكل البيانات اخلطيّة عنا�سر البيانات يف ت�سل�سل ّ‬
‫�سكل ‪ :1.13‬عملية اإ�سافة عن�سر اإىل املُكدّ�ص‬
‫هي��اكل البيان��ات غ��ري اخلط َّي��ة (‪ :)Non-linear data structures‬ال حتت��وي هي��اكل‬ ‫•‬
‫البيان��ات غ��ر اخلط َّي��ة عل��ى ارتباط ت�سل�س��لي بني عنا�س��ر البيانات‪ُ ،‬ومُيكن رب��ط اأي زوج اأو‬
‫جمموعة من عنا�سر البيانات معًا‪ ،‬والو�سول اإليها دون ت�سل�سل ُحم َّدد‪.‬‬
‫حذف عن�ضر‬ ‫عملية حذف عن�ضر ‪Pop operation‬‬
‫من امل ُكدّ�س‬
‫العن�ضر‬ ‫هياكل البيانات اخلطية ‪inear ata tructures‬‬
‫عند القمة‬ ‫يُطلق على عملية حذف عن�سر من املُكدّ�ص ا�سم حذف عن�ضر (‪.)Pop‬‬
‫العن�ضر‬ ‫عند حذف عن�سر من املُكدّ�ص‪:‬‬ ‫ُتخ��زِّ ن هي��اكل البيان��ات اخلط َّي��ة عنا�س��ر البيان��ات يف ت�سل�س��ل مع� ّ�ني‪ .‬يف هذا الدر���ص �س��تتعلّم‬
‫عند القمة‬
‫‪E‬‬ ‫بع���ص هي��اكل البيان��ات اخلط ّي��ة مث��ل امل ُك ّد���س (‪ )Stack‬والطاب��ور (‪ ،)Queue‬وهم��ا نوع��ان‬
‫‪E‬‬ ‫• يُحذَ ف العن�سر من قمة املُكدّ�ص‪.‬‬ ‫من هياكل البيانات االأكرث ا�ستخدامً ا يف احلياة اليومية‪.‬‬
‫‪D‬‬ ‫‪D‬‬ ‫‪D‬‬
‫• تنخف�ص قيمة موؤ�س��ر االأعلى بقيمة واحد الإظهار العن�سر التايل عند قمة‬
‫املُكدّ�ص‪.‬‬ ‫�سكل ‪ :1.12‬كومة من الكتب كمثال‬ ‫املُكدّ �ص ‪tac‬‬
‫‪C‬‬ ‫‪C‬‬ ‫‪C‬‬ ‫واقعي على املُكدّ�ص‬
‫مُيك��ن متثي��ل املُك ّد���ص يف الواق��ع مبجموع��ة م��ن الكت��ب ُر َّ�س��ت ف��وق بع�سه��ا البع���ص‪ ،‬كم��ا ه��و‬
‫َغيْ�س امل ُكدّ�س ‪tac nder lo‬‬ ‫مو�س��ح يف ال�س��كل ‪ .1.12‬فالإن�س��اء تل��ك املجموع��ة‪ ،‬علي��ك اأن ت�س��ع الكت��ب بع�سها فوق بع�ص‪،‬‬ ‫ّ‬
‫‪B‬‬ ‫‪B‬‬ ‫‪B‬‬
‫اإذا كن�ت ترغ�ب يف ح�ذف عن�س�ر من املُك ّد��ص‪ ،‬عليك التّحقّ�ق ا ًأوال من‬ ‫قاعدة املُ ساف اآخرً ا‬ ‫وعندم��ا تري��د ا�س��تخدام اأح��د الكت��ب‪ ،‬علي��ك اأخ��ذ الكت��اب من اأعل��ى املجموع��ة‪ .‬وللو�سول اإىل‬
‫‪A‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫اأن املُك ّد��ص يحت�وي عل�ى عن�س�ر واح�د عل�ى االأق�ل؛ ف�اإذا كان املُك ّد��ص‬ ‫أوأل‬
‫َخرج ا ً‬
‫ي ُ‬ ‫الكتب االأخرى عليك اإنزال الكتب من اأعلى املجموعة‪.‬‬
‫املُكدّ�ص االأ ّويل‬ ‫املُكدّ�ص النهائي‬ ‫فارغًا‪� ،‬سوف ينتج عن ذلك م�سكلة َغيْ�س امل ُكدّ�س (‪)StackUnderflow‬‬ ‫(‪:) ast In First Out-LIFO‬‬
‫ويق�سد بها االنخفا�ص عن احلد االأدنى لل�سعة‪.‬‬ ‫اآخر عن�سر ُم�ساف مُيكن‬ ‫متغريًا ديناميكيًا‪.‬‬
‫قد يكون حجم امل ُكدّ�س ثابتًا اأو ّ‬
‫�سكل ‪ :1.14‬عملية حذف عن�سر من املُكدّ�ص‬ ‫الو�سول اإليه ا ًأوال‪.‬‬ ‫تُطبِّق لغة البايثون امل ُكدّ�ضات با�ضتخدام القوائم‪.‬‬

‫‪25‬‬ ‫‪24‬‬
‫مفكرة جوبيرت ‪Jupyter Notebook‬‬ ‫املُكدّ �س يف لغة البايثون ‪Stack in Python‬‬
‫يف ه��ذه الوح��دة �س��تكتب مقط ًع��ا برجم ًّي��ا بلغ��ة البايث��ون با�س��تخدام مفك��رة جوبي��رت‬ ‫ُمتثَّل املُكدّ�صات يف لغة البايثون با�صتخدام القوائم التي بدورها تُقدِّ م بع�ص العمليات التي ُميكن تطبيقها مبا�صر ًة على املُكدّ�صات‪.‬‬
‫(‪ .)Jupyter Notebook‬وه��ي تطبي��ق الوي��ب املُ�س� َ‬
‫�تخدم الإن�س��اء املُ�س��تندات احلا�س��وبية‬
‫وم�س��اركتها‪ .‬كل ُم�س��تند ُي�س��مى مفك��رة‪ ،‬ويحت��وي عل��ى املقط��ع الربجم��ي ال��ذي كتب َت��ه‪،‬‬ ‫جدول  ‪ :1.2‬عمليات املُكدّ �س‬
‫والتعليق��ات‪ ،‬والبيان��ات االأول ّي��ة واملُعاجَل��ة‪ ،‬وت�س�وّرات البيان��ات‪� .‬ستَ�س��تخدِ م االإ�س��دار غ��ري‬ ‫الو�صف‬ ‫العملية‬
‫امل ُت�ض��ل باإلإنرتن��ت (‪ )Offline‬م��ن مفك��رة جوبي��رت‪ ،‬واأ�س��هل طريقة لتثبيت��ه حمليًا هي من‬ ‫تُطبَّق عملية اإ�صافة عن�صر‬
‫خ��الل اأناكون��دا (‪ )Anaconda‬وه��ي من�س��ة توزي��ع مفتوح��ة امل�س��در للطلب��ة واله��واة‪،‬‬ ‫للمُكدّ�س يف لغة البايثون‬ ‫اإ�صافة العن�صر ‪ x‬اإىل نهاية القائمة‪.‬‬ ‫(‪listName.append)x‬‬
‫ومُيكنك تنزيلها وتثبيتها من الرابط التايل‪:‬‬ ‫َ‬ ‫با�صتخدام دالة ‪.append‬‬ ‫حذف العن�صر االأخر من القائمة‪.‬‬ ‫()‪listName.pop‬‬
‫‪https://www.anaconda.com/products/distribution‬‬
‫‪2‬‬
‫و�سيتم تثبيت لغة البايثون ومفكرة جوبيرت تلقائيًا‪.‬‬
‫مثاال على تطبيق املُكدّ�ص يف لغة البايثون‪:‬‬
‫�صت�صاهد ً‬
‫‪ 1‬اأن�صئ املُكدّ�ص لتخزين جمموعة من االأرقام (‪.)45 ،32 ،21 ،1‬‬
‫‪3‬‬ ‫لفت مفكرة جوبيرت (‪:)Jupyter Notebook‬‬ ‫ِ‬ ‫‪2‬‬
‫ا�صتخدم عملية حذف عن�صر (‪ )Pop‬من املُكدّ�ص مرتن حلذف العن�صرين االأخرين (‪ )45 ،32‬من املُكدّ�ص‪.‬‬
‫‪2‬‬ ‫ ا�سغط على ‪( Start‬بدء)‪ 1 ،‬ثم ا�سغط على ‪( Anaconda3‬اأناكوندا ‪.)3‬‬ ‫ا�صتخدم عملية اإ�صافة عن�صر (‪ )Push‬اإىل املُكدّ�ص الإ�صافة عن�صر جديد (‪ )78‬اإىل املُكدّ�ص‪.‬‬‫ِ‬ ‫‪3‬‬
‫ اخرت ‪( Jupyter Notebook‬مفكرة جوبيرت)‪3 .‬‬

‫ �ستظهر ال�سفحة الرئي�سة ملفكرة جوبيرت يف املت�سفح‪.‬‬ ‫اإ�صافة عن�صر‬


‫اإىل امل ُكدّ�س‬
‫‪1‬‬
‫اإ�صافة عن�صر‬ ‫العن�صر عند‬
‫اإىل امل ُكدّ�س‬
‫‪45‬‬ ‫القمة‬
‫اإ�صافة عن�صر‬ ‫‪45‬‬
‫اإىل امل ُكدّ�س‬
‫‪32‬‬
‫‪32‬‬ ‫‪32‬‬
‫اإ�صافة عن�صر‬ ‫‪21‬‬
‫اإىل امل ُكدّ�س‬ ‫‪21‬‬ ‫‪21‬‬ ‫‪21‬‬

‫ال�سفحة الرئي�سة‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬


‫لمفكرة جوبيتر‪.‬‬ ‫‪1‬‬

‫‪45‬‬
‫اإ�صافة عن�صر‬
‫حذف عن�صر‬ ‫‪32‬‬ ‫اإىل امل ُكدّ�س‬
‫من امل ُكدّ�س‬
‫‪45‬‬
‫حذف عن�صر‬
‫من امل ُكدّ�س‬ ‫‪78‬‬
‫‪32‬‬ ‫‪32‬‬ ‫‪78‬‬

‫‪21‬‬ ‫‪21‬‬ ‫‪21‬‬ ‫‪21‬‬ ‫‪21‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬


‫‪2‬‬ ‫‪3‬‬

‫�سكل ‪ :1.16‬ال�سفحة الرئي�سة ملفكرة جوبيرت‬ ‫�صكل ‪ :1.15‬مثال على املُكدّ�ص‬


‫‪27‬‬ ‫‪26‬‬
‫ألإن�صاء برنامج يف مفكرة جوبيرت‪:‬‬ ‫االآن وبع��د اأن اأ�صبح��ت مُفكرت��ك جاه��زة‪ ،‬ح��ان الوق��ت لكتاب��ة‬ ‫ألإن�صاء مفكرة جوبيرت جديدة‪:‬‬
‫برناجمك االأول وت�صغيله فيها‪.‬‬
‫‪1‬‬ ‫ اأكتب االأوامر داخل خلية املقطع الربجمي‪.‬‬ ‫ يف الزاوية اليمنى العلوية من �صا�صتك‪ ،‬ا�صغط على ‪( New‬جديد)‪.‬‬
‫‪1‬‬

‫ ا�صغط على ‪( Run‬ت�صغيل)‪2 .‬‬


‫مُيكنك احل�صول على العديد من اخلاليا املختلفة التي‬ ‫ حدِّ د (‪( Python 3 )ipykernel‬بايثون ‪2 .)3‬‬
‫حتتاجها يف نف�س املفكرة حيث حتتوي كل خلية على مقطعها‬
‫ �صيتم عر�ص النتيجة حتت االأوامر‪3 .‬‬
‫الربجمي اخلا�س‪.‬‬ ‫‪3‬‬ ‫ �صيتم فتح املفكرة اخلا�صة بك يف عالمة تبويب جديدة يف املت�صفح اخلا�ص بك‪.‬‬

‫‪2‬‬

‫‪1‬‬
‫‪1‬‬ ‫يمكنك تحميل مفكرتك من‬
‫‪3‬‬ ‫جهاز الحا�صب الخا�ص بك‪.‬‬
‫عند ت�صغيل برنامجك‬
‫�صتتم اإ�صافة خلية‬ ‫‪2‬‬
‫مقطع برمجي جديدة‬
‫تلقائيًا‪.‬‬
‫�صكل ‪ :1.18‬اإن�صاء برنامج يف مفكرة جوبيرت‬

‫‪.‬‬ ‫‪Enter ‬‬ ‫‪+‬‬ ‫‪Shift‬‬ ‫ُمُيكنك ت�صغيل برناجمك بال�صغط على‬ ‫حان الوقت حلفظ مفكّرتك‪.‬‬
‫حلفظ املفكرة اخلا�صة بك‪:‬‬
‫‪3‬‬
‫‪1‬‬ ‫‪1‬‬ ‫ ا�صغط على ‪( File‬ملف)‬
‫ اخرت ‪( Save as‬حفظ ك��)‪2 .‬‬

‫ اكتب ا�صمًا ملفكرتك‪3 .‬‬

‫ ا�صغط على ‪( Save‬حفظ)‪4 .‬‬

‫‪2‬‬

‫يتم حفظ املفكرة‬ ‫لقد تغ ّير ا�صم‬ ‫اال�صم االفترا�صي‬


‫‪3‬‬ ‫تلقائيًا اأثناء عملك‪.‬‬ ‫المفكرة‪.‬‬ ‫خلية المقطع البرمجي‪ .‬يمكنك كتابة ن�ص‪ ،‬اأو‬ ‫�صريط اأدوات‬
‫‪4‬‬ ‫معادلة ريا�صية اأو اأمر بلغة البايثون‪.‬‬ ‫للمفكرة هو "بدون عنوان"‪.‬‬
‫المفكرة‪.‬‬
‫�صكل ‪ :1.19‬حفظ املفكرة اخلا�صة بك‬ ‫�صكل ‪ :1.17‬اإن�صاء مفكرة جوبيرت جديدة‬
‫‪29‬‬ ‫‪28‬‬
‫ �ص��يظهر بالربنام��ج قائم��ة تطل��ب من��ك‬،‫ اأو حتذفه��ا من��ه‬،‫يف الربنام��ج الت��ايل �صتن�ص��ئ مُكدّ� ًص��ا جدي��دً ا وت�صي��ف العنا�ص��ر اإلي��ه‬ :‫ يف مفكرة جوبيرت‬1.15 ‫لت�صاهد املثال يف ال�صكل‬
.‫حتديد االإجراء الذي تود القيام به يف كل مرة‬ .)45 ،32 ،21 ،1( ‫ اأن�صئ املُكدّ�ص لتخزين جمموعة من االأرقام‬.1
.‫ من قائمة الربنامج‬1 ‫ ا�صغط على الرقم‬،‫• الإ�صافة عن�صر اإىل املُكدّ�ص‬ .‫) من املُكدّ�ص مرتن حلذف العن�صرين االأخرين منه‬Pop( ‫ا�صتخدم عملية حذف عن�صر‬ ِ .2
.‫ من قائمة الربنامج‬2 ‫ ا�صغط على الرقم‬،‫• حلذف عن�صر من املُكدّ�ص‬ ِ
.‫) اإىل املُكدّ�ص الإ�صافة عن�صر جديد اإليه‬Push( ‫ا�صتخدم عملية اإ�صافة عن�صر‬ .3
.‫ من قائمة الربنامج‬3 ‫ ا�صغط على الرقم‬،‫• للخروج من الربنامج‬
myStack=[1,21,32,45]
def push(stack,element): print("Initial stack: ", myStack)
stack.append(element) print(myStack.pop()) ‫ لعر�ص‬print)myStack.pop)(( ‫تُ�صتخدَ م الدالة‬
def pop(stack): print(myStack.pop())
print("The new stack after pop: ", myStack)
.myStack.Pop)( ‫ُ�صترجعة من دالة‬
َ ‫القيم الم‬
return stack.pop()
def isEmpty(stack): myStack.append(78)
return len(stack)==0 print("The new stack after push: ", myStack)
def createStack():
return []
Initial stack: [1, 21, 32, 45]
newStack=createStack() 45
while True: 32
print("The stack so far is:",newStack) The new stack after pop: [1, 21]
print("-----------------------------") The new stack after push: [1, 21, 78]
print("Choose 1 for push")
print("Choose 2 for pop")
print("Choose 3 for end") myStack=[1,21,32,45]
print("-----------------------------") print("Initial stack:", myStack)
choice=int(input("Enter your choice: ")) a=len(myStack)
while choice!=1 and choice!=2 and choice!=3: print("size of stack",a)
.‫ لعر�ص طول المُكدّ�ص‬len ‫تُ�صتخدَ م الدالة‬
print ("Error") # empty the stack
choice=int(input("Enter your choice: ")) for i in range(a): ‫يُ�صتخدَ م هذا االأمر لحذف‬
if choice==1: myStack.pop()
x=int(input("Enter element for push: ")) print(myStack)
.‫كل العنا�صر من المُكدّ�ص‬
push(newStack,x) myStack.pop()
elif choice==2:
if not isEmpty(newStack):
print("The pop element is:",pop(newStack)) Initial stack: [1, 21, 32, 45]
else: size of stack 4
print("The stack is empty") []
else: --------------------------------------------------------------------
print("End of program") IndexError Traceback (most recent call last)
break; Input In [3], in <cell line: 9>()
7 myStack.pop() ‫يظهر الخطاأ الأن المُكدّ�ص‬
8 print(myStack) ‫فارغ واأنت كتبت اأمر حذف‬
----> 9 myStack.pop() .‫عن�صر منه‬
IndexError: pop from empty list

IndexError ‫خطاأ الفهر�س‬


‫�ص�تالحظ ظه�ور خط�اأ عندم�ا كتب�تَ اأم�ر ح�ذف عن�ص�ر م�ن املُك ّد��ص الف�ارغ وت�ص�بب ه�ذا يف َغ ْي��س امل ُك ّد��س‬
.‫ عليك دومً ا التحقق من وجود عنا�صر يف املُكدّ�ص قبل حماولة حذف عن�صر منه‬.)Stack Underflow(
31 30
‫الطابور ‪Queue‬‬ ‫َنفِّذ الربنامج ال�صابق كما يلي‪:‬‬
‫][ ‪The stack so far is:‬‬
‫أوأل‬
‫أوأل يَخرُ ج ا ً‬
‫قاعدة املُ�صاف ا ً‬ ‫‪-----------------------------‬‬ ‫• اأن�صئ مُكدّ�صً ا من ثالثة اأرقام‪.‬‬
‫هي��كل البيان��ات الت��ايل ال��ذي �صت�ص��تعر�صه ه��و الطاب��ور‪ .‬تُ�ص��ا ِدف ع��اد ًة طواب��ر يف‬ ‫‪Choose 1 for push‬‬
‫(‪:)First In First Out )FIFO( rule‬‬ ‫حيات��ك اليومي��ة‪ .‬الطاب��ور االأك��ر �ص��يوعً ا ه��و طاب��ور انتظ��ار ال�ص��يارات عن��د اإ�ص��ارة‬ ‫‪Choose 2 for pop‬‬
‫• اأ�صف العنا�صر اإىل املُكدّ�ص‪.‬‬
‫العن�ص��ر االأول املُ�ص��اف اإىل القائمة ُيعالَج‬ ‫املرور‪ .‬عندما تتحول اإ�ص��ارة املرور اإىل اللون االأخ�صر‪� ،‬ص��تكون ال�ص��يارة التي دخلت‬ ‫‪Choose 3 for end‬‬
‫‪-----------------------------‬‬
‫ا ًأوال‪ ،‬والعن�صر االأحدث ُيعالَج اآخرًا‪.‬‬ ‫اإىل الطاب��ور ا ًأوال ه��ي نف�ص��ها الت��ي تخ��رج من��ه ا ًأوال‪ .‬الطابور هو هي��كل البيانات الذي‬ ‫‪Enter your choice: 1‬‬
‫أوال (‪ ، )First In First Out - FIFO‬مم��ا يعن��ي‬ ‫أوال َيخ�رُج ا ً‬
‫َيتب��ع قاع��دة امل ُ�ص��اف ا ً‬ ‫‪Enter element for push: 26‬‬
‫اأن كل عن�صر يف الطابور ُيق َّدم بالرتتيب نف�صه الذي و�صل به اإىل الطابور‪.‬‬ ‫]‪The stack so far is: [26‬‬
‫‪-----------------------------‬‬
‫الفرق بني امل ُكدّ�س والطابور هو اأنه يف امل ُكدّ�س‬ ‫‪Choose 1 for push‬‬
‫تتم اإ�صافة وحذف العن�صر من نف�س اجلانب‪،‬‬ ‫اأ�صف العن�صر‬
‫‪Choose 2 for pop‬‬ ‫اإىل امل ُكدّ�س‬
‫ويف الطابور تتم االإ�صافة من جانب‪ ،‬بينما‬ ‫‪Choose 3 for end‬‬
‫يتم احلذف من اجلانب االآخر‪ .‬وهكذا‪ ،‬عند‬ ‫‪-----------------------------‬‬ ‫اأ�صف العن�صر‬
‫احلذف يف امل ُكدّ�س‪ ،‬يُحذف العن�صر امل ُ�صاف‬ ‫قاعدة المُ�صاف ا ًأوال يَخرُج ا ًأوال‬ ‫‪Enter your choice: 1‬‬ ‫اإىل امل ُكدّ�س‬
‫اآخرًا‪ ،‬بينما يف الطابور‪ ،‬يُحذف العن�صر‬ ‫‪Enter element for push: 18‬‬
‫]‪The stack so far is: [26, 18‬‬ ‫‪23‬‬
‫أوال‪.‬‬
‫امل ُ�صاف ا ً‬ ‫‪-----------------------------‬‬
‫‪Choose 1 for push‬‬ ‫اأ�صف العن�صر‬
‫اإىل امل ُكدّ�س‬ ‫‪18‬‬
‫‪Choose 2 for pop‬‬
‫‪Choose 3 for end‬‬ ‫‪18‬‬
‫‪-----------------------------‬‬
‫‪Enter your choice: 1‬‬
‫‪Enter element for push: 23‬‬ ‫‪26‬‬ ‫‪26‬‬ ‫‪26‬‬
‫]‪The stack so far is: [26, 18, 23‬‬
‫‪-----------------------------‬‬
‫املوؤ�صر (‪:)Pointer‬‬ ‫العمليات يف الطابور ‪:Operations on the Queue‬‬ ‫�صكل ‪ :1.20‬اإ�صافة العنا�صر‬
‫املوؤ�ص��ر ه��و ُمتغر يُخزِّ ن اأو يُ�ص��ر‬ ‫هناك عمليتان رئي�صتان يف الطابور‪:‬‬
‫اإىل عن��وان ُمتغ��ر آاخ��ر‪ .‬املوؤ�ص��ر‬ ‫ميكن��ك االآن ح��ذف عن�صري��ن م��ن املُك ّد���ص‪ ،‬ثم‬
‫‪Choose 1 for push‬‬
‫ي�ص��به رق��م ال�صفح��ة يف فهر���ص‬ ‫• اإ�صافة عن�صر للطابور (‪ :)Enqueue‬تُ�صتخدَ م العملية الإ�صافة عن�صر يف اآخر الطابور‪.‬‬ ‫‪Choose 2 for pop‬‬
‫اخلروج من الربنامج‪.‬‬
‫• ح��ذف عن�ص��ر م��ن الطاب��ور (‪ :)Dequeue‬تُ�ص��تخدَ م العملي��ة حل��ذف عن�ص��ر من مقدمة‬ ‫‪Choose 3 for end‬‬
‫الكت��اب الذي ُي�ص� ِّهل عل��ى القارئ‬ ‫‪-----------------------------‬‬
‫الو�صول اإىل املحتوى املطلوب‪.‬‬ ‫الطابور‪.‬‬ ‫‪Enter your choice: 2‬‬
‫‪The pop element is: 23‬‬
‫]‪The stack so far is: [26, 18‬‬
‫موؤ�صرات الطابور ‪Queue Pointers‬‬ ‫‪-----------------------------‬‬ ‫حذف العن�صر‬
‫الفهر�س (‪:)Index‬‬ ‫يحتوي الطابور على موؤ�صرين‪:‬‬ ‫‪Choose 1 for push‬‬ ‫من امل ُكدّ�س‬
‫الفهر���ص ه��و رق��م ُيح� ِّ�دد مو�ص��ع‬ ‫‪Choose 2 for pop‬‬
‫• املوؤ�صر االأمامي (‪ :)Front Pointer‬يُ�صر اإىل العن�صر االأول يف الطابور‪.‬‬ ‫‪Choose 3 for end‬‬
‫حذف العن�صر‬
‫العن�صر يف هيكل البيانات‪.‬‬ ‫من امل ُكدّ�س‬
‫‪-----------------------------‬‬
‫• املوؤ�صر االأخر (‪ُ :)Rear Pointer‬ي�صر اإىل العن�صر االأخر يف الطابور‪.‬‬ ‫‪Enter your choice: 2‬‬
‫‪23‬‬
‫‪The pop element is: 18‬‬ ‫‪23‬‬
‫]‪The stack so far is: [26‬‬ ‫‪18‬‬
‫املوؤ�صر االأمامي‬ ‫‪Q u e u e‬‬
‫املوؤ�صر اخللفي‬ ‫‪-----------------------------‬‬
‫حذف عن�صر‬ ‫اإ�صافة عن�صر‬ ‫‪Choose 1 for push‬‬ ‫‪18‬‬ ‫‪18‬‬
‫من الطابور‬ ‫للطابور‬ ‫‪Choose 2 for pop‬‬
‫‪Choose 3 for end‬‬
‫‪-----------------------------‬‬ ‫‪26‬‬ ‫‪26‬‬ ‫‪26‬‬
‫‪9‬‬ ‫‪17‬‬ ‫‪43‬‬ ‫‪21‬‬ ‫‪7‬‬ ‫‪12‬‬ ‫‪56‬‬ ‫‪23‬‬ ‫‪4‬‬ ‫‪14‬‬ ‫‪31‬‬ ‫‪Enter your choice: 3‬‬
‫الفهر�س‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪8‬‬ ‫‪9‬‬ ‫‪10‬‬ ‫‪End of program‬‬

‫�صكل ‪ :1.22‬العمليات يف الطابور‬ ‫�صكل ‪ :1.21‬حذف العنا�صر‬


‫‪33‬‬ ‫‪32‬‬
‫الطابور يف لغة البايثون ‪Queue in Python‬‬ ‫عملية اإ�صافة عن�صر للطابور ‪Enqueue Operation‬‬
‫ميك��ن متثي��ل الطاب��ور بع��دة ط��رق متنوع��ة يف لغ��ة البايث��ون منه��ا القوائ��م (‪ .)Lists‬ويرج��ع ذل��ك اإىل حقيق��ة اأن القائم��ة متث��ل‬ ‫ال مُيكنك اإ�صافة عن�صر اأو‬ ‫يُطل��ق عل��ى عملي��ة اإ�صاف��ة عن�ص��ر جدي��د اإىل الطاب��ور ا�ص��م اإ�صاف��ة عن�ص��ر للطاب��ور‬
‫جمموعة من العنا�صر اخلطيّة‪ ،‬كما ميكن اإ�صافة عن�صر يف نهاية القائمة وحذف عن�صر من بداية القائمة‪.‬‬ ‫حذفه من و�صط الطابور‪.‬‬ ‫(‪ .)Enqueue‬الإ�صافة عن�صر جديد اإىل الطابور‪:‬‬
‫�صتتعلم فيما يلي ال�صيغ العامة لبع�ص العمليات التي ميكن تنفيذها على الطابور‪:‬‬ ‫• تت��م زي��ادة قيم��ة املوؤ�ص��ر اخللف��ي بقيم��ة واح��د بحي��ث ي�ص��ر اإىل مو�ص��ع العن�ص��ر اجلدي��د‬
‫الذي �صيُ�صاف‪.‬‬
‫جدول  ‪ُ :1.3‬ط ُرق الطابور‬ ‫• تتمّ اإ�صافة العن�صر‪.‬‬
‫الو�صف‬ ‫الطريقة‬
‫ت�صيف العن�صر ‪ x‬اإىل القائمة التي متثل الطابور‪.‬‬ ‫(‪listName.append)x‬‬
‫االأمامي‬ ‫اخللفي‬ ‫االأمامي‬ ‫اخللفي‬ ‫االأمامي‬ ‫اخللفي‬
‫حتذف العن�صر االأول من القائمة‪.‬‬ ‫(‪listName.pop)0‬‬

‫تُ�ص��تخدَ م طريق��ة ()‪ listName.pop‬ل��كلٍ م��ن هي��اكل بيان��ات املُك ّد���ص والطاب��ور‪ .‬عندم��ا تُ�ص��تخدَ م م��ع املُك ّد���ص‪ ،‬ال‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬
‫تتطل��ب الطريق��ة اأي مُعام��ل‪ .‬بينم��ا تتطل��ب الطريق��ة اإ�صاف��ة �صف��ر اإىل املُعام��ل عندم��ا تُ�ص��تخدم م��ع الطاب��ور‪:‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬
‫ُو�صح يف اجلدول ‪ 1.4‬اأدناه‪.‬‬ ‫(‪ .listName.pop)0‬الفرق بن الدالتن م ّ‬
‫بعد‬ ‫اإ�صافة عن�صر للطابور‬ ‫قبل‬
‫جدول  ‪ :1.4‬طريقة ()‪ listName.pop‬مقابل طريقة (‪listName.pop)0‬‬ ‫�صكل ‪ :1.23‬عملية اإ�صافة عن�صر للطابور‬
‫الو�صف‬ ‫الطريقة‬
‫اإذا كان ُم ِ‬
‫عامل الدالة فارغً ا‪ُ ،‬يحذف العن�صر االأخر من نهاية القائمة التي متثل املُكدّ�ص‪.‬‬ ‫()‪listName.pop‬‬
‫اإذا كان ُم ِ‬
‫عامل الدالة �صف ًرا‪ُ ،‬يحذف العن�صر االأول من القائمة التي متثل الطابور‪.‬‬ ‫(‪listName.pop)0‬‬ ‫قبل اأي اإجراء عليك‬ ‫عملية حذف عن�صر من الطابور ‪Dequeue Operation‬‬
‫التحقق مما اإذا كانت هناك‬
‫مثاال على تطبيق الطابور يف لغة البايثون‪:‬‬
‫�صن�صتعر�ص لك ً‬ ‫م�صاحة فارغة يف الطابور‬ ‫يُطلق على عملية حذف عن�صر من الطابور ا�صم حذف عن�صر من الطابور (‪.)Dequeue‬‬
‫• اأن�صئ طابورًا لتخزين جمموعة من االأرقام (‪.)45 ،32 ،21 ،1‬‬ ‫الإ�صافة عن�صر جديد‪،‬‬ ‫حلذف عن�صر من الطابور‪:‬‬
‫وتوافر عن�صر واحد على‬ ‫• يُحذف العن�صر املُ�صار اإليه باملوؤ�صر االأمامي‪.‬‬
‫• ا�صتخدم عملية حذف عن�صر من الطابور مرتن حلذف العن�صرين االأ َّولَن منه‪.‬‬ ‫االأقل لت�صديره‪.‬‬
‫• ا�صتخدم عملية اإ�صافة عن�صر اإىل الطابور الإ�صافة عن�صر جديد اإليه‪.‬‬ ‫• تتم زيادة قيمة املوؤ�ص��ر االأمامي بقيمة واحد بحيث ي�ص��ر اإىل العن�صر اجلديد التايل يف‬
‫الطابور‪.‬‬
‫االأمامي‬ ‫اخللفي‬ ‫االأمامي‬ ‫اخللفي‬ ‫اخللفي االأمامي‬
‫االأمامي‬ ‫اخللفي‬ ‫االأمامي‬ ‫اخللفي‬ ‫االأمامي‬ ‫اخللفي‬

‫‪1‬‬ ‫‪21‬‬ ‫‪32‬‬ ‫‪45‬‬ ‫‪1‬‬ ‫‪21‬‬ ‫‪32‬‬ ‫‪45‬‬ ‫‪21‬‬ ‫‪32‬‬ ‫‪45‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫حذف عن�صر‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫حذف عن�صر‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬
‫من الطابور‬ ‫من الطابور‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬

‫اخللفي االأمامي‬ ‫االأمامي‬ ‫اخللفي‬ ‫بعد‬ ‫حذف عن�صر من الطابور‬ ‫قبل‬

‫�صكل ‪ :1.24‬عملية حذف عن�صر من الطابور‬


‫‪32‬‬ ‫‪45‬‬ ‫‪78‬‬ ‫‪32‬‬ ‫‪45‬‬ ‫‪78‬‬ ‫الطابور االأخير‬
‫‪0‬‬ ‫‪1‬‬ ‫اإ�صافة عن�صر‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬
‫للطابور‬
‫�صكل ‪ :1.25‬مثال تو�صيحي ملفهوم الطابور‬
‫‪35‬‬ ‫‪34‬‬
‫تطبيقات على الطابور ‪Queue Applications‬‬ ‫لربجم��ة اخلط��وات املو�صح��ة باالأعل��ى بلغ��ة البايث��ون‪� ،‬صتَ�ص��تخدِ م قائم��ة البايث��ون لتنفي��ذ هي��كل الطاب��ور‪ ،‬كم��ا فعل��ت يف‬
‫أاح��د االأمثل��ة عل��ى تطبيق��ات الطاب��ور يف عل��وم احلا�ص��ب هو طابور الطباعة‪ .‬على �ص��بيل املثال‪ ،‬لديك معمل حا�ص��ب به ‪ 30‬جهاز حا�ص��ب‬ ‫املُكدّ�ص‪.‬‬
‫مت�صل��ن بطابع��ة واح��دة‪ .‬عندم��ا يرغ��ب الطلب��ة يف طباع��ة املُ�ص��تندات‪� ،‬صت�ص�كّل مه��ا ّم الطّ باع� ِة طاب��ورًا ملعاجلته��ا وف��ق قاع��دة امل ُ�ص��اف‬ ‫]‪myQueue=[1,21,32,45‬‬
‫أوال (‪ ،)FIFO‬اأي اأنّ تل��ك امله��ام �ص�تُنج ُز بالرتتي��ب الزمن��ي ال��ذي اأُر�ص�لَت ب��ه اإىل الطابع��ة‪ .‬املهم��ة املُر�ص��لة ا ًأوال �ص��وف ُتطب��ع‬
‫أوال َيخ�رُج ا ً‬
‫ا ً‬ ‫)‪print("Initial queue: ", myQueue‬‬
‫قبل املهمة املُر�ص��لة بعدها ولن تُطبع املهمة يف نهاية الطابور قبل طباعة كل املهام التي قبلها‪ .‬عندما تنتهي الطابعة من اأحد االأوامر‪،‬‬ ‫)‪myQueue.pop(0‬‬
‫)‪myQueue.pop(0‬‬
‫�صوف تبحث يف الطابور ملعرِ فة ما اإن كانت هناك اأوامر اأخرى ملعاجلتها‪.‬‬ ‫)‪print("The new queue after pop: ", myQueue‬‬
‫)‪myQueue.append(78‬‬
‫املُكدّ �س والطابور با�صتخدام وحدة الطابور النمطية‬ ‫)‪print("The new queue after push: ", myQueue‬‬
‫‪Stack and Queue Using Queue Module‬‬
‫ميكن اعتبار القائمة يف لغة البايثون مبثابة طابور وكذلك مُكدّ�ص‪ .‬تُقدِّ م لغة البايثون الوحدة النمطية للطابور (‪)Queue Module‬‬ ‫]‪Initial queue: [1, 21, 32, 45‬‬
‫وهي طريقة اأخرى لتنفيذ هيكلَيّ البيانات املو�صحن‪ .‬تت�صمن الوحدة النمطية للطابور بع�ص الدوال اجلاهزة لال�صتخدام التي ميكن‬ ‫]‪The new queue after pop: [32, 45‬‬
‫تطبيقها على كل من املُكدّ�ص والطابور‪.‬‬ ‫]‪The new queue after push: [32, 45, 78‬‬

‫جدول  ‪ :1.5‬وظائف وحدة الطابور النمطية‬ ‫عليك ا ًأوال اأن تُفرِ غ الطابور من العنا�صر‪.‬‬
‫لكي ت�صاهد ما قد يحدث عندما حتاول حذف عن�صر من طابور فارغ‪َ ،‬‬
‫الو�صف‬ ‫الوظيفة‬
‫]‪myQueue=[1,21,32,45‬‬
‫()‪ queueName=queue.Queue‬تن�صئ طابورًا جديدً ا ا�صمه ‪.queueName‬‬ ‫)‪print("Initial queue: ", myQueue‬‬
‫ت�صيف العن�صر ‪ x‬اإىل الطابور‪.‬‬ ‫(‪queueName.put)x‬‬ ‫)‪a=len(myQueue‬‬
‫)‪print("size of queue ",a‬‬
‫تعود بقيمة حجم الطابور‪.‬‬ ‫()‪queueName.qsize‬‬ ‫‪# empty the queue‬‬
‫تعر�ص وحتذف العن�صر االأول من الطابور والعن�صر االأخر من املُكدّ�ص‪.‬‬ ‫()‪queueName.get‬‬ ‫‪for i in range(a):‬‬
‫)‪myQueue.pop(0‬‬
‫تع��ود بقيم��ة ‪�( True‬صحي��ح) اإن كان الطاب��ور ممتل ًئ��ا‪ ،‬وقيم��ة ‪( False‬خط�اأ)‬ ‫()‪queueName.full‬‬ ‫)‪print(myQueue‬‬
‫اإن كان الطابور فارغً ا‪ ،‬وميكن تطبيقها على املُكدّ�ص كذلك‪.‬‬ ‫)‪myQueue.pop(0‬‬
‫تع��ود بقيم��ة ‪�( True‬صحي��ح) اإن كان الطاب��ور فارغً ��ا والقيم��ة ‪( False‬خط�اأ)‬ ‫()‪queueName.empty‬‬
‫اإن كان الطابور ممتلئًا‪ ،‬ميكن تطبيقها على املُكدّ�ص كذلك‪.‬‬ ‫]‪Initial queue: [1, 21, 32, 45‬‬
‫‪size of queue 4‬‬
‫][‬
‫* ‪from queue import‬‬ ‫تُ�صتخدَم وظائف مكتبة الطابور مع كلٍ من امل ُكدّ�س والطابور‪.‬‬
‫‪--------------------------------------------------------------------‬‬
‫)(‪myQueue = Queue‬‬ ‫‪IndexError‬‬ ‫)‪Traceback (most recent call last‬‬
‫‪# add the elements in the queue‬‬ ‫)(>‪Input In [6], in <cell line: 9‬‬
‫�صت ِ‬
‫َ�صتخدم وحدة الطابور النمطية الإن�صاء طابور‪.‬‬ ‫‪7‬‬ ‫)(‪myQueue.pop‬‬
‫)"‪myQueue.put("a‬‬
‫)"‪myQueue.put("b‬‬ ‫يف هذا املثال عليك‪:‬‬ ‫)‪8 print(myQueue‬‬
‫)"‪myQueue.put("c‬‬ ‫)(‪----> 9 myQueue.pop‬‬
‫)"‪myQueue.put("d‬‬ ‫• ا�ص��تراد مكتب��ة الطاب��ور (‪ )Queue‬ال�ص��تخدام‬
‫)"‪myQueue.put("e‬‬ ‫‪IndexError: pop from empty list‬‬
‫طُ رُق الطابور‪.‬‬
‫‪# print the elements of the queue‬‬ ‫• اإن�صاء طابور فارغ با�صم ‪( myQueue‬طابوري)‪.‬‬
‫‪for element in list(myQueue.queue):‬‬
‫)‪print(element‬‬ ‫• اإ�صاف��ة العنا�ص��ر ‪ e ،d ،c ،b ،a‬اإىل الطاب��ور‬
‫‪( myQueue‬طابوري)‪.‬‬ ‫عليك اأن تتحقق دومًا من وجود عنا�صر يف‬ ‫ظهر الخطاأ الأنك حاولت‬
‫الطابور قبل حماولة حذف عن�صر منه‪.‬‬ ‫حذف عن�صر من طابور فارغ‪.‬‬
‫‪a‬‬ ‫• طباعة عنا�صر الطابور‪.‬‬
‫‪b‬‬ ‫عليك ا�صتيراد وحدة‬
‫‪c‬‬ ‫الطابور في بداية‬
‫‪d‬‬ ‫المقطع البرمجي‪.‬‬
‫‪e‬‬

‫‪37‬‬ ‫‪36‬‬
‫كما ذُ ِكر من قبل فاإن وحدة الطابور حتتوي على بع�ص الوظائف اجلاهزة لال�صتخدام مع املُكدّ�ص اأو الطابور‪ .‬اجلدول‬ ‫اأن�ص��ئ طاب��ورًا مُك َّو ًن��ا م��ن خم���ص قي��م يق��وم املُ�ص��تخدِ م باإدخالها اأثن��اء تنفيذ الربنام��ج‪ ،‬ثم اطبع هذه القي��م‪ ،‬ويف النهاية‬
‫‪ 1.6‬يو�صح وظائف الوحدة التي ُميكن ا�صتخدامها مع هيكل بيانات املُكدّ�ص‪.‬‬ ‫اطبع حجم الطابور‪.‬‬
‫* ‪from queue import‬‬
‫جدول  ‪ :1.6‬وظائف الوحدة املُ�صتخدمة ُ‬
‫للمكدّ �س‬
‫الو�صف‬ ‫الوظيفة‬ ‫)(‪myQueue = Queue‬‬
‫()‪ stackName=queue.LifoQueue‬تن�صئ مُكدّ�صً ا جديدً ا ا�صمه ‪.stackName‬‬ ‫‪# the user enters the elements of the queue for i in range(5):‬‬
‫‪for i in range(5):‬‬
‫حتذف العن�صر االأخر من املُكدّ�ص‪.‬‬ ‫()‪stackName.get‬‬ ‫)" ‪element=input("enter queue element:‬‬
‫)‪myQueue.put(element‬‬
‫�صتَ�صتخدِ م وحدة الطابور الإن�صاء مُكدّ�ص فارغ‪.‬‬ ‫‪# print the elements of the queue‬‬
‫‪for element in list(myQueue.queue):‬‬
‫* ‪from queue import‬‬ ‫)‪print(element‬‬
‫تذكّر اأن العمليات يف امل ُكدّ�س تعمل وفقًا‬
‫)(‪myStack = LifoQueue‬‬ ‫))(‪print ("Queue size is: ",myQueue.qsize‬‬
‫أوال (‪.)LIFO‬‬
‫لقاعدة امل ُ�صاف اآخرًا يَخرُج ا ً‬
‫)"‪myStack.put("a‬‬
‫)"‪myStack.put("b‬‬ ‫‪enter‬‬ ‫‪queue‬‬ ‫‪element:‬‬ ‫‪5‬‬
‫)"‪myStack.put("c‬‬
‫عند ا�صتخدام دالة ‪ get‬مع الطابور‪،‬‬ ‫‪enter‬‬ ‫‪queue‬‬ ‫‪element:‬‬ ‫‪f‬‬
‫)"‪myStack.put("d‬‬ ‫�صتَ�صتنِد عمليات اال�صتدعاء والطباعة اإىل‬ ‫‪enter‬‬ ‫‪queue‬‬ ‫‪element:‬‬ ‫‪12‬‬
‫)"‪myStack.put("e‬‬ ‫أوال (‪.)FIFO‬‬
‫أوال يَخرُج ا ً‬
‫قاعدة امل ُ�صاف ا ً‬ ‫‪enter‬‬ ‫‪queue‬‬ ‫‪element:‬‬ ‫‪b‬‬
‫‪enter‬‬ ‫‪queue‬‬ ‫‪element:‬‬ ‫‪23‬‬
‫‪for i in range(5):‬‬ ‫‪5‬‬
‫)(‪k=myStack.get‬‬ ‫‪f‬‬
‫)‪print(k‬‬ ‫‪12‬‬
‫‪b‬‬
‫‪# empty the stack‬‬ ‫‪23‬‬
‫)(‪checkEmpty= myStack.empty‬‬ ‫‪Queue‬‬ ‫‪size is: 5‬‬
‫)‪print("Is the stack empty?", checkEmpty‬‬
‫اأن�صئ برناجمً ا للتحقق مما اإذا كان الطابور فارغً ا اأم ممتلئًا‪.‬‬
‫‪e‬‬
‫‪d‬‬ ‫* ‪from queue import‬‬
‫‪c‬‬
‫‪b‬‬ ‫)(‪myQueue = Queue‬‬
‫‪a‬‬
‫‪Is the stack empty? True‬‬ ‫)"‪myQueue.put("a‬‬
‫)"‪myQueue.put("b‬‬
‫)"‪myQueue.put("c‬‬
‫مثال‪ :‬الطباعة ‪Print‬‬ ‫)"‪myQueue.put("d‬‬
‫)"‪myQueue.put("e‬‬
‫يظه��ر اأمام��ك يف املث��ال الت��ايل حم��اكاة لطاب��ور الطباع��ة يف الطابعة‪ .‬عندما ي ِ‬
‫ُر�ص��ل املُ�ص� ِ‬
‫�تخدمون اأوام��ر طباعة‪ ،‬تُ�صاف‬
‫اإىل طابور الطباعة‪ .‬ت ِ‬
‫َ�صتخدم الطابعة هذا الطابور لتحديد امللف الذي �ص ُيطبع ا ًأوال‪.‬‬ ‫)(‪checkFull=myQueue.full‬‬
‫)‪print("Is the queue full? ", checkFull‬‬
‫• افرت���ص اأن �ص��عة الطابع��ة ه��ي فق��ط ‪ 7‬ملف��ات‪ ،‬ولك��ن يف الوق��ت نف�ص��ه‪ ،‬حتت��اج اإىل طباع��ة ‪ 10‬ملف��ات م��ن املل��ف ‪A‬‬ ‫)(‪checkEmpty= myQueue.empty‬‬
‫اإىل امللف ‪.J‬‬ ‫)‪print("Is the queue empty? ", checkEmpty‬‬

‫• اكتب برناجمً ا ُميثّل طابور الطباعة منذ بدء اأمر الطباعة االأول ‪ A‬حتى االنتهاء من كل اأوامر الطباعة‪.‬‬
‫‪Is the queue full? False‬‬
‫• اأ�صف اللبنة التي توؤكد اأن طابور اأوامر الطباعة فارغ‪.‬‬ ‫‪Is the queue empty? False‬‬

‫‪39‬‬ ‫‪38‬‬
:‫ُميكنك ا�صتخدام اخلوارزمية االآتية‬
print()
return .‫ اأن�صئ طابور اأوامر الطباعة‬1
printDocument = printQueue.get()
time.sleep(1) # wait one second A B C D E F G
‫ يف‬G ‫ اإىل‬A ‫ اأدرِج امللفات من‬2
print ("OK - ", printDocument, " is printed.") 0 1 2 3 4 5 6 .‫طابور اأوامر الطباعة‬
printQueueSizeMessage()
# print a message with the size of the queue ‫متت طباعته‬ A B C D E F G H
.H ‫ واأدرج امللف‬A ‫اأخرِ ج امللف‬ 3
def printQueueSizeMessage():
printQueueSize = printQueue.qsize() 0 1 2 3 4 5 6
if printQueueSize == 0:
.I ‫ واأدرج امللف‬B ‫اأخرِ ج امللف‬ 4
print ("There are no documents waiting for printing.") ‫متت طباعته‬ B C D E F G H I
elif printQueueSize == 1: 0 1 2 3 4 5 6
print ("There is 1 document waiting for printing.")
else:
C D E F G H I J
.J ‫ واأدرج امللف‬C ‫اأخرِ ج امللف‬ 5
print ("There are ", printQueueSize, " documents waiting for printing.")
‫متت طباعته‬
print() 0 1 2 3 4 5 6
# the main program
‫اأخرج امللفات التي متت طباعتها‬ 6
# send documents to the print queue for printing D E F G H I J
addDocument("Document A") .‫) واحدً ا تلو االآخر‬D-E-F-G-H-I-J(
0 1 2 3 4 5 6
addDocument("Document B")
addDocument("Document C")
addDocument("Document D")
addDocument("Document E") # import the queue library
addDocument("Document F") from queue import *
addDocument("Document G") # import the time library to use the sleep function
printDocument() import time
addDocument("Document H") # initialize the variables and the queue
printDocument() printDocument = " "
addDocument("Document I") printQueueSize = 0
printDocument() printQueueMaxSize = 7
addDocument("Document J") printQueue = Queue(printQueueMaxSize)
addDocument("Document K") # add a document to print the queue
printDocument()
def addDocument(document):
printDocument()
printQueueSize = printQueue.qsize()
printDocument()
if printQueueSize == printQueueMaxSize:
printDocument()
printDocument() print("!! ", document, " was not sent to print queue.")
printDocument() print("The print queue is full.")
printDocument() print()
printDocument() return
printQueue.put(document)
time.sleep(0.5) #Wait 5.0 seconds
Document A sent to print queue. print(document, " sent to print queue.")
There is 1 document waiting for printing. printQueueSizeMessage()
# print a document from the print queue
Document B sent to print queue.
There are 2 documents waiting for printing. def printDocument():
printQueueSize = printQueue.qsize()
Document C sent to print queue. if printQueueSize == 0:
There are 3 documents waiting for printing. print("!! The print queue is empty.")

41 40
‫هياكل البيانات الثابتة واملتغرة ‪Static and Dynamic Data Structures‬‬ ‫‪Document D sent to print queue.‬‬
‫�ص��بق تو�صيح اأن هياكل البيانات هي طريقة فعالة لتخزين البيانات وتنظيمها‪ ،‬وباالإ�صافة اإىل ما تعلمته حول ت�صنيف هياكل‬ ‫‪There are 4 documents waiting for printing.‬‬

‫أي�صا اإىل ثابتة (‪ )Static‬و متغرة (‪.)Dynamic‬‬ ‫البيانات اإىل اأوليّة وغر اأوليّة‪ ،‬فاإنه ميكن ت�صنيفها ا ً‬ ‫‪Document E sent to print queue.‬‬
‫‪There are 5 documents waiting for printing.‬‬
‫هياكل البيانات الثابتة ‪Static Data Structure‬‬
‫‪Document F sent to print queue.‬‬
‫يف البيان��ات الثابت��ة‪ ،‬يك��ون حج��م الهي��كل ثاب ًت��ا‪ ،‬و ُتخ�زَّن عنا�ص��ر البيان��ات يف مواق��ع الذاك��رة املتج��اورة‪ُ .‬تع� ُّد امل�صفوف��ة‬ ‫‪There are 6 documents waiting for printing.‬‬
‫(‪ )Array‬املثال االأبرز لهياكل البيانات الثابتة‪.‬‬
‫‪Document G sent to print queue.‬‬
‫‪There are 7 documents waiting for printing.‬‬
‫هياكل البيانات املتغرة ‪Dynamic Data Structure‬‬
‫يف هي��اكل البيان��ات املتغ��رة‪ ،‬ال يك��ون حج��م الهي��كل ثاب ًت��ا ولك��ن ميك��ن تعديل��ه اأثن��اء تنفي��ذ الربنام��ج‪ ،‬ح�ص��ب العملي��ات‬ ‫‪OK - Document A is printed.‬‬
‫‪There are 6 documents waiting for printing.‬‬
‫املُن َّف��ذة علي��ه‪ .‬تُ�ص َّم��م هي��اكل البيان��ات املتغ��رة لت�ص��هيل تغي��ر حج��م هي��اكل البيان��ات اأثن��اء الت�ص��غيل‪ .‬و ُتع� ُّد القائم��ة‬
‫املرتابطة (‪ )Linked List‬املثال االأبرز لهياكل البيانات املتغرة‪.‬‬ ‫‪Document H sent to print queue.‬‬
‫‪There are 7 documents waiting for printing.‬‬

‫جدول  ‪ :1.7‬مقارنة بني هياكل البيانات الثابتة واملتغرة‬ ‫‪OK - Document B is printed.‬‬
‫‪There are 6 documents waiting for printing.‬‬
‫املتغرة‬ ‫الثابتة‬
‫‪Document I sent to print queue.‬‬
‫ميكن تغير حجم الذاكرة اأثناء الت�صغيل‪.‬‬ ‫حجم الذاكرة ثابت‪.‬‬ ‫حجم الذاكرة‬ ‫‪There are 7 documents waiting for printing.‬‬
‫ُتخ�زَّن العنا�ص��ر يف مواقع متجاورة ُتخ � َّزن العنا�ص��ر يف مواق��ع ع�ص��وائية يف الذاك��رة‬ ‫‪OK - Document C is printed.‬‬
‫الرئي�صة‪.‬‬ ‫يف الذاكرة الرئي�صة‪.‬‬ ‫اأنواع ذاكرة التخزين‬ ‫‪There are 6 documents waiting for printing.‬‬

‫اأبطاأ‪.‬‬ ‫�صرعة الو�صول اإىل البيانات اأ�صرع‪.‬‬ ‫‪Document J sent to print queue.‬‬
‫‪There are 7 documents waiting for printing.‬‬

‫‪!! Document K was not sent to print queue.‬‬


‫‪The print queue is full.‬‬
‫تخ�صي�س الذاكرة ‪Memory Allocation‬‬
‫تنتم��ي القوائ��م املرتابط��ة (‪ )Linked Lists‬اإىل هي��اكل البيان��ات املتغ��رة‪ ،‬وه��ذا يعن��ي اأن عُ ق��د القائم��ة املرتابط��ة ال ُتخ�زَّن يف‬ ‫‪OK - Document D is printed.‬‬
‫‪There are 6 documents waiting for printing.‬‬
‫مواقع الذاكرة املتجاورة مثل البيانات يف امل�صفوفات‪ .‬ولهذا ال�صبب‪ ،‬حتتاج اإىل تخزين املوؤ�صر من عُ قدة اإىل اأخرى‪.‬‬
‫‪OK - Document E is printed.‬‬
‫‪There are 5 documents waiting for printing.‬‬
‫= بايت واحد من الذاكرة املُ�صتخدَ مة‬ ‫املتغرة‬ ‫= بايت واحد من الذاكرة املُ�صتخدَ مة‬ ‫الثابتة‬
‫‪OK - Document F is printed.‬‬
‫‪There are 4 documents waiting for printing.‬‬

‫‪1‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪OK - Document G is printed.‬‬


‫‪There are 3 documents waiting for printing.‬‬
‫‪3‬‬
‫‪OK - Document H is printed.‬‬
‫‪There are 2 documents waiting for printing.‬‬
‫‪2‬‬
‫‪OK - Document I is printed.‬‬
‫‪5‬‬ ‫‪There is 1 document waiting for printing.‬‬

‫‪4‬‬ ‫‪OK - Document J is printed.‬‬


‫‪There are no documents waiting for printing.‬‬
‫ال حتتاج القوائم املرتابطة اإىل اأن تكون متجاورة‬ ‫حتتاج امل�صفوفات اإىل لبنة ذاكرة متجاورة‪.‬‬ ‫‪!! The print queue is empty.‬‬
‫يف الذاكرة ولكن يزداد حجمها بطريقة متغرة‪.‬‬
‫�صكل ‪ :1.26‬مثال على تخ�صي�صيّ الذاكرة الثابتة واملتغرة‪.‬‬
‫‪43‬‬ ‫‪42‬‬
‫عل��ى �ص��بيل املث��ال‪ ،‬اإن كن��ت ترغب يف الو�ص��ول اإىل العُقدة الثالثة‬ ‫القائمة املرتابطة ‪Linked List‬‬
‫يف القائم��ة ملعاجل��ة البيان��ات التي حتتوي عليها‪ ،‬عليك البدء من‬
‫الراأ�س‬ ‫القيم الفارغة‬ ‫ال ُعق��دة االأوىل يف القائم��ة‪ ،‬وم��ن ال ُعق��دة االأوىل للو�ص��ول اإىل‬ ‫القائمة املرتابطة (‪:)Linked List‬‬ ‫القائم��ة املرتابط��ة ه��ي ن��وع م��ن هي��اكل البيان��ات اخلط َّي��ة‪ ،‬وه��ي واح��دة م��ن هي��اكل‬
‫الثانية‪ ،‬ومن الثانية للو�صول اإىل الثالثة‪.‬‬ ‫البيان��ات االأك��ر �ص��هرة يف الربجم��ة‪ .‬القائم��ة املرتابط��ة ت�ص��به �صل�ص��لة م��ن ال ُعق��د‪.‬‬
‫القائم��ة املرتابط��ة ه��ي ن��وع م��ن هي��اكل‬ ‫حتت��وي كل عُ ق��دة عل��ى حقل��ن‪ :‬حق��ل البيان��ات حي��ث ُتخ��زن البيان��ات‪ ،‬وحق��ل يحتوي‬
‫• عنوان العُقدة االأوىل ُخمزَّن يف مُتغر خا�ص (مُ�صتقِل) يُطلق‬ ‫البيان��ات اخلط َّي��ة الت��ي ت�ص��به �صل�ص��لة م��ن‬ ‫عل��ى املوؤ�ص��ر ال��ذي ُي�ص��ر اإىل ال ُعق��دة التالي��ة‪ُ .‬ي�ص��تثنى م��ن هذا ال ُعق��دة االأخرة التي‬
‫‪15‬‬ ‫‪25‬‬ ‫‪30‬‬ ‫عليه عاد ًة الراأ�س (‪.)Head‬‬ ‫العُقد‪.‬‬ ‫ال يحم��ل فيه��ا حق��ل العن��وان اأي بيان��ات‪ .‬اإح��دى مزاي��ا القائم��ة املرتابط��ة ه��ي اأن‬
‫• قيمة موؤ�صر العُقدة االأخرة يف القائمة قيمة فارغة (‪،)Null‬‬ ‫حجمها يزداد اأو يقل باإ�صافة اأو حذف ال ُعقد‪.‬‬
‫العُقدة االأوىل‬ ‫العُقدة الثانية‬ ‫العُقدة الثالثة‬ ‫ُوميثَّل بالرمز ‪.‬‬ ‫الراأ�س‬ ‫القيمة الفارغة‬
‫العُقدة (‪:)Node‬‬ ‫القائمة املرتابطة‬
‫• عندما تكون القائمة فارغة‪ ،‬ي�ص��ر موؤ�ص��ر الراأ���ص اإىل القيمة‬ ‫(‪)Head‬‬ ‫(‪)Null‬‬
‫�صكل ‪ :1.30‬الو�صول اإىل العُقدة الثالثة يف القائمة املرتابطة‬ ‫الفارغة (‪.)Null‬‬ ‫ال ُعق��دة ه��ي اللبن��ة الفردي��ة املُك ِّون��ة لهي��كل‬
‫البيان��ات وحتت��وي عل��ى البيان��ات وراب��ط‬
‫واح��د اأو أاك��ر م��ن الرواب��ط الت��ي تربطه��ا‬ ‫‪5‬‬ ‫‪7.2‬‬ ‫‪-2‬‬ ‫‪ABC‬‬
‫اإلي��ك مث� ً�اال تو�صيح ًي��ا عل��ى القائم��ة املرتابط��ة يف �ص��كل ‪ ،1.31‬كما ذُ ك��ر من قبل فاإن كل عُ قدة تتكون من بيانات وموؤ�ص��ر‬
‫ي�صر اإىل ال ُعقدة التالية‪ ،‬بحيث تُخزّن كل عُ قدة يف الذاكرة يف عنوان ُحم َّدد‪.‬‬ ‫بالعُقد االأخرى‪.‬‬ ‫�صكل ‪ :1.27‬ر�صم تو�صيحي للقائمة املرتابطة‬

‫مثال على العُقدة‪:‬‬ ‫لرنب��ط ال ُعق��دة ال�ص��ابقة بال ُعق��دة التالي��ة بقيم��ة بيان��ات ‪،42‬‬
‫• بيانات العُقدة هي الرقم ‪.15‬‬ ‫الت��ي بدوره��ا تُ�ص��ر اإىل ال ُعق��دة الثالث��ة واالأخ��رة عن��د عن��وان‬
‫‪ 30‬بقيمة بيانات ‪.37‬‬ ‫العُقدة ‪Node‬‬
‫• عنوان العُقدة يف الذاكرة هو ‪.10‬‬ ‫تتكون كل عُ قدة يف القائمة املرتابطة من جزئن‪:‬‬
‫• عنوان العُقدة التالية هو ‪.20‬‬
‫‪12‬‬ ‫• اجلزء االأول يحتوي على البيانات‪.‬‬
‫• اجلزء الثاين يحتوي على موؤ�صر يُ�صر اإىل العُقدة التالية‪.‬‬
‫‪10‬‬ ‫‪15‬‬ ‫‪20‬‬
‫‪10‬‬ ‫‪20‬‬ ‫‪30‬‬
‫‪15‬‬ ‫‪20‬‬ ‫‪42‬‬ ‫‪30‬‬ ‫‪37‬‬
‫حقل البيانات‪.‬‬ ‫موؤ�صر اإلى العُقدة التالية‪.‬‬ ‫لقراءة حمتوى عُقدة حمددة‪ ،‬عليك‬
‫العنوان‪/‬الراأ�س‬ ‫البيانات‬ ‫العنوان التايل‬ ‫املرور على كل العُقد ال�صابقة‪.‬‬
‫�صكل ‪ :1.28‬ر�صم تو�صيحي للعُقد‬
‫�صكل ‪ :1.31‬املوؤ�صرات يف القائمة املرتابطة‬

‫جدول  ‪ :1.8‬األختالفات بني القائمة والقائمة املرتابطة‬ ‫القيمة الفارغة تعني اأنها‬
‫مثاال على القائمة املرتابطة لالأعداد ال�صحيحة‪.‬‬
‫لت�صاهد ً‬
‫القائمة املرتابطة‬ ‫القائمة‬ ‫االختالفات‬ ‫بال قيمة‪ ،‬اأو غر ُحمدَّدة‪ ،‬اأو‬ ‫تتكون القائمة املرتابطة من خم�ص عُ قد‪.‬‬
‫فارغة‪ .‬على الرغم من اأنه يف‬
‫املواقع ع�صوائية يف الذاكرة‪.‬‬ ‫طريقة تخزين الذاكرة املواقع متجاورة يف الذاكرة‪.‬‬ ‫بع�س االأحيان ن�صتخدم الرقم‬ ‫الراأ�س‬ ‫القيمة الفارغة‬
‫ميكن الو�صول اإىل العنا�صر من خالل املوؤ�صر‬ ‫ميكن الو�صول اإىل كل عن�صر برقم‬ ‫الهيكل‬ ‫‪ 0‬لالإ�صارة اإىل القيمة الفارغة‪،‬‬
‫(‪.)Pointer‬‬ ‫الفهر�س (‪.)Index‬‬ ‫اإال اأنه رقم حمدَّد وقد ي�صر‬
‫اإىل قيمة حقيقية‪.‬‬ ‫‪3‬‬ ‫‪12‬‬ ‫‪1‬‬ ‫‪95‬‬ ‫‪21‬‬
‫ُتخ �زَّن الكائن��ات يف �ص��ورة عُ ق��د حتت��وي عل��ى‬ ‫يُخزَّن كل عن�صر تلو االآخر‪.‬‬ ‫احلجم‬
‫البيانات وعنوان العن�صر التايل‪.‬‬ ‫�صكل ‪ :1.29‬ر�صم تو�صيحي ُميثّل قائمة مرتابطة لالأعداد ال�صحيحة‬
‫تُخزَّن البيانات واملوؤ�صرات يف الذاكرة‪.‬‬ ‫تُخ َّزن البيانات وحدَ ها يف الذاكرة‪.‬‬ ‫ا�صتخدام الذاكرة‬ ‫ال ُعق��د يف القائم��ة ال يك��ون له��ا ا�ص��م‪ ،‬وم��ا تعرف��ه عنها هو عنوانها (املوقع الذي تخزن في��ة العُقدة يف الذاكرة)‪ .‬للو�صول‬
‫نوع الو�صول اإىل البيانات الو�صول الع�صوائي اإىل اأي عن�صر بالقائمة‪ .‬الو�صول املت�صل�صل اإىل العنا�صر‪.‬‬ ‫اإىل اأي عُ ق��دة بالقائم��ة‪ ،‬حتت��اج فق��ط اإىل معرف��ة عن��وان ال ُعق��دة االأوىل‪ .‬ث��م تتب��ع �صل�ص��لة ال ُعق��د للو�ص��ول اإىل ال ُعق��دة‬
‫�صرعة اإ�صافة العنا�صر وحذفها‪.‬‬ ‫�صرعة االإ�صافة واحلذف بطء اإ�صافة العنا�صر وحذفها‪.‬‬ ‫املطلوبة‪.‬‬
‫‪45‬‬ ‫‪44‬‬
‫ا ِأ�ص ْف االآن املزيد من العُقد اإىل القائمة املرتابطة‪.‬‬ ‫القائمة املرتابطة يف لغة البايثون ‪Linked List in Python‬‬
‫الفئة (‪:)Class‬‬
‫الفئ��ة ه��ي هي��كل بيان��ات مع�رّف‬ ‫ال تُوف��ر لغ��ة البايث��ون ن��وع بيان��ات ُحم َّدد ُم�ص��بقًا للقوائ��م املرتابطة‪ .‬عليك اإن�ص��اء نوع البيانات‬
‫‪# single node‬‬
‫‪class Node:‬‬ ‫بوا�ص��طة امل�ص��تخدم‪ ،‬ويحت��وي‬ ‫متثيال لهذا النوع من البيانات‪ .‬الإن�صاء‬
‫اخلا�ص بك‪ ،‬اأو ا�صتخدام مكتبات البايثون التي توفر ً‬
‫‪def __init__(self, data = None, next=None):‬‬
‫عل��ى اأع�صاء البيانات (ال�ص��مات‬ ‫قائم��ة مرتابط��ة‪ ،‬ا�ص��تخدم فئ��ات البايث��ون‪ .‬يف املث��ال املو�ص��ح بال�ص��كل ‪� ،1.32‬صتُن�ص��ئ قائم��ة‬
‫‪self.data = data‬‬ ‫مرتابطة مكونة من ثالث ُعقد‪ ،‬كل واحدة ت�صم يومً ا من اأيام االأ�صبوع‪.‬‬
‫‪self.next = next‬‬ ‫‪ ،)Properties‬والطرا ئ��ق‬
‫( ا ل�ص��لو ك ‪)B e h a v i o r‬‬
‫‪# an empty linked list with a head node.‬‬
‫‪class LinkedList:‬‬
‫اخلا�ص��ة بها‪ .‬وتُ�ص��تخدَ م الفئات‬ ‫‪Monday‬‬ ‫‪Tuesday‬‬ ‫‪Wednesday‬‬
‫‪def __init__(self):‬‬ ‫كقوالب الإن�صاء الكائنات‪.‬‬
‫‪self.head = None‬‬ ‫�صكل ‪ :1.32‬مثال على القائمة املرتابطة‬

‫‪# the main program‬‬ ‫�صتُن�صئ ا ًأوال عُ قدة با�صتخدام الفئة‪.‬‬


‫)(‪linked_list = LinkedList‬‬
‫‪# the first node‬‬
‫)"‪linked_list.head = Node("Monday‬‬ ‫‪# single node‬‬
‫‪# the second node‬‬ ‫‪class Node:‬‬
‫)"‪linked_list.head.next = Node("Tuesday‬‬ ‫‪def __init__(self, data, next=None):‬‬
‫‪# the third node‬‬ ‫‪self.data = data # node data‬‬
‫)"‪linked_list.head.next.next = Node("Wednesday‬‬ ‫‪self.next = next # Pointer to the next node‬‬

‫‪# print the linked list‬‬ ‫‪# Create a single node‬‬


‫‪node = linked_list.head‬‬ ‫)"‪first = Node("Monday‬‬
‫تُ�صتخدَ م عبارة ‪ while‬للتنقل من عُ قدة‬ ‫)‪print(first.data‬‬
‫‪while node:‬‬
‫)‪print (node.data‬‬
‫اإلى اأخرى‪.‬‬
‫‪node = node.next‬‬
‫‪Monday‬‬

‫‪Monday‬‬
‫‪Tuesday‬‬ ‫اخلطوة التالية هي اإن�ص��اء قائمة مرتابطة حتتوي على عُ قدة واحدة‪ ،‬وهذه املرة �صتَ�ص��تخدِ م موؤ�ص��ر الراأ���ص لالإ�ص��ارة اإىل‬
‫‪Wednesday‬‬ ‫العُقدة االأوىل‪.‬‬

‫اإ�صافة العُقدة اإىل القائمة املرتابطة‬ ‫‪# single node‬‬


‫‪12‬‬ ‫‪99‬‬ ‫‪class Node:‬‬
‫‪Add a Node to a Linked List‬‬ ‫‪def __init__(self, data = None, next=None):‬‬
‫‪node‬‬ ‫‪node.next‬‬ ‫‪self.data = data‬‬
‫لتتمكن من اإ�صافة عُ قدة جديدة‪ ،‬اتبع اخلطوات التالية‪:‬‬ ‫‪self.next = next‬‬
‫‪ .1‬اأن�ص��ئ ال ُعق��دة‬ ‫• يج��ب اأن يُ�ص��ر موؤ�ص��ر ال ُعق��دة االأوىل اإىل عن��وان ال ُعق��دة اجلدي��دة‪ ،‬حت��ى‬
‫‪37‬‬ ‫‪1‬‬ ‫‪# linked list with one head node‬‬
‫اجلديدة‪.‬‬ ‫ت�صبح العُقدة اجلديدة هي العُقدة الثانية‪.‬‬ ‫‪class LinkedList:‬‬
‫• يجب اأن يُ�صر موؤ�صر العُقدة اجلديدة (الثانية) اإىل عنوان العُقدة الثالثة‪.‬‬ ‫‪def __init__(self):‬‬
‫‪self.head = None‬‬
‫‪12‬‬ ‫‪3‬‬
‫‪37‬‬ ‫‪2‬‬
‫‪99‬‬ ‫به��ذه الطريق��ة‪ ،‬ل��ن حتت��اج اإىل تغي��ر العنا�ص��ر عن��د اإ�صاف��ة عن�ص��ر جدي��د يف‬
‫املنت�ص��ف‪ .‬تقت�ص��ر العملي��ة عل��ى تغير ِقيَم العناوين يف العُقدة التي تُ�ص�رِّع من‬ ‫‪# list linked with a single node‬‬
‫‪node‬‬ ‫‪node.next‬‬ ‫‪node.next.next‬‬ ‫)(‪Linkedlist1 = LinkedList‬‬
‫عملية االإ�صافة يف حالة القوائم املرتابطة‪ ،‬مقارنًة بحالة القوائم املت�صل�صلة‪.‬‬
‫)"‪Linkedlist1.head = Node("Monday‬‬
‫‪ .2‬اربُط العُقدة ‪ 37‬بالعُقدة ‪.99‬‬ ‫مثال‪:‬‬ ‫)‪print(Linkedlist1.head.data‬‬

‫‪ .3‬ار ُب��ط ال ُعق��دة ‪ 12‬بال ُعق��دة ‪37‬‬ ‫لدي��ك قائم��ة مرتابط��ة م��ن عن�صري��ن‪ 12 :‬و‪ ،99‬وتري��د اإدراج العن�ص��ر ‪ 37‬كعن�ص��ر‬
‫(متت اإ�صافة العُقدة اجلديدة)‪.‬‬ ‫ثانٍ بالقائمة‪ .‬يف النهاية‪� ،‬صيكون لديك قائمة من ثالثة عنا�صر‪ 12 :‬و‪ 37‬و‪.99‬‬ ‫‪Monday‬‬

‫‪47‬‬ ‫‪46‬‬
# single node # single node
class Node: 12 37 99 class Node:
def __init__(self, data = None, next=None): def __init__(self, data = None, next=None):
self.data = data node node.next node.next.next self.data = data
self.next = next self.next = next
.99 ‫ بالعُقدة‬12 ‫ اربُط موؤ�صر العُقدة‬.1
# linked list with one head node # linked list with one head node
class LinkedList: .37 ‫ احذف العُقدة‬.2 class LinkedList:
def __init__(self): def __init__(self):
self.head = None self.head = None
1
12 99
def deleteNode(key, follow): def insertAfter(new, prev):
node node.next # create the new node
# store the head node new_node = Node(new)
temp = follow.head
2 # make the next of the new node the same as the next of the previous node
37 new_node.next = prev.next
# find the key to be deleted,
node.next # make the next of the previous node the new node
# the trace of the previous node to be changed
prev.next = new_node
while(temp is not None):
if temp.data == key: ‫النتيجة النهائية‬.3
break
# create the linked list
prev = temp L_list = LinkedList()
temp = temp.next 3
12 99 # add the first two nodes
# unlink the node from the linked list L_list.head = Node(12)
node node.next
prev.next = temp.next second = Node(99)
temp = None L_list.head.next = second

# create the linked list # insert the new node after node 12 (the head of the list)
L_list = LinkedList() insertAfter(37, L_list.head)

# add the first three nodes # print the linked list


L_list.head = Node(12) node = L_list.head
second = Node(37) while node:
third = Node(99) print (node.data)
L_list.head.next = second ‫اإذا كنت تريد حذف العُقدة االأوىل من‬ node = node.next
second.next = third
‫ عليك نقل موؤ�صر‬،‫القائمة املرتابطة‬
# delete node 37 .‫الراأ�س اإىل العُقدة الثانية من القائمة‬ 12
deleteNode(37,L_list) 37
99
# print the linked list
node = L_list.head
while node: Delete a Node from a Linked List ‫حذف العُقدة من القائمة املرتابطة‬
print (node.data)
node = node.next .‫ عليك تغير ُموؤ�صر العُقدة التي ت�صبق العُقدة املراد حذفها اإىل موؤ�صر العُقدة التي تلي العُقدة املحذوفة‬،‫حلذف عُ قدة‬
َّ ‫) و�ص� ُت‬Useless Data( ‫اأ�صبح��ت ال ُعق��دة املحذوف��ة (الثاني��ة) عب��ارة ع��ن بيانات غر ُمفيدة‬
‫خ�ص�ص م�ص��احة الذاكرة‬
12
.‫التي ت�صغلها ال�صتخدامات اأخرى‬
99
:‫مثال‬
‫ �ص��يكون لدي��ك‬،‫ يف النهاي��ة‬.37 ‫ وترغ��ب يف ح��ذف العن�ص��ر‬،99‫ و‬37‫ و‬12 :‫لدي��ك قائم��ة مرتابط��ة م��ن ثالث��ة عنا�ص��ر‬
.99‫ و‬12 :‫قائمة من عن�صرين‬
49 48
‫امل ُخرَج النهائي‬ ‫امل ُكدّ�س‬ ‫‪ 4‬لديك مُكدّ�س به �صت م�صاحات فارغة‪.‬‬
‫مترينات‬
‫‪5‬‬ ‫‪5‬‬
‫�صتُ�صيف احلروف االآتية ‪ C‬و‪ E‬و‪ B‬و‪ A‬و‪ D‬يف املواقع من ‪ 0‬اإىل ‪.4‬‬ ‫•‬
‫‪1‬‬
‫امالأ امل ُكدّ�س الذي يُ�صر اإىل موقع املوؤ�صر العلوي‪.‬‬ ‫•‬
‫‪4‬‬ ‫‪4‬‬ ‫َنفِّذ العمليات التالية‪:‬‬ ‫•‬ ‫خاطئة‬ ‫�صحيحة‬ ‫حدِّد اجلملة ال�صحيحة واجلملة اخلاطئة فيما يلي‪:‬‬
‫‪pop‬‬ ‫‪push K‬‬ ‫‪push X‬‬ ‫‪pop‬‬ ‫‪pop‬‬
‫‪ .1‬لغة البايثون تُعرِّف هياكل البيانات غر االأوليّة‪.‬‬
‫‪3‬‬ ‫‪3‬‬
‫اظهِر امل ُخرَج النهائي بعد تنفيذ العمليات ال�صابقة لالإ�صارة اإىل موقع‬
‫‪ .2‬هياكل البيانات اخلطيَّة تُخزِّ ن عنا�صر البيانات يف ترتيب ع�صوائي فقط‪.‬‬
‫‪2‬‬ ‫‪2‬‬ ‫املوؤ�صر العلوي‪.‬‬
‫املو�صح باالأعلى‪ ،‬ثم َنفِّذ العمليات‬
‫اكتب الربنامج الذي يُن�صئ امل ُكدّ�س َّ‬ ‫‪ .3‬اإ�صاف�ة العنا�ص�ر وحذفه�ا م�ن القائم�ة املُرتابط�ة (‪ )Linked List‬اأبط� أا م�ن القائم�ة‬
‫‪1‬‬ ‫‪1‬‬ ‫(‪.)List‬‬
‫املذكورة اأعاله با�صتخدام مكتبة الطابور القيا�صية‪.‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪ .4‬ميكن الو�صول اإىل العنا�صر يف القائمة با�صتخدام رقم الفهر�ص فقط‪.‬‬
‫‪ُ .5‬ميكن تغير حجم هيكل البيانات الثابتة اأثناء تنفيذ الربنامج‪.‬‬

‫‪ 5‬لديك الت�صل�صل الرقمي االآتي‪ 4 :‬و‪ 8‬و‪ 2‬و‪ 5‬و‪ 9‬و‪.13‬‬


‫ما العملية امل ُ�صتخدَمة الإ�صافة العنا�صر املو�صحَّ ة باالأعلى اإىل الطابور؟‬ ‫•‬
‫‪ 2‬حدِّد االختالفات بني هياكل البيانات الثابتة واملتغرة‪.‬‬
‫هياكل البيانات املتغرة‬ ‫هياكل البيانات الثابتة‬

‫اأكمل الطابور بعد اإ�صافة العنا�صر‪.‬‬ ‫•‬


‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬

‫ما العملية امل ُ�صتخدَمة حلذف العنا�صر من الطابور؟‬ ‫•‬

‫‪ 3‬اكتب مثالني ال�صتخدامات القوائم املرتابطة‪.‬‬


‫كم مرة يجب تنفيذ العملية املو�صحَّ ة باالأعلى حلذف العن�صر الذي قيمته ‪5‬؟‬ ‫•‬

‫اأكتب املقطع الربجمي بلغة البايثون الإن�صاء الطابور ال�صابق‪.‬‬ ‫•‬

‫‪51‬‬ ‫‪50‬‬
‫الدر�س الثالث‬ ‫‪ 6‬با�صتخدام العُقد التالية ار�صِّ م القائمة املرتابطة ثم اكتب القيم يف القائمة بالرتتيب ال�صليم‪:‬‬
‫هياكل البيانات غر اخلط َّية‬
‫=‪3‬‬ ‫الراأ�س‬
‫‪5‬‬ ‫‪9‬‬ ‫‪2‬‬
‫‪3‬‬ ‫‪0‬‬ ‫‪4‬‬
‫‪4‬‬ ‫‪1‬‬ ‫‪5‬‬
‫‪2 -3‬‬

‫يف الدر���ص ال�ص��ابق تع ّلم��ت بع���ص هي��اكل البيان��ات اخلط َّي��ة‪ ،‬وفيه��ا كل عن�ص��ر يَتب��ع العن�ص��ر االآخ��ر بطريق��ة خط َّي��ة‪ .‬ه��ل ميكنك‬
‫التفكر يف حالة ال ت�صر فيها االأ�صياء بت�صل�صل خطيّ ؟ على �صبيل املثال‪ ،‬هل ميكن لعن�صر واحد اأن يتبعه اأكر من عن�صر؟‬

‫هياكل البيانات غر اخلطيَّة ‪Non-Linear Data Structures‬‬


‫هي نوع من هياكل البيانات يتميز باإمكانية ربط عن�صر باأكر من عن�صر واحد يف الوقت نف�صه‪ .‬ومن االأمثلة التو�صيحية‬
‫وخمطَّ طات البيانات‪ .‬ال�صكل ‪ 1.33‬يو�صح هياكل البيانات اخلط َّية وهياكل‬
‫على هياكل البيانات غر اخلط َّية‪ :‬االأ�صجار ُ‬ ‫‪ 7‬اأن�صئ قائمة ُ‬
‫ت�صم االأرقام التالية‪ 5 :‬و‪ 20‬و‪ 45‬و‪ 8‬و‪.1‬‬
‫البيانات غر اخلطيَّة‪.‬‬
‫ار�صم العُقد يف القائمة املرتابطة‪.‬‬ ‫•‬

‫هياكل البيانات غر اخلطيَّة‬ ‫هياكل البيانات اخلطيَّة‬

‫ِ�صفْ عملية اإ�صافة الرقم ‪ 7‬بعد الرقم ‪.45‬‬ ‫•‬

‫ار�صم القائمة اجلديدة‪.‬‬ ‫•‬

‫�صكل ‪ :1.33‬الر�صم التو�صيحي لهياكل البيانات اخلطيَّة وغر اخلطيَّة‬ ‫ِ�صفْ العملية املطلوبة حلذف العُقدة الثانية من القائمة‪.‬‬ ‫•‬

‫جدول  ‪ :1.9‬الفرق بني هياكل البيانات اخلط َّية وغر اخلط َّية‬
‫هياكل البيانات غر اخلطيَّة‬ ‫هياكل البيانات اخلطيَّة‬
‫تُر َّت��ب عنا�ص��ر البيان��ات يف ترتي��ب خط��ي يرتب��ط في��ه ميكن ربط عنا�صر البيانات بالعديد من العنا�صر االأخرى‪.‬‬ ‫ار�صم القائمة املرتابطة النهائية‪.‬‬ ‫•‬
‫كل عن�صر بالعن�صرين ال�صابق والتايل له‪.‬‬
‫ال تُ�صتَعر�ص عنا�صر البيانات يف م�صار واحد‪.‬‬ ‫تُ�صتَعر�ص عنا�صر البيانات يف م�صار واحد‪.‬‬
‫معقّد التنفيذ‪.‬‬ ‫�صهل التنفيذ‪.‬‬

‫‪53‬‬ ‫‪52‬‬
‫وفيما يلي مثال على هيكل بيانات ال�صجرة‪:‬‬ ‫عُقدة‬ ‫األأ�صجار ‪Trees‬‬
‫أ�صال‬
‫قد تكون العُقدة فرعًا وا ً‬
‫يف الوقت نف�صه‪ :‬فرع للعُقدة‬ ‫اجلِ ذر‬ ‫حافّة‬ ‫االأ�ص��جار ه��ي ن��وع م��ن هي��اكل البيان��ات غ��ر اخلط َّي��ة‪ ،‬وتتك��ون ال�ص��جرة م��ن جمموع��ة من‬
‫ال�صابقة واأ�صل للعُقدة التالية‪.‬‬ ‫ال ُعق��د املُر َّتب��ة يف ترتي��ب هرم��ي‪ .‬ترتب��ط كل عُ ق��دة بواح��دة اأو اأك��ر م��ن ال ُعق��د‪ ،‬وترتب��ط‬
‫احليوانات‬ ‫ال ُعق��د م��ع احل��واف يف من��وذج عالق��ة يرب��ط ب��ن االأ�ص��ل (‪ )Parent‬وال َف��رع (‪.)Child‬‬
‫�تخدم االأ�ص��جار يف العدي��د م��ن جم��االت عل��وم احلا�ص��ب‪ ،‬مبا يف ذلك اأنظمة الت�ص��غيل‪،‬‬ ‫تُ�ص� َ‬
‫العُقدة االأ�صل‬ ‫والر�ص��وميات‪ ،‬واأنظم��ة قواع��د البيان��ات‪ ،‬واالألع��اب‪ ،‬وال��ذكاء اال�صطناع��ي‪ ،‬و�ص��بكات‬
‫�صكل ‪ :1.34‬العالقات يف ال�صجرة‬ ‫احلا�صب‪.‬‬
‫الفقاريَّات‬ ‫الالفقاريَّات‬
‫مُ�صطلحات تقنية ال�صجرة املُ�صتخدمة يف هيكل بيانات ال�صجرة‬
‫اجلِ ذر (‪ :)Root‬العُقدة االأوىل والوحيدة يف ال�ص��جرة التي لي���ص لها اأ�صل وتاأتي يف امل�ص��توى االأول من ال�ص��جرة‪ ،‬مثل‪:‬‬ ‫•‬
‫العُقدة ‪ A‬يف ال�صكل ‪.1.35‬‬
‫الطيور‬ ‫االأ�صماك‬ ‫الثد ِييَّات‬ ‫احل�صرات‬ ‫العنكبوتيات‬
‫الفَرع (‪ :)Child‬العُقدة املرتبطة مبا�ص��ر ًة ِبعُقدة يف امل�ص��توى االأعلى‪ ،‬مثل‪ :‬العُقدة ‪ H‬هي فرع العُقدة ‪ ،D‬والعُقدتان‬ ‫•‬
‫العُقدة الفَرع‬ ‫الورقة‬ ‫‪ B‬و‪ C‬هما فرعا العُقدة ‪.A‬‬
‫االأ�صل (‪ :)Parent‬العُقدة التي لها فرع اأو اأكر يف امل�صتوى االأقل‪ ،‬مثل‪ :‬العُقدة ‪ B‬هي اأ�صل العُقدتن ‪ D‬و‪.E‬‬ ‫•‬
‫اجلَمل‬ ‫احل�صان‬ ‫النمر‬ ‫الورقة (‪ :)Leaf‬العُقدة التي لي�ص لها اأي عُ قدة فرعية‪ ،‬مثل‪ :‬الورقة ‪.F‬‬ ‫•‬
‫االأ�صقاء‬ ‫االأ�صقاء (‪ :)Siblings‬كل العُقد الفرعية التي تنبثق من االأ�صل نف�صه‪ ،‬مثل‪:‬العُقدتان ‪ D‬و‪� E‬صقيقتان‪.‬‬ ‫•‬
‫�صكل ‪ :1.36‬مثال على هيكل بيانات ال�صجرة‬
‫احلواف (‪ :)Edges‬الروابط التي ت�صل بن العُقد وال�صجرة‪.‬‬ ‫•‬
‫ال�صجرة الفرعية (‪ :)Sub-Tree‬ال�صجرات التي توجد داخل ال�صجرة االأكرب حجمًا‪ ،‬مثل‪:‬ال�صجرة التي بها العُقدة‬ ‫•‬
‫خ�صائ�س هيكل بيانات ال�صجرة ‪Tree Data Structure Features‬‬ ‫‪ D‬هي االأ�صل والعُقدتان ‪ H‬و‪ I‬هما الفرعان‪.‬‬
‫يُ�صتخدم لتمثيل املُخطَّ ط الهرمي‪.‬‬ ‫•‬ ‫ِ‬
‫اجلذر‬
‫يتميّز باملرونة‪ ،‬فمن ال�صهل اإ�صافة عن�صر من ال�صجرة اأو حذفه‪.‬‬ ‫•‬ ‫ال�صجرة (‪:)Tree‬‬
‫امل�صتوى االأول‬
‫�صهولة البحث عن العنا�صر فيه‪.‬‬ ‫•‬ ‫ال�ص��جرة ه��ي ن��وع م��ن هي��اكل‬ ‫‪A‬‬
‫يعك�ص العالقات الهيكلية بن البيانات‪.‬‬ ‫•‬ ‫البيان��ات غ��ر اخلط َّي��ة‪ ،‬وتتكون‬
‫م��ن جمموع��ة من ال ُعق��د املُرتَّبة‬
‫مثال‬ ‫يف ترتيب هرمي‪.‬‬ ‫احلواف‬
‫تنظي��م امللف��ات يف نظ��ام الت�ص��غيل ه��و مث��ال عمل��ي عل��ى ال�ص��جرة‪ .‬كم��ا يت�ص��ح يف ال�ص��كل ‪ ،1.37‬يوج��د داخ��ل جمل��د‬ ‫امل�صتوى الثاين‬
‫‪( Documents‬امل�صتندات) ُجملد اآخر ا�صمه ‪( Python Projects‬م�صروعات البايثون) يحتوي على ملفن اآخرين‪.‬‬ ‫‪B‬‬ ‫‪C‬‬

‫العُقدة‬ ‫االأ�صقاء‬
‫‪This PC‬‬ ‫احلافة (‪:)Edge‬‬ ‫االأ�صل‬
‫احلاف��ة ت�ص��ل ب��ن عُ ق��د هي��كل‬ ‫امل�صتوى الثالث‬
‫بيانات ال�صجرة‪.‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪G‬‬

‫‪3D Objects‬‬ ‫‪Desktop‬‬ ‫‪Documents‬‬ ‫‪Downloads‬‬ ‫‪Music‬‬ ‫‪Pictures‬‬


‫الورقة‬
‫قد يكون لديك �صجرة ب�صيطة‬
‫تتكون من عُقدة واحدة‪ .‬تكون‬ ‫امل�صتوى الرابع‬
‫‪Alice‬‬ ‫‪Python Projects‬‬ ‫‪H‬‬ ‫‪I‬‬ ‫‪J‬‬
‫هذه العُقدة يف الوقت نف�صه‬
‫جِ ذر هذه ال�صجرة الب�صيطة‪،‬‬ ‫العُقدة‬
‫الأنّها لي�س لها اأ�صل‪.‬‬ ‫الفَرع‬ ‫ال�صجرة‬
‫‪HelloWorld.py‬‬ ‫‪infinite.py‬‬ ‫�صكل ‪ :1.35‬هيكل بيانات ال�صجرة‬
‫الفرعية‬
‫�صكل ‪ :1.37‬تنظيم امللفات يف نظام الت�صغيل‬
‫‪55‬‬ ‫‪54‬‬
‫ال�صجرة الثنائية ‪Binary Tree‬‬ ‫‪a‬‬ ‫هيكل بيانات ال�صجرة يف لغة البايثون‬
‫ال�صجرة الثنائية هي نوع خا�ص من االأ�صجار‪ ،‬يكون لك ّل عُ قد ٍة فيها فرعان على االأكر؛ الفَرع االأمين والفَرع االأي�صر‪ .‬ال�صكل ‪1.40‬‬
‫‪Tree Data Structure in Python‬‬
‫مثاال يو�صح ال�صجرة وال�صجرة الثنائية‪.‬‬
‫يَعر�ص ً‬ ‫‪b‬‬ ‫‪c‬‬ ‫ال تُوفِر لغة البايثون نوعً ا حمددًا م�ص��بقًا من البيانات لهيكل بيانات ال�ص��جرة‪ .‬ومع‬
‫ال�صجرة الثنائية‬ ‫ال�صجرة‬ ‫�صم��م االأ�ص��جار م��ن القوائ��م والقوامي���ص ب�ص��هولة‪ .‬يو�ص��ح ال�ص��كل ‪1.38‬‬ ‫ذل��ك‪ُ ،‬ت َّ‬
‫‪a‬‬ ‫‪a‬‬ ‫‪d‬‬ ‫‪e‬‬ ‫‪f‬‬ ‫تطبيقًا ب�صيطً ا لل�صجرة با�صتخدام القامو�ص‪.‬‬
‫�صكل ‪� :1.38‬صجرة قامو�ص البايثون‬ ‫يف ه��ذا املث��ال‪� ،‬صتُن�ص��ئ �ص��جرة با�ص��تخدام قامو���ص البايث��ون‪� .‬ص��تمثّل عُ ق��د‬
‫‪b‬‬ ‫‪c‬‬ ‫‪b‬‬ ‫‪d‬‬ ‫ال�ص��جر ِة مفاتي��حَ القامو���ص‪ ،‬و�ص��تكون القيم��ة املقابل��ة لكل مفت��اح هي قائمة‬
‫‪c‬‬ ‫حتتوي على ال ُعقد املُت�صلة بحافة مبا�صرة من هذه العُقدة‪.‬‬
‫‪d‬‬ ‫‪e‬‬ ‫‪f‬‬ ‫‪g‬‬ ‫‪e‬‬ ‫‪f‬‬ ‫‪h‬‬ ‫‪i‬‬ ‫‪j‬‬
‫{ = ‪myTree‬‬
‫‪"a": ["b", "c"], # node‬‬
‫‪g‬‬ ‫‪"b": ["d", "e"],‬‬
‫‪h‬‬ ‫‪i‬‬ ‫‪k‬‬ ‫‪"c": [None, "f"],‬‬
‫‪"d": [None, None],‬‬
‫‪"e": [None, None],‬‬
‫الفَرع االأمُين الفَرع االأي�صر‬ ‫‪l‬‬ ‫‪m‬‬
‫‪"f": [None, None],‬‬
‫}‬
‫)‪print(myTree‬‬
‫�صكل ‪ :1.40‬ال�صجرة وال�صجرة الثنائية‬

‫‪{'a': ['b', 'c'], 'b': ['d', 'e'], 'c': [None, 'f'],‬‬


‫جدول  ‪ :1.10‬اأنواع هياكل بيانات ال�صجرة الثنائية‬ ‫}]‪'d': [None, None], 'e': [None, None], 'f': [None, None‬‬
‫ر�صم تو�صيحي للهيكل‬ ‫الو�صف‬ ‫النوع‬
‫يف املثال التايل �صتُن�صئ �صجرة مثل تلك املو�صحة يف ال�صكل ‪:1.39‬‬
‫‪0‬‬ ‫يكون لك ّل عُ قدة اإمّا ‪ 0‬اأو ‪ 2‬من الفروع‬ ‫ال�صجرة الثنائية التّامة‬
‫‪1‬‬ ‫‪2‬‬
‫(‪)Children‬بخالف االأوراق (‪.)Leaves‬‬ ‫(‪)Full Binary Tree‬‬ ‫االأ�صل‬ ‫الفَرع‬
‫‪3‬‬ ‫‪4‬‬
‫‪Data Structures‬‬ ‫‪myTree = {"Data Structures":["Linear","Non-linear"],‬‬
‫‪"Linear":["Stack","Queue","Linked List"],‬‬
‫‪0‬‬ ‫يكون ك ّل م�ص��توًى من م�ص��تويات ال�صجرة ممتلئًا‬ ‫ال�صجرة الثنائية الكاملة‬ ‫}]"‪"Non-linear":["Tree", "Graph‬‬
‫‪1‬‬ ‫‪2‬‬
‫بالكام��ل‪ ،‬رمبا با�ص��تثناء امل�ص��توى االأخر‪ ،‬حيث‬ ‫(‪)Complete Binary Tree‬‬
‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪for parent in myTree:‬‬
‫تك��ون كل ال ُعق��د في��ه ممل��وءة م��ن الي�ص��ار اإىل‬ ‫) "‪print(parent, "has",len(myTree[parent]),"nodes‬‬
‫‪Linear‬‬ ‫‪Non-linear‬‬
‫اليمن‪.‬‬ ‫‪for children in myTree[parent]:‬‬
‫)‪print(" ",children‬‬
‫‪0‬‬ ‫يك��ون ل��كل ال ُعق��د الداخلي��ة فرع��ان وتك��ون كل‬ ‫ال�ص��جرة الثنائي��ة املثالي��ة‬
‫‪1‬‬ ‫‪2‬‬
‫االأوراق عند امل�صتوى نف�صه‪.‬‬ ‫(‪)Perfect Binary Tree‬‬ ‫‪Data structures has 2 nodes‬‬
‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪Tree‬‬ ‫‪Graph‬‬ ‫‪Linear‬‬
‫‪Non-linear‬‬
‫‪Linear has 3 nodes‬‬
‫اأمثلة على تطبيقات هياكل بيانات ال�صجرة‪:‬‬ ‫‪Stack‬‬
‫‪Queue‬‬
‫‪Examples of Applications of Tree Data Structures:‬‬ ‫‪Linked List‬‬
‫‪Non-linear has 2 nodes‬‬
‫تخزين البيانات الهرمية مثل‪ :‬هياكل املجلدات‪.‬‬ ‫•‬ ‫‪Stack‬‬ ‫‪Queue‬‬ ‫‪Linked List‬‬ ‫‪Tree‬‬
‫تعريف البيانات يف لغة ترميز الن�س الت�صعبي (‪.)HTML‬‬ ‫•‬ ‫‪Graph‬‬
‫�صكل ‪� :1.39‬صجرة هياكل البيانات‬
‫تنفيذ الفهر�صة يف قواعد البيانات‪.‬‬ ‫•‬
‫‪57‬‬ ‫‪56‬‬
‫اأنواع املُخطَّ طات ‪Types of Graphs‬‬ ‫هل تقدّم اجلامعة املقرر‬ ‫�صجرة القرار ‪Decision Tree‬‬
‫• امل ُخطَّ ��ط امل ُوجَّ ��ه (‪ :)Directed Graph‬ترتب��ط ال ُعق��د باحل��واف املوجه��ة يف املخط��ط املُوجَّ ��ه‪ ،‬بحي��ث يك��ون للحاف��ة اجت��اه‬ ‫الدرا�صي الذي اأريده؟‬ ‫عب��ارة الق��رار ‪ if a: else b‬ه��ي واح��دة م��ن العب��ارات االأك��ر ا�ص��تخدامً ا يف لغ��ة البايث��ون‪.‬‬
‫واحد‪.‬‬ ‫نعم‬ ‫ومن خالل تداخل وجتميع هذه العبارات‪ ،‬ميكنك ت�صميم �صجرة القرار‪.‬‬
‫ال‬
‫• امل ُخطَّ ��ط غ��ر امل ُوجَّ ��ه (‪ :)Undirected graphs‬ال حتت��وي الو�ص��الت عل��ى اجت��اه يف املُخطَّ ��ط غ��ر املُوجَّ ��ه‪ ،‬وه��ذا يعن��ي اأن‬ ‫تُ�صتخدَ م اأ�صجار القرار يف الذكاء اال�صطناعي من خالل اإحدى تقنيات تعلم االآلة وتُعرف‬
‫احلواف ت�صر اإىل عالقة ثنائية االجتاه ميكن من خاللها عر�ص البيانات يف كال االجتاهن‪.‬‬ ‫هل درجاتي تُلبي‬ ‫َجتاهَ ل‬ ‫با�ص��م‪ :‬تع ُّل��م �ص��جرة الق��رار (‪ .)Decision Tree Learning‬ال ُعق��د االأخ��رة يف ه��ذه‬
‫وجه يتكونان من �صت ُعقد و�صت حواف‪.‬‬ ‫ال�صكل ‪ 1.43‬يعر�ص خمطّ طً ا موجَّ هًا‪ ،‬وخمطّ طً ا غر ُم َّ‬ ‫�صروط القبول؟‬ ‫أي�صا‪ :‬االأوراق‪ ،‬وحتتوي على احللول املُحتملة للم�ص��كلة‪ .‬كل ُعقدة با�ص��تثناء‬ ‫التقنية تُ�ص�مّى ا ً‬
‫نعم‬ ‫ال‬ ‫االأوراق ترتبط بحالة منطقية يتفرع منها احتماال االإجابة بنعم اأو ال‪ .‬اأ�صجار القرار تعترب‬
‫�صهلة الفهم‪ ،‬واال�صتخدام‪ ،‬والت�صوير‪ ،‬وي�صهل التحقق منها‪ ،‬على �صبيل املثال‪ ،‬ال�صكل ‪1.41‬‬
‫تطبيق‬ ‫َجتاهَ ل‬ ‫يو�ص��ح �ص��جرة الق��رار الت��ي ُحت� ِّ�دد ما اإذا كنت �ص�تَتق َّدم بطلب االلتح��اق بجامعة ُحم َّددة اأم‬
‫�صكل ‪ :1.41‬مثال على �صجرة القرار‬ ‫ال بن��ا ًء عل��ى معياري��ن‪ :‬املق��ررات الدرا�ص��ية الت��ي تُد َّر���ص يف اجلامع��ة‪ ،‬وا�ص��تيفاء متطلب��ات‬
‫القبول‪.‬‬
‫امل ُخطّ ط غر امل ُوجَّ ه‬ ‫املخطّ ط امل ُوجَّ ه‬
‫املُخطَّ طات ‪Graphs‬‬
‫�صكل ‪ :1.43‬املُخطَّ ط املُوجَّ ه و املُخطَّ ط غر املُوجَّ ه‬
‫ال�ص�مَة االأك��ر اأهمي��ة لهي��اكل البيان��ات غ��ر اخلط َّي��ة ه��ي اأنّ البيان��ات اخلا�ص��ة به��ا ال تت ّب��ع‬
‫املُخطَّ ط (‪:)Graph‬‬
‫املُخطَّ طات يف احلياة اليومية ‪Graphs in Everyday Life‬‬ ‫املُخطَّ ��ط ه��و هي��كل البيان��ات املُك�وَّن‬
‫�وع م��ن اأن��واع التّ�صل�ص��ل‪ ،‬وذلك على خالف امل�صفوف��ات والقوائم املرتابطة‪ ،‬كما ميكن‬ ‫اأي ن� ٍ‬
‫رب��ط عنا�صره��ا باأك��ر م��ن عن�ص��ر وحي��د‪ .‬ال�ص��جرة اجلذري��ة (‪ )Rooted Tree‬تب��داأ‬
‫�صبكة الويب العاملية ‪World Wide Web‬‬ ‫م��ن جمموع��ة م��ن ال ُعق��د وجمموع��ة‬ ‫ب ُعق��دة جذري��ة ميك��ن ربطه��ا بال ُعق��د االأخ��رى‪َ .‬ت ْتب��ع تتب��ع االأ�ص��جار قواع��د حم��ددة‪ :‬وهي اأن‬
‫ُتع� ُّد �ص��بكة الوي��ب العاملي��ة م��ن اأب��رز االأمثل��ة للمُخطَّ ط��ات‪ ،‬وميك��ن اعتباره��ا مبثاب��ة اأح��د أان��واع املُخطَّ ط��ات املُوجَّ ه��ة حيث‬ ‫م��ن اخلط��وط الت��ي ت�صل ب��ن جميع‬ ‫تكون عقد ال�ص��جرة مت�صلة‪ ،‬واأن تكون ال�ص��جرة خالية من احللقات(‪ )Loops‬واحللقات‬
‫ُمت ِّث��ل الروؤو���س (‪� )Vertices‬صفح��ات الوي��ب‪ُ ،‬ومت ِّث��ل االرتباط��ات الت�ص��عبية احل��واف امل َّ‬
‫ُوجه��ة‪ .‬تنقي��ب ُبن َي��ة الوي��ب‬ ‫العُقد‪ ،‬اأو بع�صها‪.‬‬ ‫الذاتية (‪ ،)Self Loops‬كما اأن لبع�ص اأنواع االأ�صجار قواعدها اخلا�صة (جدول ‪،)1.10‬‬
‫(‪ )Web Structure Mining‬ه��و اكت�ص��اف املعرِ ف��ة املُفي��دة م��ن هي��كل �ص��بكة الوي��ب املُمَث َل��ة م��ن خ��الل االرتباط��ات‬ ‫مثلم��ا يف حال��ة االأ�ص��جار الثنائي��ة‪ .‬ولك��ن م��اذا �ص��يحدث اإذا مل َت َّتب��ع قواع��د االأ�ص��جار؟ يف‬
‫الت�ص��عبية‪ ،‬وميك��ن اأن مي ّث��ل هي��كل املُخطَّ ��ط االرتباط��ات الت�ص��عبية والعالق��ات التي تُن�ص��ئها بن �صفح��ات الويب املختلفة‪.‬‬ ‫ُتغرة‬‫ه��ذه احلال��ة اأن��ت ال تتح��دث ع��ن االأ�ص��جار‪ ،‬ب��ل عن ن��وع جديد من هي��اكل البيان��ات امل ِّ‬
‫خططات ُميكنك ح�صاب االأهمية الن�صبية‬ ‫يعر�ص ال�صكل ‪ 1.44‬ر�ص ًما تو�صيح ًيا ل�صبكة الويب العاملية‪ .‬با�صتخدام هذه املُ َّ‬ ‫كل االأ�صجار ُخمطَّ طات‪ ،‬ولكن لي�صت‬ ‫الت��ي ُت�ص��مى املُخطَّ ط��ات‪ .‬يف احلقيق��ة‪ ،‬االأ�ص��جار هي ن��وع من املُخطَّ طات حي��ث اأن املُخطَّ ط‬
‫‪C‬‬ ‫‪B‬‬
‫ل�صفحات الويب‪.‬‬ ‫كل امل ُخطَّ طات اأ�صجارًا‪.‬‬ ‫ه��و ال�ص��كل الع��ام لهي��كل البيان��ات‪ ،‬مبعن��ى اأن كل هي��اكل البيانات ال�ص��ابقة ميك��ن اعتبارها‬
‫حاالت خا�صة من املُخطَّ طات‪ .‬ال�صكل ‪ 1.42‬يعر�ص ُخمطَّ طً ا به �صت عُ قد وع�صر حواف‪.‬‬
‫‪C‬‬
‫‪A‬‬

‫‪2‬‬
‫جدول  ‪ :1.11‬الفرق بني األأ�صجار واملُخطَّ طات‬
‫‪D‬‬ ‫‪1‬‬
‫‪B‬‬ ‫امل ُخطَّ طات‬ ‫االأ�صجار‬
‫‪D‬‬
‫ت�ص�كّل ال ُعق��د املتّ�صل��ة فيه��ا منوذجً ��ا ت�صكّل العُقد املتّ�صلة فيها‬
‫‪D‬‬
‫‪3‬‬ ‫منوذجً ا �صبكيًّا‪.‬‬ ‫هرميًّا‪.‬‬
‫ال توجد فيها عُ قدة فريدة‬ ‫يف االأ�صجار اجلذرية توجد عُ قدة‬
‫اأو جذرية‪.‬‬ ‫فريدة تُ�صمى اجلِ ذر‪.‬‬
‫�صكل ‪� :1.44‬صبكة الويب العاملية‬ ‫‪5‬‬ ‫‪4‬‬ ‫ترتب��ط ال ُعق��د يف �ص��ورة عالق��ة ب��ن ال تنطبق عالقة االأ�صل‬
‫والفَرع بن العُقد‪.‬‬ ‫االأ�صل والفَرع‪.‬‬
‫يَ�ص��تخدِ م ُحم�رِّك البح��ث قوق��ل (‪ )Google Search Engine‬منهجي��ة مماثل��ة لتحديد االأهمية الن�ص��بية ل�صفحات‬ ‫تركيب املخطّ طات اأكر‬ ‫تتميز بب�صاطة الرتكيب‪.‬‬
‫الوي��ب وم��ن ث��م ترتي��ب نتائ��ج البح��ث ح�ص��ب اأهميته��ا‪ .‬اخلوارزمي��ة املُ�ص��تخدَ مة بوا�ص��طة قوق��ل هي خوارزمي��ة ت�صنيف‬ ‫‪6‬‬ ‫تعقيدً ا‪.‬‬
‫ال�صفحة اأو بيج رانك (‪ )PageRank‬التي ابتكرها موؤ�صِّ �صو قوقل‪.‬‬ ‫قد حتتوي على احللقات‪.‬‬ ‫ال ُي�صمح فيها باحللقات‪.‬‬
‫�صكل ‪ :1.42‬مثال على ُخمطَّ ط به �صت عُ قد وع�صر حواف‬
‫‪59‬‬ ‫‪58‬‬
‫‪a‬‬ ‫املُخطَّ طات يف لغة البايثون ‪Graphs in Python‬‬ ‫في�صبوك ‪Facebook‬‬
‫ال تُو ِف��ر لغ��ة البايث��ون نوعً ��ا حمددًا م�ص��بقًا من البيانات لالأ�ص��جار‪ ،‬كم��ا اأنّها ال تُو ِفر نو ًعا‬ ‫في�صبوك هو مثال اآخر على املُخطَّ طات غر املُوجَّ هة‪ .‬يظهر بال�صكل ‪1.45‬‬
‫امل ُ�صتخدِ م‬
‫‪b‬‬ ‫‪c‬‬ ‫حم��ددًا م�ص��بقًا م��ن البيان��ات لل ُمخطَّ ط��ات‪( ،‬تذك��ر اأن االأ�ص��جار ه��ي ن��وع خا���ص م��ن‬ ‫ال ُعق��د الت��ي ُمت ِّث��ل ُم�ص��تخدمي في�ص��بوك‪ ،‬بينم��ا ُمت ِّث��ل احل��واف عالق��ات‬
‫املُخطَّ طات)‪ .‬ومع ذلك‪ُ ،‬ميكن بِناء املُخطَّ طات با�صتخدام القوائم والقوامي�ص‪.‬‬ ‫ال�صداق��ة‪ .‬عندم��ا تري��د اإ�صافة �صدي��ق‪ ،‬يجب عليه قبول طلب ال�صداقة؛‬
‫ولن يكون ذلك ال�صخ�ص �صديقك على ال�صبكة دون قبول طلب ال�صداقة‪.‬‬
‫‪d‬‬ ‫‪e‬‬ ‫يف املثال التايل‪� ،‬صتقوم بتنفيذ التايل‪:‬‬ ‫(عقدت��ن) ه��ي عالق��ة ثنائي��ة‬ ‫العالق��ة هن��ا ب��ن اثن��ن م��ن املُ�ص� ِ‬
‫�تخدمن ُ‬
‫�صكل ‪ :1.48‬مثال على املُخطَّ ط‬ ‫وجه مثل املُو�صح بال�صكل ‪.1.48‬‬ ‫‪.1‬اإن�صاء ُخمطَّ ط ُم َّ‬ ‫�تخدم خوارزمي��ة مقرتح��ات االأ�صدق��اء يف في�ص��بوك نظري��ة‬ ‫االجت��اه‪ُ .‬ت�ص� َ‬
‫‪.2‬اإن�صاء دالة الإ�صافة عُ قدة اإىل املُخطَّ ط‪.‬‬ ‫عالقة ال�صداقة‬ ‫املُخطَّ طات‪ .‬تَدر�ص حتليالت ال�صبكات االجتماعية العالقات االجتماعية‬
‫‪.3‬اإن�صاء دالة حتتوي على كل م�صارات املُخطَّ ط‪.‬‬ ‫با�صتخدام نظرية املُخطَّ طات اأو ال�صبكات من علوم احلا�صب‪.‬‬
‫�صكل ‪ُ :1.45‬خمطَّ ط في�صبوك غر املُوجَّ ه‬
‫"‪myGraph = { "a‬‬ ‫‪: ["b","c"],‬‬ ‫خرائط قوقل ‪Google Maps‬‬
‫‪"b" :‬‬ ‫‪["c", "d"],‬‬
‫‪"c" :‬‬ ‫‪["d", "e"],‬‬ ‫ي�ص��تخدم تطبيق خرائط قوقل وكل التطبيقات املُ�ص��ابهة له املُخطَّ طات لعر�ص اأنظمة النقل واملوا�صالت حل�ص��اب امل�ص��ار‬
‫‪"d" :‬‬ ‫‪[],‬‬ ‫االأق�ص��ر ب��ن موقع��ن‪ .‬تَ�ص� ِ‬
‫�تخدم ه��ذه التطبيق��ات املُخطَّ ط��ات الت��ي حتتوي على عدد كب��ر جدً ا من ال ُعق��د واحلواف التي‬
‫‪"e" :‬‬ ‫‪[],‬‬
‫}‬
‫ال ُميكن متييزها بالعن املُجردة‪.‬‬
‫)‪print(myGraph‬‬

‫‪{'a': ['b', 'c'], 'b': ['c', 'd'], 'c': ['d', 'e'],‬‬


‫}][ ‪'d': [], 'e':‬‬

‫و�صيتوىل الربنامج الرئي�ص‪:‬‬


‫ّ‬
‫‪ .1‬اإن�صاء املُخطَّ ط‪.‬‬
‫‪ .2‬طباعة املُخطَّ ط‪.‬‬
‫�صكل ‪ :1.46‬خرائط قوقل‬
‫‪ .3‬ا�صتدعاء دالة االإ�صافة‪.‬‬
‫‪ .4‬طباعة كل م�صارات املُخطَّ ط‪.‬‬ ‫ال�صبكة الع�صبية ‪Neural Network‬‬
‫�صت ِ‬
‫َ�صتخدم القامو�ص الذي ُمتثِّل مفاتيحه العُقد باملُخطَّ ط‪ .‬تكون القيمة املقابِلة لكل مفتاح هي قائمة حتتوي على العُقد‬ ‫ال�ص��بكة الع�صبي��ة ه��ي ن��وع ُخمطَّ ��ط تعلُّ��م االآلة الذي يُحاكي الدماغ الب�ص��ري‪ .‬ال�ص��بكات الع�صبية ُميكن اأن تكون �ص��بكات‬
‫املت�صلة بحافة مبا�صرة من هذه العُقدة‪.‬‬ ‫وجهة وفقًا للغر�ص من التعلُّم‪ ،‬وتتكوّن هذه ال�صّ بكات من اخلاليا الع�صبية واالأوزان املُوزعة يف الطبقات‬ ‫مُوجَّ هة وغر ُم َّ‬
‫املختلف��ة‪ُ .‬مت َّث��ل اخلالي��ا الع�صبي��ة بال ُعق��د‪ ،‬بينم��ا ُمت َّث��ل االأوزان باحل��واف‪ .‬يت��م ح�ص��اب تدفق��ات االإ�ص��ارة وحت�ص��ينها يف‬
‫‪# function for adding an edge to a graph‬‬ ‫ُ�صتخدم ال�صبكات الع�صبية يف العديد من التطبيقات الذكية مثل‪:‬‬ ‫جميع اأنحاء ُبنية ال�صبكات الع�صبية لتقليل اخلطاأ‪ .‬ت َ‬
‫‪def addEdge(graph,u,v):‬‬ ‫مثاال على هيكل ال�ص��بكات‬‫الرتجم��ة االآلي��ة‪ ،‬وت�صني��ف ال�ص��ور‪ ،‬وحتدي��د الكائنات‪ ،‬والتع ّرف عليها‪ .‬ال�ص��كل ‪ 1.47‬يو�صح ً‬
‫)‪graph[u].append(v‬‬ ‫الع�صبية‪.‬‬
‫‪# function for generating the edges of a graph‬‬
‫‪def generate_edges(graph):‬‬
‫][ = ‪edges‬‬

‫‪# for each node in graph‬‬


‫‪for node in graph:‬‬

‫طبقة امل ُخرَجات‬ ‫الطبقات املخف َّية‬ ‫طبقة امل ُدخَ الت‬
‫�صكل ‪ :1.47‬هيكل ال�صبكات الع�صبية‬
‫‪61‬‬ ‫‪60‬‬
‫مترينات‬ # for each neighbouring node of a single node
for neighbour in graph[node]:

# if edge exists then append to the list


1 edges.append((node, neighbour))
return edges
‫خاطئة‬ ‫�صحيحة‬ :‫حدِّد اجلملة ال�صحيحة واجلملة اخلاطئة فيما يلي‬
# main program
.‫ ميكن ربط العن�صر يف هياكل البيانات غر اخلطيَّة باأكر من عن�صر واحد‬.1 # initialisation of graph as dictionary
myGraph = {"a" : ["b","c"],
"b" : ["c", "d"],
.‫ تنفيذ هياكل البيانات اخلطيَّة يكون اأكر تعقيدً ا من تنفيذ هياكل البيانات غر اخلطيَّة‬.2 "c" : ["d", "e"],
"d" : [],
"e" : [],
.‫ االأوراق يف تعلُّم �صجرة القرار حتتوي على حلول امل�صكلة‬.3 }

‫) االأهمي��ة الن�ص��بية ل�صفح��ة‬PageRank( ‫ َحت�صِ ��ب خوارزمي��ة قوق��ل ت�صني��ف ال�صفح��ة‬.4 # print the graph contents
print("The graph contents")
.‫ويب على �صبكة الويب العاملية‬ print(generate_edges(myGraph))

.‫ ال�صبكات الع�صبية هي نوع املُخطَّ طات املُ�صتخدَ م لت�صوير امل�صكالت االأخرى‬.5 # add more edges to the graph
addEdge(myGraph,'a','e')
addEdge(myGraph,'c','f')

# print the graph after adding new edges


print("The new graph after adding new edges")
.‫و�صح االختالفات بني االأ�صجار وامل ُخطَّ طات‬
ّ 2 print(generate_edges(myGraph))

‫امل ُخطَّ طات‬ ‫االأ�صجار‬


The graph contents
[('a', 'b'), ('a', 'c'), ('b', 'c'), ('b', 'd'), ('c', 'd'), ('c', 'e')]
The new graph after adding new edges
[('a', 'b'), ('a', 'c'), ('a', 'e'), ('b', 'c'), ('b', 'd'), ('c', 'd'),
('c', 'e'), ('c', 'f')]

.‫ ِ�صفْ كيف تُ�صتخدَم خوارزميات امل ُخطَّ طات يف التطبيقات التجارية‬3

63 62
‫‪ 5‬يظهر اأمامك يف ال�صورة التالية �صفحة حمتويات الكتاب‪.‬‬ ‫‪ 4‬امالأ الفراغات باالأ�صماء ال�صحيحة الأجزاء ال�صجرة‪.‬‬
‫اأكمل متثيل ال�صجرة‪.‬‬ ‫•‬

‫‪Book‬‬
‫‪Book‬‬
‫‪C1‬‬ ‫‪a‬‬
‫‪C1‬‬ ‫‪C2‬‬
‫‪C1.1‬‬
‫‪C1.2‬‬
‫‪C2‬‬
‫‪C1.1‬‬
‫‪C2.1‬‬ ‫‪b‬‬ ‫‪e‬‬
‫‪C2.1.1‬‬
‫‪C2.1.2‬‬
‫‪C2.2‬‬
‫‪C2.3‬‬ ‫‪f‬‬
‫‪C3‬‬

‫‪c‬‬ ‫‪d‬‬ ‫‪i‬‬ ‫‪h‬‬

‫‪g‬‬

‫‪j‬‬ ‫‪k‬‬
‫هل هي �صجرة ثنائية؟ َعلِّل اإجابتك‪.‬‬ ‫•‬

‫‪65‬‬ ‫‪64‬‬
‫با�صتخدام القامو�س يف لغة البايثون اكتب الربنامج املنا�صب لتمثيل هذه ال�صجرة‪ ،‬ثم اأ�صف العُقدة االأ�صل والعُقد الفرعية‪.‬‬ ‫‪ 6‬ار�صم ال�صجرة الناجتة عن املعطيات التالية‪:‬‬
‫العُقدة ‪ A‬لها فرعان ‪ B‬و‪.C‬‬ ‫•‬
‫العُقدتان ‪ D‬و‪ E‬لهما االأ�صل نف�صه وهو العُقدة ‪.B‬‬ ‫•‬
‫العُقدتان ‪ F‬و‪� G‬صقيقتان‪ ،‬ولهما االأ�صل نف�صه وهو العُقدة ‪.C‬‬ ‫•‬
‫العُقدة ‪ H‬لها عُقدتان فرعيتان ‪ I‬و‪ J‬ولها عُقدة اأ�صل ‪.F‬‬ ‫•‬

‫ما نوع ال�صجرة املر�صومة يف االأعلى؟‬

‫‪67‬‬ ‫‪66‬‬
‫ماذا تع ّلمت‬ ‫الم�صروع‬

‫ مفهوم الذكاء األ�صطناعي‪.‬‬


‫ ت�صنيف تطبيقات الذكاء األ�صطناعي‪.‬‬ ‫ُتق�دَّم اخلدم��ة للعم��الء يف اأح��د البن��وك بن��ا ًء على وق��ت و�صولهم‬
‫ ت�صنيف هياكل البيانات‪.‬‬ ‫اإىل ف��رع البن��ك‪ .‬يعم��ل بالبن��ك موظ��ف وحي��د‪ ،‬و ُمتو�ص��ط وق��ت‬
‫اخلدمة لكل عميل هو دقيقتان‪.‬‬
‫ حتديد الفرق بني هيكل بيانات املُكدّ �س وهيكل بيانات الطابور‪.‬‬ ‫ال ُي�صمح باأن يتجاوز الطابور يف البنك ‪ً 40‬‬
‫عميال‪.‬‬
‫ حتديد الفرق بني هيكل بيانات القائمة وهيكل بيانات القائمة املرتابطة‪.‬‬
‫ حتديد الفرق بني هيكل بيانات ال�صجرة وهيكل بيانات املُخطَّ ط‪.‬‬
‫‪1‬‬
‫ تطبيق هياكل البيانات املُعقَّدة با�صتخدام لغة برجمة البايثون‪.‬‬ ‫اأن�ص��ئ برناجمً ��ا بلغ��ة البايث��ون ي�ص��تدعي اإح��دى قي��م اال�ص��تراد‪:‬‬
‫‪( ENTRY‬دخول) اأو ‪( NEXT‬التايل)‪.‬‬
‫• اإن اأدخل�ت القيم�ة ‪( ENTRY‬دخول) ‪� ،‬ص�يقراأ الربنامج ا�ص�م‬
‫العمي�ل وبعده�ا مبا�ص�ر ًة ُيظهِ �ر ع�دد االأ�ص�خا�ص يف قائم�ة‬
‫امل�صطلحات الرئي�صة‬ ‫االنتظ�ار اأمام�ه‪ .‬اإن كان الطاب�ور ُممتلئً�ا‪ ،‬تظه�ر ر�ص�الة‬
‫‪( The branch is full. Come another day‬الفَ�رع‬
‫‪Binary Tree‬‬ ‫ال�صجرة الثنائية‬ ‫‪Non-Primitive‬‬ ‫يل‬
‫غر اأو ّ‬ ‫ُممتلئ‪ .‬الرجاء العودة يف يوم اآخر)‪.‬‬
‫‪Child‬‬ ‫فَرع (ابن)‬ ‫‪Null‬‬ ‫قيمة فارغة‬ ‫• اإن اأدخل��ت القيم��ة ‪( NEXT‬الت��ايل)‪ ،‬الب��د اأن يظه��ر ا�ص��م‬
‫‪Data Structure‬‬ ‫هيكل البيانات‬ ‫‪Pointer‬‬ ‫موؤ�صر‬ ‫العميل التايل الذي �صتُق َّدم له اخلدمة‪.‬‬
‫‪Decision Tree‬‬ ‫�صجرة القرار‬ ‫‪Pop‬‬ ‫حذف عن�صر‬
‫‪Dequeue‬‬ ‫حذف العنا�صر من الطابور‬ ‫‪Primitive‬‬ ‫يل‬
‫اأو ّ‬
‫‪Directed Graph‬‬ ‫امل ُخطَّ ط امل ُوجّ ه‬ ‫‪Push‬‬ ‫اإ�صافة عن�صر‬ ‫َكرِّر العملية املو�صحة اأعاله حتى ال يكون هناك عمالء يف قائمة‬ ‫‪2‬‬
‫‪Dynamic‬‬ ‫متغر‬ ‫‪Rear‬‬ ‫اخللفي‬ ‫االنتظار‪.‬‬
‫‪Front‬‬ ‫االأمامي‬ ‫‪Root‬‬ ‫اجلذر‬
‫‪Graph‬‬ ‫ُخمطَّ ط‬ ‫‪Siblings‬‬ ‫اأ�صقاء‬
‫‪Index‬‬ ‫فهر�س‬ ‫‪Stack‬‬ ‫امل ُكدِّ�س‬ ‫‪3‬‬
‫‪Head‬‬ ‫راأ�س‬ ‫‪Sub-Tree‬‬ ‫�صجرة فرعية‬ ‫يف النهاية‪� ،‬ص َيعر�ص الربنامج على ال�صا�صة‪:‬‬
‫‪Leaf‬‬ ‫ورقة‬ ‫‪Top‬‬ ‫قمة‬ ‫• عدد العمالء الذين ق ُِّدمت لهم اخلدمة‪.‬‬
‫‪Linear‬‬ ‫خطي‬ ‫‪Underflow‬‬ ‫َغيْ�س امل ُكدّ�س‬ ‫• متو�صط وقت انتظار العميل‪.‬‬
‫‪Linked List‬‬ ‫قائمة مرتابطة‬ ‫‪Undirected‬‬
‫‪Ggraph‬‬
‫امل ُخطَّ ط غر املوجّ ه‬
‫‪Non-Linear‬‬ ‫غر خطي‬
‫‪69‬‬ ‫‪68‬‬
‫األ�صتدعاء الذاتي‬
‫الدر�س األأول‬
‫‪ .2‬خوارزميات ال��ذكاء األ�صطناعي‬
‫�ص ��يتعرف الطال ��ب يف ه ��ذه الوح ��دة عل ��ى بع� ��س اخلوارزمي ��ات األأ�صا�ص ��ية املُ�ص ��تخدَ مة يف‬
‫ال��ذكاء األ�صطناع��ي (‪ .)AI‬كم��ا �ص��يتعلم كي��ف يُن�صِ � ن ��ام ت�ص��خي�س طبي ب�ص��يط مُ�ص��ت ِند‬
‫تق�صيم املُ�صكلة ‪Dividing the Problem‬‬ ‫اإىل القواع��د بِطُ ��رق برجمي��ة مُتع��ددة ث��م يق��ارن النتائ��ج‪ .‬ويف اخلتام �ص��يتعلّم خوارزميات‬
‫يف هذا الدر�ص‪� ،‬صتتعلّم ا�صتخدام الدوال التكرارية لتب�صيط الربنامج وزيادة كفاءته‪.‬‬ ‫البحث وطرق حل األغاز املتاهة مع اأخذ معاير معيّنة يف األعتبار‪.‬‬
‫لك هديّة‪ ،‬وكنت ُمتلهفًا ملعرفتها‪ ،‬ولكن عندما فتحت ال�صندوق‪ ،‬وجدت �صندوقًا جديدً ا بداخله‪ ،‬وعندما‬
‫والداك قد اأح�صرا َ‬
‫َ‬ ‫تخيّل اأن‬
‫وجدت اآخ َر بداخله‪ ،‬وهكذا حتى عجزت اأن تعرف يف اأي �صندوق توجد الهدية‪.‬‬ ‫َ‬ ‫فتحته‪،‬‬

‫األ�صتدعاء الذاتي ‪Recursion‬‬


‫اأهداف التعلُّم‬
‫اال�ص��تدعاء الذاتي هو اأحد طُ ُرق حل امل�ص��كالت يف علوم احلا�ص��ب‪ ،‬ويتم عن طريق تق�ص��يم امل�ص��كلة اإىل جمموعة من امل�ص��كالت‬ ‫بنهاية هذه الوحدة �صيكون الطالب قادرًا على اأن‪:‬‬
‫�تخدم اال�ص��تدعاء‬
‫ال�صغ��رة املُ�ص��ابهة للم�ص��كلة االأ�صلي��ة حت��ى ُميكن��ك ا�ص��تخدام اخلوارزمي��ة نف�ص��ها حل��ل تل��ك امل�ص��كالت‪ُ .‬ي�ص� َ‬ ‫ يُن�ص مقطعًا برجميا تكراريا‪.‬‬
‫الذاتي بوا�صطة اأنظمة الت�صغيل والتطبيقات االأخرى‪ ،‬كما تدعمه معظم لغات الربجمة‪.‬‬
‫ يُق��ارِن ب��ني خوارزمي��ة البح��ث باأولوية األت�ص��اع وخوارزمية البح��ث باأولوية‬
‫العُمق‪.‬‬
‫افتح ال�صندوق‬ ‫يحدث اال�صتدعاء الذاتي عندما‬ ‫ ي َِ�صف خوارزميات البحث وتطبيقاتها‪.‬‬
‫تتكرر التعليمات نف�صها‪ ،‬ولكن‬
‫مع بيانات خمتلفة واأقل تعقيدًا‪.‬‬ ‫ يُقارِن بني خوارزميات البحث‪.‬‬
‫نعم‬
‫ ي َِ�صف الن ام القائم على القواعد‪.‬‬
‫هل هناك �صندوق‬ ‫ يُد ِّر اذج الذكاء األ�صطناعي حتى تتعلّم حل امل�صكالت املُعقدة‪.‬‬
‫بالداخل؟‬
‫ يُقيِّم نتائج املقطع ال جمي وكفاءة ال نامج الذ اأن�صاأه‪.‬‬
‫ال‬ ‫ يُطوِّر ال امج ملحاكاة حلّ م�صكالت احلياة الواقعية‪.‬‬
‫ يُقارِن بني خوارزميات البحث‪.‬‬
‫وجدت الهدية وانتهى‬
‫اال�صتدعاء الذاتي‬
‫�صكل ‪ :2.1‬مثال على اال�صتدعاء الذاتي‬

‫األأدوات‬
‫ مفكرة جوبيرت (‪)Jupyter Notebook‬‬

‫‪71‬‬ ‫‪70‬‬
‫تتكون دالة اال�صتدعاء التكرارية من حالتن‪:‬‬ ‫ل ُتُلقِ نظرة على مثال لدالة ت�صتدعي دالة اأخرى‪.‬‬
‫احلالة األأ�صا�صية ‪Base Case‬‬
‫ويف ه��ذه احلال��ة تتوق��ف الدال��ة ع��ن ا�ص��تدعاء نف�ص��ها‪ ،‬ويتاأ ّك��د الو�صول اإىل ه��ذه احلالة من خالل االأمر امل�ص��روط‪ .‬بدون‬ ‫‪def mySumGrade (gradesList):‬‬
‫‪sumGrade=0‬‬
‫احلالة االأ�صا�صية‪� ،‬ص َتتَكرَّر عملية اال�صتدعاء الذاتي اإىل ما ال نهاية‪.‬‬ ‫)‪l=len(gradesList‬‬
‫‪for i in range(l):‬‬
‫حالة األ�صتدعاء التكرارية ‪Recursive Case‬‬
‫]‪sumGrade=sumGrade+gradesList[i‬‬
‫ويف ه��ذه احلال��ة ت�ص��تدعي الدال� ُة نف�صَ ��ها عندم��ا ال ُحتق��ق �ص��رط التوق��ف‪ ،‬وتظ��ل الدال��ة يف حالة اال�ص��تدعاء الذاتي حتى‬ ‫‪return sumGrade‬‬
‫ت�صل اإىل احلالة االأ�صا�صية‪.‬‬ ‫ا�صتدعاء الدالة‬
‫‪def avgFunc (gradesList):‬‬
‫اأمثلة �صائعة على األ�صتدعاء الذاتي ‪Recursion Common Examples‬‬ ‫)‪s=mySumGrade(gradesList‬‬ ‫‪.mySumGrade‬‬
‫)‪l=len(gradesList‬‬
‫أاح��د االأمثل��ة االأك��ر �ص��يوعً ا عل��ى ا�ص��تخدام اال�ص��تدعاء الذات��ي ه��و عملي��ة ح�ص��اب م�صروب رقم ُمع� ّ�ن‪ .‬م�ص��روب الرقم هو‬ ‫‪avg=s/l‬‬
‫عرب ع��ن امل�صروب بالرق��م متبو ًع��ا بالعالمة "!"‪،‬‬
‫ن��ا �ص��رب جمي��ع االأع��داد الطبيعي��ة االأق��ل م��ن اأو ت�ص��اوي ذل��ك الرق��م‪ُ .‬ي َّ‬ ‫‪return avg‬‬
‫ت�صتخدم دالة ()‪ len‬قائمة‬
‫على �صبيل املثال‪ ،‬م�صروب الرقم ‪ 5‬هو !‪ 5‬وي�صاوي ‪.1*2*3*4*5‬‬ ‫‪# program section‬‬
‫كم ِ‬
‫ُعامل مُدخَ ل‪ ،‬حل�صاب وحتديد‬
‫]‪grades=[89,88,98,95‬‬ ‫عدد العنا�صر يف القائمة‪.‬‬
‫�ص��تالحظ اأن عملي��ة ح�ص��اب امل�ص��روب ت�ص��تند اإىل‬ ‫األأرقام من ‪ 0‬اإىل ‪5‬‬ ‫جدول  ‪ :2.1‬م�صرو‬ ‫)‪averageGrade=avgFunc(grades‬‬
‫)‪print ("The average grade is: ",averageGrade‬‬
‫القاعدة اأدناه‪:‬‬ ‫!‪0!=1 0‬‬
‫‪1!= 0! *1‬‬ ‫اأو‬ ‫!‪1!=1*1=1 1‬‬ ‫‪The average grade is: 92.5‬‬
‫‪1‬‬ ‫‪،if n=0‬‬ ‫الحالة‬ ‫‪2!= 1! *2‬‬ ‫اأو‬ ‫!‪2!=2*1=2 2‬‬
‫= !‪n‬‬ ‫االأ�صا�صية‬
‫‪(n-1)! * n‬‬ ‫‪if n>0‬‬ ‫‪3!= 2! *3‬‬ ‫اأو‬ ‫!‪3!=3*2*1=6 3‬‬ ‫دالة األ�صتدعاء التكرارية ‪Recursive Function‬‬
‫حالة اال�صتدعاء‬ ‫‪4!=3! * 4‬‬ ‫اأو‬ ‫!‪4!=4*3*2*1=24 4‬‬ ‫يف بع���ص احل��االت ت�ص��تدعي الدّال� ُة نف�صَ ��ها وه��ذه اخلا�صي��ة تُ�ص��مى‬
‫التكرارية‬ ‫الربنامج الرئي�س‬ ‫اال�صتدعاءات التكرارية (‪.)Recursive Calls‬‬
‫�صكل ‪ :2.3‬قاعدة ح�صاب امل�صروب‬ ‫‪5!=4! * 5‬‬ ‫اأو‬ ‫!‪5!=5*4*3*2*1=120 5‬‬
‫يك��ون ِبن��اء اجلمل��ة الع��ام لدال��ة اال�ص��تدعاء التكراري��ة عل��ى النح��و‬
‫الإن�صاء برنامج يقوم باحت�صاب م�صروب العدد با�صتخدام حلقة التكرار‪ ،for‬اتّبع ما يلي‪:‬‬ ‫التايل‪:‬‬

‫‪# calculate the factorial of an integer using iteration‬‬ ‫‪# recursive function‬‬
‫)(‪recurseFunction‬‬ ‫‪def recurseFunction():‬‬
‫‪def factorialLoop(n):‬‬ ‫‪if (condition): # base case‬‬
‫‪result = 1‬‬ ‫‪statement‬‬
‫‪for i in range(2,n+1):‬‬ ‫خاطئ‬ ‫‪else:‬‬
‫‪result = result * i‬‬ ‫‪#recursive call‬‬
‫)(‪recurseFunction‬‬
‫‪return result‬‬ ‫ال�صر‬
‫‪# main program‬‬
‫‪# main program‬‬ ‫‪.......‬‬
‫))" ‪num = int(input("Type a number:‬‬
‫)‪f=factorialLoop(num‬‬ ‫�صحيح‬ ‫‪# normal function call‬‬
‫)‪print("The factorial of ", num, " is:", f‬‬ ‫)(‪recurseFunction‬‬
‫‪.........‬‬

‫‪Type a number: 3‬‬


‫االأمر‬
‫‪The factorial of 3 is:6‬‬ ‫اال�صتدعاء التكراري هو عملية‬
‫�صكل ‪ :2.2‬متثيل اال�صتدعاء التكراري‬
‫ا�صتدعاء الدالة لنف�صها‪.‬‬

‫‪73‬‬ ‫‪72‬‬
‫متى ت ِ‬
‫َ�صتخدم اال�صتدعاء الذاتي؟‬ ‫االآن ِ‬
‫اح�صب م�صروب العدد با�صتخدام دالة امل�صروب‪.‬‬
‫• يُع ُّد اال�صتدعاء الذاتي الطريقة االأكر مالئمة للتعامل مع امل�صكلة يف العديد من احلاالت‪.‬‬
‫م�صروب )‪(3‬‬ ‫‪# calculate the factorial of an integer using a‬‬
‫• يَ�صهُل ا�صتك�صاف بع�ص هياكل البيانات با�صتخدام اال�صتدعاء الذاتي‪.‬‬ ‫‪# recursive function‬‬
‫• بع���ص خوارزمي��ات الت�صني��ف (‪ ،)Sorting Algorithms‬تَ�ص� ِ‬
‫�تخدم اال�ص��تدعاء الذات��ي‪ ،‬مث��ل‪ :‬الت�صني��ف ال�ص��ريع‬ ‫‪def factorial(x):‬‬
‫‪if x == 0:‬‬ ‫الحالة االأ�صا�صية‪.‬‬
‫(‪.)Quick Sort‬‬ ‫‪3‬‬ ‫م�صروب )‪(2‬‬ ‫‪return 1‬‬
‫يف املثال التايل‪� ،‬صت�صتخرج اأكرب رقم موجود يف قائمة مكونة من االأرقام با�صتخدام دالة اال�صتدعاء التكرارية‪.‬‬ ‫‪else:‬‬ ‫حالة اال�صتدعاء‬
‫))‪return (x * factorial(x-1‬‬
‫كما يظهر يف ال�صطر االأخر من املثال دالة اأخرى للتكرار لغر�ص املقارنة‪.‬‬ ‫التكرارية‪.‬‬
‫‪2‬‬ ‫م�صروب )‪(1‬‬ ‫‪# main program‬‬
‫‪def findMaxRecursion(A,n):‬‬ ‫))" ‪num = int(input("Type a number:‬‬
‫)‪f=factorial(num‬‬
‫‪if n==1:‬‬ ‫)‪print("The factorial of ", num, " is: ", f‬‬
‫]‪m = A[n-1‬‬ ‫‪1‬‬ ‫م�صروب )‪(0‬‬
‫‪else:‬‬
‫))‪m = max(A[n-1],findMaxRecursion(A,n-1‬‬ ‫‪Type a number: 3‬‬
‫‪return m‬‬ ‫‪1‬‬ ‫‪The factorial of 3 is: 6‬‬
‫‪3! = 3*2*1 = 6‬‬
‫‪def findMaxIteration(A,n):‬‬ ‫�صكل ‪� :2.4‬صجرة اال�صتدعاء الذاتي‬
‫]‪m = A[0‬‬
‫جدول  ‪ :2.2‬مزايا األ�صتدعاء الذّ اتي‪ ،‬وعيوبه‬
‫‪for i in range(1,n):‬‬
‫)]‪m = max(m,A[i‬‬
‫ت�صتخرج الدالة ()‪ max‬العن�صر ذا القيمة‬ ‫العيوب‬ ‫املزايا‬
‫‪return m‬‬
‫االأكرب (العن�صر ذو القيمة االأكرب يف ‪.)myList‬‬ ‫• تقل��ل دوال اال�ص��تدعاء التكراري��ة م��ن ع��دد التعليم��ات يف • يف بع���ص االأحي��ان‪َ ،‬ي�ص ُع��ب تَت ُّب��ع منط��ق دوال‬
‫‪# main program‬‬
‫اال�صتدعاء التكرارية‪.‬‬ ‫املقطع الربجمي‪.‬‬
‫]‪myList = [3,73,-5,42‬‬ ‫• ميك��ن تق�ص��يم املهم��ة اإىل جمموع��ة م��ن امل�ص��كالت الفرعي��ة • يتطل��ب اال�ص��تدعاء الذات��ي مزي��دً ا م��ن الذاك��رة‬
‫)‪l = len(myList‬‬ ‫والوقت‪.‬‬ ‫با�صتخدام اال�صتدعاء الذاتي‪.‬‬
‫)‪myMaxRecursion = findMaxRecursion(myList,l‬‬
‫)‪print("Max with recursion is: ", myMaxRecursion‬‬ ‫• يف بع���ص االأحي��ان‪ ،‬يَ�ص �هُل ا�ص��تخدام اال�ص��تدعاء الذات��ي • ال ي�ص��هل حتدي��د احل��االت الت��ي ميك��ن فيه��ا‬
‫)‪myMaxIteration = findMaxIteration(myList,l‬‬ ‫ا�صتخدام دوال اال�صتدعاء التكرارية‪.‬‬ ‫ال�صتبدال التكرارات املُتداخلة‪.‬‬
‫)‪print("Max with iteration is: ", myMaxIteration‬‬
‫األ�صتدعاء الذاتي والتكرار ‪Recursion and Iteration‬‬
‫‪Max with recursion is:‬‬ ‫‪73‬‬ ‫ُي�ص��تخدم كل م��ن اال�ص��تدعاء الذات��ي والتك��رار يف تنفي��ذ جمموع��ة م��ن التعليم��ات لع��دة م��رات‪ ،‬والف��ارق الرئي���ص ب��ن‬
‫‪Max with iteration is:‬‬ ‫‪73‬‬ ‫اال�صتدعاء الذاتي والتكرار هو طريقة اإنهاء الدالة التكرارية‪ .‬دالة اال�صتدعاء التكرارية ت�صتدعي نف�صها وتُنهي التنفيذ‬
‫عندم��ا ت�ص��ل اإىل احلال��ة االأ�صا�ص��ية‪ .‬اأم��ا التك��رار فيُن ِّف��ذ ل ِب َن� َة املقط��ع الربجم��ي با�ص��تمرارحتى يتحق��ق �ص��رط ُحم� َّدد اأو‬
‫))‪max(A[3], findMaxRecursion(A, 3‬‬ ‫ينق�صي عدد ُحم َّدد من التكرارات‪.‬‬
‫اجلدول التايل يعر�ص بع�ص االختالفات بن اال�صتدعاء الذاتي والتكرار‪.‬‬
‫> ‪42‬‬ ‫))‪max(A[2], findMaxRecursion(A, 2‬‬
‫جدول  ‪ :2.3‬التكرار واأل�صتدعاء الذاتي‬
‫اال�صتدعاء الذاتي‬ ‫التكرار‬
‫‪-5‬‬ ‫>‬ ‫))‪max(A[1], findMaxRecursion(A, 1‬‬ ‫بطيء التنفيذ مقارن ًة بالتكرار‪.‬‬ ‫�صريع التنفيذ‪.‬‬
‫يتطلب حجم ذاكرة اأكرب‪.‬‬ ‫يتطلب حجم ذاكرة اأقل‪.‬‬
‫حجم املقطع الربجمي اأ�صغر‪.‬‬ ‫حجم املقطع الربجمي اأكرب‪.‬‬
‫‪73‬‬ ‫>‬ ‫‪3‬‬ ‫ينتهي مبجرد الو�صول اإىل احلالة االأ�صا�صية‪.‬‬ ‫�ق‬‫�‬ ‫ي‬ ‫حتق‬ ‫أو‬
‫ا‬ ‫�رارات‬‫�‬ ‫ك‬ ‫الت‬ ‫�ن‬‫�‬ ‫م‬ ‫د‬‫د‬‫َّ‬ ‫�‬ ‫ح‬‫ينته��ي با�ص��تكمال الع��دد املُ‬
‫�صرط ُم َّعن‪.‬‬
‫�صكل ‪� :2.5‬صجرة اال�صتدعاء الذاتي لدالة ا�صتخراج اأكرب رقم يف قائمة مكونة من االأرقام‬
‫‪75‬‬ ‫‪74‬‬
‫مترينات‬ ‫يف الربنامج التايل‪� ،‬صتُن�صئ دالة ا�صتدعاء تكرارية حل�صاب مُ�صاعَ ف الرقم‪.‬‬
‫�ص��تقوم باإدخ��ال رق ًم��ا (االأ�صا���ص) وفهر�صً ��ا (االأُ���ص اأو ال ُق� ّوَّة) يقبلهم��ا الربنام��ج‪ ،‬وم��ن َث��مَّ �صتَ�ص� ِ‬
‫�تخدم دال��ة اال�ص��تدعاء‬
‫�صاعف الرق��م‪ .‬ميكن حتقيق االأمر‬ ‫�تخدم هذي��ن املدخَ َل��ن حل�ص��اب ُم َ‬ ‫التكراري��ة ()‪ powerFunRecursive‬الت��ي �صتَ�ص� ِ‬
‫‪1‬‬ ‫يو�صح ذلك‪:‬‬ ‫نف�صه با�صتخدام التكرار‪ ،‬واملثال التايل ّ‬
‫خاطئة‬ ‫�صحيحة‬ ‫حدِّد اجلملة ال�صحيحة واجلملة اخلاطئة فيما يلي‪:‬‬
‫‪def powerFunRecursive(baseNum,expNum):‬‬
‫‪if(expNum==1):‬‬
‫‪ .1‬تتكون دالة اال�صتدعاء التكرارية من حالتن‪.‬‬
‫)‪return(baseNum‬‬
‫‪else:‬‬
‫‪ .2‬ت�صتدعي دالة اال�صتدعاء التكرارية دالة اأخرى‪.‬‬
‫))‪return(baseNum*powerFunRecursive(baseNum,expNum-1‬‬

‫‪ .3‬دوال اال�صتدعاء التكرارية اأ�صرع يف التنفيذ‪.‬‬ ‫‪def powerFunIteration(baseNum,expNum):‬‬

‫‪ .4‬ا�صتدعاء الدوال يجعل لبِنة املقطع الربجمي اأ�صغر حجمًا‪.‬‬ ‫‪numPower = 1‬‬
‫‪for i in range(exp):‬‬
‫‪ .5‬كتابة مقطع برجمي مُتكرِّر يتطلب ا�صتدعا ًء ذاتيًّا اأقل‪.‬‬ ‫‪numPower = numPower*base‬‬
‫‪return numPower‬‬

‫‪# main program‬‬


‫))" ‪base = int(input("Enter number:‬‬
‫‪ 2‬ما االختالفات بني التكرار واال�صتدعاء الذاتي؟‬
‫))" ‪exp = int(input("Enter exponent:‬‬
‫)‪numPowerRecursion = powerFunRecursive(base,exp‬‬
‫)‪print( "Recursion: ", base, " raised to ", exp, " = ",numPowerRecursion‬‬
‫)‪numPowerIteration = powerFunIteration(base,exp‬‬
‫)‪print( "Iteration: ", base, " raised to ", exp, " = ",numPowerIteration‬‬

‫‪Enter number: 10‬‬


‫‪Enter exponent: 3‬‬
‫‪Recursion: 10 raised to 3 = 1000‬‬
‫‪Iteration: 10 raised to 3 = 1000‬‬

‫‪ 3‬متى يجب ا�صتخدام اال�صتدعاء الذاتي؟‬ ‫دالة األ�صتدعاء التكرارية الالنهائية ‪Infinite Recursive Function‬‬
‫يج��ب اأن تك��ون ح��ذرًا للغاي��ة عن��د تنفي��ذ اال�ص��تدعاء التك��راري‪ ،‬كما يجب عليك ا�ص��تخدام طريقة معين��ة الإيقاف التكرار‬
‫عن��د حتقي��ق �ص��رط ُحم� َّدد لتجن��ب ح��دوث اال�ص��تدعاء التك��راريّ الالنهائ� ّ�ي‪ ،‬ال��ذي ي�ص� ّبب تو َّق��ف النظ��ام عن اال�ص��تجابة‬
‫ب�صبب كرة ا�صتدعاءات الدالة‪ ،‬مما يوؤدي اإىل َفيْ�س الذاكرة (‪ )Memory Overflow‬واإنهاء التطبيق‪.‬‬

‫‪77‬‬ ‫‪76‬‬
‫الدر�س الثاين‬ ‫‪ 4‬و َِّ�صح مزايا ا�صتخدام اال�صتدعاء الذاتي وعيوبه‪.‬‬
‫خوارزمية البحث باأولوية العمق‬
‫والبحث باأولوية األت�صاع‬
‫البحث يف املُخطَّ طات ‪Searching in Graphs‬‬
‫تفح���ص كل ُعق��دة يف املُخطَّ ��ط إالج��راء‬
‫هن��اك بع���ص احل��االت الت��ي حتت��اج فيه��ا اإىل البح��ث ع��ن عُ ق��دة ُحم� َّددة يف املُخطَّ ��ط‪ ،‬اأو ُّ‬
‫عملي��ة بعينه��ا مث��ل طباع��ة ُعق��د املُخطَّ ��ط‪ ،‬فتك��ون حالت� َ�ك ك�ص��خ� ٍص يبح��ث ع��ن املدين��ة الت��ي يري��د ال�صّ ��فر اإليه��ا؛ و ليتحقق هذا‪،‬‬
‫حتتاج اإىل فح�ص كل ُعقدة يف املُخطَّ ط حتى جتد تلك التي حتتاج اإليها‪ُ .‬يطلق على هذا االإجراء‪ :‬البحث يف املُخطَّ ط اأو م�ص��ح‬
‫املُخطَّ ط‪ ،‬وهناك العديد من خوارزميات البحث التي ت�صاعد على تنفيذه‪ ،‬مثل‪:‬‬
‫• خوارزمية البحث باأولوية االت�صاع (‪.)Breadth-First Search - BFS‬‬
‫• خوارزمية البحث باأولوية العمق (‪.)Depth-First Search - DFS‬‬
‫‪ 5‬اكت��ب دال��ة ا�ص��تدعاء تكراري��ة بلغ��ة البايث��ون تق��وم بح�ص��اب الرق��م االأك��رب برتتي��ب حم��دد (مث� ّ�ال ث��اين اأك��رب رق��م) يف‬
‫عُ قدة البث‬ ‫قائمة من االأرقام‪.‬‬

‫العُقد االأخرى‬
‫العُقد المجاورة‬
‫ل ُعقدة البث‬

‫مثال على خوارزمية البحث باأولوية العمق )‪ :(DFS‬حل املتاهة‬ ‫مثال على خوارزمية البحث باأولوية االت�صاع )‪ :(BFS‬البث ال�صبكي‬
‫‪ 6‬اكتُب دالة ا�صتدعاء تكرارية بلغة البايثون حل�صاب جمموع كل االأرقام الزوجية يف قائمة معيّنة‪.‬‬
‫امل�صتوى ‪0‬‬
‫خوارزمية البحث باأولوية االت�صاع‬
‫‪A‬‬ ‫‪Breadth-First Search (BFS) Algorithm‬‬
‫‪1‬‬
‫ت�صتك�ص��ف خوارزمي��ة البح��ث باأولوي��ة االت�ص��اع (‪ )BFS‬املُخطَّ ��ط بح�ص��ب‬
‫‪2‬‬
‫واحدا تلو االآخر‪ ،‬حيث تبد أا بفح�ص عُ قدة اجلذر (عُ قدة البداية)‪ ،‬امل�صتوى ‪1‬‬ ‫امل�صتوى ً‬
‫‪B‬‬ ‫‪C‬‬ ‫ثم تفح�ص جميع العُقد املرتبطة بها ب�صكل مبا�صر واحدة تلو االأخرى‪.‬‬
‫‪3‬‬
‫بع��د االنته��اء م��ن فح���ص كل ال ُعق��د يف امل�ص��توى‪ ،‬تنتق��ل اإىل امل�ص��توى الت��ايل‪،‬‬
‫وتتبع االإجراءات نف�صها املُو�صحّ ة يف ال�صكل ‪.2.6‬‬
‫امل�صتوى ‪2‬‬
‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪G‬‬ ‫�صتخدم الطّ ابور لتت ّبع العُقد التي ّمت فح�صها‪ ،‬ومبج ّرد ا�صتك�صاف العُقدة‪،‬‬ ‫ُي َ‬
‫�صتتم اإ�صافة ال ُع َقد الفرعية اإىل الطابور‪ ،‬ثم حتذف ال ُعقدة التالية املوجودة‬
‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫يف اأول الطابور التي مت ا�صتك�صافها �صابقًا‪.‬‬
‫‪79‬‬ ‫�صكل ‪ :2.6‬خوارزمية البحث باأولوية االت�صاع (‪)BFS‬‬ ‫‪78‬‬
‫احذف العُقدة ‪ E‬ملعاجلتها‪.‬‬ ‫‪6‬‬ ‫احذف العُقدة ‪ D‬ملعاجلتها‪.‬‬ ‫‪5‬‬ ‫اح��ذف ال ُعق��دة ‪ C‬وعاجله��ا‪،‬‬ ‫‪4‬‬ ‫املث��ال الت��ايل يو�ص��ح طريق��ة عم��ل خوارزمي��ة البح��ث باأولوية االت�ص��اع (‪ .)BFS‬با�ص��تخدام املُخطَّ ط الت��ايل‪ ،‬حدِّ د العُقد‬
‫(لي�ص لديها فروع)‪.‬‬ ‫(لي�ص لديها فروع)‪.‬‬ ‫ثم اأ�صف فرعها اإليها‪.‬‬ ‫التي يجب فح�صها لالنتقال من عُ قدة اجلذر ‪ A‬اإىل ال ُعقدة ‪:F‬‬
‫ِ‬
‫ا�صتخدم هيكل البيانات املُنا�صب‪.‬‬ ‫مالحظة‪:‬‬
‫‪A‬‬ ‫‪A‬‬ ‫‪A‬‬
‫‪A‬‬
‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬
‫عليك فح�س كل العُقد يف امل�صتوى ‪1‬‬ ‫‪B‬‬ ‫‪C‬‬
‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫قبل االنتقال اإىل العُقد يف امل�صتوى ‪.2‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬

‫‪E‬‬ ‫‪F‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫الطابور‬ ‫املُخطَّ ط‬
‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬

‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫ا ح��ذف ال ُعق��دة م��ن مقد م��ة‬ ‫‪3‬‬ ‫اح��ذف ال ُعق��دة اجلذر ّي��ة م��ن‬ ‫‪2‬‬ ‫البداي��ة م��ن ال ُعق��دة اجلذرية‬ ‫‪1‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫الطاب��ور (ال ُعق��دة ‪ )B‬ملعاجلته��ا‪،‬‬ ‫الطاب��ور ملعاجلته��ا‪ ،‬ث��م اأ�ص��ف‬ ‫(ال ُعق��دة ‪ .)A‬اأ�ص��ف ال ُعق��دة‬
‫ث��م اأ�ص��ف ف��روع ه��ذه ال ُعق��دة اإىل‬ ‫ف��روع ه��ذه ال ُعق��دة اإىل الطاب��ور‬ ‫اجلذريّة اإىل الطابور‪.‬‬
‫‪A‬‬ ‫اح��ذف ال ُعق��دة ‪ F‬ملعاجلته��ا‪ ،‬وبذل��ك اأ�صب��ح‬ ‫‪7‬‬ ‫الطابور (العُقدتن ‪ D‬و‪.)E‬‬ ‫(العُقدتن ‪ B‬و‪.)C‬‬
‫الطابور االآن فارغً ا وانتهت عملية البحث‪.‬‬
‫‪B‬‬ ‫‪C‬‬
‫‪F‬‬ ‫العُقد التي فُحِ �صَ ت با�صتخدام خوارزمية البحث‬
‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫باأولوية االت�صاع (‪ )BFS‬هي‪.F ،E ،D ،C ،B ،A :‬‬ ‫فُحِ َ�صت‬
‫‪A‬‬ ‫‪A‬‬ ‫‪A‬‬

‫الحظ كيف ُميكنك تطبيق خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬بلغة البايثون (‪ )Python‬يف املثال التايل‪:‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬

‫{ = ‪graph‬‬
‫‪"A" : ["B","C"],‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬
‫‪"B" : ["D","E"],‬‬
‫‪"C" : ["F"],‬‬
‫‪"D" : [],‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪A‬‬
‫‪"E" : [],‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫][ ‪"F" :‬‬
‫}‬
‫‪C‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬
‫‪visitedBFS = [] # List to keep track of visited nodes‬‬
‫][ = ‪queue‬‬ ‫‪# Initialize a queue‬‬

‫‪# bfs function‬‬


‫‪def bfs(visited, graph, node):‬‬
‫)‪visited.append(node‬‬

‫‪81‬‬ ‫‪80‬‬
‫امل�صتوى ‪0‬‬
‫خوارزمية البحث باأولوية العمق‬ ‫)‪queue.append(node‬‬
‫‪A‬‬ ‫‪Depth-First Search (DFS) Algorithm‬‬
‫‪1‬‬
‫‪while queue:‬‬
‫يف البح�ث باأولوي�ة العم�ق (‪� ،)DFS‬ص�تقوم باتب�اع احلواف‪ ،‬وتتعمق اأكر‬
‫)‪n = queue.pop(0‬‬
‫امل�صتوى ‪1‬‬ ‫�صتخدم البحث باأولوية العمق اإجراء ا�صتدعاء تكراري‬ ‫واأكر يف املُخطَّ ط‪َ .‬ي ِ‬
‫‪B‬‬ ‫‪C‬‬ ‫)" " = ‪print (n, end‬‬
‫للتنقل عرب ال ُعقد‪ .‬عند الو�صول اإىل ُعقدة ال حتتوي على حواف الأي ُعقدة‬
‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫جديدة‪� ،‬ص�تعود اإىل ال ُعقدة ال�ص�ابقة وت�ص�تمر العملية‪ .‬ت ِ‬
‫َ�صتخدم خوارزمية‬ ‫‪for neighbor in graph[n]:‬‬
‫البح�ث باأولوي�ة العم�ق هي�كل بيان�ات املُك ّد��ص لتتب�ع م�ص�ار اال�صتك�ص�اف‪.‬‬ ‫‪if neighbor not in visited:‬‬

‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪G‬‬


‫امل�صتوى ‪2‬‬ ‫مبجرد ا�صتك�صاف ُعقدة‪� ،‬صتُ�صاف اإىل املُكدّ�ص‪ .‬عندما ترغب يف العودة‪،‬‬ ‫)‪visited.append(neighbor‬‬
‫�صتحذف ال ُعقدة من املُكدّ�ص كما هو مو�صح يف ال�صكل ‪.2.7‬‬ ‫)‪queue.append(neighbor‬‬
‫�صكل ‪ :2.7‬خوارزمية البحث باأولوية العمق (‪)DFS‬‬

‫املثال التايل يو�صح طريقة عمل خوارزمية البحث باأولوية العمق (‪ ،)DFS‬با�صتخدام املُخطَّ ط التايل‪َ ،‬ت َتبّع ترتيب ا�صتك�صاف‬ ‫‪# main program‬‬
‫)"‪bfs(visitedBFS, graph, "A‬‬
‫العُقد (‪ )Traversal‬بح�صب خوارزمية البحث باأولوية العمق‪.‬‬
‫ِ‬
‫ا�صتخدم هيكل البيانات املُنا�صب‪.‬‬ ‫مالحظة‪:‬‬
‫‪ 1‬عا ِلج اجلذر ‪ A‬ثم اأ�صفه اإىل املُكدّ�ص‪.‬‬
‫‪A B C D E F‬‬
‫‪A‬‬
‫‪A‬‬
‫‪B‬‬ ‫‪C‬‬
‫‪B‬‬ ‫‪C‬‬ ‫التطبيقات العملية خلوارزمية البحث باأولوية األت�صاع‬
‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪Practical Applications of the BFS Algorithm‬‬
‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪A‬‬
‫املُخطَّ ط‬ ‫املُكدّ�ص‬
‫تُ�ص��تخدَ م يف �ص��بكات ال ّنظ��ر لل ّنظ��ر (‪ )Peer-to-Peer Networks‬للعث��ور عل��ى كل‬
‫عا ِلج العُقدة ‪ D‬ثم اأ�صفها اإىل املُكدّ�ص‪� .‬صتُحذَ ف‬ ‫‪3‬‬ ‫عا ِلج العُقدة ‪ B‬ثم اأ�صفها اإىل املُكدّ�ص‪.‬‬ ‫‪2‬‬ ‫ال ُعقد املجاورة من اأجل تاأ�صي�ص االت�صال‪.‬‬
‫ال ُعق��دة الت��ي ف ُِح َ�ص��ت ولي���ص له��ا ف��روع م��ن‬
‫املُكدّ�ص‪(.‬احذف العُقدة ‪.)D‬‬
‫‪A‬‬ ‫فُحِ َ�صت‬ ‫تُ�ص��تخدَ م يف و�ص��ائل التوا�ص��ل االجتماع��ي (‪ )Social Media‬لرب��ط عُ ق��د املُ�ص� ِ‬
‫�تخدمن‬
‫‪A‬‬ ‫‪D‬‬ ‫املُرتبطن‪ ،‬مثل اأولئك الذين لهم االهتمامات نف�صها اأو املوقع نف�صه‪.‬‬
‫‪D‬‬ ‫‪B‬‬ ‫‪C‬‬
‫‪B‬‬
‫‪B‬‬ ‫‪C‬‬
‫‪B‬‬ ‫‪B‬‬ ‫‪A‬‬
‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬
‫تُ�ص��تخدَ م يف ُنظ��م املالح��ة با�ص��تخدام ُحم �دِّد املواق��ع العامل��ي (‪GPS Navigation‬‬
‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪A‬‬ ‫‪A‬‬
‫‪ )Systems‬للبحث عن االأماكن املتجاورة حتى ُحت ِّدد االجتاهات التي يتبعها املُ�صتخدِ م‪.‬‬
‫عا ِل��ج ال ُعق��دة ‪ E‬ثم اأ�صفها اإىل املُك ّد���ص‪� .‬ص�تُحذَ ف العُقدة التي‬ ‫‪4‬‬
‫ف ُِح َ�صت ولي�ص لها فروع من املُكدّ�ص‪(.‬احذف العُقدة ‪.)E‬‬
‫تُ�صتخدَ م للح�صول على البث ال�صبكي (‪ )Network Broadcasting‬لبع�ص احلُزم‪.‬‬
‫ملحة تاريخية‬ ‫‪A‬‬ ‫‪E‬‬
‫طُ ورّت الن�صخة االأوىل من خوارزمية البحث باأولوية‬ ‫‪E‬‬ ‫معلومة‬
‫العمق (‪ )DFS‬يف القرن التا�صع ع�صر بوا�صطة عا‬ ‫‪B‬‬ ‫‪C‬‬
‫‪B‬‬ ‫‪B‬‬ ‫ُمُيكن تطوير خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬بتحديد نقطة البداية‬
‫ريا�صيات فرن�صي كا�صرتاتيجية حلل املتاهات‪.‬‬
‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫(احلالة االأوليّة) ونقطة الهدف (احلالة امل ُ�صته َدفة) الإيجاد امل�صار بينهما‪.‬‬

‫‪83‬‬ ‫‪82‬‬
‫التطبيقات العملية خلوارزمية البحث باأولوية العمق‬ ‫عا ِلج العُقدة ‪ C‬ثم اأ�صفها اإىل املُكدّ�ص‪.‬‬ ‫‪6‬‬ ‫احذف العُقدة ‪.B‬‬ ‫‪5‬‬
‫‪Practical Applications of the DFS Algorithm‬‬
‫‪A‬‬ ‫‪A‬‬

‫‪C‬‬ ‫‪B‬‬
‫تُ�ص��تخدَ م خوارزمي��ة البح��ث باأولوي��ة العم��ق يف اإيج��اد امل�ص��ارات (‪)Path Finding‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬
‫‪C‬‬
‫ال�صتك�صاف امل�صارات املختلفة يف العمق للخرائط والطرقات والبحث عن امل�صار االأف�صل‪.‬‬
‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪A‬‬

‫املُك ّد���ص خ��ايل وبالت��ايل �ص��تتوقف خوارزمي��ة البح��ث‬ ‫‪8‬‬ ‫عا ِلج العُقدة ‪ F‬ثم اأ�صفها اإىل املُكدّ�ص‪.‬‬ ‫‪7‬‬
‫تُ�ص��تخدَ م خوارزمي��ة البح��ث باأولوي��ة العم��ق يف حل املتاه��ات (‪ )Solve Mazes‬من خالل‬
‫اجتياز كل الطُ ُرق املمكنة‪.‬‬ ‫باأولوية العمق (‪.)DFS‬‬
‫‪A‬‬ ‫‪F‬‬ ‫‪A‬‬ ‫‪F‬‬
‫‪C‬‬ ‫‪F‬‬
‫ُمي ِك��ن حتدي��د ال��دورات (‪ )Cycles‬يف املُخطَّ ��ط با�ص��تخدام خوارزمي��ة البح��ث باأولوي��ة‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬
‫‪C‬‬ ‫‪C‬‬ ‫‪C‬‬
‫العم��ق م��ن خ��الل وج��ود حاف��ة خلفي��ة (‪ُ ،)Back Edge‬مت��ر م��ن خ��الل ال ُعق��دة نف�ص��ها‬
‫مرتن‪.‬‬ ‫‪A‬‬
‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪A‬‬ ‫‪A‬‬

‫العُقد التي فُحِ �صَ ت با�صتخدام خوارزمية البحث‬ ‫واالآن �ص��تتعلّم طريق��ة تنفي��ذ خوارزمي��ة البح��ث باأولوي��ة العم��ق‬
‫باأولوية العمق (‪ )DFS‬هي‪.F ،C ،E ،D ،B ،A :‬‬ ‫(‪ )DFS‬يف لغة البايثون‪.‬‬
‫جدول  ‪ :2.4‬مقارنة بني خوارزمية البحث باأولوية األت�صاع (‪ )BFS‬و خوارزمية البحث باأولوية العمق (‪)DFS‬‬
‫خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬خوارزمية البحث باأولوية العمق (‪)DFS‬‬ ‫معاير املقارنة‬ ‫= ‪graph‬‬ ‫{‬
‫"‪"A‬‬ ‫‪:‬‬ ‫‪["B","C"],‬‬
‫"‪"B‬‬ ‫‪:‬‬ ‫‪["D","E"],‬‬
‫التنقّل ح�صب عُ مق ال�صجرة‪.‬‬ ‫التنقّل ح�صب م�صتوى ال�صجرة‪.‬‬ ‫طريقة التنفيذ‬ ‫"‪"C‬‬ ‫‪:‬‬ ‫‪["F"],‬‬
‫"‪"D‬‬ ‫‪:‬‬ ‫‪[],‬‬
‫"‪"E‬‬ ‫‪:‬‬ ‫‪[],‬‬
‫"‪"F‬‬ ‫‪:‬‬ ‫][‬
‫تَ�ص��تخدِ م هي��كل بيان��ات املُك ّد���ص لتت ُّب��ع‬ ‫تَ�ص� ِ‬
‫�تخدم هيكل بيانات الطابور لتت ُّبع املوقع‬ ‫}‬
‫املوقع التايل لفح�صه‪.‬‬ ‫التايل لفح�صه‪.‬‬ ‫هيكل البيانات‬
‫‪visitedDFS = [] # list to keep track of visited nodes‬‬

‫‪# dfs function‬‬


‫ُف�ص��ل ا�ص��تخدامها عندم��ا يك��ون هي��كل‬
‫ي َّ‬ ‫ُف�ص��ل ا�ص��تخدامها عندم��ا يك��ون هي��كل‬
‫ي َّ‬ ‫اال�صتخدام‬ ‫‪def dfs(visited, graph, node):‬‬
‫وطويال‪.‬‬
‫ً‬ ‫املُخطَّ ط �صيقًا‬ ‫املُخطَّ ط وا�صعًا وق�صرًا‪.‬‬ ‫‪if node not in visited:‬‬
‫)" " = ‪print(node, end‬‬
‫)‪visited.append(node‬‬ ‫يُ�صتخدم المُكدّ�ص ب�صورة غير‬
‫‪for neighbor in graph[node]:‬‬ ‫مبا�صرة عبر مُكدّ�س اأثناء الت�صغيل‬
‫يتج��ة البح��ث اإىل قاع ال�ص��جرة الفرعية‪،‬‬ ‫تبح��ث ع��ن م�ص��ار الوجه��ة با�ص��تخدام أاق��ل‬ ‫)‪dfs(visited, graph, neighbor‬‬ ‫(‪ )Runtime Stack‬لتت ُّبع‬
‫ثم يرتاجع‪.‬‬ ‫عدد من احلواف‪.‬‬ ‫طريقة البحث‬
‫اال�صتدعاءات التكرارية‪.‬‬
‫‪# main program‬‬
‫العُقد التي تُفح�س يف‬ ‫)"‪dfs(visitedDFS, graph, "A‬‬
‫فح�ص عُ قد الفروع قبل االأ�صقاء‪.‬‬ ‫فح�ص عُ قد االأ�صقاء قبل الفروع‪.‬‬ ‫البداية‬
‫‪A B D E C F‬‬

‫‪85‬‬ ‫‪84‬‬
‫‪A‬‬ ‫‪ 4‬يف امل ُخطَّ ��ط عل��ى الي�ص��ار‪ ،‬انت ِق��ل م��ن ُعق��دة البداي��ة ‪ A‬اإىل‬
‫مترينات‬
‫ُعق��دة اله��دف ‪ .G‬ط ِّب��ق خوارزمي��ة البح��ث باأولوي��ة االت�ص��اع‬
‫‪B‬‬ ‫‪D‬‬
‫‪C‬‬ ‫(‪ )BFS‬وخوارزمية البحث باأولوية العمق (‪ )DFS‬با�صتخدام‬ ‫‪1‬‬
‫هي��كل البيان��ات املنا�ص��ب (امل ُك ّد���س اأو الطاب��ور)‪ ،‬م��ع االإ�ص��ارة‬
‫‪E‬‬ ‫‪F‬‬ ‫‪G‬‬ ‫‪H‬‬ ‫‪I‬‬ ‫‪J‬‬
‫اإىل ال ُعقد التي ف ُِح َ�صت‪.‬‬ ‫خاطئة‬ ‫�صحيحة‬ ‫حدِّد اجلملة ال�صحيحة واجلملة اخلاطئة فيما يلي‪:‬‬
‫‪K‬‬ ‫‪L‬‬ ‫‪M‬‬ ‫‪ .1‬تُنفَّذ خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬وخوارزمية البحث باأولوية العمق (‪)DFS‬‬
‫با�صتخدام اال�صتدعاء الذاتي‪.‬‬
‫‪ .2‬ال ميكن ا�ص��تخدام خوارزمية البحث باأولوية االت�ص��اع (‪ )BFS‬وخوارزمية البحث باأولوية‬
‫العمق (‪ )DFS‬يف هيكل بيانات ال�صجرة‪.‬‬
‫‪ .3‬تُنفَّذ خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬مب�صاعدة هيكل بيانات القائمة املرتابطة‪.‬‬
‫‪ .4‬ميكن تنفيذ خوارزمية البحث باأولوية العمق (‪ )DFS‬مب�صاعدة هيكل بيانات املُكدّ�ص‪.‬‬
‫‪ .5‬ال ميكن ا�صتخدام خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬يف البث ال�صبكي‪.‬‬

‫‪ 2‬ا�صرح كيف تعمل خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬وخوارزمية البحث باأولوية العمق (‪.)DFS‬‬

‫‪ 3‬قارن بني خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬وخوارزمية البحث باأولوية العمق (‪.)DFS‬‬

‫‪87‬‬ ‫‪86‬‬
‫الدر�س الثالث‬ ‫‪ 5‬اكت��ب دال��ة بلغ��ة البايث��ون تَ�ص� ِ‬
‫�تخدم خوارزمي��ة البح��ث باأولوي��ة االت�ص��اع (‪ )BFS‬يف ُخمطَّ ��ط للتحق��ق مم��ا اإذا كان هن��اك‬
‫اتخاذ القرار القائم على القواعد‬ ‫م�صار بني ُعقدتني ُمعطاتني‪.‬‬

‫األأن مة القائمة على القواعد ‪Rule-Based Systems‬‬


‫تُر ِّك��ز اأنظم��ة ال��ذكاء اال�صطناع��ي القائم��ة على القواعد على ا�ص��تخدام جمموعة من القواعد املُح َّددة ُم�ص��بقًا التخاذ القرارات‬
‫وح��ل امل�ص��كالت‪ .‬االأنظم��ة اخلب��رة (‪ )Expert Systems‬ه��ي املث��ال االأك��ر �ص��هرة لل��ذكاء اال�صطناع��ي القائ��م عل��ى القواعد‪،‬‬
‫وهي اإحدى �صور الذكاء اال�صطناعي االأوىل التي طُ وِّرت وانت�صرت يف فرتة الثمانينيات والت�صعينيات من القرن املا�صي‪ .‬وغالبًا‬
‫م��ا كان��ت تُ�ص��تخدَ م الأمتت��ة امله��ام الت��ي تتطلب عاد ًة خربات ب�ص��رية مثل‪ :‬ت�ص��خي�ص احل��االت الطبية اأو حتديد امل�ص��كالت التقنية‬
‫واإ�صالحها‪ .‬واليوم مل َتعُد االأنظمة القائمة على القواعد التقنية هي االأحدث‪ ،‬حيث تفوّقت عليها منهجيات الذكاء اال�صطناعي‬
‫احلديث��ة‪ .‬وم��ع ذل��ك‪ ،‬ال ت��زال االأنظم��ة اخلب��رة �ص��ائعة اال�ص��تخدام يف العديد من املجاالت نظرًا لقدرته��ا على اجلمع بن االأداء‬
‫املعقول وعملية اتخاذ القرار البديهية والقابلة للتف�صر‪.‬‬

‫قاعدة املعرِ فة ‪Knowledge Base‬‬


‫األأن مة اخلبرة‬
‫(‪:)Expert systems‬‬ ‫اأح��د املكون��ات الرئي�ص��ة الأنظم��ة ال��ذكاء اال�صطناع��ي القائم��ة عل��ى القواع��د ه��ي‬
‫قاع��دة املعرِ ف��ة‪ ،‬وه��ي جمموع��ة م��ن احلقائ��ق والقواع��د الت��ي َي�ص� ِ‬
‫�تخدمها النظ��ام‬
‫النظ��ام اخلب��ر ه��و اأحد اأن��واع الذكاء‬ ‫التخ��اذ الق��رارات‪ .‬تُدخَ ��ل ه��ذه احلقائ��ق والقواع��د يف النظ��ام بوا�ص��طة اخل��رباء‬
‫اال�صطناع��ي ال��ذي ُيحاك��ي ق��درة‬ ‫‪ 6‬اكت��ب دال��ة بلغ��ة البايث��ون تَ�ص��تخدِ م خوارزمي��ة البح��ث باأولوي��ة العم��ق (‪ )DFS‬الإيج��اد امل�ص��ار االأق�ص��ر يف خمط��ط غ��ر‬
‫الب�ص��رين امل�ص�وؤولن ع��ن حتدي��د املعلوم��ات االأك��ر اأهمي��ة وحتدي��د القواع��د الت��ي‬ ‫موزون‪.‬‬
‫اتخ��اذ الق��رار ل��دى اخلب��ر الب�ص��ري‪.‬‬ ‫يتَّبعه��ا النظ��ام‪ .‬التخ��اذ الق��رار اأو ح��ل املُ�ص��كلة‪ ،‬يبداأ النظام اخلب��ر بالتحقق من‬
‫َي�ص� ِ‬
‫�تخد م النظ��ام قا ع��دة املعرِ ف��ة‬ ‫احلقائ��ق والقواع��د يف قاع��دة البيان��ات و تطبيقه��ا عل��ى املوق��ف احل��ايل‪ .‬اإن مل‬
‫املُك َّون��ة من قواعد وحقائق وحمركات‬ ‫يتمك��ن النظ��ام م��ن العث��ور عل��ى تطاب��ق بن احلقائ��ق والقواعد يف قاع��دة املعرِ فة‪،‬‬
‫اال�ص��تدالل لتق��دمي امل�ص��ورة اأو ح��ل‬ ‫فق��د يطل��ب م��ن املُ�ص� ِ‬
‫�تخدم معلوم��ات اإ�صافي��ة اأو اإحال��ة امل�ص��كلة اإىل خب��ر ب�ص��ري‬
‫امل�صكالت يف جمال معريف ُحم َّدد‪.‬‬ ‫ملزي��د م��ن امل�ص��اعدة‪ ،‬واإلي� َ�ك بع���ص مزاي��ا وعي��وب االأنظم��ة القائم��ة عل��ى القواع��د‬
‫مو�صحة يف جدول ‪:2.5‬‬

‫جدول  ‪ :2.5‬املزايا والعيو الرئي�صة لالأن مة القائمة على القواعد‬


‫العيوب‬ ‫املزايا‬
‫• ُميكنه��ا اتخ��اذ الق��رارات وح��ل امل�ص��كالت ب�ص��رعة • تَعم��ل ه��ذه االأنظم��ة بكف��اءة طامل��ا كان��ت مُدخَ ��الت املعرِ ف��ة‬
‫والقواع��د جي��دة‪ ،‬وق��د ال ت�ص��تطيع التعام��ل م��ع املواق��ف الت��ي‬ ‫وبدق��ة اأف�ص��ل م��ن الب�ص��ر‪ ،‬خا�ص ًة عندم��ا يتعلق االأمر‬
‫تقع خارج نطاق خرباتها‪.‬‬ ‫بامله��ام الت��ي تتطل��ب ق��درًا كب �رًا م��ن املعرِ ف��ة اأو‬
‫• ال ُميكنه��ا التعلُّ��م اأو التك ُّي��ف بالطريق��ة نف�ص��ها مث��ل الب�ص��ر‪،‬‬ ‫البيانات‪.‬‬
‫وه��ذا يجعله��ا أاق��ل قابلي��ة للتطبي��ق عل��ى االأح��داث املُتغ� ِّ�رة‬ ‫• تَعم��ل ه��ذه االأنظم��ة با�ص��تمرار‪ ،‬دون حت ُّي��ز اأو اأخط��اء‬
‫حيث تتغر ُمدخَ الت البيانات واملنطق كثرًا مبرور الوقت‪.‬‬ ‫ق��د توؤث��ر يف بع���ص االأحي��ان عل��ى اتخ��اذ الق��رار‬
‫الب�صري‪.‬‬
‫‪89‬‬ ‫‪88‬‬
‫�ص��يتَّبع االإ�ص��دار االأول القائ��م عل��ى القواع��د قاع��دة ب�ص��يطة اأال وه��ي‪ :‬اإذا كان ل��دى املري���ص عل��ى ا أالق��ل ثالثً��ا م��ن جمي��ع‬ ‫نظام ذكاء ا�صطناعي قائم على القواعد‬ ‫يف ه��ذا الدر���ص �ص��تتعلّم املزي��د ح��ول االأنظم��ة القائم��ة عل��ى القواع��د يف �ص��ياق اأح��د تطبيقاته��ا‬
‫االأعرا���ص املحتمل��ة للمر���ص‪ ،‬فيج��ب اإ�صاف��ة املر���ص كت�ص��خي�ص ُحم َتم��ل‪ .‬ميكن��ك العث��ور اأدن��اه عل��ى دال��ة ‪Python‬‬ ‫قاعدة املعرِفة‬ ‫�خي�صا طب ًي��ا وف ًق��ا لالأعرا���ص الت��ي‬
‫الرئي�ص��ة‪ ،‬وه��و‪ :‬الت�ص��خي�ص الطب��ي‪� .‬ص��يعر�ص النظ��ام ت�ص� ً‬
‫(البايث��ون) الت��ي تَ�ص� ِ‬
‫�تخدم ه��ذه القاع��دة الإج��راء الت�ص��خي�ص‪ ،‬باال�ص��تناد اإىل قاع��دة املعرِ ف��ة املذك��ورة أاع��اله واأعرا���ص‬ ‫مر�س ‪1‬‬
‫و�ص��ح يف ال�ص��كل ‪ .2.8‬ب��دءًا بنظ��ام ت�ص��خي�ص ب�ص��يط ُم�ص��ت ِند‬
‫تظه��ر عل��ى املري���ص‪ ،‬كم��ا ه��و ُم ّ‬
‫املر�ص الظاهرة على املري�ص‪.‬‬ ‫‪a‬‬ ‫‪b‬‬ ‫‪c‬‬ ‫‪d‬‬ ‫اأعرا�س‬ ‫اإىل القواعد‪ ،‬و�صتكت�صف بع�ص االأنظمة االأكر ذكا ًء وكيف ُيحقِّق كل تكرار نتائج اأف�صل‪.‬‬
‫مر�س ‪2‬‬
‫‪def diagnose_v1(patient_symptoms:list):‬‬ ‫‪e‬‬ ‫‪f‬‬ ‫‪g‬‬ ‫‪h‬‬ ‫اأعرا�س‬ ‫االإ�صدار ‪1‬‬

‫‪diagnosis=[] # the list of possible diseases‬‬


‫مر�س ‪3‬‬ ‫يف االإ�ص��دار االأول �ص��تبني نظامً ��ا ب�ص��يطً ا قائ ًم��ا عل��ى القواع��د ميكن��ه ت�ص��خي�ص ثالث��ة اأمرا���ص‬
‫‪i‬‬ ‫‪j‬‬ ‫‪k‬‬ ‫‪l‬‬ ‫اأعرا�س‬ ‫ُحمتمل��ة‪( KidneyStones :‬ح�ص��ى ال ُكل��ى)‪ ،‬و‪( Appendicitis‬الته��اب الزائ��دة الدودي��ة)‪،‬‬
‫‪if "vomiting" in patient_symptoms:‬‬ ‫و‪( Food Poisoning‬الت�ص�مُم الغذائ��ي)‪� .‬ص��تكون املُدخَ ��الت اإىل النظ��ام ه��ي قاع��دة معرف��ة‬
‫ب�ص��يطة ترب��ط كل مر���ص بقائم��ة م��ن االأعرا���ص املُحتمل��ة‪ .‬يتو ّف��ر ذل��ك يف ملف بتن�ص��يق ‪JSON‬‬
‫‪if "abdominal pain" in patient_symptoms:‬‬ ‫و�صح باالأ�صفل‪.‬‬‫(جي�صون) ُميكنك حتميله وعر�صه كما هو ُم َّ‬
‫‪if "diarrhea" in patient_symptoms:‬‬
‫‪import json # a library used to save and load JSON files‬‬
‫مري�س ‪2‬‬ ‫مري�س ‪1‬‬
‫‪# 1:vomiting, 2:abdominal pain, 3:diarrhea‬‬ ‫اأعرا�س‬ ‫اأعرا�س‬
‫‪b‬‬ ‫‪d‬‬ ‫‪a‬‬ ‫‪j‬‬
‫‪# the file with the symptom mapping‬‬
‫)'‪diagnosis.append('food poisoning‬‬ ‫‪f‬‬ ‫‪g‬‬ ‫‪e‬‬ ‫‪k‬‬
‫'‪symptom_mapping_file='symptom_mapping_v1.json‬‬

‫‪elif 'fever' in patient_symptoms:‬‬


‫‪# open the mapping JSON file and load it into a dictionary‬‬
‫مر�س‬ ‫مر�س‬ ‫مر�س‬ ‫‪with open(symptom_mapping_file) as f:‬‬
‫‪# 1:vomiting, 2:abdominal pain, 3:fever‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫)‪mapping=json.load(f‬‬
‫)'‪diagnosis.append('food poisoning‬‬
‫الت�صخي�صات‬
‫)'‪diagnosis.append('appendicitis‬‬ ‫‪# print the JSON file‬‬
‫�صكل ‪ :2.8‬الت�صخي�ص الطبي بوا�صطة نظام‬ ‫))‪print(json.dumps(mapping, indent=2‬‬
‫‪elif "lower back pain" in patient_symptoms and 'fever' in patient_symptoms:‬‬ ‫الذكاء اال�صطناعي القائم على القواعد‬

‫‪# 1:vomiting, 2:lower back pain, 3:fever‬‬ ‫{‬


‫{ ‪"diseases":‬‬
‫)'‪diagnosis.append('kidney stones‬‬
‫[ ‪"food poisoning":‬‬
‫‪"vomiting",‬‬
‫‪elif "abdominal pain" in‬‬ ‫\‪patient_symptoms and‬‬
‫‪"abdominal pain",‬‬
‫\‪"diarrhea" in patient_symptoms and‬‬
‫‪"diarrhea",‬‬
‫\‪"fever" in patient_symptoms:‬‬ ‫"‪"fever‬‬
‫‪# 1:abdominal pain, 2:diarrhea, 3:fever‬‬ ‫‪],‬‬
‫)'‪diagnosis.append('food poisoning‬‬ ‫[ ‪"kidney stones":‬‬
‫‪"lower back pain",‬‬
‫‪return diagnosis‬‬ ‫‪"vomiting",‬‬
‫"‪"fever‬‬
‫‪],‬‬
‫يف ه��ذه احلال��ة‪ ،‬تك��ون قاع��دة املعرِ ف��ة حم��دد ًة بتعليم��اتٍ برجمي � ٍة ثابت��ة (‪ )Hard-Coded‬داخ��ل الدال��ة يف �ص��كل‬ ‫[ ‪"appendicitis":‬‬
‫َ�صتخدم هذه العبارات االأعرا�ص ال�صائعة بن االأمرا�ص الثالثة للتو�صل تدريجيًا اإىل الت�صخي�ص يف اأ�صرع‬ ‫عبارات ‪ .IF‬ت ِ‬ ‫‪"abdominal pain",‬‬
‫وق��ت ممك��ن‪ .‬عل��ى �ص��بيل املث��ال‪ ،‬عَ ر���ص ‪( Vomiting‬الق��يء) م�ص��رتك بن جمي��ع االأمرا�ص‪ .‬لذل��ك‪ ،‬اإذا كانت عبارة ‪IF‬‬ ‫‪"vomiting",‬‬
‫االأوىل �صحيح��ة فق��د مت بالفع��ل ح�ص��اب اأح��د االأعرا���ص الثالث��ة املطلوب��ة جلمي��ع االأمرا���ص‪ .‬بع��د ذل��ك‪� ،‬ص��وف تب��داأ يف‬ ‫"‪"fever‬‬
‫]‬
‫البح��ث ع��ن ‪( Abdominal Pain‬اأمل البط��ن) املرتب��ط مبر�ص��ن وت�ص��تمر بالطريق��ة نف�ص��هاحتى يت��م النظ��ر يف جمي��ع‬ ‫}‬
‫جمموعات االأعرا�ص املمكنة‪.‬‬ ‫}‬

‫‪91‬‬ ‫‪90‬‬
‫االإ�صدار ‪2‬‬
‫ُميكنك بعد ذلك اختبار هذه الدالة على ثالثة مر�صى خمتلفن‪:‬‬
‫يف االإ�صدار الثاين‪� ،‬صتُعزِّ ز مرونة وقابلية تطبيق النظام القائم على القواعد بتمكينه من قراءة قاعدة املعرِ فة امل ِّ‬
‫ُتغرة‬ ‫‪# Patient 1‬‬
‫مبا�ص��ر ًة م��ن مل��ف ‪( JSON‬ج�ص��ون)‪� .‬ص��يوؤدي ه��ذا اإىل احل��د م��ن عملي��ة الهند�ص��ة اليدوي��ة لعبارات ‪ IF‬ال�صَ ��رطيَّة ح�ص��ب‬ ‫]'‪my_symptoms=['abdominal pain', 'fever', 'vomiting‬‬
‫قابال للتطبيق على قواعد املعرِ فة االأكرب حجمًا مع تزايد‬ ‫حت�صنًا كبرًا يجعل النظام ً‬ ‫االأعرا�ص �صمن الدالة‪ .‬وهذا ُيع ُّد ُّ‬ ‫)‪diagnosis=diagnose_v1(my_symptoms‬‬
‫يو�صح قاعدة املعرِ فة‪.‬‬
‫عدد االأمرا�ص واالأعرا�ص‪ .‬ويف االأ�صفل‪ ،‬مثال ّ‬ ‫)‪print('Most likely diagnosis:',diagnosis‬‬

‫‪# Patient 2‬‬


‫'‪symptom_mapping_file='symptom_mapping_v2.json‬‬
‫] '‪my_symptoms=['vomiting', 'lower back pain', 'fever‬‬
‫‪with open(symptom_mapping_file) as f:‬‬ ‫)‪diagnosis=diagnose_v1(my_symptoms‬‬
‫)‪mapping=json.load(f‬‬
‫)‪print('Most likely diagnosis:',diagnosis‬‬
‫))‪print(json.dumps(mapping, indent=2‬‬
‫‪# Patient 3‬‬
‫]'‪my_symptoms=['fever', 'cough', 'vomiting‬‬
‫{‬ ‫‪"headache",‬‬
‫)‪diagnosis=diagnose_v1(my_symptoms‬‬
‫{ ‪"diseases":‬‬ ‫‪"tiredness",‬‬
‫[ ‪"covid19":‬‬ ‫‪"stuffy nose",‬‬ ‫)‪print('Most likely diagnosis:',diagnosis‬‬
‫‪"fever",‬‬ ‫‪"sneezing",‬‬
‫‪"headache",‬‬ ‫‪"sore throat",‬‬
‫‪"tiredness",‬‬ ‫‪"cough",‬‬ ‫]'‪Most likely diagnosis: ['food poisoning', 'appendicitis‬‬
‫‪"sore throat",‬‬ ‫"‪"runny nose‬‬ ‫]'‪Most likely diagnosis: ['kidney stones‬‬
‫"‪"cough‬‬ ‫‪],‬‬ ‫][ ‪Most likely diagnosis:‬‬
‫‪],‬‬ ‫[ ‪"allergies":‬‬
‫[ ‪"common cold":‬‬ ‫‪"headache",‬‬
‫‪"stuffy nose",‬‬ ‫‪"tiredness",‬‬ ‫املري�س ‪3‬‬ ‫املري�س ‪2‬‬ ‫املري�س ‪1‬‬
‫‪"runny nose",‬‬ ‫‪"stuffy nose",‬‬
‫‪"sneezing",‬‬ ‫‪"sneezing",‬‬ ‫االأعرا�س‪:‬‬ ‫االأعرا�س‪:‬‬ ‫االأعرا�س‪:‬‬
‫‪"sore throat",‬‬ ‫‪"cough",‬‬ ‫‪( Fever‬احلُمى)‬ ‫•‬ ‫‪( Vomiting‬القيء)‬ ‫•‬ ‫‪Abdominal pain‬‬ ‫•‬
‫"‪"cough‬‬ ‫"‪"runny nose‬‬ ‫‪( Cough‬ال�صُ عال)‬ ‫•‬ ‫‪Lower back pain‬‬ ‫•‬ ‫(اأمل يف البطن)‬
‫‪],‬‬ ‫]‬ ‫‪( Vomiting‬القيء)‬ ‫•‬ ‫(اأمل باأ�صفل الظهر)‬ ‫‪( Fever‬احلُمى)‬ ‫•‬
‫[ ‪"flu":‬‬ ‫}‬ ‫‪( Fever‬احلُمى)‬ ‫•‬ ‫‪( Vomiting‬القيء)‬ ‫•‬
‫‪"fever",‬‬ ‫}‬
‫الت�صخي�س الطبي با�صتخدام نظام الذكاء اال�صطناعي القائم على القواعد | ‪symptom_mapping_v1.json‬‬

‫‪Food poisoning or Appendicitis‬‬


‫قاع��دة املعرِ ف��ة اجلدي��دة ه��ذه اأك��رب قلي� ً�ال م��ن �ص��ابقتها‪ .‬وم��ع ذل��ك‪ ،‬يتَّ�ص��ح اأن حماول��ة اإن�ص��اء‬ ‫؟‬ ‫‪( Kidney stones‬ح�صى الكُلى)‬ ‫(الت�صمُم الغذائي اأو التهاب الزائدة الدودية)‬
‫عب��ارات ‪ IF‬ال�صَ ��رطيَّة يف ه��ذه احلال��ة �ص��تكون اأ�صعب بكثر‪ .‬على �ص��بيل املث��ال‪ ،‬ت�صمنت قاعدة‬ ‫�صكل ‪ :2.9‬متثيل االإ�صدار االأول‬
‫املعرِ ف��ة ال�ص��ابقة رب��ط اأح��د االأمرا���ص باأربعة اأعرا�ص‪ ،‬ومر�صن بثالث��ة اأعرا�ص‪ .‬وعند تطبيق‬ ‫يت�صم��ن الت�ص��خي�ص الطب��ي للمري���ص االأول الت�ص� ُمم الغذائ��ي والتهاب الزائدة الدودي��ة الأن االأعرا�ص الثالثة التي تظهر‬
‫قاع��دة ثالث��ة اأعرا���ص عل��ى االأق��ل املُط َّبق��ة يف االإ�ص��دار االأول‪ ،‬حت�ص��ل عل��ى ‪ 6‬جمموع��ات‬ ‫عل��ى املري���ص ترتب��ط ب��كال املر�ص��ن‪ .‬يُ�ص��خَّ �ص املري���ص الث��اين بح�ص��ى ال ُكل��ى‪ ،‬فه��و املر���ص الوحي��د ال��ذي جتتم��ع في��ه‬
‫االإ�صدار ‪1‬‬
‫ثالثي��ة م��ن االأعرا���ص املحتمل��ة الت��ي توؤخَ ��ذ يف االعتب��ار‪ .‬يف قاع��دة املعرِ ف��ة اجلدي��دة باالأعل��ى‪،‬‬ ‫االأعرا���ص الثالث��ة‪ .‬يف النهاي��ة‪ ،‬ال ُميك��ن ت�ص��خي�ص احلال��ة الطبي��ة للمري���ص الثال��ث؛ الأن االأعرا���ص الثالث��ة الت��ي ظهرت‬
‫االإ�صدار ‪2‬‬ ‫تك��ون لالأمرا���ص االأربع��ة ‪ 5‬و‪ 5‬و‪ 8‬و‪ 6‬اأعرا���ص‪ ،‬عل��ى الت��وايل‪ .‬وبه��ذا‪ ،‬حت�ص��ل عل��ى ‪96‬‬ ‫على املري�ص ال جتتمع يف ا ٍأي من االأمرا�ص الثالثة‪.‬‬
‫جمموع��ة ثالثي��ة م��ن االأعرا���ص املحتمل��ة‪ .‬ويف ح��ال التعامل م��ع مئات اأو حت��ى اآالف االأمرا�ص‪،‬‬ ‫يتميز االإ�صدار االأول القائم على القواعد بالبديهية والقابلية للتف�ص��ر‪ ،‬كما يت�صمن ا�ص��تخدام قاعدة املعرِ فة والقواعد‬
‫�صتج ُد اأنّه من امل�صتحيل اإن�صاء نظام مثل املوجود يف االإ�صدار االأول‪.‬‬ ‫يف الت�ص��خي�ص الطب��ي دون َحت ُّي��ز اأو انح��راف ع��ن اخل��ط املعي��اري‪ .‬وم��ع ذلك‪ ،‬ي�ص��وب ه��ذا االإ�صدار العدي��د من العيوب‪:‬‬
‫وكذل��ك‪ ،‬ال يوج��د �ص��بب طب��ي وجي��ه ل ِق َ�ص��ر الت�ص��خي�ص الطب��ي عل��ى جمموع��ات ثالثي��ة م��ن‬ ‫ب�ص��ط للغاي��ة لكيفية الت�ص��خي�ص الطبي على يد اخلبر الب�ص��ري‪.‬‬ ‫ا ًأوال‪ ،‬اأن قاع��دة ثالث��ة اأعرا���ص عل��ى االأق��ل ه��ي متثي��ل ُم َّ‬
‫�صكل ‪ :2.10‬االإ�صدار الثاين ال‬ ‫االأعرا���ص‪ .‬ولذل��ك‪� ،‬ص��تجعل منط��ق الت�ص��خي�س (‪ )Diagnosis Logic‬اأك��ر تنوعً ��ا بح�ص��اب‬ ‫بتعليمات برجمي ٍة ثابتة‪ ،‬وعلى الرغم من اأنه ي�ص� ُهل اإن�ص��اء عبارات‬
‫ٍ‬ ‫ثان ًي��ا‪ ،‬اأن قاع��دة املعرِ ف��ة داخ��ل الدال��ة تك��ون حم��دد ًة‬
‫يحتوي على عبارات ‪ IF‬ال�صَ رطيَّة‬ ‫�تخدم بتحدي��د ع��دد االأعرا���ص املُطابق��ة‬ ‫ع��دد االأعرا���ص املُطابق��ة ل��كل مر���ص‪ ،‬وال�ص��ماح لل ُم�ص� ِ‬ ‫طويال عند ت�صخي�ص احلاالت‬ ‫�صَ رطيَّة ب�صيطة لقواعد املعرِ فة ال�صغرة‪ ،‬اإال اأن املهمة ت�صبح اأكر تعقيدً ا وت�صتغرق وقتًا ً‬
‫بتعليمات برجمي ٍة ثابتة‪.‬‬
‫ٍ‬ ‫املحدد ًة‬ ‫التي يجب توافرها يف املر�ص لت�صمينه يف الت�صخي�ص‪.‬‬ ‫التي تعاين من العديد من االأمرا�ص واالأعرا�ص املر�صية‪.‬‬
‫‪93‬‬ ‫‪92‬‬
# Patient 1 def diagnose_v2(patient_symptoms:list,
my_symptoms=["stuffy nose", "runny nose", "sneezing", "sore throat"] symptom_mapping_file:str,
diagnosis=diagnose_v2(my_symptoms,'symptom_mapping_v2.json' , 3) matching_symptoms_lower_bound:int):
print('Most likely diagnosis:',diagnosis)
diagnosis=[]
# Patient 2
my_symptoms=["stuffy nose", "runny nose", "sneezing", "sore throat"] with open(symptom_mapping_file) as f:
diagnosis=diagnose_v2(my_symptoms, 'symptom_mapping_v2.json' , 4) mapping=json.load(f)
print('Most likely diagnosis:',diagnosis)
# access the disease information
# Patient 3 disease_info=mapping['diseases']
my_symptoms=['fever', 'cough', 'vomiting']
diagnosis=diagnose_v2(my_symptoms, 'symptom_mapping_v2.json' , 3)
# for every disease
print('Most likely diagnosis:',diagnosis)
for disease in disease_info:

Most likely diagnosis: ['common cold', 'flu', 'allergies'] counter=0


Most likely diagnosis: ['common cold']
Most likely diagnosis: [] disease_symptoms=disease_info[disease]

3 ‫املري�س‬ 2 ‫املري�س‬ 1 ‫املري�س‬ # for each patient symptom


:‫االأعرا�س‬ :‫االأعرا�س‬ :‫االأعرا�س‬ for symptom in patient_symptoms:

)‫ (احلُمى‬Fever • Stuffy nose • Stuffy nose •


)‫ (ال�صُ عال‬Cough • )‫(ان�صداد االأنف‬ • )‫(ان�صداد االأنف‬ • # if this symptom is included in the known symptoms for the disease
)‫ (القيء‬Vomiting • Runny nose • Runny nose • if symptom in disease_symptoms:
)‫(ر�صح االأنف‬ )‫(ر�صح االأنف‬
)‫ (العُطا�ص‬Sneezing • )‫ (العُطا�ص‬Sneezing •
Sore throat • Sore throat • counter+=1
)‫(التهاب احللق‬ )‫(التهاب احللق‬
if counter>=matching_symptoms_lower_bound:
diagnosis.append(disease)

symptom_mapping_v2.json
return diagnosis

‫ بعد حتمي��ل ُخمطَّ ط االأعرا�ص من‬.‫�ات برجمي ٍة ثابتة‬ ٍ �‫ ال�صَ ��رطيَّة املح��ددة بتعليم‬IF ‫ال يحت��وي ه��ذا االإ�ص��دار عل��ى عب��ارات‬
? (‫ )نزالت الربد‬Common cold Common cold or Flu or Allergies
( ‫)نزالت الربد اأو االإنفلونزا اأو احل�صا�صية‬
.FOR ‫ يب��داأ االإ�ص��دار يف اأخ��ذ ك ّل مر���ص حمتم��ل يف االعتب��ار با�ص��تخدام حلق��ة التك��رار االأوىل‬،)‫ (ج�ص��ون‬JSON ‫مل��ف‬
‫ متثيل االإ�صدار الثاين‬:2.11 ‫�صكل‬ ‫) يف كل مرة‬Counter( ‫تتحق��ق احللق��ة م��ن كل َع ْر���ص عل��ى ح��دة مبقارنت��ه باالأعرا�ص املعروفة للمر�ص وزي��ادة الع� َّداد‬
‫ ُيع ُّد هذا االإ�صدار اأك��ر قابلية للتطبيق على‬،‫ ومع ذل��ك‬.‫الح��ظ اأن االإ�ص��دار الث��اين ه��و ن�ص��خة ُمع َّمم��ة م��ن االإ�صدار االأول‬ .‫يجد فيها النظام تطابقًا‬
‫ حتى ل��و كانت ت�ص��مل االآالف من‬،‫ وميك��ن ا�ص��تخدامه كم��ا ه��و م��ع اأي قاع��دة معرِ ف��ة أاخ��رى بالتن�ص��يق نف�ص��ه‬،‫نط��اق وا�ص��ع‬
ِ �‫ كم��ا َي�ص��مح لل ُم�ص‬.‫االأمرا���ص م��ع ع��دد �صخ��م م��ن االأعرا���ص‬
‫�تخدم بزي��ادة اأو تقلي��ل ع��دد القي��ود على الت�ص��خي�ص ب�صبط‬
‫ فعل��ى‬:2 ‫ واملري���ص‬1 ‫ ميك��ن مالحظ��ة ذل��ك يف حال��ة املري���ص‬.matching_symptoms_lower_bound ‫املُتغ� ِّ�ر‬
.‫ �صتح�صل على ت�صخي�ص خمتلف متامً ا‬،‫ُتغر‬ ِّ ‫ اإال اأنه عند �صبط هذا امل‬،‫الرغم من اأنهما يعانيان من االأعرا�ص نف�صها‬
‫متثيال دقيقًا للت�صخي�ص‬
ً ‫ وال ُيع ُّد‬،‫اإال اإنّ بع�ص العيوب ال تزال موجودة يف هذا االإ�صدار‬،‫على الرغم من هذه التح�صينات‬
.‫الطبي احلقيقي‬
95 94
‫ و�صيُ�ص��تبدَ ل بدالة ت�ص��جيل النقاط التي تعطي اأوزانًا ُخم َّ�ص�صة‬،‫لن يُنظر اإىل املنطق الذي يقت�صر على عدد االأعرا�ص‬ 3 ‫االإ�صدار‬
‫�يتم ت�صمن‬
ّ �‫ �ص‬.‫ �ص�تَتوفر للم�ص��تخدِ م كذلك املرونة لتحديد االأوزان التي يراها منا�ص��بة‬.‫لالأعرا�ص االأكر واالأقل �ص��يوعً ا‬
.‫املر�ص اأو االأمرا�ص ذات املجموع املوزون االأعلى يف الت�صخي�ص‬ ‫ُف�صل من قاعدة‬
َّ ‫ �ص��تزيد م��ن ذكاء النظ��ام القائ��م عل��ى القواع��د مبنحه اإمكاني��ة الو�صول اإىل ن��وع م‬،‫يف االإ�ص��دار الثال��ث‬
ً �‫ اإنّ بع���ص االأعرا�ص تكون اأكر �ص‬:‫ ه��ذا الن��وع اجلدي��د ياأخ��ذ بع��ن االعتب��ار احلقيقة الطبي��ة التي تقول‬.‫املعرِ ف��ة‬
‫�يوعا من‬
from collections import defaultdict .‫اأخرى للمر�ص نف�صه‬
def diagnose_v3(patient_symptoms:list, symptom_mapping_file='symptom_mapping_v3.json'
symptom_mapping_file:str,
very_common_weight:float=1,
less_common_weight:float=0.5 with open(symptom_mapping_file) as f:
): mapping=json.load(f)

with open(symptom_mapping_file) as f: print(json.dumps(mapping, indent=2))


mapping=json.load(f)

disease_info=mapping['diseases'] { "fever",
"diseases": { "headache",
# holds a symptom-based score for each potential disease "covid19": { "tiredness",
disease_scores=defaultdict(int)
"very common": [ "sore throat",
"fever", "cough"
for disease in disease_info:
"tiredness", ],
# get the very common symptoms of the disease "cough" "less common": [
very_common_symptoms=disease_info[disease]['very common'] ], "stuffy nose",
"less common": [ "sneezing",
# get the less common symptoms for this disease
"headache", "runny nose"
less_common_symptoms=disease_info[disease]['less common']
"sore throat" ]
for symptom in patient_symptoms: ] },
}, "allergies": {
if symptom in very_common_symptoms: "common cold": { "very common": [
disease_scores[disease]+=very_common_weight "very common": [ "stuffy nose",
"stuffy nose", "sneezing",
elif symptom in less_common_symptoms:
"runny nose", "runny nose"
disease_scores[disease]+=less_common_weight
"sneezing", ],
# find the max score all candidate diseases "sore throat" "less common": [
max_score=max(disease_scores.values()) ], "headache",
"less common": [ "tiredness",
if max_score==0: "cough" "cough"
return []
] ]

else: }, }
# get all diseases that have the max score "flu": { }
diagnosis=[disease for disease in disease_scores if disease_scores "very common": [ }
[disease]==max_score]

return diagnosis, max_score

97 96
‫االإ�صدار ‪4‬‬
‫لكل مر�ص حمتمل يف قاعدة املعرِ فة‪ُ ،‬حتدِّ د هذه الدالة اجلديدة االأعرا�ص االأكر واالأقل ظهورًا على املري�ص‪ ،‬ثم تزيد‬
‫م��ن درج��ة املر���ص وف ًق��ا ل�الأوزان املُقا ِبل��ة‪ ،‬ويف االأخ��ر ُت��درَج االأمرا���ص ذات الدرج��ة االأعلى يف الت�ص��خي�ص‪ُ .‬ميكنك االآن‬
‫ميك��ن حت�ص��ن النظ��ام القائ��م عل��ى القواع��د بزي��ادة كف��اءة قاع��دة املعرِ ف��ة وجترب��ة دوال ت�ص��جيل النق��ا‬ ‫اختبار تنفيذ الدالة مع بع�ص االأمثلة‪:‬‬
‫(‪ )Scoring Functions‬املختلف��ة‪ .‬وعل��ى الرغ��م م��ن اأن ذل��ك �ص��يوؤدي اإىل حت�ص��ن النظام‪ ،‬اإال اأنه �ص��يتطلب الكثر من‬
‫الوقت واجلهد اليدوي‪ .‬وحل�صن احلظ‪ ،‬هناك طريقة اآلية لبناء نظام مبني على القواعد يكون ذكيًا مبا يكفي لت�صميم‬ ‫‪# Patient 1‬‬
‫قاع��دة معرِ ف��ة ودال��ة ت�ص��جيل نق��اط خا�ص��ة ب��ه‪ :‬با�ص��تخدام تعلُّ��م ا آالل��ة‪ُ .‬يط ِّب��ق تع ُّل��م ا آالل��ة القائ��م عل��ى القواع��د‬ ‫]"‪my_symptoms=["headache", "tiredness", "cough‬‬

‫بدال من احلاجة اإىل االإن�صان‬ ‫(‪ )Rule-Based Machine Learning‬خوارزمية تعلّم لتحديد القواعد املُفيدة تلقائيًا‪ً ،‬‬ ‫)'‪diagnosis=diagnose_v3(my_symptoms, 'symptom_mapping_v3.json‬‬

‫لتطبيق املعرِ فة واخلربات ال�صابقة يف املجال لبناء القواعد وتنظيمها يدويًا‪.‬‬ ‫)‪print('Most likely diagnosis:',diagnosis‬‬

‫�دال م��ن قاع��دة املعرِ ف��ة ودال��ة ت�ص��جيل النق��اط املُ�ص َّممتان يدويًا‪ ،‬تَتو َّق��ع خوارزمية تعلّم االآلة مدخ� ً�ال واحدً ا فقط وهو‬‫فب� ً‬ ‫‪# Patient 2‬‬
‫جمموع��ة البيان��ات التاريخ ّي��ة للح��االت املرَ�ص َّي��ة‪ .‬فالتعلُّ��م م��ن البيان��ات مبا�ص��ر ًة يح�وُل دون ح��دوث امل�ص��كالت املرتبط��ة‬ ‫]"‪my_symptoms=["stuffy nose", "runny nose", "sneezing", "sore throat‬‬
‫باكت�صاب املعرِ فة االأ�صا�صية والتحقق منها‪ .‬تتكون كل حالة من بيانات اأعرا�ص املري�ص والت�صخي�ص الطبي الذي ميكن‬ ‫)'‪diagnosis=diagnose_v3(my_symptoms, 'symptom_mapping_v3.json‬‬
‫اأن يقدم��ه اأي خب��ر ب�ص��ري مث��ل الطبي��ب‪ .‬وبا�ص��تخدام جمموع��ة بيان��ات التدري��ب‪ ،‬تتع ّل��م اخلوارزمي��ة تلقائ ًيا كي��ف تتنباأ‬ ‫)‪print('Most likely diagnosis:',diagnosis‬‬
‫بالت�صخي�ص املُحتمَل حلالة مري�ص جديد‪.‬‬
‫‪# Patient 3‬‬
‫‪import pandas as pd # import pandas to load and process spreadsheet-type data‬‬ ‫]"‪my_symptoms=["stuffy nose", "runny nose", "sneezing", "sore throat‬‬
‫)‪diagnosis=diagnose_v3(my_symptoms, 'symptom_mapping_v3.json', 1, 1‬‬
‫‪medical_dataset=pd.read_csv('medical_data.csv') # load a medical dataset.‬‬ ‫)‪print('Most likely diagnosis:',diagnosis‬‬

‫‪medical_dataset‬‬
‫)‪Most likely diagnosis: (['flu'], 3‬‬
‫)‪Most likely diagnosis: (['common cold'], 4‬‬
‫)‪Most likely diagnosis: (['common cold', 'flu'], 4‬‬

‫املري�س ‪3‬‬ ‫املري�س ‪2‬‬ ‫املري�س ‪1‬‬

‫االأعرا�س‪:‬‬ ‫االأعرا�س‪:‬‬ ‫االأعرا�س‪:‬‬


‫‪( Stuffy nose‬ان�صداد االأنف)‬ ‫•‬ ‫‪( Stuffy nose‬ان�صداد االأنف)‬ ‫•‬ ‫‪ُ Headache‬‬
‫(ال�صداع)‬ ‫•‬
‫‪( Runny nose‬ر�صح االأنف)‬ ‫•‬ ‫‪( Runny nose‬ر�صح االأنف)‬ ‫•‬ ‫‪( Tiredness‬االإعياء)‬ ‫•‬
‫‪( Sneezing‬العُطا�ص)‬ ‫•‬ ‫‪( Sneezing‬العُطا�ص)‬ ‫•‬ ‫‪( Cough‬ال�صُ عال)‬ ‫•‬
‫‪( Sore throat‬التهاب احللق)‬ ‫•‬ ‫‪( Sore throat‬التهاب احللق)‬ ‫•‬

‫‪symptom_mapping_v2.json‬‬

‫‪( Common cold or Flu‬نزالت الربد اأو االإنفلونزا)‬ ‫‪( Common cold‬نزالت الربد)‬ ‫‪( Flu‬االإنفلونزا)‬
‫�صكل ‪ :2.12‬متثيل االإ�صدار الثالث‬
‫يف املث��ال اأع��اله‪ ،‬حتت��وي جمموع��ة البيان��ات عل��ى ‪ 2,000‬حال��ة مر�صي��ة‪ ،‬بحي��ث تتك��ون كل حال��ة من ‪ 8‬اأعرا���ص حمتملة‪:‬‬ ‫ق��د تالح��ظ اأن��ه عل��ى الرغ��م م��ن اأن االأعرا���ص الثالث��ة عل��ى املري���ص ‪( Headache :1‬ال�ص��داع)‪ ،‬و‪Tiredness‬‬
‫(ال�ص��داع)‪ ،‬و‪Stuffy nose‬‬‫(ال�ص��عال)‪ ،‬و‪( Tiredness‬االإعي��اء)‪ ،‬و‪ُ Headache‬‬ ‫حلم��ى)‪ ،‬و‪ُ Cough‬‬ ‫‪( Fever‬ا ُ‬ ‫(االإعي��اء)‪ ،‬و‪( Cough‬ال�ص��عال) تظه��ر عن��د االإ�صاب��ة ب��كل م��ن ‪( Flu‬االإنفلون��زا)‪ ،‬و ‪( Covid19‬كوفي��د‪.)19 -‬‬
‫(ان�ص��داد االأن��ف)‪ ،‬و‪( Runny nose‬ر�ص��ح االأن��ف)‪ ،‬و‪( Sneezing‬العُطا���ص)‪ ،‬و‪( Sore throat‬الته��اب احلل��ق)‪.‬‬ ‫واحل�صا�ص��ية‪ ،‬ا ّإال اأنّ الظّ اه��ر يف نتائ��ج التّ�ص��خي�ص ه��ي االإنفلون��زا فق��ط‪ .‬هذا الأن جميع االأعرا�ص الثالثة �ص��ائعة جدً ا يف‬
‫تُر َّمز كل واحدة من هذه االأعرا�ص يف عمود ثنائي ُمنف�صل‪ .‬العدد الثنائي ‪ 1‬ي�صر اإىل اأن املري�ص ُيعاين من االأعرا�ص‪،‬‬ ‫قاع��دة املعرِ ف��ة‪ ،‬مم��ا ي�وؤدي اإىل درج��ة ق�ص��وى قدره��ا ‪ .3‬وباملث��ل‪ ،‬يف ظ��ل معان��اة املري���ص الث��اين والثال��ث م��ن االأعرا�ص‬
‫بينما العدد الثنائي ‪ 0‬ي�صر اإىل اأن املري�ص ال ُيعاين من االأعرا�ص‪.‬‬ ‫نف�صها‪ ،‬توؤدي ُمدخَ الت االأوزان املختلفة لالأعرا�ص االأكر واالأقل �صيوعً ا اإىل ت�صخي�صات خمتلفة‪ .‬وعلى وجه التحديد‪،‬‬
‫يَنتج عن ا�صتخدام وزن مت�صا ٍو لنوعن من االأعرا�ص اإ�صافة االإنفلونزا اإىل الت�صخي�ص‪.‬‬
‫‪99‬‬ ‫‪98‬‬
.‫ نقطة �صتُ�صتخدَ م الختباره‬600‫ نقطة بيانات �صتُ�صتخدَ م لتدريب النموذج و‬1,400 ‫لديك االآن‬ :‫ وهناك اأربعة ت�صخي�صات حمتملة‬،‫يحتوي العمود االأخر على ت�صخي�ص اخلبر الب�صري‬
:‫ابداأ بتدريب منوذج �صجرة القرار ومتثيله‬ .)‫ (نزالت الربد‬Common cold‫ و‬،)‫ (احل�صا�صية‬Allergies‫ و‬،)‫ (االإنفلونزا‬Flu‫ و‬،)19 -‫ (كوفيد‬Covid19
:‫ميكنك التحقق من ذلك ب�صهولة با�صتخدام املقطع الربجمي التايل بلغة البايثون‬
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
set(medical_dataset['diagnosis'])

my_tree=diagnose_v4(train_data) # train a model


،‫على الرغم من اأن هناك الع�صرات من خوارزميات تعلُّم االآلة املحتملة التي ميكن ا�صتخدامها مع جمموعة البيانات هذه‬
print(my_tree.classes_) # print the possible target labels (diagnoses) ‫ كم�ا �صتَ�ص�تخدِ م‬،)Decision Tree( ‫اإال اأن�ك �صت�ص�تخدم تل�ك الت�ي تتب�ع املنهجي�ة املُ�ص�ت ِندة عل�ى منط�ق �ص�جرة الق�رار‬
.‫) على وجه التحديد‬Sklearn( ‫ (م�صنّف �صجرة القرار) من مكتبة البايثون �صكلرن‬DecisionTreeClassifier
plt.figure(figsize=(12,6)) # size of the visualization, in inches

# plot the tree from sklearn.tree import DecisionTreeClassifier


plot_tree(my_tree,
def diagnose_v4(train_dataset:pd.DataFrame):
max_depth=2,
fontsize=10, # create a DecisionTreeClassifier
feature_names=medical_dataset.columns[:-1] model=DecisionTreeClassifier(random_state=1)
)
# drop the diagnosis column to get only the symptoms
train_patient_symptoms=train_dataset.drop(columns=['diagnosis'])
['allergies' 'common cold' 'covid19' 'flu']
# get the diagnosis column, to be used as the classification target
train_diagnoses=train_dataset['diagnosis']

# build a decision tree


model.fit(train_patient_symptoms, train_diagnoses)

# return the trained model


return model

،‫ فهو بب�صاطة يقراأ امللف التدريبي‬،‫ُيع ُّد تطبيق البايثون يف االإ�صدار الرابع اأق�صر واأب�صط بكثر من التطبيقات ال�صابقة‬
‫ وم��ن َث� َّ�م ينت��ج منوذجً ��ا‬،‫وي�ص��تخدمه لبن��اء من��وذج �ص��جرة الق��رار ا�ص��تنادًا اإىل العالق��ات ب��ن االأعرا���ص والت�ص��خي�صات‬
‫ واحدة‬،‫ اب��داأ بتق�ص��يم جمموع��ة البيان��ات اإىل جمموعتن منف�صلت��ن‬،‫ الختب��ار ه��ذا االإ�ص��دار ب�ص��كل �صحي��ح‬.‫خم�ص ً�ص��ا‬ َّ
.‫ واأخرى لالختبار‬،‫للتدريب‬
from sklearn.model_selection import train_test_split

# use the function to split the data, get 30% for testing and 70% for training.
train_data, test_data = train_test_split(medical_dataset, test_size=0.3,
random_state=1)

#print the shapes (rows x columns) of the two datasets


print(train_data.shape)
print(test_data.shape)

‫ الطبية) بعُمق م�صتوين‬-‫ (البيانات‬medical_data ‫ منوذج �صجرة القرار ملجموعة بيانات‬:2.13 ‫�صكل‬ (1400, 9)
(600, 9)

101 100
‫احتماال للمر�صى يف جمموعة االختبار‪.‬‬‫ً‬ ‫�صتَ�صتخدِ م االآن �صجرة القرار للتنبوؤ بالت�صخي�ص االأكر‬ ‫تُ�ص��تخدَ م دالة ()‪ plot_tree‬لر�ص��م وعر�ص �ص��جرة القرار‪ .‬ولعدم توفر م�ص��احة كافية للعر�ص �ص��يتم متثيل امل�ص��توين‬
‫تُ�ص��تخدَ م جمموع��ة االختب��ار لتقيي��م اأداء النم��وذج‪ .‬تَ�ص��ت ِند طريق��ة التقيي��م الدقيقة على م��ا اإذا كان املق�صود من املهمة‬ ‫ُتغر ‪.max_depth‬‬ ‫ا أالوّلن فقط‪ ،‬باالإ�صافة اإىل اجلذر‪ .‬ميكن �صبط هذا الرقم ب�صهولة با�صتخدام امل ِّ‬
‫االنح��دار (‪ )Regression‬اأم الت�صني��ف (‪ .)Classification‬يف مث��ل م�ص��كالت الت�صني��ف املعرو�ص��ة هن��ا‪ ،‬تُ�ص��تخدَ م‬
‫‪# plot the tree‬‬
‫طرائق التقييم ال�صهرة مثل‪ :‬ح�صاب دقة النموذج (‪ )Model's Accuracy‬وم�صفوفة الدقة (‪.)Confusion Matrix‬‬ ‫‪plot_tree(my_tree,‬‬
‫عُ مق‬
‫• الدق��ة ه��ي ن�ص��بة التنب�وؤات ال�صحيح��ة الت��ي يق��وم به��ا املُ�ص ِّن��ف‪َ .‬حت ُق��ق دق��ة عالي��ة قريب��ة م��ن ‪ 100%‬يعن��ي اأن معظم‬ ‫‪max_depth=2,‬‬
‫التنبوؤات التي يقوم بها املُ�صنِّف �صحيحة‪.‬‬ ‫‪fontsize=10‬‬ ‫�صجرة القرار‪.‬‬
‫• م�صفوف��ة الدق��ة ه��ي ج��دول يق��ارن ب��ن القيم احلقيقية (الفعلية) وبن التنبوؤات الت��ي يقوم بها املُ�صنِّف يف جمموعة‬
‫البيانات‪ .‬يحتوي اجلدول على �صف واحد لكل قيمة �صحيحة وعمود واحد لكل قيمة ُمتوقَّعة‪ .‬كل ُمدخَ ل يف امل�صفوفة‬ ‫كل عُ قدة يف ال�صجرة ُمتثِّل جمموعة فرعية من املر�صى‪ ،‬فعلى �صبيل املثال‪،‬‬
‫ُميثِّل عدد احلاالت التي لها قيم فعلية و ُمتوقَّعة‪.‬‬ ‫ُمت ِّث��ل عُ ق��دة اجل��ذر اإجم��ايل ع��دد ‪ 1,400‬مري���ص يف جمموع��ة بيان��ات التدري��ب‪ .‬م��ن‬
‫بينه��م‪ ،354 ،‬و ‪ ،345‬و ‪ ،358‬و ‪� 343‬صُ ��خِّ �صوا ب � ‪( Allergies‬احل�صا�ص��ية)‪،‬‬
‫‪# functions used to evaluate a classifier‬‬ ‫و‪( Common cold‬ن��زالت ال��ربد)‪ ،‬و‪( Covid19‬كوفي��د‪ ،)19-‬و‪( Flu‬االإنفلون��زا)‪،‬‬
‫‪from sklearn.metrics import accuracy_score,confusion_matrix‬‬ ‫على التوايل‪.‬‬
‫‪# drop the diagnosis column to get only the symptoms‬‬
‫)]'‪test_patient_symptoms=test_data.drop(columns=['diagnosis‬‬

‫‪# get the diagnosis column, to be used as the classification target‬‬


‫]'‪test_diagnoses=test_data['diagnosis‬‬

‫‪# guess the most likely diagnoses‬‬


‫)‪pred=my_tree.predict(test_patient_symptoms‬‬

‫‪# print the achieved accuracy score‬‬


‫)‪accuracy_score(test_diagnoses,pred‬‬
‫بُن َّي��ت ال�ص��جرة با�ص��تخدام من��ط م��ن االأعل��ى اإىل االأ�ص��فل ع��رب التف�رُّع الثنائ��ي (‪ .)Binary Splits‬يَ�ص��ت ِند التف�رُّع االأول‬
‫حلم��ى اأم ال‪ .‬ونظ�رًا الأن كل خ�صائ���ص االأعرا���ص ثنائي��ة‪ ،‬يك��ون التحق��ق ‪a <=0.5‬‬ ‫اإىل م��ا اإذا كان املري���ص ُيع��اين م��ن ا ُ‬
‫‪0.8166666666666667‬‬
‫حلمى (امل�ص��ار االأي�ص��ر) يتف َّرعون‬
‫�صحيحً ��ا اإذا مل يك��ن املري���ص يع��اين م��ن االأعرا���ص‪ .‬اأم��ا املر�صى الذين ال يعانون من ا ُ‬
‫م��رة اأخ��رى بن��ا ًء عل��ى م��ا اإذا كان��وا يعان��ون من التهاب احللق اأم ال‪ .‬املر�صى الذين ال يعان��ون من التهاب احللق يتف َّرعون‬
‫بن��ا ًء عل��ى م��ا اإذا كان��وا يعان��ون م��ن ر�ص��ح االأن��ف اأم ال‪ .‬يف ه��ذه املرحل��ة‪ ،‬حتت��وي ال ُعق��دة عل��ى ‪ 526‬حال��ة‪ّ .‬مت ت�ص��خي�ص‬
‫�ص��تالحِ ظ اأن �ص��جرة الق��رار ُحت ِّق��ق دق��ة ت�ص��ل اإىل ‪ ،81.6%‬وه��ذا يعن��ي اأن��ه م��ن ب��ن ‪ 600‬حال��ة ّمت اختبارها‪� ،‬صَ ��خَّ �صت‬ ‫‪ ،354‬و‪ ،101‬و‪ ،58‬و‪ 13‬من بينهم باحل�صا�صية‪ ،‬ونزالت الربد‪ ،‬وكوفيد‪ ،19-‬واالإنفلونزا‪ ،‬على التوايل‪.‬‬
‫ال�ص��جرة ‪ 490‬منه��ا ب�ص��كل �صحي��ح‪ُ .‬ميكن��ك كذل��ك طباع��ة م�صفوف��ة الدق��ة للنم��وذج لت�ص��تعر�ص ب�ص��كل اأف�ص��ل االأمثل��ة‬
‫املُ�صنَّفة ب�صكل خاطئ‪.‬‬

‫)‪confusion_matrix(test_diagnoses,pred‬‬

‫‪array([[143,‬‬ ‫‪3,‬‬ ‫‪0,‬‬ ‫‪0],‬‬


‫‪[ 48,‬‬ ‫‪98,‬‬ ‫‪5,‬‬ ‫‪4],‬‬
‫‪[ 2,‬‬ ‫‪1, 127, 12],‬‬
‫‪[ 1,‬‬ ‫)]]‪3, 31, 122‬‬ ‫ي�ص��تمر التفرُّع حتى ُحتدِّ د اخلوارزمية احلاالت التي انق�ص��مت بالفعل‬
‫يقي�س موؤ�صر جيني (‪)Gini Index‬‬
‫ال�صوائب بالعُقدة‪ ،‬وبالتحديد احتمالية‬ ‫اإىل ُعق��د نق َّي��ة متامً ��ا‪ .‬ال ُعق��دة النق َّي��ة بالكام��ل حتت��وي عل��ى احل��االت‬
‫ت�صنيف حمتويات العُقدة ب�صورة خاطئة‪.‬‬ ‫الت��ي له��ا الت�ص��خي�ص نف�ص��ه‪ِ .‬ق َي��م موؤ�ص��ر ‪( gini‬جين��ي) املُح� َّددة عل��ى‬
‫ي�صر انخفا�س م ِ‬
‫ُعامل جيني اإىل ارتفاع‬ ‫كل ُعق��دة‪ُ ،‬مت ِّث��ل موؤ�ص��رات عل��ى مقيا���ص جين��ي‪ ،‬وه��ي �صيغ��ة �ص��هرة‬
‫درجة تاأكُّد اخلوارزمية من الت�صنيف‪.‬‬ ‫ُ�صتخدم لتقييم درجة نقاء العُقدة‪.‬‬ ‫ت َ‬
‫‪103‬‬ ‫‪102‬‬
‫مترينات‬ ‫االإنفلونزا امل ُتوقَّعة‬ ‫امل ُتوقَّع‬ ‫كوفيد‪19‬‬ ‫احل�صا�صية امل ُتوقَّعة نزالت الربد امل ُتوقَّعة‬

‫‪ 1‬اذكر بع�س مزايا وعيوب االأنظمة القائمة على القواعد‪.‬‬


‫‪0‬‬ ‫‪0‬‬ ‫‪3‬‬ ‫‪143‬‬ ‫احل�صا�صية الفعلية‬

‫‪4‬‬ ‫‪5‬‬ ‫‪98‬‬ ‫‪48‬‬ ‫نزالت الربد الفعلية‬

‫‪12‬‬ ‫‪127‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫كوفيد ‪ 19‬الفعلي‬

‫‪ 2‬ما مزايا وعيوب االإ�صدار االأول؟‬


‫‪122‬‬ ‫‪31‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫االإنفلونزا الفعلية‬

‫�صكل ‪ :2.14‬م�صفوفة الدقة للحاالت املُتوقَّعة واحلاالت الفعلية‬

‫االأرق��ام الواقع��ة يف اخل��ط ال ُقط��ري (املُظلل��ة باللون الوردي) ُمتثِّل احلاالت املُتوقَّعة ب�ص��كل �صحيح‪ ،‬اأما االأرقام التي تقع‬
‫خارج اخلط القُطري فتُمثِّل اأخطاء النموذج‪.‬‬
‫عل��ى �ص��بيل املث��ال‪ ،‬بالنظ��ر اإىل ترتي��ب الت�ص��خي�صات االأربع��ة املُحتمل��ة [‪( Allergies‬احل�صا�ص��ية)‪Common cold ،‬‬
‫(ن��زالت ال��ربد)‪( Covid19 ،‬كوفي��د‪( Flu ،)19-‬االإنفلون��زا)]‪ ،‬تو�ص��ح امل�صفوف��ة اأن النم��وذج اأخط �اأ يف ت�صني��ف‬
‫‪ 48‬حال��ة م��ن املُ�صاب��ن بن��زالت ال��ربد باأنه��م م�صاب��ون باحل�صا�ص��ية‪ ،‬كم��ا اأخط�اأ يف ت�صني��ف ‪ 31‬حال��ة م��ن املُ�صاب��ن‬
‫مري�ص��ا ُيع��اين م��ن االأعرا�س التالية‬
‫ً‬ ‫‪ 3‬اأ�ص��ف اإىل املقط��ع الربجم��ي اخلا���س باالإ�ص��دار االأول لنظ��ام قائ��م عل��ى القواع��د‬ ‫باالإنفلونزا باأنهم م�صابون بكوفيد‪.19-‬‬
‫[‪( Vomiting‬الق��يء)‪ ،‬و ‪( Abdominal pain‬اآالم البط��ن)‪ ،‬و ‪( Diarrhea‬االإ�ص��هال)‪ ،‬و ‪( Fever‬ا ُ‬
‫حلم��ى)‪،‬‬ ‫وعل��ى الرغ��م م��ن اأنّ ه��ذا النم��وذج لي���ص مثال ًي��ا‪ ،‬فم��ن املُث��ر للده�ص��ة اأ ّن��ه قادر على حتقي��ق مثل هذه الدرج��ة العالية من‬
‫و‪( Lower back pain‬اأ باأ�صفل الظهر)]‪ .‬ما الت�صخي�س الطبي حلالة املري�س؟ َدوِّن مالحظاتك باالأ�صفل‪.‬‬ ‫الدق��ة بتعلُّ��م جمموع��ة القواع��د اخلا�ص��ة ب��ه‪ ،‬دون احلاج��ة اإىل قاع��دة معرِ ف��ة اأن�ص��ئت يدو ًي��ا‪ .‬باالإ�صاف��ة اإىل حتقي��ق مث��ل‬
‫ه��ذه الدق��ة دون حماول��ة �صب��ط ُمتغ��رات االأداء املتنوع��ة ل � ‪ُ ( DecisionTreeClassifier‬م�ص ِّن��ف �ص��جرة الق��رار)‪.‬‬
‫وبالت��ايل‪ُ ،‬ميك��ن حت�ص��ن دق��ة النم��وذج الأف�ص��ل م��ن ذل��ك‪ .‬كما ُميكن حت�ص��ن النموذج بتج��اوز قيود النم��وذج القائم على‬
‫القواعد وجتربة اأنواع خمتلفة من خوارزميات تعلُّم االآلة‪ .‬و�صتتعلّم بع�ص هذه الطرائق يف الوحدة التالية‪.‬‬

‫‪105‬‬ ‫‪104‬‬
‫الدر�س الرابع‬ ‫‪ 4‬يف ا الإ�ص��دار الث��اين‪ ،‬ك��م ع��دد ا الأمرا ���س ا مل ُو�صحَّ ��ة يف ت�ص��خي�س كل مري���س اإذا َغ� َّ�ر ت قيم��ة ا مل ُتغ� ِّ�ر‬
‫خوارزميات البحث امل�صتنرة‬ ‫‪ matching_symptoms_lower_bound‬اإىل ‪ 2‬و‪ 3‬و‪4‬؟ َعدِّل املقطع الربجمي ثم َدوِّن مالحظاتك‪.‬‬

‫تطبيقات خوارزميات البحث‬


‫احلالة النهائية‬ ‫‪Applications of Search Algorithms‬‬
‫خوارزميات البحث هي اأحد املكونات الرئي�صة الأنظمة الذكاء اال�صطناعي‪ ،‬فبا�صتخدامها‬
‫ُميكن اكت�صاف االحتماالت املختلفة الإيجاد احللول املنا�صبة للم�صكالت املُعقدة يف العديد‬
‫من التطبيقات ال�صائدة‪ .‬وفيما يلي اأمثلة على بع�ص تطبيقات خوارزميات البحث‪:‬‬
‫• الروبوتي�ة (‪ :)Robotics‬ق�د يَ�ص�تخدِ م الروب�وت خوارزمي�ة البح�ث لتحدي�د طريق�ه‬
‫عرب املتاهة اأو لتحديد موقع اأحد الكائنات يف نطاق بيئته‪.‬‬
‫• مواقع التجارة االإلكرتونية (‪ :)E-commerce Websites‬ت ِ‬
‫َ�صتخدم مواقع الت�صوق‬
‫ع�رب االإنرتن�ت خوارزمي�ات البح�ث ِلتُطاب�ق ب�ن ا�صتف�ص�ارات العم�الء وب�ن املُنتج�ات‬
‫املتوف�رة‪ ،‬ولت�صفي�ة نتائ�ج البح�ث وف�ق بع�ص املعاير مثل ال�ص�عر‪ ،‬والعالم�ة التجارية‪،‬‬ ‫‪ 5‬يف االإ�صدار الثالث‪ ،‬غ ََّر كال الوزنني اإىل ‪ 1‬للمري�صني االأول والثاين‪ ،‬متامًا مثل املري�س الثالث‪.‬‬
‫والتقييمات‪ ،‬واقرتاح املُنتجات ذات ال�صلة‪.‬‬
‫كائن‬
‫من�ص�ات مواق�ع التوا�ص�ل االجتماع�ي (‪ :)Social Media Platforms‬تَ�ص�تخدِ م‬ ‫• ّ‬ ‫َعدِّل املقطع الربجمي ثم َدوِّن مالحظاتك‪.‬‬
‫الروبوت‬ ‫مواق�ع التوا�ص�ل االجتماع�ي خوارزمي�ات البح�ث لعر��ص التدوين�ات‪ ،‬واالأ�ص�خا�ص‪،‬‬
‫ُ�صتخدمن وفقًا للكلمات املفتاحية واهتمامات امل ِ‬
‫ُ�صتخدم‪.‬‬ ‫واملجموعات للم ِ‬
‫• متكني االآلة من ممار�صة االألعاب �صتوى ٍ‬
‫عال من املهارة‬
‫(‪ :)Enabling a machine to play games at a high skill level‬يَ�ص�تخدِ م‬
‫ال�ذكاء اال�صطناع�ي خوارزمي�ة البح�ث اأثن�اء لع�ب ال�ص�طرجن اأو ق�و (‪ )Go‬لتقيي�م‬
‫احلركات املختلفة واختيار اخلطوات التي من املرجح اأن توؤدي اإىل الفوز‪.‬‬
‫احلالة االأوليّة‬
‫• ُنظ�م املالح�ة با�ص�تخدام ُحم�دِّد املواق�ع العامل�ي (‪:)GPS Navigation Systems‬‬
‫�صكل ‪ :2.15‬ا�صتخدام الروبوت خوارزمية‬ ‫تَ�ص�تخدِ م ُنظ�م املالح�ة القائمة على ُحم ِّدد املواق�ع العاملي خوارزميات البحث لتحديد‬
‫البحث لتحديد طريقه‬
‫اأق�صر واأ�ص�رع طريق بن موقعن‪ ،‬مع مراعاة بيانات حركة املرور يف الوقت احلايل‪.‬‬
‫• نُظم اإدارة امللفات (‪ :)File Management Systems‬تُ�صتخدم خوارزميات البحث‬
‫يف ُنظ�م اإدارة امللف�ات لتحدي�د موق�ع امللفات با�ص�تخدام ا�ص�م‪ ،‬وحمت�وى امللف‪ ،‬وبع�ص‬ ‫‪�ِ 6‬ص��فْ باإيج��از كي��ف ُمُيك��ن حت�ص��ني كل اإ�ص��دار بالن�ص��بة لالإ�ص��دار ال�ص��ابق ل��ه (االأول اإىل الث��اين‪ ،‬والث��اين اإىل الثال��ث‪،‬‬
‫ال�صمات االأخرى‪.‬‬ ‫والثالث اإىل الرابع)‪.‬‬
‫اأنواع خوارزميات البحث واأمثلتها ‪Types and Examples of Search Algorithms‬‬
‫هناك نوعان رئي�صان من خوارزميات البحث وهما‪:‬غر امل ُ�صتنرة (‪ )Uninformed‬وامل ُ�صتنرة (‪.)Informed‬‬
‫خوارزميات البحث غر امل�صتنرة ‪Uninformed Search Algorithms‬‬
‫أي�ص��ا‪ :‬خوارزميات البح��ث العمياء‪ ،‬هي تلك التي ال حتتوي عل��ى معلومات اإ�صافية‬ ‫خوارزمي��ات البح��ث غ��ر املُ�ص��تنرة‪ ،‬وت�ص� ّمى ا ً‬
‫حول حاالت امل�ص��كلة باإ�ص��تثناء املعلومات امل�ص��تفادة من تعريف امل�ص��كلة‪ .‬وتقوم هذه اخلوارزميات باإجراء فح�ص �ص��امل مل�ص��احة‬
‫البح��ث ا�ص��تنادًا اإىل جمموع��ة م��ن القواع��د املُح�دَّدة ُم�ص��بقًا‪ .‬و ُتع� ُّد تقني��ات البح��ث باأولوي��ة االت�ص��اع (‪ )BFS‬والبح��ث باأولوي��ة‬
‫العمق (‪ )DFS‬املُ�صار اإليها يف الدر�ص الثاين اأمثلة على خوارزميات البحث غر املُ�صتنرة‪.‬‬
‫‪107‬‬ ‫‪106‬‬
‫عل��ى �ص��بيل املث��ال‪ ،‬تب��داأ خوارزمي��ة البح��ث باأولوي��ة العم��ق (‪ )DFS‬عن��د عُ ق��دة اجل��ذر بال�ص��جرة اأو املُخطَّ ��ط وتتو�صَّ ��ع‬
‫يف هذه الوحدة‪� ،‬صت�صاهد بع�ص االأمثلة املرئية وتطبيقات البايثون على خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬وخوارزمية‬ ‫حت��ى ت�ص��ل لل ُعق��دة االأعم��ق الت��ي مل تُفحَ ���ص‪ .‬وي�ص��تمر االأم��ر به��ذه الطريق��ة حت��ى ت�ص��تنفد اخلوارزمي��ة م�ص��احة البح��ث‬
‫البحث باأولوية االأف�صل (‪ )A* search‬ملعرِ فة االختالفات بن خوارزميتي البحث املُ�صتنرة وغر املُ�صتنرة‪.‬‬ ‫باأكملها بعد فح�ص كل العُقد املتاحة‪ .‬ثم تُخرِ ج احلل االأمثل الذي وجدته اأثناء البحث‪ .‬فاحلقيقة اأن خوارزمية البحث‬
‫اإن�صاء األغاز املتاهة بوا�صطة البايثون‬ ‫باأولوي��ة العم��ق (‪ )DFS‬تَتب��ع دومً ��ا ه��ذه القواع��د وال ميك��ن �صبط ا�ص��رتاتيجتها ب�صرف النظر ع��ن نتائج البحث‪ ،‬وهذا‬
‫الهدف‬
‫العقبة‬ ‫ما يجعلها خوارزمية غر مُ�صتنرة‪.‬‬
‫‪Creating Maze Puzzles in Python‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫ومث��ال اآخ��ر ملح��و عل��ى ه��ذا الن��وع م��ن اخلوارزمي��ات ه��و خوارزمي��ة البح��ث باأولوي��ة العم��ق التك��راري امل ُتع ِّم��ق‬
‫تُعرَّف املتاهة يف �صورة اإطار �صبكي ‪.3 3‬‬ ‫(‪ )Iterative Deepening Depth-First Search - IDDFS‬الت��ي ميك��ن اعتباره��ا مزيجً ��ا ب��ن خوارزميت��ي البح��ث‬
‫‪0‬‬ ‫ُيح� َّدد مو�ص��ع البداي��ة بنجم��ة يف اأ�ص��فل ي�ص��ار املتاه��ة‪.‬‬ ‫�تخدم ا�ص��رتاتيجة ال ُعم��ق ا ًأوال للبح��ث يف جمي��ع‬ ‫باأولوي��ة العم��ق (‪ )DFS‬والبح��ث باأولوي��ة االت�ص��اع (‪ ،)BFS‬فه��ي تَ�ص� ِ‬
‫اله��دف ه��و الو�ص��ول اإىل اخللي��ة املُ�ص��ته َدفة املُح � َّددة‬ ‫اخليارات املوجودة يف النطاق الكامل ب�صورة متكررة حتى ت�صل اإىل ُعقدة ُحم َّددة‪.‬‬
‫‪1‬‬
‫بالعالم��ة ‪ ،X‬وميك��ن ّلالع��ب االنتق��ال اإىل اأي خلي��ة‬
‫فارغة جماورة ملوقعه احلايل‪.‬‬ ‫خوارزميات البحث امل�صتنرة ‪Informed Search Algorithms‬‬
‫الدالة األ�صتدأللية‬
‫مو�صع‬ ‫(‪:)Heuristic function‬‬ ‫عل��ى النقي���ص م��ن خوارزمي��ات البح��ث غ��ر امل�ص��تنرة‪ ،‬تَ�ص� ِ‬
‫�تخدم‬
‫‪2‬‬ ‫خوارزمي��ات البح��ث املُ�ص��تنرة املعلوم��ات ح��ول امل�ص��كلة وم�ص��احة البح��ث‬
‫البداية‬ ‫ه��ي الدال��ة الت��ي تُ�ص ِّن��ف البدائ��ل يف‬
‫�صكل ‪ :2.17‬لُغز متاهة ب�صيط‬ ‫خوارزمي��ات البح��ث عن��د كل مرحل��ة‬ ‫لتوجيه عملية البحث‪ .‬واالأمثلة على هذه اخلوارزميات ت�صمل‪:‬‬
‫املو�صحة يف �ص��كل ‪ 2.17‬حتتوي على ‪ 3‬خاليا ت�ص��غلُها احلواجز‬ ‫تكون اخللية فارغة اإذا مل حتتوي على عائق‪ .‬على �ص��بيل املثال‪ ،‬املتاهة َّ‬ ‫فرعي��ة ا�ص��تنا ًد ا اإىل تقد ي��رات‬ ‫• خوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل (‪ )A* search‬تَ�ص��تخدِ م دال��ة‬
‫(‪ .)Blocks‬ه��ذه احلواج��ز املل ّون��ة بالل��ون الرم��ادي تُ�ص�كِّل عائ ًق��ا يج��ب عل��ى الالع��ب جت��اوزه للو�ص��ول اإىل اله��دف ‪ ،X‬وميك��ن ّلالع��ب‬ ‫ا�ص��تداللية مبني��ة عل��ى البيا ن��ات‬ ‫ا�ص��تداللية لتقدي��ر امل�ص��افة ب��ن كل عُ ق��دة من العُقد املُر�صَّ ��حة والعُقدة‬
‫االنتقال ب�صكل اأفقي اأو راأ�صي اأو قطري اإىل اأي خلية فارغة جماورة ملوقعه احلايل كما يظهر يف �صكل ‪ ،2.18‬على �صبيل املثال‪:‬‬ ‫املتو ف��رة لتحد ي��د الف��رع ا ل��ذي‬ ‫املُ�ص��تهدَ فة‪ .‬ث��م تُو�صِّ ��ع ال ُعق��دة املُر�صَّ ��حة بالتقدي��ر االأق��ل‪ .‬اإن فعَّالي��ة‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫�صت�صلكه‪.‬‬ ‫خوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل (‪ )A* search‬مرتبط��ة بج��ودة‬
‫دالتها اال�ص��تداللية‪ .‬على �ص��بيل املثال‪ ،‬اإذا كنت ت�صمن اأن اال�ص��تدالل‬
‫‪0‬‬ ‫‪0‬‬ ‫ل��ن يتج��اوز امل�ص��افة الفعلي��ة اإىل اله��دف‪ ،‬فبالت��ايل �ص��وف تع��ر‬
‫اخلوارزمية على احلل االأمثل‪ .‬بخالف ذلك‪ ،‬قد ال يكون احلل النا من اخلوارزمية هو االأف�صل‪.‬‬
‫‪1‬‬ ‫‪1‬‬ ‫• خوارزمية ديك�صرتا (‪ )Dijkstra's Algorithm‬تُو�صِّ ع العُقدة بناء على اأق�صر م�صافة فعلية اإىل الهدف يف كل خطوة‪.‬‬
‫ولذلك‪ ،‬على النقي�ص من خوارزمية البحث باأولوية االأف�صل ‪ ،‬حت�صب خوارزمية ديك�صرتا (‪ )Dijkstra‬امل�صافة الفعلية‬
‫َ�صتخدم التقديرات اال�صتداللية‪ .‬وبينما يجعل هذا خوارزمية ديك�صرتا اأبطاأ من خوارزمية البحث باأولوية االأف�صل‪،‬‬ ‫وال ت ِ‬
‫‪2‬‬ ‫‪2‬‬
‫(ممثال بامل�صار االأق�صر من البداية حتى الهدف)‪.‬‬ ‫ً‬ ‫اإال اأن ذلك يعني �صمان العثور على احلل االأمثل دومً ا‬
‫�صكل ‪ :2.18‬ميكن لالعب االنتقال ب�صكل اأفقي اأو راأ�صي اأو قطري اإىل اأي خلية فارغة جماورة ملوقعه احلايل‬ ‫• خوارزمية ت�ص�لُّق التالل (‪ )Hill Climbing‬تبداأ بتوليد حل ع�ص��وائي‪ ،‬ثم حتاول حت�ص��ن هذا احلل ب�صورة متكررة‬
‫الهدف هو اإيجاد امل�صار االأق�صر واالأق ّل عددًا ملرات‬ ‫باإج��راء تغي��رات ب�ص��يطة ُحت�صِّ ��ن م��ن دال��ة ا�ص��تداللية ُحم� َّددة‪ .‬وبالرغ��م م��ن اأن ه��ذه املنهجي��ة ال ت�صم��ن اإيجاد احلل‬
‫‪import numpy as np‬‬ ‫االأمثل‪ ،‬اإال اأنها �صهلة التنفيذ وتتميز بفعالية كبرة عند تطبيقها على اأنواع مُعينة من امل�صكالت‪.‬‬
‫فح��ص اخلالي�ا‪ .‬وبالرغ�م م�ن اأن املتاه�ة ال�صغ�رة‬
‫‪# create a numeric 3 x 3 matrix full of zeros.‬‬ ‫‪ 3 3‬قد تبدو ب�صيطة ّلالعب الب�صري‪ ،‬اإال اأنه يتوجب‬ ‫خوارزمية دي�صكرتا (‪)Dijkstra's Algorithm‬‬ ‫خوارزمية البحث باأولوية االأف�صل (‪)A* search‬‬
‫))‪small_maze=np.zeros((3,3‬‬ ‫اخلاليا ذات اللون‬
‫عل�ى اخلوارزمي�ة الذكي�ة اإيج�اد حل�ول للتعام�ل م�ع‬ ‫البنف�صجي هي‬
‫‪# coordinates of the cells occupied by blocks‬‬ ‫املتاه�ات الكب�رة واملُعق�دة للغاي�ة‪ ،‬مث�ل‪ :‬متاه�ة‬ ‫اخلاليا التي ّ‬
‫])‪blocks=[(1, 1), (2, 1), (2, 2‬‬
‫‪ 10 . 000 10 . 000‬الت�ي حتت�وي عل�ى مال ي�ن‬ ‫فح�صها‪ ،‬واخللية ذات‬
‫‪for block in blocks:‬‬ ‫احلواجز املُوزَّعة يف اأ�صكال ُمع َّقدة ومتنوعة‪.‬‬ ‫اللون االأخ�صرهي‬
‫‪# set the value of block-occupied cells to be equal to 1‬‬ ‫مو�صع البدء‪ ،‬واخللية‬
‫‪small_maze[block]=1‬‬ ‫ميك�ن ا�ص�تخدام املقط�ع الرب جم�ي الت�ايل بلغ�ة‬
‫ذات اللون االحمر هي‬
‫البايث�ون الإن�ص�اء جمموع�ة بيان�ات تُ�ص� ّور املث�ال‬
‫‪small_maze‬‬ ‫موقع الهدف‪ ،‬بينما‬
‫ُو�صح يف ال�صكل ‪.2.18‬‬ ‫امل َّ‬ ‫اخلاليا ذات اللون‬
‫االأ�صفر متثل امل�صار‬
‫‪array([[0., 0., 0.],‬‬
‫‪[0., 1., 0.],‬‬
‫الذي العثور عليه‪.‬‬
‫)]]‪[0., 1., 1.‬‬
‫�صكل ‪ :2.16‬حل املتاهة نف�صها با�صتخدام خوارزمية البحث باأولوية االأف�صل وخوارزمية دي�صكرتا‬
‫‪109‬‬ ‫‪108‬‬
:‫ُميكن ا�صتخدام الدالة التالية ال�صتدعاء قائمة حتتوي على كل اخلاليا الفارغ ِة واملُجاورة خللية ُحم َّددة يف اأي متاهة‬ ‫ ميك��ن‬.)Ones( ‫) وامل�ص��غولة باالآح��اد‬Zeros( ‫ ُمت َّث��ل اخلالي��ا الفارغ��ة باالأ�صف��ار‬،‫يف ه��ذا التمثي��ل الرقم��ي للمتاه��ة‬
:‫ مثل‬،‫حتديث املقطع الربجمي نف�صه ب�صهولة الإن�صاء متاهات كبرة ومُعقدة للغاية‬
def get_accessible_neighbors(maze:np.ndarray, cell:tuple):
import random
# list of accessible neighbors, initialized to empty x-1, y-1 x-1, y x-1, y+1
neighbors=[] random_maze=np.zeros((10,10))
x, y-1 x, y x, y+1
x,y=cell x+1, y-1 x+1, y x+1, y+1 # coordinates of 30 random cells occupied by blocks
blocks=[(random.randint(0,9),random.randint(0,9)) for i in range(30)]
# for each adjacent cell position
for i,j in [(x-1,y-1),(x-1,y),(x-1,y+1),(x,y-1),(x,y+1),(x+1,y-1),(x+1,y), for block in blocks:
(x+1,y+1)]: random_maze[block]=1

# if the adjacent cell is within the bounds of the grid and is not occupied by a block
if i>=0 and j>=0 and i<len(maze) and j<len(maze[0]) and :‫تُ�صتخدَ م الدالة التالية لتمثيل املتاهة‬
maze[(i,j)]==0:

neighbors.append(((i,j),1)) import matplotlib.pyplot as plt # library used for visualization

return neighbors def plot_maze(maze):


ax = plt.gca() # create a new figure
ax.invert_yaxis() # invert the y-axis to match the matrix
‫يفرت���ص ه��ذا التطبي��ق اأن كل عميل��ة انتق��ال م��ن خلي��ة اإىل اأخ��رى جم��اورة �ص��وا ًء اأفق ًي��ا اأو راأ�ص�يًا اأو قطر ًي��ا يت��م بتكلف��ة‬ ax.axis('off') # hide the axis labels
‫ �ص��يتم اإع��ادة النظ��ر يف ه��ذه الفر�صية يف وق��ت الحق من هذا الدر���ص بعر�ص حاالت اأكر‬.‫َاح��دَ ة فق��ط‬ ِ ‫مقداره��ا ِوح��دَ ة و‬ ax.set_aspect('equal') # make sure the cells are rectangular
.‫تعقيدً ا مع �صروط انتقال مُتغرة‬ plt.pcolormesh(maze, edgecolors='black', linewidth=2,cmap='Accent')
‫ يف االأمثل��ة التالي��ة‬.‫ يف حماول��ة ح��ل املتاه��ة‬get_accessible_neighbors)( ‫تَ�ص��تخدِ م كل خوارزمي��ات البح��ث دال��ة‬ plt.show()

‫ املُ�ص َّمم��ة باالأعل��ى للتحق��ق م��ن اأن الدال��ة ت�ص��تدعي اخللي��ة ال�صحيح��ة الفارغ��ة واملج��اورة للخلي��ة‬3 3 ‫تُ�ص��تخدم املتاه��ة‬ plot_maze(random_maze)
.‫املُحدَّدة‬
0 1 2
0
# this cell is the northwest corner of the grid and has only 2 accessible neighbors
1 get_accessible_neighbors(small_maze, (0,0))

2
[((0, 1), 1), ((1, 0), 1)]

0 1 2
0
‫المربعات الخ�صراء‬
# the starting cell (in the southwest corner) has only 1 accessible neighbor
1 get_accessible_neighbors(small_maze, (2,0))
‫فارغة ويُمكن‬
‫المربعات ال�صوداء‬ .‫اجتيازها‬
2
[((1, 0), 1)]
‫م�صغولة بالحواجز وال يُمكن‬
‫الخلية‬ .‫اجتيازها‬
‫المُجاورة‬ ،‫ وكذلك ا�صتدعاء اخلاليا املجاورة الأي خلية يف املتاهة‬،‫بعد اأن تعلّمت كيفية اإن�صاء املتاهات‬
‫ف�اإنّ اخلط��وة التالي��ة ه��ي تطبيق خوارزميات البحث التي ميكنها حل املتاهة من خالل اإيجاد‬
‫خلية البداية‬ .‫امل�صار االأق�صر من خلية البداية اإىل خلية الهدف املُحدَّدة‬
‫ با�صتخدام حواجز ع�صوائية‬10 10 ‫ متثيل متاهة‬:2.19 ‫�صكل‬
‫ اخلاليا املجاورة‬:2.20 ‫�صكل‬

111 110
shortest_distance[start_cell] = 0 ‫ا�صتخدام خوارزمية البحث باأولوية األت�صاع يف حل األغاز املتاهة‬
# remembers the direct parent of each cell on the shortest path from the start_cell to the cell
Using BFS to Solve Maze Puzzles
parent = {} ‫) حل��ل األغ��از‬BFS( ‫ املُ�ص��ار اإليه��ا يف ه��ذا اجل��زء خوارزمي��ة البح��ث باأولوي��ة االت�ص��اع‬bfs_maze_solver)( ‫�تخدم دال��ة‬ِ �‫تَ�ص‬
#the parent of the start cell is itself
parent[start_cell] = start_cell
‫ املُح�دَّدة‬get_accessible_neighbors)( ‫�تخدم ه��ذا النم��وذج دال��ة‬ ِ �‫ يَ�ص‬.‫املتاه��ة با�ص��تخدام خلي��ة البداي��ة وخلي��ة اله��دف‬
‫ و مبجرد عثور خوارزمية البحث باأولوية‬،‫باالأعلى ال�ص��تدعاء اخلاليا املُجاورة التي ميكن فح�صها عند اأي نقطة اأثناء البحث‬
while len(to_expand)>0: ‫ املُو�صح��ة باالأ�ص��فل الإع��ادة ِبن��اء‬reconstruct_shortest_path)( ‫ �صتُ�ص��تخدم دال��ة‬،‫) عل��ى اخلل ّي��ة اله��دف‬BFS( ‫االت�ص��اع‬
next_cell = to_expand.pop(0) # get the next cell and remove it from the expansion list :‫ وذلك بتتبع امل�صار ب�صورة عك�صية من خلية الهدف اإىل خلية البداية‬،‫امل�صار االأق�صر وا�صتدعائه‬
if verbose:
def reconstruct_shortest_path(parent:dict, start_cell:tuple, target_cell:tuple):
print('\nExpanding cell', next_cell)
shortest_path = []
# for each neighbor of this cell
for neighbor,cost in get_neighbors(maze, next_cell): my_parent=target_cell # start with the target_cell

if verbose: # keep going from parent to parent until the search cell has been reached
print('\tVisiting neighbor cell',neighbor) while my_parent!=start_cell:

cell_visits+=1 shortest_path.append(my_parent) # append the parent

if neighbor not in visited: # if this is the first time this neighbor is visited my_parent=parent[my_parent] # get the parent of the current parent

visited.add(neighbor) shortest_path.append(start_cell) # append the start cell to complete the path


to_expand.append(neighbor)
parent[neighbor]= next_cell shortest_path.reverse() # reverse the shortest path
shortest_distance[neighbor]=shortest_distance[next_cell]+cost
return shortest_path
# target reached
if neighbor==target_cell:
ً ‫ ا‬reconstruct_shortest_path)( ‫�صتُ�ص��تخدَ م دال��ة‬
‫أي�ص��ا الإع��ادة ِبن��اء احل��ل خلوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل‬
# get the shortest path to the target cell, reconstructed in reverse. get_accessible_ neighbors)( ‫ وبالنظ��ر اإىل تعري��ف الدالت��ن‬.‫)املُ�ص��ار اإليه��ا �ص��لفًا يف ه��ذا الدر���ص‬A* search(
shortest_path = reconstruct_shortest_path(parent,
start_cell, target_cell)
:‫ على النحو التايل‬bfs_maze_solver)( ‫ ُميكن تنفيذ دالة‬،‫ املُ�صاعدتن‬reconstruct_shortest_path)(‫و‬
return shortest_path, shortest_distance[target_cell],cell_visits from typing import Callable # used to call a function as an argument of another function

else: # this neighbor has been visited before def bfs_maze_solver(start_cell:tuple,


target_cell:tuple,
# if the current shortest distance to the neighbor is longer than the shortest maze:np.ndarray,
# distance to next_cell plus the cost of transitioning from next_cell to this neighbor get_neighbors: Callable,
if shortest_distance[neighbor]>shortest_distance[next_cell] verbose:bool=False): # by default, suppresses descriptive output text
+cost:
cell_visits=0 # keeps track of the number of cells that were visited during the search
parent[neighbor]=next_cell visited = set() # keeps track of the cells that have already been visited
shortest_distance[neighbor]=shortest_distance[next_cell]+cost to_expand = [] # keeps track of the cells that have to be expanded

# search complete but the target was never reached, no path exists # add the start cell to the two lists
return None,None,None visited.add(start_cell)
to_expand.append(start_cell)
# remembers the shortest distance from the start cell to each other cell
shortest_distance = {}
# the shortest distance from the start cell to itself, zero

113 112
‫تنجح خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬يف اإيجاد امل�صار االأق�صر بعد فح�ص ‪ 10‬خاليا‪ُ .‬ميكن ت�صوير عملية‬ ‫تتّبع الدالة منهجية البحث باأولوية االت�صاع (‪ )BFS‬للبحث يف كل اخليارات يف العُمق احلايل قبل االنتقال اإىل م�صتوى‬
‫البحث املطبّقة بخوارزمية البحث باأولوية االت�صاع (‪ )BFS‬ب�صهولة عند ت�صوير املتاهة بالتمثيل املُ�صت ِند اإىل ُخمطَّ ط‪.‬‬ ‫ال ُعمق التايل‪ ،‬وتَ�صتخدم هذه املنهجية جمموعة واحدة تُ�ص ّمى ‪ visited‬وقائمة تُ�صمى ‪.to_expand‬‬
‫املثال التايل يعر�ص متاهة ‪ 3 3‬ومتثيلها باملُخطَّ ط‪:‬‬ ‫تت�صم��ن املجموع��ة االأوىل كل اخلالي��ا الت��ي ف ُِح َ�ص��ت م��رة واح��دة عل��ى االأقل من قبل اخلوارزمية‪ .‬بينم��ا تت�صمن القائمة‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫الثاني��ة كل اخلالي��ا الت��ي مل ُت َو َّ�ص��ع بع��د‪ ،‬مم��ا يعن��ي اأن اخلالي��ا املُج��اورة مل تُفح���ص بع��د‪ .‬تَ�ص��تخدم اخلوارزمي��ة كذل��ك‬
‫‪1,0‬‬ ‫‪0,0‬‬ ‫قامو�ص��ن ‪ shortest_distance‬و‪ ،parent‬يحف��ظ االأوّل منهم��ا ط��ول امل�ص��ار االأق�ص��ر م��ن خلي��ة البداي��ة اإىل كل خلي��ة‬
‫‪1,2‬‬ ‫‪0‬‬ ‫اأخرى‪ ،‬بينما يحفظ الثاين عُ قدة اخللية االأ�صل يف امل�صار االأق�صر‪.‬‬
‫‪1‬‬ ‫خزن املتغ� ِّ�ر [‪ shortest_distance]target_cell‬طول احلل‬ ‫مبج��رد الو�ص��ول اإىل اخللي��ة الهدف وانتهاء البحث‪� ،‬ص� ُي ِّ‬
‫والذي ميثل طول امل�صار االأق�صر من البداية اإىل الهدف‪.‬‬
‫‪2,0‬‬ ‫‪0,1‬‬ ‫‪0,2‬‬ ‫‪2‬‬ ‫َ�صتخدم املقطع الربجمي التايل دالة ()‪ bfs_maze_solver‬حلل املتاهة ال�صغرة ‪ 3 3‬امل َّ‬
‫ُو�صحة باالأعلى‪:‬‬ ‫ي ِ‬
‫ُو�ص��ح القيم��ة عل��ى ال ُعق��د اإحداثي��ات خلي��ة امل�صفوف��ة‬
‫يت�صم��ن متثي��ل املُخطَّ ��ط عُ ق��دة واح��دة ل��كل خلي��ة غ��ر م�ص��غولة‪ .‬ت ِّ‬ ‫‪start_cell=(2,0) # start cell, marked by a star in the 3x3 maze‬‬
‫وجه��ة م��ن عُ ق��دة اإىل اأخ��رى يف حال كانت اخلالي��ا املُقابِلة ُميكن الو�ص��ول اإليها من خالل‬ ‫املُقابل��ة‪� .‬ص��تظهر حاف��ة غ��ر ُم َّ‬ ‫‪target_cell=(1,2) # target cell, marked by an "X" in the 3x3 maze‬‬
‫االنتق��ال م��ن واح��دة اإىل االأخ��رى‪ .‬اإح��دى املالحظ��ات املُه ّم��ة ح��ول خوارزمي��ة البح��ث باأولوي��ة االت�ص��اع (‪ )BFS‬ه��ي اأن��ه‬
‫‪solution, distance, cell_visits=bfs_maze_solver(start_cell,‬‬
‫يف حال��ة امل ُخطَّ ط��ات غ��ر املوزون��ة (‪ )Unweighted Graphs‬يك��ون امل�ص��ار االأول ال��ذي ُحت��دِّ ده اخلوارزمي��ة ب��ن خلي��ة‬ ‫‪target_cell,‬‬
‫البداي��ة واأي خلي��ة اأخ��رى ه��و امل�ص��ار ال��ذي يت�صم��ن اأق��ل ع��دد من اخلالي��ا التي ّمت فح�صه��ا‪ .‬وهذا يعني اأن��ه اإذا كانت ك ّل‬ ‫‪small_maze,‬‬
‫احلواف يف املُخطَّ ط لها الوزن نف�صه‪،‬اأي كان لك ّل االنتقاالت من خلية اإىل اأخرى التكلفة نف�صها‪ ،‬فاإنّ امل�صار االأول الذي‬ ‫‪get_accessible_neighbors,‬‬
‫)‪verbose=True‬‬
‫ُحت��دِّ ده اخلوارزمي��ة اإىل ُعق��دة ُحم� َّددة يك��ون ه��و امل�ص��ار االأق�ص��ر اإىل تل��ك ال ُعق��دة‪ .‬وله��ذا ال�ص��بب‪ ،‬تتوق��ف دال��ة _‪bfs‬‬
‫ُ�صتهدفة‪.‬‬
‫َح�صت فيها العُقدة امل َ‬ ‫()‪ maze_solver‬عن البحث‪ ،‬و َتعر�ص نتيجة املرة االأوىل التي ف َ‬ ‫)‪print('\nShortest Path:', solution‬‬
‫))‪print('Cells on the Shortest Path:', len(solution‬‬
‫وم��ع ذل��ك‪ ،‬ال ميك��ن تطبي��ق ه��ذه املنهجي��ة عل��ى امل ُخطَّ ط��ات املوزون��ة (‪ .)Weighted Graphs‬املث��ال الت��ايل ِّ‬
‫يو�ص��ح‬ ‫)‪print('Shortest Path Distance:', distance‬‬
‫اإ�صدارًا موزونًا (‪ )Weighted Version‬لتمثيل ُخمطَّ ط متاهة ‪:3 3‬‬ ‫)‪print('Number of cell visits:', cell_visits‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬
‫‪1,0‬‬ ‫‪1‬‬ ‫‪0,0‬‬ ‫‪1,2‬‬ ‫‪0‬‬ ‫)‪Expanding cell (2, 0‬‬
‫)‪Visiting neighbor cell (1, 0‬‬
‫‪1‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫‪3‬‬ ‫‪1‬‬ ‫‪1‬‬
‫)‪Expanding cell (1, 0‬‬
‫)‪Visiting neighbor cell (0, 0‬‬
‫‪2,0‬‬ ‫‪0,1‬‬ ‫‪1‬‬ ‫‪0,2‬‬ ‫‪2‬‬ ‫)‪Visiting neighbor cell (0, 1‬‬
‫)‪Visiting neighbor cell (2, 0‬‬
‫�صكل ‪ :2.21‬املتاهة ُ‬
‫وخمطَّ طها املوزون‬
‫�صماال‪ ،‬غربًا‪� ،‬صرقًا) ي�صاوي ‪.1‬‬
‫يف هذا املثال‪ ،‬يكون وزن كل احلواف املُقابلة للحركات الراأ�صية اأو االأفقية (جنوبًا‪ً ،‬‬ ‫)‪Expanding cell (0, 0‬‬
‫)‪Visiting neighbor cell (0, 1‬‬
‫ومع ذلك‪ ،‬يكون وزن كل احلواف املُقابلة للحركات القُطرية (جنوبية غربية‪ ،‬جنوبية �ص��رقية‪� ،‬ص��مالية غربية‪� ،‬ص��مالية‬ ‫)‪Visiting neighbor cell (1, 0‬‬
‫�ص��رقية) ي�ص��اوي ‪ .3‬يف ه��ذه احلال��ة املوزون��ة‪� ،‬ص��يكون امل�ص��ار االأق�ص��ر ه��و [(‪،)0,2( ،)0,1( ،)0,0( ،)1,0( ،)2,0‬‬
‫)‪Expanding cell (0, 1‬‬
‫(‪ ،])1,2‬مب�صافة اإجمالية‪.5=1 1 1 1 1 :‬‬ ‫‪Visiting neighbor‬‬ ‫‪cell‬‬ ‫‪(0,‬‬ ‫)‪0‬‬
‫ميك��ن ترمي��ز ه��ذه احلال��ة االأك��ر تعقي��دً ا با�ص��تخدام االإ�ص��دار امل��وزون م��ن الدال��ة ()‪get_accessible_neighbors‬‬ ‫‪Visiting neighbor‬‬ ‫‪cell‬‬ ‫‪(0,‬‬ ‫)‪2‬‬
‫‪Visiting neighbor‬‬ ‫‪cell‬‬ ‫‪(1,‬‬ ‫)‪0‬‬
‫ُو�صحة باالأ�صفل‪.‬‬
‫امل َّ‬ ‫‪Visiting neighbor‬‬ ‫‪cell‬‬ ‫‪(1,‬‬ ‫)‪2‬‬

‫‪def get_accessible_neighbors_weighted(maze:np.ndarray,‬‬ ‫])‪Shortest Path: [(2, 0), (1, 0), (0, 1), (1, 2‬‬
‫‪cell:tuple,‬‬ ‫‪Cells on the Shortest Path: 4‬‬
‫‪horizontal_vertical_weight:float,‬‬ ‫‪Shortest Path Distance: 3‬‬
‫‪diagonal_weight:float):‬‬ ‫‪Number of cell visits: 10‬‬

‫‪115‬‬ ‫‪114‬‬
‫وكم��ا ه��و ُمتو َّق��ع‪ ،‬اأخط �اأت اأداة احل��ل يف البح��ث باأولوي��ة االت�ص��اع (‪ )BFS solver‬يف عر���ص امل�ص��ار ال�ص��ابق نف�ص��ه‬
‫][=‪neighbors‬‬
‫بال�صب��ط‪ ،‬عل��ى الرغ��م م��ن اأن التكلف��ة ت�ص��اوي ‪ ،7‬وم��ن الوا�صح اأنه لي���ص امل�ص��ار االأق�صر‪ .‬ويرجع ذل��ك اإىل الطبيعة غر‬ ‫‪x,y=cell‬‬
‫امل�ص��تنرة خلوارزمي��ة البح��ث باأولوي��ة االت�ص��اع (‪ ،)BFS‬حي��ث ال ت أاخ��ذ اخلوارزمي��ة االأوزان بع��ن االعتب��ار عن��د حتدي��د‬
‫اخللية املُق َّرر تو�ص��يعها يف اخلطوة التالية؛ الأنها تُطبِّق بب�ص��اطة منهجية البحث بالعر�ص نف�صِ ��ها والتي توؤدي اإىل امل�ص��ار‬ ‫‪for i,j in [(x-1,y-1), (x-1,y+1), (x+1,y-1), (x+1,y+1)]: # for diagonal neighbors‬‬

‫نف�ص��ه ال��ذي وجدت��ه اخلوارزمي��ة يف االإ�ص��دار غ��ر امل��وزون (‪ )Unweighted Version‬م��ن املتاه��ة‪ .‬الق�ص��م الت��ايل‬ ‫‪# if the cell is within the bounds of the grid and it is not occupied by a block‬‬
‫ي�ص��ف طريق��ة معاجل��ة نقط��ة ال�صع��ف ه��ذه با�ص��تخدام خوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل (‪ ،)A* search‬وه��ي‬ ‫‪if i>=0 and j>=0 and i<len(maze) and j<len(maze[0]) and maze[(i,j)]==0:‬‬
‫خوارزمي��ة ُم�ص��تنرة واأك��ر ذكا ًء ت�صب��ط �ص��لوكها وف ًق��ا ل �الأوزان املُح � َّددة‪ ،‬وبالت��ايل ُميكنه��ا ح��ل املتاه��ات با�ص��تخدام‬
‫))‪neighbors.append(((i,j), diagonal_weight‬‬
‫االنتقاالت املوزونة (‪ )Weighted Transitions‬واالنتقاالت غر املوزونة (‪.)Unweighted Transitions‬‬
‫‪for i,j in [(x-1,y), (x,y-1), (x,y+1), (x+1,y)]: # for horizontal and vertical neighbors‬‬
‫ا�صتخدام خوارزمية البحث باأولوية األأف�صل يف حل األغاز املتاهة‬
‫‪if i>=0 and j>=0 and i<len(maze) and j<len(maze[0]) and maze[(i,j)]==0:‬‬
‫‪Using A* Search to Solve Maze Puzzles‬‬
‫كم�ا يف خوارزمي�ة البح�ث باأولوي�ة االت�ص�اع (‪ ،)BFS‬تَفحَ ��ص خوارزمية البح�ث باأولوية االأف�صل (‪ )A* search‬خلية‬ ‫))‪neighbors.append(((i,j), horizontal_vertical_weight‬‬

‫واح�دة يف كل م�رة بفح��ص كل خلي�ة جم�اورة ميك�ن الو�صول اإليها‪ .‬فبينما ت�ص�تخدم خوارزمية البحث باأولوية االت�ص�اع‬ ‫‪return neighbors‬‬
‫(‪ )BFS‬منهجية بحث عمياء باأولوية العر�ص لتحديد اخللية التالية التي �صتَفحَ �صها‪ ،‬تَفحَ �ص خوارزمية البحث باأولوية‬
‫االأف�ص�ل (‪ )A* search‬اخللي�ة الت�ي يك�ون بينه�ا وب�ن اخللي�ة املُ�ص�تهدَ فة اأق�ص�ر م�ص�افة حم�ص�وبة بوا�ص�طة الدال�ة‬ ‫ُ�صتخدم بتعين وزن ُخم ّ�ص�ص للحركات االأفقية و احلركات الراأ�صية‪ ،‬وكذلك وزن ُخم ّ�ص�ص خمتلف للحركات‬ ‫ت�صمح الدالة للم ِ‬
‫اال�ص�تداللية (‪ .)Heuristic Function‬يعتم�د التعري�ف الدقي�ق للدال�ة اال�ص�تداللية عل�ى التطبي�ق‪ .‬يف حال�ة األغ�از‬ ‫القُطرية‪ .‬اإذا ا�ص�تُخدِ م االإ�صدار املوزون (‪ )Weighted Version‬املُ�ص��ار اإليه بوا�ص��طة اأداة احلل يف البحث باأولوية االت�ص��اع‬
‫املتاه�ة‪ ،‬توفِّ�ر الدال�ة اال�ص�تداللية تقدي�رًا دقيقً�ا مل�دى قُ�رب اخللي�ة املُر�صَّ �حة اإىل اخللي�ة املُ�ص�تهدَ فة‪ .‬ي�صم�ن اال�ص�تدالل‬ ‫(‪ ،)BFS solver‬فاإنّ النتائج �صتكون كما يلي‪:‬‬
‫املُطبَّق عدم املبالغة يف تقدير (‪ )Overestimate‬امل�ص�افة الفعلية اإىل اخللية املُ�ص�تهدَ فة مثل‪ :‬عر�ص م�ص�افة تقديرية‬
‫اأك�رب م�ن امل�ص�افة احلقيقي�ة اإىل اله�دف‪ ،‬وبالت�ايل �ص�وف ُحت�دِّ د اخلوارزمي�ة اأق�ص�ر م�ص�ار ُحمتم�ل ل�كلٍ م�ن املُخطَّ ط�ن‬ ‫‪from functools import partial‬‬
‫املوزون (‪ )Weighted‬وغر املوزون (‪ .)Unweighted‬اإذا كان اال�صتدالل ُيبالِغ يف بع�ص االأحيان يف تقدير امل�صافة‪،‬‬
‫حال‪ ،‬ولكن قد ال يكون االأف�صل‪ .‬اال�صتدالل املُحتمل االأب�صط‬ ‫�صتُقدِّ م خوارزمية البحث باأولوية االأف�صل (‪ً )A* search‬‬ ‫)‪start_cell=(2,0‬‬
‫)‪target_cell=(1,2‬‬
‫الذي لن يوؤدي اإىل املُبالغة يف تقدير امل�صافة هو دالة ب�صيطة تعطي دومً ا م�صافة تقديرية قدرها وِحدَ ة واحدة‪.‬‬ ‫‪horz_vert_w=1 # weight for horizontal and vertical moves‬‬
‫‪diag_w=3 # weight for diagonal moves‬‬
‫‪def constant_heuristic(candidate_cell:tuple, target_cell:tuple):‬‬
‫‪solution, distance, cell_visits=bfs_maze_solver(start_cell,‬‬
‫‪return 1‬‬ ‫‪target_cell,‬‬
‫‪small_maze,‬‬
‫‪1,0‬‬ ‫‪1‬‬ ‫‪0,0‬‬ ‫عل��ى الرغ��م م��ن اأن ه��ذا اال�ص��تدالل �ص��ديد التف��اوؤل‪ ،‬اإال اأن��ه ل��ن ُيق��دم اأب��دً ا تقدي�رًا اأعل��ى م��ن‬ ‫‪partial(get_accessible_neighbors_weighted,‬‬
‫‪horizontal_vertical_weight=horz_vert_w,‬‬
‫‪1‬‬
‫امل�صافة احلقيقية‪ ،‬وبالتايل �صيوؤدي اإىل اأف�صل حل ممكن‪� .‬صيتم تقدمي ا�صتدالل متطور ُميكنه‬ ‫‪diagonal_weight=diag_w),‬‬
‫العثور على اأف�صل حل ب�صكلٍ �صريع يف هذا الق�صم الحقًا‪.‬‬ ‫)‪verbose=False‬‬
‫‪0,1‬‬
‫َ�صتخدم الدالة التالية دالة ا�صتداللية معطاة للعثور على اخللية التي يجب تو�صيعها بعد ذلك‪� :‬صكل ‪ :2.22‬اال�صتدالل الثابت‬ ‫ت ِ‬ ‫)‪print('\nShortest Path:', solution‬‬
‫))‪print('Cells on the Shortest Path:', len(solution‬‬
‫)‪print('Shortest Path Distance:', distance‬‬
‫‪def get_best_candidate(expansion_candidates:set,‬‬ ‫)‪print('Number of cell visits:', cell_visits‬‬
‫‪shortest_distance:dict,‬‬
‫‪heuristic:Callable):‬‬
‫])‪Shortest Path: [(2, 0), (1, 0), (0, 1), (1, 2‬‬
‫‪winner = None‬‬ ‫‪Cells on the Shortest Path: 4‬‬
‫‪# best (lowest) distance estimate found so far. Initialized to a very large number‬‬
‫‪Shortest Path Distance: 7‬‬
‫‪best_estimate= sys.maxsize‬‬
‫‪Number of cell visits: 6‬‬
‫‪for candidate in expansion_candidates:‬‬

‫‪# distance estimate from start to target, if this candidate is expanded next‬‬

‫‪117‬‬ ‫‪116‬‬
shortest_path=reconstruct_shortest_path(parent,start_cell,target_cell)
candidate_estimate=shortest_distance[candidate]+heuristic(candidate,target_cell)
if candidate_estimate < best_estimate:
return shortest_path, shortest_distance[target_cell],cell_visits
winner = candidate
for neighbor,cost in get_neighbors(maze, best_cell): best_estimate=candidate_estimate

if verbose: print('\nVisiting neighbor cell', neighbor) return winner

cell_visits+=1
ِ �‫َي�ص‬
.‫ لفح���ص اخلالي��ا املُر�صَّ ��حة يف املجموع��ة وحتدي��د االأف�ص��ل‬For ‫�تخدم التطبي��ق املُ�ص��ار اإلي��ه باالأعل��ى حلق��ة التك��رار‬
# first time this neighbor is reached ‫) يف حتدي��د املُر�صَّ ��ح االأف�ص��ل دون احلاج��ة‬Priority Queue( ‫ ق��د ُي�ص��تخدم طاب��ور االأولوي��ة‬،‫و ِلتطبي��ق اأك��ر كف��اءة‬
if neighbor not in expansion_candidates and neighbor not in fully_expanded: ‫ كدال� ٍة ُم�ص��اعدة بوا�ص��طة دال��ة‬get_best_candidate)( ‫�تخدم دال��ة‬ َ �‫ تُ�ص‬.‫اإىل فح���ص كل املُر�صَّ � ِ�حن ب�ص��ورة متك��ررة‬
expansion_candidates.add(neighbor) ‫�تخدم ه��ذا التطبي��ق كذل��ك‬ ِ �‫ يَ�ص‬،‫ وباالإ�صاف��ة اإىل الدال��ة اال�ص��تداللية‬.‫ُو�صح��ة فيم��ا يل��ي‬
َّ ‫ امل‬astar_maze_solver)(
‫ املُ�ص��ار‬reconstruct_shortest_path)( ‫ و‬get_accessible_neighbors_weighted)( ‫الدالتن املُ�ص��اعدتن‬
parent[neighbor] = best_cell # mark the best_cell as this neighbor's parent .‫اإليهما يف الق�صم ال�صابق‬
# update the shortest distance for this neighbor
shortest_distance[neighbor] = shortest_distance[best_cell] + cost import sys

# this neighbor has been visited before, but a better (shorter) path to it has just been found def astar_maze_solver(start_cell:tuple,
elif shortest_distance[neighbor] > shortest_distance[best_cell] + cost: target_cell:tuple,
maze:np.ndarray,
shortest_distance[neighbor] = shortest_distance[best_cell] + cost get_neighbors: Callable,
heuristic:Callable,
parent[neighbor] = best_cell verbose:bool=False):

if neighbor in fully_expanded: cell_visits=0

fully_expanded.remove(neighbor) shortest_distance = {}
shortest_distance[start_cell] = 0
expansion_candidates.add(neighbor)
parent = {}
# all neighbors of best_cell have been inspected at this point parent[start_cell] = start_cell
expansion_candidates.remove(best_cell)
expansion_candidates = set([start_cell])
fully_expanded.add(best_cell)
fully_expanded = set()
return None, None, None # no solution was found
# while there are still cells to be expanded
while len(expansion_candidates) > 0:
shortest_distance ‫ُو�صحة باالأعلى كذلك القامو�صن‬ ِ ‫ ت‬،bfs_maze_solver)( ‫وكما احلال يف الدالة‬
َّ ‫َ�صتخدم الدالة امل‬
‫ وحفظ عُ قدة اأ�صل اخللية يف هذا امل�ص��ار‬،‫ حلف��ظ ط��ول امل�ص��ار االأق�ص��ر م��ن خلي��ة البداي��ة اإىل اأي خلي��ة اأخ��رى‬parent‫و‬ best_cell = get_best_candidate(expansion_candidates,shortest_distance,heuristic)
.‫االأق�صر‬ if best_cell == None: break
ِ �‫ فه��ي تَ�ص‬،‫ منهجي��ة خمتلف��ة لفح���ص اخلالي��ا وتو�ص��يعها‬astar_maze_solve)( ‫ تَتب��ع الدال��ة‬،‫ورغ��م ذل��ك‬
‫�تخدم‬
if verbose: print('\nExpanding cell', best_cell)
‫ تُ�ص��تخدَ م دال��ة‬،‫ يف كل تك��رار‬.‫ لتت ُّب��ع كل اخلالي��ا الت��ي ميك��ن تو�ص��يعها بع��د ذل��ك‬expansion_candidates
ِّ ‫ لتحديد اأي من اخلاليا املُر�صَّ حة �ص ُت‬get_best_candidate)(
.‫و�ص ُعها بعد ذلك‬ # if the target cell has been reached, reconstruct the shortest path and exit
if best_cell == target_cell:
‫ اإذا كانت اخللية‬.‫ لفح�ص كل اخلاليا املجاورة لها‬For ‫ تُ�صتخدَ م حلقة التكرار‬،best_cell ‫بعد اختيار اخللي ِة املر�صح ِة‬
.‫ عُ قدة االأ�صل للخلية املجاورة يف امل�صار االأق�صر‬best_cell ‫ ف�صت�صبح‬،‫فح�ص للمرة االأوىل‬ َ ‫املجاورة ُت‬
119 118
‫يحدث االأمر نف�صه اإذا مت فح�ص الدالة املجاورة من قبل‪ ،‬ولكن فقط اإذا كان امل�صار اإىل هذه اخللية املجاورة من خالل‬
‫)‪print('\nShortest Path:', solution‬‬
‫‪ best_cell‬اأق�صر من امل�صار ال�صابق‪ .‬اإذا عرت الدالة بالفعل على م�صار اأف�صل‪ ،‬ف�صيتعن على اخللية املجاورة العودة‬
‫))‪print('Cells on the Shortest Path:', len(solution‬‬ ‫اإىل جمموع�ة ‪ expansion_candidates‬الإع�ادة تقيي�م امل�ص�ار االأق�ص�ر اإىل اخلالي�ا املج�اورة له�ا‪ُ .‬ي�ص�تخدم املقط�ع‬
‫)‪print('Shortest Path Distance:', distance‬‬ ‫الربجمي التايل ()‪ astar_maze_solver‬حلل احلالة غر املوزونة (‪ )Unweighted Case‬للُغز املتاهة ‪:3x3‬‬
‫)‪print('Number of cell visits:', cell_visits‬‬

‫)‪start_cell=(2,0‬‬
‫])‪Shortest Path: [(2, 0), (1, 0), (0, 0), (0, 1), (0, 2), (1, 2‬‬ ‫)‪target_cell=(1,2‬‬
‫‪Cells on the Shortest Path: 6‬‬
‫‪Shortest Path Distance: 5‬‬ ‫‪solution, distance, cell_visits=astar_maze_solver(start_cell,‬‬
‫‪Number of cell visits: 12‬‬ ‫‪target_cell,‬‬
‫‪small_maze,‬‬
‫‪get_accessible_neighbors,‬‬
‫ُو�صح النتائج قدرة ()‪ astar_maze_solver‬على حل احلالة املوزونة بالعثور على امل�صار االأق�صر املُحتمل‬ ‫ت ِّ‬ ‫‪constant_heuristic,‬‬
‫[(‪ ])2 ،1( ،)2 ،0( ،)1 ،0( ،)0 ،0( ،)0 ،1( ،)0 ،2‬بتكلف��ة اإجمالي��ة قدره��ا ‪ .5‬وه��ذا ِّ‬
‫يو�ص��ح مزاي��ا ا�ص��تخدام‬ ‫)‪verbose=False‬‬

‫خوارزمية بحث م�صتنرة‪ ،‬فهي ُمتكِّنك من اإيجاد احلل االأمثل با�صتخدام اأب�صط طريقة ممكنة‪.‬‬ ‫)‪print('\nShortest Path:', solution‬‬
‫))‪print('Cells on the Shortest Path:', len(solution‬‬
‫)‪print('Shortest Path Distance:', distance‬‬
‫‪( target_cell‬الخلية الم�صتهدَ فة)‬ ‫املقارنة بني اخلوارزميات ‪Algorithm Comparison‬‬ ‫)‪print('Number of cell visits:', cell_visits‬‬
‫اخلطوة التالية هي املقارنة بن خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬وخوارزمية‬
‫البح�ث باأولوي�ة االأف�ص�ل (‪ )A* search‬يف متاه�ة أاك�رب حجمً�ا و أاك�ر تعقي�دً ا‪.‬‬
‫])‪Shortest Path: [(2, 0), (1, 0), (0, 1), (1, 2‬‬
‫�صتخدم املقطع الربجمي التايل بلغة البايثون الإن�صاء متثيل رقمي لهذه املتاهة‪:‬‬
‫ُي َ‬ ‫‪Cells on the Shortest Path: 4‬‬
‫‪Shortest Path Distance: 3‬‬
‫))‪big_maze=np.zeros((15,15‬‬ ‫‪Number of cell visits: 12‬‬

‫‪# coordinates of the cells occupied by blocks‬‬


‫‪blocks=[(2,8), (2,9), (2,10), (2,11), (2,12),‬‬ ‫�ص�تبحث اأداة احل�ل يف البح�ث باأولوي�ة االأف�ص�ل (‪ )A* search solver‬ع�ن امل�ص�ار املُحتم�ل االأق�ص�ر واالأف�ص�ل بع�د‬
‫‪(8,8), (8,9), (8,10), (8,11), (8,12),‬‬ ‫فح��ص ‪ 12‬خلي�ة‪ .‬وه�ذا اأك�ر قلي ً�ال م�ن اأداة احل�ل يف البح�ث باأولوي�ة االت�ص�اع (‪ )BFS solver‬الت�ي وج�دت احل�ل بع�د‬
‫‪(3,8), (4,8), (5,8), (6,8), (7,8),‬‬ ‫�تخدم الإر�ص�اد ()‪ .astar_maze_solver‬وكما‬
‫])‪(3,12), (4,12), (6,12), (7,12‬‬
‫فح��ص ‪ 10‬خالي�ا فق�ط‪ .‬ه�ذا يع�ود اإىل ب�ص�اطة اال�ص�تدالل الثابت املُ�ص َ‬
‫�صيت�صح الحقًا يف هذا الق�صم‪ُ ،‬ميكن ا�صتخدام دالة ا�صتدالل اأخرى لتمكن اخلوارزمية من اإيجاد احلل ب�صكلٍ اأ�صرع‪.‬‬
‫‪for block in blocks:‬‬ ‫اخلط��وة التالي��ة ه��ي تقيي��م م��ا اإذا كان��ت خوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل (‪ )A* search‬ق��ادرة عل��ى ح��ل املتاه��ة‬
‫‪# set the value of block-occupied cells to be equal to 1‬‬
‫�صكل ‪:2.23‬خلية البداية واخللية امل�صتهدَ فة للمتاهة‬ ‫‪big_maze[block]=1‬‬ ‫املوزونة التي ف�صلت خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬يف العثور على اأق�صر م�صار لها اأم ال‪:‬‬
‫‪( start_cell‬خلية البداية)‬ ‫)‪start_cell=(2,0‬‬
‫)‪target_cell=(1,2‬‬
‫ه��ذه املتاه��ة ‪ 15 15‬حتت��وي عل��ى ق�ص��م م��ن احلواج��ز عل��ى �ص��كل ح��رف ‪ C‬ينبغ��ي عل��ى ّ‬
‫الالع��ب جتاوزه��ا للو�ص��ول اإىل‬
‫اله��دف املُح� َّدد بالعالم��ة ‪ .X‬ث��م تُ�ص��تخدَ م اأداة احل��ل يف البح��ث باأولوي��ة االت�ص��اع (‪ )BFS solver‬واأداة احل��ل يف البحث‬ ‫‪horz_vert_w=1 # weight for horizontal and vertical moves‬‬
‫باأولوية االأف�صل (‪ )A* search solver‬حلل االإ�صدارات املوزونة وغر املوزونة من هذه املتاهة كبرة احلجم‪:‬‬ ‫‪diag_w=3 # weight for diagonal moves‬‬

‫‪solution, distance, cell_visits=astar_maze_solver(start_cell,‬‬


‫)‪start_cell=(14,0‬‬ ‫‪target_cell,‬‬
‫)‪target_cell=(5,10‬‬
‫االإ�صدار غر املوزون‬ ‫‪small_maze,‬‬
‫‪partial(get_accessible_neighbors_weighted,‬‬
‫‪solution_bfs_unw, distance_bfs_unw, cell_visits_bfs_unw=bfs_maze_solver(start_cell,‬‬ ‫‪horizontal_vertical_weight=horz_vert_w,‬‬
‫‪target_cell,‬‬ ‫‪diagonal_weight=diag_w),‬‬
‫‪big_maze,‬‬ ‫‪constant_heuristic,‬‬
‫‪get_accessible_neighbors,‬‬ ‫)‪verbose=False‬‬

‫‪121‬‬ ‫‪120‬‬
big_maze, verbose=False)
partial(get_accessible_neighbors_weighted,
horizontal_vertical_weight=horz_vert_w, print('\nBFS unweighted.')
diagonal_weight=diag_w), print('\nShortest Path:', solution_bfs_unw)
verbose=False) print('Cells on the Shortest Path:', len(solution_bfs_unw))
print('Shortest Path Distance:', distance_bfs_unw)
print('\nBFS weighted.') print('Number of cell visits:', cell_visits_bfs_unw)
print('\nShortest Path:', solution_bfs_w)
print('Cells on the Shortest Path:', len(solution_bfs_w)) solution_astar_unw, distance_astar_unw, cell_visits_astar_unw=astar_maze_solver(
print('Shortest Path Distance:', distance_bfs_w) start_cell,
print('Number of cell visits:', cell_visits_bfs_w) target_cell,
big_maze,
solution_astar_w, distance_astar_w, cell_visits_astar_w=astar_maze_solver(start_cell, get_accessible_neighbors,
target_cell, constant_heuristic,
big_maze, verbose=False)
partial(get_accessible_neighbors_weighted,
horizontal_vertical_weight=horz_vert_w, print('\nA* Search unweighted with a constant heuristic.')
diagonal_weight=diag_w), print('\nShortest Path:', solution_astar_unw)
constant_heuristic, print('Cells on the Shortest Path:', len(solution_astar_unw))
verbose=False) print('Shortest Path Distance:', distance_astar_unw)
print('Number of cell visits:', cell_visits_astar_unw)
print('\nA* Search weighted with constant heuristic.')
print('\nShortest Path:', solution_astar_w)
print('Cells on the Shortest Path:', len(solution_astar_w)) BFS unweighted.
print('Shortest Path Distance:', distance_astar_w)
print('Number of cell visits:', cell_visits_astar_w) Shortest Path: [(14, 0), (13, 1), (12, 2), (11, 3), (10, 4), (9, 5), (8,
6), (8, 7), (9, 8), (9, 9), (9, 10), (9, 11), (9, 12), (8, 13), (7, 13),
(6, 13), (5, 12), (4, 11), (5, 10)]
BFS weighted. Cells on the Shortest Path: 19
Shortest Path Distance: 18
Shortest Path: [(14, 0), (14, 1), (14, 2), (13, 2), (13, 3), (12, 3), (12, Number of cell visits: 1237
4), (11, 4), (11, 5), (10, 5), (10, 6), (9, 6), (9, 7), (9, 8), (9, 9), (9,
10), (9, 11), (9, 12), (9, 13), (8, 13), (7, 13), (6, 13), (5, 13), (5, A* Search unweighted with a constant heuristic.
12), (4, 11), (5, 10)]
Cells on the Shortest Path: 26
Shortest Path: [(14, 0), (13, 1), (12, 2), (11, 3), (10, 4), (10, 5), (10,
Shortest Path Distance: 30
6), (9, 7), (9, 8), (10, 9), (9, 10), (9, 11), (9, 12), (8, 13), (7, 13),
Number of cell visits: 1235
(6, 13), (5, 12), (6, 11), (5, 10)]
Cells on the Shortest Path: 19
A* Search weighted with constant heuristic.
Shortest Path Distance: 18
Number of cell visits: 1272
Shortest Path: [(14, 0), (13, 0), (12, 0), (11, 0), (10, 0), (9, 0), (9,
1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9), (9,
10), (9, 11), (9, 12), (9, 13), (8, 13), (7, 13), (6, 13), (5, 13), (5,
12), (5, 11), (5, 10)] start_cell=(14,0) ‫االإ�صدار املوزون‬
Cells on the Shortest Path: 26 target_cell=(5,10)
Shortest Path Distance: 25
Number of cell visits: 1245 horz_vert_w=1
diag_w=3

solution_bfs_w, distance_bfs_w, cell_visits_bfs_w=bfs_maze_solver(start_cell,


target_cell,

123 122
‫تتوافق النتائج مع تلك التي ح�صلت عليها يف املتاهة ال�صغرة وهي كالتايل‪:‬‬
‫جدول  ‪ :2.6‬مقارنة بني اخلوارزميات املُ�صتنرة وغر املُ�صتنرة‬
‫• جنح��ت خوارزم ّيت��ا البح��ث باأولوي��ة االت�ص��اع (‪ )BFS‬والبح��ث باأولوي��ة االأف�ص��ل (‪ )A* search‬يف العث��ور عل��ى امل�ص��ار‬
‫غر امل ُ�صتنرة‬ ‫امل ُ�صتنرة‬ ‫معاير املقارنة‬ ‫االأق�صر لالإ�صدار غر املوزون‪.‬‬
‫• وجدت خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬احلل بعد فح�ص عدد اأق ّل من اخلاليا وهو ‪ 1237‬مقابل ‪1272‬‬
‫التعقيد احل�صابي‬ ‫يف خوارزمية البحث باأولوية االأف�صل (‪.)A* search‬‬
‫اأكر تعقيدً ا ح�صابيًا‪.‬‬ ‫اأقل تعقيدً ا‪.‬‬
‫(‪)Computational Complexity‬‬ ‫• ف�ص��لت خوارزمي��ة البح��ث باأولوي��ة االت�ص��اع (‪ )BFS‬يف العث��ور عل��ى امل�ص��ار االأق�ص��ر لالإ�ص��دار امل��وزون‪ ،‬حي��ث ع��رت‬
‫على م�صار بطول ‪ 30‬وحدة‪.‬‬
‫اأبط أا من اخلوارزميات املُ�صتنرة‪.‬‬ ‫اأ�صرع يف عمليات البحث‪.‬‬ ‫الكفاءة (‪)Efficiency‬‬ ‫• ع��رت خوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل (‪ )A* search‬عل��ى امل�ص��ار االأق�ص��ر لالإ�ص��دار امل��وزون‪ ،‬حي��ث ع��رت‬
‫على م�صار بطول ‪ 25‬وحدة‪.‬‬
‫ُي�ص��تخدَ م املقطع التايل لتمثيل امل�ص��ار االأق�صر الذي وجدته اخلوارزميتان؛ خوارزمية البحث باأولوية االت�ص��اع (‪)BFS‬‬
‫غ��ر عملي��ة حل��ل م�ص��كالت البح��ث‬ ‫اأف�صل يف حل م�ص��كالت البحث وا�ص��ع‬ ‫وخوارزمية البحث باأولوية االأف�صل (‪ )A* search‬لالإ�صدار املوزون كالتايل‪:‬‬
‫وا�صع النطاق‪.‬‬ ‫النطاق‪.‬‬ ‫االأداء (‪)Performance‬‬
‫)(‪maze_bfs_w=big_maze.copy‬‬ ‫)(‪maze_astar_w=big_maze.copy‬‬

‫ُحتقِق احلل االأمثل‪.‬‬ ‫حتقّقُ حلوال مُنا�صب ًة ب�صكلٍ عام‪.‬‬ ‫الفعالية (‪)Effectiveness‬‬ ‫‪for cell in solution_bfs_w:‬‬ ‫‪for cell in solution_astar_w:‬‬
‫‪maze_bfs_w[cell]=2‬‬ ‫‪maze_astar_w[cell]=2‬‬

‫)‪plot_maze(maze_bfs_w‬‬ ‫)‪plot_maze(maze_astar_w‬‬
‫وم��ع ذل��ك‪ ،‬تُظهِ ��ر النتائ��ج اأن خوارزمي��ة البح��ث باأولوي��ة االت�ص��اع (‪ )BFS‬ميكنها العثور على احلل االأمثل ب�ص��كلٍ �ص��ريع بفح�ص‬
‫ع��دد اأق��ل م��ن اخلالي��ا يف احلال��ة غ��ر املوزون��ة‪ .‬ميك��ن ُمعاجل��ة ذل��ك بتوف��ر ا�ص��تدالل أاك��ر ذكا ًء خلوارزمي��ة البح��ث باأولوي��ة‬ ‫خوارزمية البحث باأولوية االأف�صل (‪.)A* search‬‬ ‫خوارزمية البحث باأولوية االت�صاع (‪.)BFS‬‬
‫ا الأف�ص��ل ( ‪ .)A* search‬واال�ص��تدالل ال�ص��هر يف التطبيق��ات ا ملُ�ص��ت ِندة اإىل امل�ص��افة ه��و م�ص��افة مانها ت��ن‬
‫مثاال على‬ ‫(‪ ،)Manhattan Distance‬وه��ي جمم��وع الفروق��ات املُطلق��ة ب��ن اإحدا ِث َّي��ي نقطت��ن ُمعطات��ن‪ِّ .‬‬
‫يو�صح ال�ص��كل اأدن��اه ً‬
‫كيفية ح�صاب م�صافة مانهاتن‪:‬‬
‫م�صافة مانهاتن ‪Manhattan Distance‬‬

‫|‪Manhattan (A, B) = |x1-x2| + |y1-y2‬‬

‫)‪B (x2, y2‬‬

‫�صكل ‪ :2.24‬مقارنة بن حلَّي خوارزميتي البحث باأولوية االت�صاع والبحث باأولوية االأف�صل‬
‫يوؤك��د التّمثي��الن اأن الطبيع��ة املُ�ص��تنرة خلوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل (‪ )A* search‬ت�ص��مح لها بتجنب احلركة‬
‫)‪A (x1, y1‬‬ ‫القُطري��ة‪ ،‬الأن تكلفته��ا اأعل��ى م��ن احلركت��ن االأفقي��ة والراأ�ص��ية‪ .‬وم��ن ناحي��ة اأخ��رى‪ ،‬تتجاه��ل خوارزمي��ة البح��ث باأولوية‬
‫االأف�ص��ل (‪ )BFS‬غ��ر امل�ص��تنرة تكلف��ة كل حرك��ة وتُعط��ي ح� ً�ال اأعل��ى تكلف��ة‪ .‬وفيم��ا يل��ي مقارن��ة عام��ة ب��ن اخلوارزميات‬
‫�صكل ‪ :2.25‬م�صافة مانهاتن‬ ‫املُ�صتنرة وغر املُ�صتنرة كما هو مو�صح يف جدول ‪:2.6‬‬
‫‪125‬‬ ‫‪124‬‬
:‫ميكن تطبيق هذا ب�صهولة يف �صورة دالة البايثون كما يلي‬
A* Search unweighted with the Manhattan heuristic.

Shortest Path: [(14, 0), (13, 1), (12, 2), (11, 3), (10, 4), (9, 5), (8, def manhattan_heuristic(candidate_cell:tuple,target_cell:tuple):
6), (8, 7), (9, 8), (9, 9), (9, 10), (9, 11), (9, 12), (8, 13), (7, 13),
(6, 13), (5, 12), (5, 11), (5, 10)] x1,y1=candidate_cell
Cells on the Shortest Path: 19 x2,y2=target_cell
Shortest Path Distance: 18 return abs(x1 - x2) + abs(y1 - y2)
Number of cell visits: 865

A* Search weighted with the Manhattan heuristic. astar_maze_solver)( ‫�تخدم املقط��ع الربجم��ي الت��ايل الختب��ار اإمكاني��ة ا�ص��تخدام هذا اال�ص��تدالل الذكي لدع��م‬
َ �‫يُ�ص‬
:‫يف البحث ب�صكل اأ�صرع يف كلٍ من احلاالت املوزونة وغر املوزونة‬
Shortest Path: [(14, 0), (14, 1), (13, 1), (12, 1), (12, 2), (12, 3), (12,
4), (12, 5), (12, 6), (12, 7), (11, 7), (11, 8), (10, 8), (9, 8), (9, 9),
(9, 10), (9, 11), (9, 12), (9, 13), (8, 13), (7, 13), (6, 13), (5, 13), (5, start_cell=(14,0)
12), (5, 11), (5, 10)] target_cell=(5,10)
Cells on the Shortest Path: 26
Shortest Path Distance: 25 solution_astar_unw_mn, distance_astar_unw_mn, cell_visits_astar_unw_mn=astar_
Number of cell visits: 1033 maze_solver(start_cell,
target_cell,
big_maze,
‫) ميك��ن ا�ص��تخدامه لدع��م خوارزمي��ة البح��ث‬Manhattan Distance( ‫توؤك��د النتائ��ج اأن ا�ص��تدالل م�ص��افة مانهات��ن‬ get_accessible_neighbors,
‫كل من‬ٍ ‫) يف العث��ور عل��ى امل�ص��ارات االأق�ص��ر املُحت َمل��ة بفح���ص أاق��ل ع��دد م��ن اخلالي��ا يف‬A* search( ‫باأولوي��ة االأف�ص��ل‬ manhattan_heuristic,
verbose=False)
‫ عل ًم��ا ب�اأن ا�ص��تخدام ه��ذا اال�ص��تدالل االأك��ر ذكا ًء يفح���ص ع��ددًا أاق��ل م��ن اخلالي��ا م��ن‬.‫احل��االت املوزون��ة وغ��ر املوزون��ة‬
.)BFS( ‫ذلك املُ�صتخدَ م يف خوارزمية البحث باأولوية االت�صاع‬ print('\nA* Search unweighted with the Manhattan heuristic.')
print('\nShortest Path:', solution_astar_unw_mn)
:‫ النتائج حول مُتغرات اخلوارزميّات املختلفة يف املتاهة الكبرة‬2.7 ‫يُلخِّ �ص جدول‬ print('Cells on the Shortest Path:', len(solution_astar_unw_mn))
print('Shortest Path Distance:', distance_astar_unw_mn)
print('Number of cell visits:', cell_visits_astar_unw_mn)
‫ مقارنة بني اأداء اخلوارزميات‬:2.7  ‫جدول‬
‫خوارزمية البحث باأولوية‬ ‫خوارزمية البحث باأولوية‬ horz_vert_w=1 # weight for horizontal and vertical moves
)A* search( ‫االأف�صل‬ )A* search( ‫االأف�صل‬ ‫خوارزمية البحث باأولوية‬ diag_w=3 # weight for diagonal moves
‫با�صتدالل مانهاتن‬ ‫باال�صتدالل الثابت‬ )BFS( ‫االت�صاع‬
solution_astar_w_mn, distance_astar_w_mn, cell_visits_astar_w_mn=astar_maze_
solver(start_cell,
1033 ‫َح�صت‬
َ ‫ وف‬،25=‫امل�صافة‬ 1245 ‫َح�صت‬
َ ‫ وف‬،25=‫امل�صافة‬ 1235 ‫َح�صت‬
َ ‫ وف‬،30=‫امل�صافة‬ ‫املوزونة‬ target_cell,
big_maze,
partial(get_accessible_neighbors_weighted,
horizontal_vertical_weight=horz_vert_w,
865‫َح�صت‬
َ ‫ وف‬،18=‫امل�صافة‬ 1272 ‫َح�صت‬
َ ‫ وف‬،18=‫امل�صافة‬ 1237‫َح�صت‬
َ ‫ وف‬،18=‫امل�صافة‬ ‫غر املوزونة‬ diagonal_weight=diag_w),
manhattan_heuristic,
verbose=False)

َّ ‫ُو�ص��ح اجل��دول مزاي��ا ا�ص��تخدام الطَّ رائ��ق االأك��ر ذكا ًء حل��ل امل�ص��كالت املُ�ص��ت ِندة اإىل البح��ث مث��ل تل��ك امل‬
‫ُو�صح��ة به��ذا‬ ِّ ‫ي‬ print('\nA* Search weighted with the Manhattan heuristic.')
:‫الدر�ص‬ print('\nShortest Path:', solution_astar_w_mn)
print('Cells on the Shortest Path:', len(solution_astar_w_mn))
‫) غ��ر املوزون��ة اإىل خوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل‬BFS( ‫• ال َتح �وُل م��ن خوارزمي��ة البح��ث باأولوي��ة االت�ص��اع‬ print('Shortest Path Distance:', distance_astar_w_mn)
.‫ كما اأتاح اإمكانية حل امل�صكالت االأكر تعقيدً ا‬،‫نتائج اأف�صل‬ َ ‫) املوزونة حَ قَّق‬A* search( print('Number of cell visits:', cell_visits_astar_w_mn)

‫• ُميك��ن حت�ص��ن ذكاء خوارزمي��ات البح��ث املُ�ص��تنرة با�ص��تخدام دوال اال�ص��تدالل االأف�ص��ل الت��ي ت�ص��مح له��ا بالعثور على‬
.‫احلل االأمثل ب�صكلٍ اأ�صرع‬

127 126
‫‪ 3‬ا�سرح باإيجاز كيف تعمل خوارزمية البحث باأولوية االأف�سل (‪.)A* search‬‬
‫مترينات‬
‫‪ 1‬اذكر تطبيقني خلوارزميات البحث‪.‬‬

‫‪َ 4‬عدِّل املقطع الربجمي بتغير الوزن القُطري (‪ )Diagonal Weight‬من ‪ 3‬اإىل ‪ .1.5‬ماذا تُالحظ؟‬
‫ه��ل يتغ��ر امل�س��ار االأق�س��ر يف حالت��ي خوارزمي��ة البح��ث باأولوي��ة االت�س��اع (‪ )BFS‬وخوارزمي��ة البح��ث باأولوي��ة االأف�س��ل‬
‫(‪) A* search‬؟‬

‫‪ 2‬حدِّد االختالفات بني خوارزميات البحث امل ُ�ستنرة وغر امل ُ�ستنرة‪ ،‬ثم اذكر ً‬
‫مثاال على كل خوارزمية‪.‬‬

‫‪َ 5‬عدِّل املقطع الربجمي بتبديل اإحداثيات خلية البداية مع احداثيات اخللية امل ُ�ستهدَفة‪ .‬ماذا تُالحظ؟‬
‫هل امل�سار هو نف�سه كما كان �سابقًا للحاالت املوزونة من خوارزميتي البحث باأولوية االت�ساع (‪ )BFS‬والبحث باأولوية‬
‫االأف�سل (‪) A* search‬؟‬

‫‪129‬‬ ‫‪128‬‬
‫ماذا تع ّلمت‬ ‫الم�سروع‬

‫ ا�ستخدام األ�ستدعاء الذاتي حلل امل�سكالت‪.‬‬


‫‪1‬‬
‫ تطبيق خوارزميات اجتياز املُخطَّ ط املُتقدمة‪.‬‬ ‫ع��دِّ ل املقط��ع الربجم��ي خلوارزمي��ة البح��ث باأولوي��ة االت�س��اع (‪ )BFS‬وخوارزمي��ة‬
‫البح��ث باأولوي��ة االأف�س��ل (‪ )A* search‬املوزونت��ني بتغي��ر االأوزان االأفقي��ة والراأ�س��ية‬
‫ تطبيق األأنظمة القائمة على القواعد الب�سيطة واملتقدمة‪.‬‬ ‫عدل نقطة البداية اإىل (‪.)7 ،2‬‬ ‫اإىل ‪ 3‬واالأوزان القُطرية اإىل ‪ .5‬وكذلك ِّ‬
‫ ت�سميم منوذج الذكاء األ�سطناعي‪.‬‬
‫ قيا�ض فعالية منوذج الذكاء األ�سطناعي الذي �س َمّمتَه‪.‬‬
‫‪2‬‬
‫ ا�ستخدام خوارزميات البحث ملحاكاة حلّ م�سكالت احلياة الواقعية‪.‬‬ ‫م��ا امل�س��ار اجلدي��د ذو امل�س��افة االأق�سر‪ ،‬وما عدد اخلاليا الت��ي ف ُِح َ�ست يف االإ�سدارات‬
‫غ��ر املوزون��ة خلوارزميت��ي البحث باأولوية االت�س��اع (‪ )BFS‬والبح��ث باأولوية االأف�سل‬
‫(‪)A* search‬با�ستخدام دالة اال�ستدالل الثابت؟ َح ِّدد هذه القيم ود ِّون مالحظاتك‪.‬‬

‫امل�سطلحات الرئي�سة‬
‫‪3‬‬
‫اتب��ع اخلط��وات نف�س��ها لالإ�س��دارات املوزون��ة م��ن خوارزميت��ي البح��ث باأولوية االت�س��اع‬
‫‪A* Search‬‬ ‫البحث باأولوية االأف�سل‬ ‫‪Model Training‬‬ ‫تدريب النموذج‬ ‫(‪ )BFS‬والبح��ث باأولوي��ة االأف�س��ل (‪ )A* search‬با�س��تخدام دال��ة اال�س��تدالل‬
‫‪Algorithm‬‬
‫اأداء اخلوارزمية‬ ‫‪Path Finding‬‬ ‫اإيجاد امل�سار‬ ‫الثابت‪.‬‬
‫‪Performance‬‬
‫‪Breadth-First‬‬ ‫‪Recursion‬‬ ‫اال�ستدعاء الذاتي‬
‫)‪Search (BFS‬‬
‫البحث باأولوية االت�ساع‬
‫‪Rule-Based‬‬ ‫االأنظمة القائمة على‬
‫‪Confusion‬‬ ‫‪Systems‬‬ ‫القواعد‬ ‫‪4‬‬
‫‪Matrix‬‬
‫م�سفوفة الدقة‬ ‫كرِّر العملية لالإ�سدارات غر املوزونة واملوزونة من خوارزميتي البحث باأولوية االت�ساع‬
‫‪Depth-First‬‬
‫‪Scoring Function‬‬ ‫دالة ت�سجيل النقاط‬ ‫(‪ )BFS‬والبح��ث باأولوي��ة االأف�س��ل (‪ )A* search‬با�س��تخدام دال��ة ا�س��تدالل مانهات��ن‬
‫)‪Search (DFS‬‬
‫البحث باأولوية العمق‬ ‫‪Search‬‬ ‫(‪.)Manhattan Heuristic‬‬
‫‪Algorithms‬‬
‫خوارزميات البحث‬
‫‪Heuristic‬‬
‫‪Function‬‬
‫دالة ا�ستداللية‬ ‫‪Uninformed‬‬
‫‪Search‬‬
‫البحث غر امل ُ�ستنر‬
‫‪Informed Search‬‬ ‫البحث امل ُ�ستنر‬ ‫‪Unweighted‬‬
‫‪Knowledge Base‬‬ ‫قاعدة املعرِفة‬ ‫‪Graph‬‬
‫ُخمطَّ ط غر موزون‬
‫‪Maze Solving‬‬ ‫حل املتاهات‬ ‫‪Weighted Graph‬‬ ‫ُخمطَّ ط موزون‬

‫‪131‬‬ ‫‪130‬‬
‫التع ُّلم َّ‬
‫املوجه‬
‫الدر�ض األأول‬
‫‪ .3‬معا ة اللغ��ات الطبيعية‬
‫ا�ستخدام التع ُلّم املوجَّ ه لفهم الن�سو�ض‬ ‫�س ��يتعلّم الطال ��ب يف ه ��ذه الوح ��دة عملي ��ة تدري ��ب �س ��املة لنم ��وذج التع ُّل ��م املوجَّ ��ه‬
‫‪Using Supervised Learning to Understand Text‬‬ ‫والتع ُّل ��م غ ��ري املوجَّ ��ه لفه ��م املعن ��ى الكام ��ن يف اأج ��زاء الن�سو� ��ض‪ .‬وكذل � �س ��يتعلّم‬
‫معا جل��ة اللغ��ات الطبيعي��ة ( ‪ )Natural Language Processing - NLP‬ه��ي اإ ح��دى جم��االت ا ل��ذكاء اال�سطنا ع��ي‬ ‫كيفي ��ة ا�س ��تخدام تع ُّل ��م األل ��ة (‪ )Machine Learning - ML‬يف دع ��م التطبيق ��ات‬
‫(‪ )Artificial Intelligence - AI‬الت��ي تر ّك��ز عل��ى متك��ني اأجه��زة احلا�س��ب لت�سب��ح ق��ادرة عل��ى فه��م اللغ��ات الب�س��ريّة‪ ،‬وتف�س��رها‪،‬‬
‫واإنتاجها‪ .‬حيث تُعنى معاجلة اللغات الطبيعية بعدد من املهام‪ ،‬مثل‪ :‬ت�سنيف الن�سو�س‪ ،‬وحُتليل امل�س��اعر‪ ،‬والرتجمة االآلية‪ ،‬واالإجابة‬ ‫ذات ال�سلة عا ة اللغات الطبيعية (‪.)Natural Language Processing -NLP‬‬
‫عل��ى االأ�س��ئلة‪� .‬س��ركز ه��ذا الدر���س ب�س��كل خا���س عل��ى كيفي��ة ا�س��تخدام التع ُّل��م َّ‬
‫املوج��ه ال��ذي ُيع� ُّد اأح��د االأن��واع الرئي�س��ة لتع ُّل��م االآل��ة‬
‫(‪ )Machine Learning - ML‬يف حُتقيق الفهم والتنبوؤ التلقائي خل�سائ�س الن�سو�س‪.‬‬
‫كال من تعلُّم االآلة والتعلُّم العميق‪ ،‬كما يت�سح يف ال�سكل ‪،3.1‬‬ ‫لقد تعلّمت يف الوحدة االأوىل اأن الذكاء اال�سطناعي هو م�سطلح ي�سم ُل ًّ‬
‫فال��ذكاء اال�سطناع��ي ه��و ذل��ك املج��ال الوا�س��ع م��ن علوم احلا�س��ب الذي ُيعنى بابت��كار اآالت ذكية‪ ،‬بينما تعلُّم االآلة ه��و اأحد فروع الذكاء‬ ‫اأهداف التعلُّم‬
‫اال�سطناع��ي ال��ذي ير ّك��ز عل��ى ت�سمي��م اخلوارزميات وبِناء النم��اذج التي ُمتكِّن االآلة من التعلُّم من البيانات دون احلاجة اإىل برجمتها‬
‫ب�سكل �سريح‪.‬‬ ‫بنهاية هذه الوحدة �سيكون الطالب قادرًا على اأن‪:‬‬
‫ يُعرِّ ف التعلُّم املوجَّ ه‪.‬‬
‫التعلُّم العميق (‪:)Deep learning‬‬ ‫الذكاء األ�سطناعي‬
‫التعلُّ��م العمي��ق ه��و اأح��د اأن��واع تعلُّ��م ا آالل��ة ال��ذي ي�س� ِ‬
‫�تخدم‬ ‫تعلُّم األلة‬
‫ يُدرِّب منوذج التعلُّم املوجَّ ه على فهم الن�ض‪.‬‬
‫ال�سبكات الع�سبية العميقة للتعلُّم تلقائيًا من جمموعات‬ ‫ يُعرِّ ف التعلُّم غري املوجَّ ه‪.‬‬
‫كب��رة م��ن البيان��ات‪ ،‬فه��و ي�س��مح الأجه��زة احلا�س��ب‬
‫بالتع ّرف على االأمناط واتخاذ القرارات بطريقة حُتاكي‬ ‫التعلُّم العميق‬ ‫ يُدرِّب منوذج التعلُّم غري املوجَّ ه على فهم الن�ض‪.‬‬
‫االإن�سان‪ ،‬عرب ت�سميم مناذج ُمعقدة من البيانات‪.‬‬ ‫ يُن�سئ روبوت درد�سة ب�سيط‪.‬‬
‫�سكل ‪ :3.1‬فروع الذكاء اال�سطناعي‬
‫ يُنت� ��ج الن�سو�� ��ض با�س� ��تخدام تقني� ��ات تولي� ��د اللغ� ��ات الطبيعي� ��ة‬
‫تعلُّم األلة ‪Machine Learning‬‬
‫تعلُّم االآلة هو اأحد فروع الذكاء اال�سطناعي املعني بتطوير اخلوارزميات التي ُمتكِّن اأجهزة احلا�سب من التعلُّم من البيانات‬
‫(‪.)Natural Language ener tion -NLG‬‬
‫بدال من اتباع التعليمات الربجمية ال�سريحة‪ ،‬فهو يعمل على تدريب مناذج احلا�سب للتعرُّف على االأمناط والقيام‬ ‫املُدخَ لة‪ً ،‬‬
‫بالتنبوؤات وفقًا للبيانات املُدخَ لة مما ي�سمح للنموذج بتح�سني الدقة مع مرور الوقت‪ ،‬وكذلك يتيح لالآلة اأداء مهام متعددة‪ ،‬مثل‪:‬‬
‫الت�سنيف‪ ،‬واالنحدار‪ ،‬والتجميع‪ ،‬وتقدمي التو�سيات دون احلاجة اإىل برجمة االآلة ب�سكل �سريح للقيام بكل مُهِ مَّة على حدة‪.‬‬
‫مُيكن ت�سنيف تعلُّم االآلة اإىل ثالثة اأنواع رئي�سة‪:‬‬
‫التع ُّل��م املوجَّ ��ه (‪ )Supervised learning‬ه��و ن��وع م��ن تعلُّ��م االآل��ة تتع ّل��م فيه اخلوارزمية م��ن بيانات تدريب مُعن َون��ة (‪)Labelled‬‬
‫به��دف القي��ام بالتنب�وؤات ح��ول بيان��ات جدي��دة غ��ر موج��ودة يف جمموعة التدري��ب اأو االختبار كما هو مو�سح يف �س��كل ‪ ،3.2‬ومن‬
‫األأدوات‬
‫االأمثلة عليه‪:‬‬ ‫ مفكرة جوبيرت (‪)Jupyter Notebook‬‬
‫• ت�سنيف ال�سور (‪ ،)Image Classification‬مثل‪ :‬التعرف على الكائنات يف ال�سور‪.‬‬
‫• ك�سف االحتيال (‪ ،)Fraud Detection‬مثل‪ :‬حُتديد املُعامَ الت املالية امل�سبوهة‪.‬‬
‫• ت�سفية الربيد االإلكرتوين الع�سوائي (‪ ،)Spam Filtering‬مثل‪ :‬حُتديد ر�سائل الربيد االإلكرتوين غر املرغوب فيها‪.‬‬
‫‪133‬‬ ‫‪132‬‬
‫التعلُّم املوجَّ ه ‪Supervised Learning‬‬ ‫املوج��ه (‪ )Unsupervised learning‬ه��و ن��وع م��ن تعلُّ��م االآل��ة تعم��ل‬ ‫التع ُّل��م غ��ر َّ‬
‫التعلُّ��م املوجَّ ��ه ه��و اأح��د اأن��واع تعلُّ��م االآل��ة ال��ذي يعتمد عل��ى ا�س��تخدام البيانات‬ ‫في��ه اخلوارزمي��ة مبوج��ب بيان��ات غ��ر مُعن َون��ة (‪ )Unlabeled‬يف حُماول��ة‬
‫التعلُّم املوجَّ ه‬ ‫املُعنوَنة لتدريب اخلوارزميات للقيام بالتنبوؤات‪ .‬يتم تدريب اخلوارزمية على‬ ‫الإيجاد االأمناط والعالقات بني البيانات‪ ،‬ومن االأمثلة عليه‪:‬‬
‫(‪:)Supervised Learning‬‬ ‫جمموع��ة م��ن البيان��ات املُعن َون��ة ث��م اختبارها على جمموع��ة بيانات جديدة مل‬ ‫امل ُخرَج املتوقّع‬ ‫• الك�س��ف ع��ن االخت��الف (‪ ،)Anomaly Detection‬مث��ل‪ :‬حُتدي��د االأمن��اط‬
‫�ست�س��تخدم يف التعلُّ��م املوجَّ ��ه جمموع��ات‬ ‫املوج��ه ع��اد ًة يف معاجل��ة‬
‫�تخدم التعلُّ��م َّ‬
‫تك��ن ج��زءًا م��ن بيان��ات التدري��ب‪ُ .‬ي�س� َ‬ ‫غر العادية يف البيانات‪.‬‬
‫البيان��ات املُعن َون��ة واملُنظم��ة ب�س��كل ي��دوي‬ ‫اللغ��ات الطبيعي��ة للقي��ام مبه��ام مث��ل‪ :‬ت�سني��ف الن�سو���س‪ ،‬وحُتلي��ل امل�س��اعر‪،‬‬ ‫النموذج‬ ‫• التجميع (‪ ،)Clustering‬مثل‪ :‬جتميع البيانات ذات اخل�سائ�س املت�سابهة‪.‬‬
‫لتدري��ب خوارزميات احلا�س��ب على التنبوؤ‬ ‫والتعرّف على الكيانات امل�سماة (‪.)Named Entity Recognition - NER‬‬ ‫• تقلي���س االأبع��اد (‪ ،)Dimensionality Reduction‬مث��ل‪ :‬اختي��ار االأبع��اد‬
‫بالقيم اجلديدة‪.‬‬ ‫يف ه��ذه امله��ام يت��م تدري��ب اخلوارزمي��ة عل��ى جمموع��ة م��ن البيان��ات املُعن َون��ة‪،‬‬ ‫املُ�ستخدَ مة للحدِّ من تعقيد البيانات‪.‬‬
‫حيث يتم اإدراج كل مثال حُتت عنوان الت�سنيف املنا�سب اأو امل�ساعر املنا�سبة‪.‬‬ ‫جمموعة بيانات‬
‫االختبار‬ ‫التع ُّل��م املع �زَّز (‪ )Reinforcement learning‬ه��و ن��وع م��ن تعلُّ��م االآل��ة تتفاع��ل‬
‫املوج��ه ا�س��م االنح��دار (‪ )Regression‬عندم��ا‬ ‫يُط َل��ق عل��ى عملي��ة التعلُّ��م َّ‬ ‫اخلوارزمية‬ ‫في��ه االآل��ة م��ع البيئ��ة املحيط��ة وتتع ّل��م ع��رب املحاول��ة واخلط �اأ اأو تل ّق��ي املكاف �اأة‬
‫تك��ون القي��م الت��ي تتنب�اأ به��ا االآل��ة رقم ّي��ة‪ ،‬بينم��ا يطل��ق عليه��ا ا�س��م الت�سني��ف‬ ‫والعقاب‪ ،‬ومن االأمثلة عليه‪:‬‬
‫(‪ )Classification‬عندما تكون القيم متقطّ عه‪.‬‬
‫جمموعة بيانات‬ ‫• لعب االألعاب‪ ،‬مثل‪ :‬لعبة ال�سطرجن اأو لعبة قو (‪. )GO‬‬
‫األنحدار‬ ‫التدريب‬
‫• الروبوتية‪ ،‬مثل‪ :‬تعليم الروبوت كيف يتنقل يف البيئة املحيطة به‪.‬‬
‫على �س��بيل املثال‪ ،‬قد ُي�س��تخدم االنحدار يف التنبوؤ ب�س��عر بيع املنزل وفقًا مل�س��احته‪ ،‬وموقعه‪ ،‬وعدد غرف النوم فيه‪ .‬كما‬ ‫امل ُخرَج املطلوب‬
‫مُيك��ن ا�س��تخدامه يف التنب�وؤ بحج��م الطل��ب عل��ى اأح��د املنتج��ات ا�س��تنادًا اإىل بيان��ات املبيع��ات التاريخي��ة وحج��م االإنف��اق‬ ‫• تخ�سي�س املوارد‪ ،‬مثل‪ :‬حُت�سني ا�ستخدام املوارد يف �سبكة ما‪.‬‬
‫�تخدم االنح��دار الن�سو���س املُدخَ ل��ة املتوفرة للتنب�وؤ بتقييم اجلمهور‬‫االإع��الين‪ .‬ويف جم��ال معاجل��ة اللغ��ات الطبيعي��ة‪َ ،‬ي�س� ِ‬ ‫جدول ‪ 3.1‬يلخ�س مزايا وعيوب اأنواع تعلُّم االآلة‪.‬‬
‫للفيلم اأو مدى التفاعل مع املن�سورات اخلا�سة به على و�سائل التوا�سل االجتماعي‪.‬‬ ‫�سكل ‪ :3.2‬متثيل التعلُّم املوجَّ ه‬
‫الت�سنيف‬ ‫جدول  ‪ :3.1‬مزايا اأنواع تعلّم األلة‪ ،‬وعيوبها‬
‫من ناحية اأخرى‪ُ ،‬ي�ستخدم الت�سنيف يف التطبيقات مثل‪ :‬ت�سخي�س احلاالت الطبية وفقًا لالأعرا�س ونتائج الفحو�سات‪.‬‬ ‫العيوب‬ ‫املزايا‬
‫املوجه يف ت�سنيف الن�سو�س املُدخَ لة اإىل فئات اأو عناوين‬ ‫وعندما يتعلق االأمر بفهم الن�سو�س‪ ،‬مُيكن ا�ستخدام التعلُّم َّ‬ ‫التعلُّم املوجَّ ه‬
‫املوجه‬
‫اأو التنب�وؤ به��ا بن��ا ًء عل��ى الكلم��ات اأو العب��ارات املوج��ودة يف املُ�س��تنَد‪ .‬على �س��بيل املثال‪ ،‬مُيكن تدريب من��وذج التعلُّم َّ‬ ‫• يتطلب بيانات مُعنوَنة‪ ،‬والتي قد تكون مرتفعة التكلفة‪.‬‬ ‫• اأثبت كفاءة وفعالية كبرة ويُ�ستخدم على نطاق وا�سع‪.‬‬
‫�تخدمة يف ر�س��الة‬
‫لت�سنيف ر�س��ائل الربيد االإلكرتوين اإىل ر�س��ائل مزعجة اأو غر مزعجة وفقًا للكلمات اأو العبارات املُ�س� َ‬ ‫• يقت�سر ا�س��تخدامه على املُهِ َّمة التي مت تدريبه عليها‪ ،‬وقد‬ ‫• �سهل الفهم والتطبيق‪.‬‬
‫الربي��د االإلك��رتوين‪ .‬و ُيع� ّد ت�سني��ف امل�س��اعر اأح��د التطبيق��ات ال�س��هرة كذل��ك‪ ،‬حي��ث مُيك��ن التنب� ؤو باالنطب��اع العام حول‬ ‫ال مُيكنه اإعطاء التنب ؤو ال�سحيح للبيانات اجلديدة‪.‬‬ ‫• ُمُيكن��ه التعام��ل م��ع البيان��ات اخلطي��ة وغ��ر اخلطي��ة عل��ى‬
‫و�س ُي�س��تخدم ه��ذا التطبي��ق كمث��ال عمل��ي يف ه��ذه الوح��دة‪ ،‬ل�س��رح كل خط��وات‬ ‫م�س��تند م��ا �س��واء كان �س��لب ًّيا اأم اإيجاب ًّي��ا‪َ .‬‬ ‫• ي�سع��ب تكيف��ه م��ع امل�س��كالت االأخ��رى يف ح��االت النم��اذج‬ ‫حد �سواء‪.‬‬
‫املوجه ب�سكل �سامل من بداية رحلة التعلم حتى نهايتها‪.‬‬ ‫عملية بِناء وا�ستخدام منوذج التعلُّم َّ‬ ‫املُعقدة جدً ا‪.‬‬
‫يف ه��ذه الوح��دة �ستَ�س��تخدم جمموع��ة بيان��ات م��ن مراجع��ات االأف��الم على موقع ‪ IMDb.com‬ال�س��هر‪� .‬س��تجد البيانات‬ ‫التعلُّم غر املوجَّ ه‬
‫حُت ّمل‬
‫مُق�سّ ��مه اإىل جمموعت��ني؛ االأوىل �ستُ�س��تخدم لتدري��ب النم��وذج‪ ،‬والثاني��ة الختب��ار اأداء النم��وذج‪ .‬يف البداية البد اأن ُ َ‬ ‫• اأ�سعب من التعلُّم املوجَّ ه من حيث الفهم والتف�سر‪.‬‬ ‫• ال يتطلب بيانات مُعنوَنة‪ ،‬مما يجعله اأكر مرونة‪.‬‬
‫البيان��ات اإىل ‪ِ ،DataFrame‬ل��ذا علي��ك ا�س��تخدام مكتب��ة باندا���س بايث��ون (‪ )Pandas Python‬والت��ي ا�س��تخدمتها‬ ‫• يقت�سر على التحليل اال�ستك�س��ايف‪ ،‬وقد ال ينا�س��ب عمليات‬ ‫• ُمُيكنه اكت�ساف االأمناط اخلفية يف البيانات‪.‬‬
‫�س��ابقًا‪ .‬مكتب��ة باندا���س ه��ي اإح��دى االأدوات ال�س��هرة الت��ي تُ�س��تخدم للتعام��ل م��ع جداول البيان��ات‪ .‬التعليم��ات الربجمية‬ ‫�سنع القرار‪.‬‬ ‫• ُمُيكنه التعامل مع البيانات ال�سخمة واملُعقدة‪.‬‬
‫التالية �ستقوم با�ستراد املكتبة اإىل الربنامج‪ ،‬ثم حُتميل جمموعتي البيانات‪:‬‬ ‫• ي�سع��ب تكيف��ه م��ع امل�س��كالت االأخ��رى يف ح��االت النم��اذج‬
‫املُعقدة جدً ا‪.‬‬
‫‪%%capture # capture is used to suppress the installation output.‬‬ ‫التعلُّم املعزَّز‬
‫‪# install the pandas library, if it is missing.‬‬
‫• يتّ�س��م باملرون��ة‪ُ ،‬ومُيكن��ه التعام��ل م��ع البيئ��ات املُعق��دة • اأكر تعقيدً ا من التعلّم املوجَّ ه وغر املوجَّ ه‪.‬‬
‫‪!pip install pandas‬‬ ‫• �سعوب��ة ت�سمي��م نظ��م مكاف �اآت ُحُت��دد ال�س��لوك املطل��وب‬ ‫واملتغرة با�ستمرار‪.‬‬
‫‪import pandas as pd‬‬ ‫• مُيكن��ه التعلُّ��م م��ن التج��ارب ال�س��ابقة وحُت�س��ني الكف��اءة مع ب�سكل دقيق‪.‬‬
‫• ق��د يتطل��ب جمموع��ات كبرة م��ن بيانات التدري��ب واملوارد‬ ‫مرور الوقت‪.‬‬
‫مكتبة باندا�س هي مكتبة �سهيرة تُ�ستخدم لقراءة ومعالجة البيانات ال�سبيهة بجداول البيانات‪.‬‬ ‫• يتنا�س��ب م��ع عملي��ات �سن��ع الق��رار مث��ل لع��ب االألع��اب احل�سابية‪.‬‬
‫والروبوتية‪.‬‬
‫‪135‬‬ ‫‪134‬‬
‫هيز البيانات واملعا ة املُ�سبقة ‪Data re r tion and Pre-Processing‬‬ ‫‪# load the train and testing data.‬‬
‫على الرغم من اأن تن�س��يق الن�س االأويل كما يف �س��كل ‪ 3.4‬بديهي للقار الب�س��ري‪ ،‬اإال اأنَّ خوارزميات التعلُّم املوجَّ ه ال ت�س��تطيع التعامل‬ ‫)'‪imdb_train_reviews=pd.read_csv('imdb_data/imdb_train.csv‬‬
‫)'‪imdb_test_reviews=pd.read_csv('imdb_data/imdb_test.csv‬‬
‫فبدال من ذلك‪ ،‬حُتتاج اخلوارزميات اإىل حُتويل هذه املُ�ستنَدات اإىل تن�سيق متَّجَ ه رقمي (‪.)Numeric Vector‬‬ ‫معه ب�سورته احلالية‪ً .‬‬
‫فيم��ا ُيع��رف بعملي��ة الربجم��ة اال اهي��ة (‪ .)Vectorization‬ومُيك��ن تطبيق عملية الربجمة االجتاهي��ة بعدة طرائق خمتلفة‪ ،‬وتتميز‬ ‫‪imdb_train_reviews‬‬
‫باأن لها تاأثرًا اإيجابيًّا كبرًا على اأداء النموذج املُد ّرب‪.‬‬
‫مكتبة �سكلرين ‪Sklearn Library‬‬ ‫وكم��ا يت�س��ح يف ال�س��كل ‪،3.3‬ف �اإن‬
‫جمموع��ة بيان��ات ‪DataFrame‬‬
‫املوجه با�ستخدام مكتبة �سكلرن وتُعرف كذلك با�سم مكتبة �سايكيت لرن (‪ ،)Scikit-Learn‬وهي‬ ‫�سيتم بناء النموذج َّ‬
‫مكتبة �س�هرة يف بايثون تخت�س بتعلُّم االآلة‪ .‬توفر املكتبة جمموعة من االأدوات واخلوارزميات الأداء مهام متعددة‪ ،‬مثل‪:‬‬ ‫حُتتوي على عمودين‪:‬‬
‫الت�سني�ف‪ ،‬واالنح�دار‪ ،‬والتجمي�ع‪ ،‬وتقلي��س االأبع�اد‪ .‬اإح�دى االأدوات املفي�دة يف مكتب�ة �س�كلرن ه�ي اأداة تُ�س�مى‬ ‫• ّ‬
‫ن�س التقييم‪.‬‬
‫‪ ،CountVectorizer‬ومُيكن ا�ستخدامها يف تهيئة عملية املعاجلة ومتثيل البيانات الن�سية باملتَّجَ هات‪.‬‬ ‫• القيم َّ‬
‫(ال�سنف)‪.‬‬
‫اأداة ‪CountVectorizer‬‬
‫الربجمة األ اهية‬
‫(‪:) ec ori tion‬‬ ‫تُ�س��تخدم اأداة ‪ CountVectorizer‬يف حُتويل جمموعة من املُ�س��تنَدات الن�سية‬ ‫تقييم اإيجابي‬
‫اإىل م�سفوف��ة م��ن رم��وز متع��ددة‪ ،‬حي��ث مُي ّث��ل ك ّل �س� ّ�ف م�س��تندً ا وكل عم��ود مُيثل‬
‫الربجم��ة االجتاهي��ة ه��ي عملي��ة حُتوي��ل‬ ‫خا�س��ا‪ .‬ق��د تك��ون الرم��وز كلم��ات فردي��ة اأو عب��ارات اأو بُني��ات اأك��ر تعقي��دً ا‬
‫رم��زً ا ً‬
‫ال�سال�س��ل الن�سية املك َون��ة من الكلمات‬ ‫تقييم �سلبي‬
‫تقوم بالتقاط االأمناط املتعددة من البيانات الن�سية االأ�سا�سية‪ .‬تُ�سر املُدخَ الت‬
‫اأو العب��ارات (الن���س) اإىل متَّجَ ��ه‬ ‫أي�س��ا‬
‫يف امل�سفوف��ة اإىل ع��دد م��رات ظه��ور الرم��ز يف كل م�س��تند‪ .‬و ُيع��رف ذل��ك ا ً‬
‫متجان���س م��ن ا الأر ق��ام احلقيقي��ة‬ ‫با�س��م متثي��ل حقيب��ة الكلم��ات (‪ ،"bag-of-words" )BoW‬حي��ث يتجاه��ل‬ ‫القيمة ‪ 0‬متثل تقييمًا �سلبيًّا‬
‫ي�س��تخدم لرتمي��ز خ�سائ���س الن���س‬ ‫ترتي��ب الكلم��ات يف الن���س م��ع املحافظ��ة عل��ى تكراره��ا في��ه‪ .‬على الرغ��م من اأن‬
‫با�س��تخدام تن�س��يق تفهم��ه خوارزمي��ات‬ ‫بينما القيمة ‪ 1‬متثل تقييمًا اإيجابيًّا‪.‬‬
‫متثي��ل حقيب��ة الكلم��ات ه��و تب�س��يط �س��ديد للغ��ة الب�س��رية‪ ،‬اإال اأن��ه يحق��ق نتائ��ج‬ ‫�سكل ‪ :3.3‬جمموعة بيانات التدريب املُعنوَنة‬
‫تعلُّم االآلة‪.‬‬ ‫تناف�سية للغاية عند التطبيق العملي‪.‬‬ ‫اخلطوة التالية هي اإ�سناد اأعمدة الن�س والقيم اإىل متغرات م�ستقلة يف اأمثلة التدريب واالختبار املُمثّلة كمجموعة‬
‫حقيبة كلمات ن�سية متَّجَ هة‬
‫‪0‬‬ ‫‪apples‬‬ ‫بيانات ‪ DataFrame‬كما يلي‪:‬‬
‫‪1‬‬ ‫‪do‬‬
‫‪1‬‬ ‫‪I‬‬
‫"?‪"I like oranges, do you like oranges‬‬ ‫‪2‬‬ ‫‪like‬‬
‫‪# extract the text from the 'text' column for both training and testing.‬‬
‫]'‪X_train_text=imdb_train_reviews['text‬‬
‫("اأنا اأحب الربتقال‪ ،‬هل حُتب الربتقال؟")‬ ‫‪2‬‬
‫‪1‬‬
‫‪oranges‬‬
‫‪you‬‬
‫]'‪X_test_text=imdb_test_reviews['text‬‬
‫ت�ستخدم الرموز ‪ X‬و‪ Y‬عاد ًة يف‬
‫فيعرب ‪ X‬عن البيانات‬
‫التعلُّم املوجَّ ه ّ‬
‫�سكل ‪ :3.5‬متثيل حقيبة الكلمات (‪)bag-of-words‬‬ ‫‪# extract the labels from the 'label' column for both training and testing.‬‬ ‫املدخلة للتنبوؤ‪ ،‬و‪ Y‬عن القيم‬
‫]'‪Y_train=imdb_train_reviews['label‬‬ ‫امل�ستهدفة‪.‬‬
‫ي�ستخدم املقطع الربجمي التايل اأداة ‪ CountVectorizer‬لتمثيل جمموعة بيانات التدريب ‪ IMDb‬باملتَّجَ هات‪:‬‬ ‫]'‪Y_test=imdb_test_reviews['label‬‬
‫‪X_train_text # training data in text format‬‬
‫‪from sklearn.feature_extraction.text import CountVectorizer‬‬

‫‪# the min_df parameter is used to ignore terms that appear in less than 10 reviews.‬‬
‫)‪vectorizer_v1 = CountVectorizer(min_df=10‬‬

‫‪vectorizer_v1.fit(X_train_text) # fit the vectorizer on the training data.‬‬


‫‪# use the fitted vectorizer to vectorize the data.‬‬
‫)‪X_train_v1 = vectorizer_v1.transform(X_train_text‬‬

‫‪X_train_v1‬‬

‫'>'‪<40000x23392 sparse matrix of type '<class 'numpy.int64‬‬


‫>‪with 5301561 stored elements in Compressed Sparse Row format‬‬
‫‪ )X‬من جمموعة بيانات ‪DataFrame‬‬ ‫‪train‬‬ ‫�سكل ‪� :3.4‬سورة من اأمثلة التدريب (‪text‬‬
‫‪137‬‬ ‫‪136‬‬
‫وبح�سب املتوقّع حُتتاج امل�سفوفة املتباعدة اإىل ذاكرة اأقل بكثر وحُتديدًا ‪ 0.000048‬ميجابايت‪ .‬بينما ت�سغل امل�سفوفة‬
‫‪# expand the sparse data into a sparse matrix format, where each column represents a different word.‬‬
‫الكثيفة ‪ 7‬جيجابايت‪ ،‬كما اأنّ هذه امل�سفوفة لن تُ�ستخدَ م مرة اأخرى وبالتايل مُيكن حذفها لتوفر هذا احلجم الكبر‬ ‫‪X_train_v1_dense=pd.DataFrame(X_train_v1.toarray(),‬‬
‫من الذاكرة‪:‬‬ ‫))(‪columns=vectorizer_v1.get_feature_names_out‬‬
‫‪X_train_v1_dense‬‬

‫‪# delete the dense matrix.‬‬


‫‪del X_train_v1_dense‬‬

‫بِناء خط اأنابيب التنبو‬


‫‪Build a re iction Pipeline‬‬
‫املُ�سنِّف (‪:) ssi er‬‬ ‫االآن بع��د اأن مت َّكن��ت م��ن متثي��ل بيان��ات التدري��ب باملتَّجَ ه��ات ف�اإن اخلط��وة التالي��ة‬
‫املُ�س ِّن��ف يف تعلُّ��م االآل��ة ه��و من��وذج يُ�س��تخدم‬ ‫ه��ي ِبن��اء خ��ط اأنابي��ب التنبوؤ االأول‪ .‬اأحد االأمثلة على املُ�سنِّفات املُ�س��تخدَ مة للتنبوؤ‬
‫لتمييز نقاط البيانات يف فئات اأو ت�سنيفات‬ ‫بال َّن���س ه��و امل ُ�س ِّن��ف باي��ز ال�س��اذج (‪ .)Naive Bayes Classifier‬يَ�س��تخدِ م ه��ذا‬
‫خمتلف��ة‪ .‬الهدف م��ن املُ�سنِّف هو التعلُّم من‬ ‫امل�سنِّف احتماالت الكلمات اأو العبارات املحددة الواردة يف النَّ�س للتنبوؤ باحتمال‬
‫بيان��ات التدري��ب املُعن َون��ة‪ ،‬وم��ن ث��م القي��ام‬ ‫انتمائ��ه اإىل ت�سني��ف حُم��دد‪ .‬ج��اءت كلم��ة ال�س��اذج (‪ )Naive‬يف ا�س��م املُ�س ِّن��ف‬
‫بالتنب �وؤات ح��ول قي��م الت�سني��ف لبيان��ات‬ ‫م��ن افرتا���س اأن وج��ود كلم��ة بعينه��ا يف ال َّن���س م�س��تقل ع��ن وجود اأي كلم��ة اأخرى‪.‬‬
‫جديدة‪.‬‬ ‫وهذا افرتا�س قوي‪ ،‬ولكنه ي�سمح بتدريب اخلوارزمية ب�سرعة وبفعالية كبرة‪.‬‬ ‫�سكل ‪ :3.6‬متثيل جمموعة بيانات التدريب باملتَّجَ هات‬
‫ُيع� ِّ�رب ه��ذا التن�س��يق الكثي��ف (‪ )Dense‬للم�سفوف��ة ع��ن ‪ 40,000‬تقيي��م ومراجع��ة ف ِل��م يف بيان��ات التدري��ب‪ .‬حُتت��وي‬
‫ي�س��تخدم املقط��ع الربجم��ي الت��ايل تطبي��ق م�س َّن��ف باي��ز ال�س��اذج ( ‪ )Multinomial NB‬م��ن مكتب��ة �س��كلرن‬ ‫امل�سفوف��ة عل��ى عم��ود ل��كل كلم��ة تظه��ر يف ‪ 10‬مراجع��ات عل��ى االأق��ل (مُنف��ذة بوا�س��طة املتغ��ر ‪ .)min_df‬كم��ا يت�س��ح‬
‫(‪ )Sklearn Library‬لتدريب منوذج التعلُّم املوجَّ ه على بيانات التدريب ‪ IMDb‬باملتَّجَ هات‪:‬‬ ‫دخ��ل امل�سفوف��ة يف املو�س��ع [‪ ]i،j‬عن‬ ‫باالأعل��ى‪ ،‬ينت��ج ع��ن ذل��ك ‪ 23,392‬عم��ودًا‪ ،‬مرتب��ة يف ترتي��ب اأبج��دي رقم��ي‪ُ .‬يع� ِّ�رب ُم َ‬
‫ع��دد امل��رات الت��ي تظه��ر فيه��ا كلم��ة ‪ j‬يف املراجع��ة ‪ .i‬وعل��ى الرغ��م م��ن اإمكان ّي��ة ا�س��تخدام ه��ذه امل�سفوف��ة مبا�س��ر ًة م��ن‬
‫املوج��ه‪ ،‬اإال اأنه��ا غ��ر ف ّعال��ة م��ن حي��ث ا�س��تخدام الذاك��رة‪ .‬وال�س��بب يف ذل��ك اأن الغالبي��ة العظم��ى‬
‫ِق َب��ل خوارزمي��ة التعلُّ��م َّ‬
‫‪from sklearn.naive_bayes import MultinomialNB‬‬
‫م��ن املُدخَ ��الت يف ه��ذه امل�سفوف��ة ت�س��اوي ‪ .0‬وه��ذا يح��دث الأن ن�س��بة �سئيل��ة ج��دً ا فق��ط م��ن ب��ني ‪ 23,392‬كلم��ة حُمتمل��ة‬
‫‪model_v1=MultinomialNB() # a Naive Bayes Classifier‬‬ ‫�س��تظهر فعل ًي��ا يف كل مراجع��ة‪ .‬وملعاجل��ة ه��ذا الق�س��ور‪ُ ،‬تخ��زِّ ن اأداة ‪ CountVectorizer‬البيان��ات املمثل��ة باملتَّجَ ه��ات‬
‫يف م�سفوف��ة متباع��دة‪ ،‬حي��ث حُتتف��ظ فق��ط باملُدخَ الت غر ال�سفرية يف كل عمود‪ .‬ي�س��تخدم املقطع الربجمي باالأ�س��فل‬
‫‪model_v1.fit(X_train_v1, Y_train) # fit the classifier on the vectorized training data.‬‬
‫الدال��ة ()‪ getsizeof‬الت��ي حُت��دد حج��م الكائن��ات يف لغ��ة البايث��ون (‪ )Python‬بالباي��ت (‪ )Bytes‬لتو�سي��ح م��دى‬
‫‪from sklearn.pipeline import make_pipeline‬‬ ‫التوفر يف الذاكرة عند ا�ستخدام امل�سفوفة املتباعدة لبيانات ‪:IMDb‬‬
‫‪# create a prediction pipeline: first vectorize using vectorizer_v1, then use model_v1 to predict.‬‬
‫)‪prediction_pipeline_v1 = make_pipeline(vectorizer_v1, model_v1‬‬ ‫‪from sys import getsizeof‬‬
‫‪print('\nMegaBytes of RAM memory used by the raw text format:',‬‬
‫)‪getsizeof(X_train_text)/1000000‬‬
‫عل��ى �س��بيل املث��ال‪� ،‬س�يُنتج ه��ذا املقط��ع الربجم��ي م�سفوف��ة نتائ��ج يرم��ز فيه��ا الرق��م ‪ 1‬للتقيي��م االإيجاب��ي و‪ 0‬للتقيي��م‬ ‫‪print('\nMegaBytes of RAM memory used by the dense matrix format:',‬‬
‫ال�سلبي‪:‬‬ ‫)‪getsizeof(X_train_v1_dense)/1000000‬‬
‫‪print('\nMegaBytes of RAM memory used by the sparse format:',‬‬
‫)‪getsizeof(X_train_v1)/1000000‬‬
‫‪prediction_pipeline_v1.predict(['One of the best movies of the year. Excellent‬‬
‫‪cast and very interesting plot.',‬‬
‫‪'I was very disappointed with his film. I‬‬ ‫‪MegaBytes of RAM memory used by the raw text format: 54.864133‬‬
‫)] '‪lost all interest after 30 minutes‬‬
‫‪MegaBytes of RAM memory used by the dense matrix format: 7485.440144‬‬

‫)‪array([1, 0], dtype=int64‬‬ ‫‪MegaBytes of RAM memory used by the sparse format: 4.8e-05‬‬

‫‪139‬‬ ‫‪138‬‬
‫يتنب�اأ خ��ط االأنابي��ب ب�س��كل �سحي��ح بالقيم��ة االإيجابي��ة وال�س��لبية للتقيمي��ني االأول والث��اين عل��ى الت��وايل‪ُ .‬مُيك��ن ا�س��تخدام‬
‫‪%%capture‬‬
‫‪!pip install scikit-plot; # install the scikit-plot library, if it is missing.‬‬
‫الدال��ة املُ�س ّمن��ة ()‪ predict_proba‬لتحدي��د جمي��ع االحتم��االت الت��ي يقوم خط االأنابي��ب بتخ�سي�سها لكل واحدة من‬
‫‪import scikitplot; # import the library‬‬ ‫القيمتني املحتملتني‪ .‬العن�سر االأول هو احتمال تعيني ‪ 0‬والعن�سر الثاين هو احتمال تعيني ‪:1‬‬
‫‪class_names=['neg','pos'] # pick intuitive names for the 0 and 1 labels.‬‬
‫القيم‬ ‫‪prediction_pipeline_v1.predict_proba(['One of the best movies of the year. Ex‬‬
‫الحقيقية‪.‬‬ ‫‪cellent cast and very interesting plot.',‬‬
‫‪# plot the confusion matrix.‬‬
‫‪'I was very disappointed with his film.‬‬
‫(‪scikitplot.metrics.plot_confusion_matrix‬‬
‫)] '‪I lost all interest after 30 minutes‬‬
‫‪[class_names[i] for i in Y_test],‬‬
‫‪[class_names[i] for i in predictions_v1],‬‬
‫‪title="Confusion Matrix", # title to use‬‬
‫القيم المُتوقَّعة‪.‬‬ ‫‪array([[0.08310769, 0.91689231],‬‬
‫‪cmap="Purples", # color palette to use‬‬
‫)]]‪[0.83173475, 0.16826525‬‬
‫‪figsize=(5,5) # figure size‬‬
‫;)‬
‫التقييم الثاين‬ ‫التقييم االأول‬
‫حُتت��وي م�سفوف��ة الدق��ة عل��ى ع��دد الت�سنيف��ات احلقيقي��ة مقاب��ل املُتو َّقع��ة‪ .‬يف ُمهِ َّم��ة الت�سني��ف الثنائي��ة (مث��ل‪ :‬م�س�األة‬ ‫‪16.8%‬‬ ‫‪8.3%‬‬

‫احتواء قيمتني‪ ،‬املوجودة يف ُمهِ َّمة ‪� ،)IMDb‬ستحتوي م�سفوفة الدقة على اأربع خاليا‪:‬‬ ‫النموذج يوؤكد بن�سبة ‪ 8.3%‬اأن التقييم االأول‬
‫�سلبي بينما يوؤكد بن�سبة ‪ 91.6%‬اأنه اإيجابي‪.‬‬
‫التنبوؤات ال�سالبة ال�سحيحة (اأعلى الي�سار)‪:‬‬ ‫وبالمثل‪ ،‬يوؤكد النموذج بن�سبة ‪ 83.1%‬اأن‬
‫التقييم الثاني �سلبي بينما يوؤكد بن�سبة ‪16.8%‬‬
‫ع��دد امل��رات الت��ي تنب �اأ فيه��ا املُ�س ِّن��ف باحل��االت‬ ‫‪83.1%‬‬ ‫‪91.6%‬‬ ‫اأنه اإيجابي‪.‬‬
‫ال�سالبة ب�سكل �سحيح‪.‬‬
‫�سلبي‬ ‫اإيجابي‬
‫التنبوؤات ال�سالبة اخلاطئة (اأعلى اليمني)‪:‬‬ ‫�سكل ‪ُ :3.7‬خمطَّ طان دائريان يو�سحان الن�سب املئوية للتقييمني‬
‫ع��دد امل��رات الت��ي تنب �اأ فيه��ا املُ�س ِّن��ف باحل��االت‬ ‫اخلط��وة التالي��ة ه��ي اختب��ار دق��ة خ��ط االأنابي��ب اجلدي��د يف ت�سني��ف التقييم��ات يف جمموع��ة بيان��ات اختب��ار ‪.IMDb‬‬
‫ال�سالبة ب�سكل خاطئ‪.‬‬ ‫املُخرَج هو م�سفوفة ت�سمل جميع قيم نتائج ت�سنيف التقييمات الواردة يف بيانات االختبار‪:‬‬
‫التنبوؤات املوجبة اخلاطئة (اأ�سفل الي�سار)‪:‬‬ ‫‪# use the pipeline to predict the labels of the testing data.‬‬
‫ع��دد امل��رات الت��ي تنب �اأ فيه��ا املُ�س ِّن��ف باحل��االت‬ ‫‪predictions_v1 = prediction_pipeline_v1.predict(X_test_text) # vectorize the text‬‬
‫املوجبة ب�سكل خاطئ‪.‬‬ ‫‪data, then predict.‬‬

‫التنبوؤات املوجبة ال�سحيحة (اأ�سفل اليمني)‪:‬‬ ‫‪predictions_v1‬‬

‫ع��دد امل��رات الت��ي تنب �اأ فيه��ا املُ�س ِّن��ف باحل��االت‬


‫املوجبة ب�سكل �سحيح‪.‬‬ ‫)‪array([0, 0, 0, ..., 0, 0, 0], dtype=int64‬‬

‫�سكل ‪ :3.8‬نتائج م�سفوفة الدقة بتطبيق م�سنَّف بايز ال�ساذج على بيانات االختبار با�ستخدام جمموعة بيانات ‪.IMDb‬‬ ‫توف�ر لغ�ة البايث�ون العدي�د م�ن االأدوات لتحلي�ل وت�سوي�ر نتائ�ج خط�وط اأنابي�ب الت�سني�ف‪ .‬ت�س�مل االأمثل�ة دال�ة‬
‫()‪ accuracy_score‬من مكتبة �س�كلرن ومتثيل م�سفوفة الدقة (‪ )Confusion Matrix‬من مكتبة �س�ايكيت بلوت‬
‫تُظه��ر النتائ��ج اأن��ه عل��ى الرغ��م م��ن اأن خ��ط االأنابي��ب‬ ‫(‪ ،)Scikit-Plot‬وهن�اك مقايي��س تقيي�م اأخ�رى مث�ل‪ :‬الدق�ة‪ ،‬واال�س�تدعاء‪ ،‬والنوعية‪ ،‬واحل�سا�س�ية‪ ،‬ومقيا��س درجة ‪،F1‬‬
‫الدقة (‪:)Accuracy‬‬ ‫االأول يحق��ق دق��ة تناف�س��ية ت�س��ل اإىل ‪ ،84.68%‬اإال‬ ‫وفقًا حلالة اال�ستخدام التي مُيكن ح�سابها من م�سفوفة الدقة‪ .‬املُخرَج التايل هو تقريب دقيق لدرجة التنبوؤ‪:‬‬
‫الدقة هي ن�سبة التنبوؤات ال�سحيحة اإىل اإجمايل عدد التنبوؤات‪.‬‬ ‫اأن��ه ال ي��زال ُيخط��ئ يف ت�سني��ف مئ��ات التقييم��ات‪.‬‬
‫(التنبوؤات املوجبة ال�سحيحة ‪ +‬التنبوؤات ال�سالبة ال�سحيحة)‬ ‫فهن��اك ‪ 331‬تن ّب �وؤًا غ��ر �سحي��ح يف الرب��ع االأمُي��ن‬ ‫‪from sklearn.metrics import accuracy_score‬‬
‫الدقة =‬ ‫العل��وي و‪ 435‬تن ّب �وؤًا غ��ر �سحي��ح يف الرب��ع االأي�س��ر‬ ‫‪accuracy_score(Y_test, predictions_v1) # get the achieved accuracy.‬‬
‫(التنب�وؤات املوجب��ة ال�سحيح��ة ‪ +‬التنب�وؤات ال�س��البة ال�سحيح��ة‬
‫‪ +‬التنبوؤات املوجبة اخلاطئة ‪ +‬التنبوؤات ال�سالبة اخلاطئة)‬ ‫ال�س��فلي‪ .‬باإجم��ايل ‪ 766‬تن ّب �وؤً ا غ��ر �سحي��ح‪.‬‬
‫اخلطوة االأوىل نحو حُت�س��ني االأداء هي درا�س��ة �س��لوك‬ ‫‪0.8468‬‬
‫الن�س‬
‫خط اأنابيب التنبوؤ‪ ،‬ملعرفة كيف يقوم مبعاجلة ّ‬
‫‪141‬‬ ‫وفهمه‪.‬‬ ‫‪140‬‬
‫كما هو مُتوقَّع‪ ،‬يقدم منوذج التنبوؤ تنبوؤًا �سلبيًا موؤكدً ا بدرجة كبرة يف هذا املثال الب�سيط‪.‬‬ ‫�سر مُتن ِّب ات ال�سندوق األأ�سود ‪Explaining Black-Box Predictors‬‬
‫ي�س��تخدم م�س َّن��ف باي��ز ال�س��اذج ال�سي��غ الريا�سي��ة الب�س��يطة لتجمي��ع احتماالت اآالف الكلمات وتق ��دي� ��م تنبوؤاته��ا‪ .‬وبالرغم من‬
‫‪# explain the prediction for this example.‬‬
‫‪exp = explainer_v1.explain_instance(easy_example.lower(),‬‬ ‫ب�س��اطة النم��وذج‪ ،‬اإال اأن��ه ال ي��زال غ��ر ق��ادر عل��ى تق��دمي �س��رح ب�س��يط ومبا�س��ر لكيفي��ة قي��ام النم��وذج بتو ُّق��ع القيم��ة املوجب��ة اأو‬
‫‪prediction_pipeline_v1.predict_proba,‬‬ ‫ال�س��البة جل��زء حُم��دد م��ن الن���س‪ .‬ق��ا ِرن ذلك مع ُم�سنِّفات �س��جرة القرار االأكر و�سوحً ا‪ ،‬حيث يتم متثي��ل القواعد التي تعلمها‬
‫)‪num_features=10‬‬ ‫النم��وذج يف الهي��كل ال�س��جري‪ ،‬مم��ا ُي�س� ِّهل عل��ى االأ�س��خا�س فه��م كي��ف يق��وم املُ�س ِّن��ف بالتنب�وؤات‪ .‬يتي��ح هي��كل ال�س��جرة كذل��ك‬
‫‪# print the words with the strongest influence on the prediction.‬‬
‫)(‪exp.as_list‬‬ ‫احل�س��ول عل��ى ت�س��ور مرئ��ي للق��رارات املُتخ��ذَّ ة يف كل فرع‪ ،‬ممّ ا يكون مفيدً ا يف فهم العالقات بني اخل�سائ�س املُدخَ لة واملتغر‬
‫امل�ستهدف‪.‬‬
‫‪[('terrible', -0.07046118794796816),‬‬ ‫االفتق��ار اإىل ق��درة التف�س��ر متث��ل حُتد ًي��ا كب�رًا يف اخلوارزمي��ات االأك��ر تعقي��دً ا‪ ،‬كتل��ك املُ�س��ت ِندة اإىل التجميع��ات مث��ل‪:‬‬
‫‪('horrible', -0.06841672591649835),‬‬ ‫توليف��ات م��ن اخلوارزمي��ات املتع��ددة اأو ال�س��بكات الع�سبي��ة‪ .‬فب��دون الق��درة عل��ى التف�س��ر‪ ،‬تتقل���س خوارزمي��ات التعلُّ��م‬
‫‪('boring', -0.05909016205135171),‬‬ ‫املوجه اإىل متنبئات ال�سندوق االأ�سود‪ :‬على الرغم من اأنها تفهم الن�س ب�سكل ٍ‬
‫‪('plot', -0.024063095577996376),‬‬
‫كاف للتنبوؤ بالقيم‪ ،‬اإال اأنها ال تزال غر‬ ‫َّ‬
‫‪('was', -0.014436071624747861),‬‬ ‫ق��ادرة عل��ى تف�س��ر كي��ف تق��وم باتخ��اذ القرار‪ .‬اأجريت العديد م��ن االأبحاث للتغلب على هذه التحديات بت�سميم و�س��ائل‬
‫‪('movie', -0.011956911011210977),‬‬ ‫ق��ادرة عل��ى التف�س��ر ت�س��تطيع فه��م من��اذج ال�سن��دوق االأ�س��ود‪ .‬واح��دة م��ن الو�س��ائل االأك��ر �س��هرة ه��ي النم��وذج املحاي��د‬
‫‪('actors', -0.011682594571408675),‬‬
‫‪('this', -0.009712387273986628),‬‬
‫املحلي القابل للتف�سر وال�سرح (‪.)Local Interpretable Model-Agnostic Explanations - LIME‬‬
‫‪('very', 0.008956707731803237),‬‬
‫])‪('were', -0.008897098392433257‬‬
‫النموذج املحايد املحلي القابل للتف�سري وال�سر‬
‫‪Local Interpretable Model- gnostic‬‬ ‫‪n tions - LIME‬‬
‫معامال في نموذج‬
‫ً‬ ‫الدرجة المقابلة لكل كلمة تمثل‬ ‫الخ�سائ�س الع�سرة‬ ‫النموذج املحايد املحلي القابل للتف�سر وال�سرح (‪ )LIME‬هو طريقة لتف�سر التنبوؤات التي قامت بها مناذج ال�سندوق‬
‫االنحدار الخطي الب�سيط المُ�ستخدَ م لتقديم التف�سير‪.‬‬ ‫االأكثر تاأثيرًا‪.‬‬ ‫االأ�س��ود‪ .‬وذل��ك م��ن خ��الل النظ��ر يف نقط��ة بيان��ات واح��دة يف وق��ت حُم��دد‪ ،‬واإج��راء تغي��رات ب�س��يطة عليه��ا ملعرف��ة كيف‬
‫يوؤث��ر ذل��ك عل��ى ق��درة تنب�وؤ النم��وذج‪ ،‬ث��م تُ�س��تخدم ه��ذه املعلومات لتدري��ب منوذج مفهوم وب�س��يط مثل االنح��دار اخلطي‬
‫على تف�س��ر هذه التنبوؤات‪ .‬بالن�س��بة للبيانات الن�سية‪ ،‬يقوم النموذج املحايد املحلي القابل للتف�س��ر وال�س��رح بالتع ّرف‬
‫مُيكن احل�سول على ت�سور مرئي اأكر دق ًة على النحو التايل‪:‬‬ ‫على الكلمات اأو العبارات التي لها االأثر االأكرب على القيام بالتنبوؤات‪.‬‬
‫يو�سح ذلك‪:‬‬‫وفيما يلي‪ ،‬تطبيق بلغة البايثون ّ‬
‫‪# visualize the impact of the most influential words.‬‬
‫)(‪fig = exp.as_pyplot_figure‬‬ ‫‪%%capture‬‬

‫‪!pip install lime # install the lime library, if it is missing‬‬


‫‪from lime.lime_text import LimeTextExplainer‬‬

‫‪# create a local explainer for explaining individual predictions‬‬


‫)‪explainer_v1 = LimeTextExplainer(class_names=class_names‬‬

‫‪# an example of an obviously negative review‬‬


‫‪easy_example='This movie was horrible. The actors were terrible and the plot‬‬
‫'‪was very boring.‬‬

‫‪# use the prediction pipeline to get the prediction probabilities for this example‬‬
‫))]‪print(prediction_pipeline_v1.predict_proba([easy_example‬‬

‫]]‪[[0.99874831 0.00125169‬‬

‫�سكل ‪ :3.9‬الكلمات االأعلى تاأثرًا يف القيام بالتنبوؤات‬


‫‪143‬‬ ‫‪142‬‬
‫ُعام��ل املوج��ب من��ه‪ .‬عل��ى �س��بيل املث��ال‪ ،‬الكلم��ات‪:‬‬ ‫يَزي��د امل ِ‬
‫ُعام��ل ال�س��الب م��ن احتمالي��ة الت�سني��ف ال�س��الب‪ ،‬بينم��ا يُقل��ل امل ِ‬
‫‪# get the correct labels of this example.‬‬
‫)]]‪print('Correct Label:', class_names[Y_test[4600‬‬
‫‪( horrible‬فظي��ع)‪ ،‬و ‪( terrible‬مري��ع)‪ ،‬و ‪( boring‬مم��ل) له��ا التاأث��ر االأق��وى عل��ى ق��رار النم��وذج بالتنب�وؤ بالقيم��ة‬
‫ال�س��البة‪ .‬الكلم��ة ‪( very‬ج��دً ا) دفع��ت النم��وذج قلي� ً�ال يف اجت��اه اآخ��ر اإيجاب��ي‪ ،‬ولكنه��ا مل تك��ن كافي��ة لتغي��ر الق��رار‪.‬‬
‫‪# get the prediction probabilities for this example.‬‬ ‫بالن�س��بة للمراق��ب الب�س��ري‪ ،‬ق��د يب��دو غري ًب��ا اأن الكلم��ات اخلالي��ة م��ن امل�س��اعر مث��ل‪( plot :‬احلبك��ة الدرامي��ة) اأو ‪was‬‬
‫‪print('Prediction Probabilities for neg, pos:',‬‬ ‫(كان) له��ا م ِ‬
‫))]‪prediction_pipeline_v1.predict_proba([mistake_example‬‬
‫ُعام��الت مرتفع��ة ن�س��بيًا‪ .‬وم��ع ذل��ك‪ ،‬م��ن ال�س��روري اأن تتذك��ر اأن تعلُّ��م ا آالل��ة ال يتب��ع دومً ��ا الوع��ي الب�س��ري‬
‫ال�سليم‪.‬‬
‫‪Correct Label: pos‬‬
‫ُعامالت املرتفعة بالفعل عن ق�سور يف منطق اخلوارزمية وقد تكون م�سوؤولة عن بع�س اأخطاء منوذج‬ ‫وقد تك�سف هذه امل ِ‬
‫]]‪Prediction Probabilities for neg, pos: [[0.8367931 0.1632069‬‬ ‫التن ُّبوؤ‪ .‬وعلى نح ٍو بديل‪ُ ،‬يع ُّد منوذج التن ُّب ؤو مبثابة موؤ�سرٍ على االأمناط التنبوؤية الكامنة والغنيّة يف الوقت نف�سه باملعلومات‪.‬‬
‫عل��ى �س��بيل املث��ال‪ ،‬ق��د يب��دو الواق��ع وكاأن املُقي ِّم��ني الب�س��ريني اأك��ر ا�س��تخدامً ا لكلم��ة ‪( plot‬احلبك��ة الدرامي��ة) اأو �سيغة‬
‫التنب�وؤ ق�دّم تنب�وؤًا �س��لبيًا م ؤوك��دً ا للغاي��ة باحتمالي��ة‬
‫عل��ى الرغ��م م��ن اأن ه��ذا التقيي��م اإيجاب��ي ب�س��كل وا�س��ح‪ ،‬اإال اأنّ من��وذج ُّ‬ ‫املا�س��ي ‪( was‬كان) عن��د احلدي��ث يف �س��ياق �س��لبي‪ .‬ومُيك��ن ملكتب��ة النم��وذج املحاي��د املحل��ي القاب��ل للتف�س��ر وال�س��رح‬
‫التنبوؤ مثل هذا القرار اخلاطئ‪:‬‬ ‫ُف�سر لتو�سيح ال�سبب وراء اتخاذ منوذج ُّ‬ ‫و�سلت اإىل ‪ .83%‬مُيكن االآن ا�ستخدام امل ِّ‬ ‫(‪ )LIME‬يف لغة البايثون ت�سوير ال�سروحات بطرائق اأخرى‪ .‬على �سبيل املثال‪:‬‬

‫‪# explain the prediction for this example.‬‬ ‫)(‪exp.show_in_notebook‬‬


‫_‪exp = explainer_v1.explain_instance(mistake_example, prediction_pipeline‬‬
‫)‪v1.predict_proba, num_features=10‬‬

‫‪# visualize the explanation.‬‬


‫)(‪fig = exp.as_pyplot_figure‬‬

‫�سكل ‪ :3.10‬التمثيالت املرئية االأخرى‬


‫التقيي��م املُ�س��تخدم يف املث��ال ال�س��ابق كان �س��لبيًا ب�س��كل وا�س��ح ويَ�س�هُل التنبوؤ به‪ .‬خُ ��ذْ بعني االعتبار التقيي��م التايل االأكر‬
‫�سعوب ًة والذي مُيكن اأن يت�سبب يف تذبذب دقة اخلوارزمية‪ ،‬وهو ماأخوذ من جمموعة بيانات اختبار ‪:IMDb‬‬

‫‪# an example of a positive review that is mis-classified as negative by prediction_pipeline_v1‬‬


‫]‪mistake_example= X_test_text[4600‬‬
‫‪mistake_example‬‬

‫‪"I personally thought the movie was pretty good, very good acting by‬‬
‫�سكل ‪ :3.11‬الكلمات التي اأثرت على القرار اخلاطئ‬ ‫‪Tadanobu Asano of Ichi the Killer fame. I really can't say much about the‬‬
‫‪story, but there were parts that confused me a little too much, and overall‬‬
‫على الرغم من اأن منوذج التن ُّبوؤ ي�ستنبط التاأثر االإيجابي لبع�س الكلمات على نح ٍو �سحيح مثل‪:‬‬ ‫‪I thought the movie was just too lengthy. Other than that however, the‬‬
‫‪movie contained superb acting great fighting and a lot of the locations‬‬
‫‪( beautifully‬ب�س��كل جمي��ل)‪ ،‬و‪( great‬رائ��ع)‪ ،‬و‪( superb‬مده���س)‪ ،‬اإال اأ ّن��ه ي ّتخ��ذ يف النهاي��ة ق��رارًا �س��لبيًا ا�س��تنادًا‬ ‫‪were beautifully shot, great effects, and a lot of sword play. Another‬‬
‫اإىل العدي��د م��ن الكلم��ات الت��ي يب��دو اأنه��ا ال تع��رب ب�س��كل وا�س��ح ع��ن امل�س��اعر ال�س��لبية مث��ل‪( Asano :‬اأ�س��انو)‪ ،‬و‪Asian‬‬ ‫‪solid effort by Tadanobu Asano in my opinion. Well I really can't say‬‬
‫‪anymore about the movie, but if you're only outlook on Asian cinema is‬‬
‫(اآ�سيوي)‪ ،‬و‪( movie‬فيلم)‪ ،‬و‪( acting‬متثيل)‪.‬‬ ‫‪Crouching Tiger Hidden Dragon or House of Flying Daggers, I would suggest‬‬
‫املنطق الذي ي�ستخدمه منوذج التن ُّبوؤ لت�سنيف املفردات الواردة يف ن�سو�س التقييمات‬ ‫يو�سح العيوب الكبرة يف ِ‬ ‫‪you trying to rent it, but if you're a die-hard Asian cinema fan I would‬‬
‫وهذا ِّ‬ ‫"‪say this has to be in your collection very good Japanese film.‬‬
‫حد كبر‪.‬‬ ‫يو�سح كيف اأن حُت�سني هذا املنطق مُيكن اأن يطور من اأداء منوذج التن ُّبوؤ اإىل ٍ‬ ‫املُقدمة‪ .‬الق�سم التايل ّ‬
‫‪145‬‬ ‫‪144‬‬
‫• ‪ \w‬تتطابق مع كل الرموز االأبجدية الرقمية (‪ )0-9، A-Z، a-z‬وال�سَ رطة ال�سفلية‪.‬‬ ‫�سن الربجمة األ اهية للن�سو�ض‬
‫‪hello123_world‬‬ ‫• ‪ \w+‬تُ�س �تَخدم للبح��ث ع��ن واح��د اأو اأك��ر م��ن رم��وز ‪ .\w‬لذل��ك‪ ،‬يف ال�سل�س��لة الن�سي��ة‬
‫(مرحبًا ‪ _123‬العامل)‪ ،‬النمط ‪� \w+‬سيتطابق مع الكلمات ‪( hello‬مرحبًا) و ‪ 123‬و‪( world‬العامل)‪.‬‬ ‫‪Improving Text ec ori tion‬‬
‫• ‪ \b‬متث��ل الفا�س��ل (‪ )boundry‬ب��ني رم��ز ‪ \w‬ورم��ز لي���س ‪، \w‬وكذل��ك يف بداي��ة اأو نهاي��ة ال�سل�س��لة الن�سي��ة املُعط��اة‪ .‬عل��ى‬ ‫ا�س��تخدم االإ�س��دار االأول خل��ط اأنابي��ب التنب �وؤ اأداة ‪CountVectorizer‬‬
‫التعبري النمطي (‪:)Regular Expression‬‬ ‫حل�س��اب ع��دد امل��رات الت��ي تظه��ر فيه��ا كل كلم��ة يف كل تقيي��م‪ .‬تتجاه��ل ه��ذه‬
‫�س��بيل املث��ال‪� :‬س��وف يتطاب��ق النم��ط ‪ \bcat\b‬م��ع الكلم��ة ‪( cat‬القط��ة) يف ال�سل�س��لة الن�سي��ة ‪(The cat is cute‬القط��ة‬
‫لطيف��ة)‪ ،‬ولكن��ه ل��ن يتطاب��ق م��ع الكلم��ة ‪( cat‬القط��ة) يف ال�سل�س��لة الن�سي��ة ‪( The category is pets‬فئ��ة احليوان��ات‬ ‫التعب��ر النمط��ي ه��و من��ط ن���س ُي�س��تخدَ م ملطابقة‬ ‫املنهجية حقيقتني اأ�سا�سيتني حول اللغات الب�سرية‪:‬‬
‫االأليفة)‪.‬‬ ‫وملعاجل��ة �سال�س��ل الن�سو���س وتق��دمي طريق��ة‬ ‫• قد يتغر معنى الكلمة واأهميّتها ح�سب الكلمات املُ�ستخدَ مة معها‪.‬‬
‫موج��زة ومرن��ة لتحدي��د اأمن��اط الن�سو���س‪ ،‬كم��ا‬ ‫• تك��رار الكلم��ة يف املُ�س��تنَد ال ُيع� ُّد دومً ��ا متثي� ً�ال دقيقًا الأهميّتها‪ .‬على �س��بيل‬
‫مثاال على التق�سيم با�ستخدام الدالة ()‪.tokenize_doc‬‬ ‫اأدناه ً‬ ‫تُ�س�تَخدم عل��ى نط��اق وا�س��ع يف معاجل��ة الن�سو���س‬ ‫املث��ال‪ ،‬عل��ى الرغ��م م��ن اأن تك��رار كلم��ة ‪( great‬رائ��ع) مرت��ني ق��د مُيث��ل‬
‫'‪raw_text='The movie was too long. I fell asleep after the first 2 hours.‬‬
‫وحُتليل البيانات‪.‬‬ ‫موؤ�س�رًا اإيجاب ًي��ا يف م�س��تند يحت��وي عل��ى ‪ 100‬كلم��ة‪ ،‬اإال اأن��ه مُيث��ل موؤ�س�رًا‬
‫)‪tokenized_sentences=tokenize_doc(raw_text‬‬
‫‪tokenized_sentences‬‬
‫اأقل اأهمية بكثر يف م�ستند يحتوي على ‪ 1000‬كلمة‪.‬‬
‫�سي�س��رح ه��ذا اجل��زء كيفي��ة حُت�س��ني الربجم��ة االجتاهي��ة للن�سو���س الأخ��ذ هات��ني احلقيقت��ني يف عني االعتب��ار‪ .‬ي�س��تدعي املقطع‬
‫‪[['the', 'movie', 'was', 'too', 'long'],‬‬ ‫الربجمي التايل ثالثة مكتبات خمتلفة بلغة البايثون‪� ،‬س ُت�ستخدم لتحقيق ذلك‪:‬‬
‫]]'‪['i', 'fell', 'asleep', 'after', 'the', 'first', '2', 'hours‬‬
‫• ‪ nltk‬و جين�سم (‪ :)Gensim‬تُ�ستَخدم هاتان املكتبتان ال�سّ هرتان يف مهام معاجلة اللغات الطبيعية املُتنوّعة‪.‬‬
‫مُيكن االآن جتميع الدالة ()‪ tokenize_doc‬مع اأداة العبارات من مكتبة جين�سم (‪ )Gensim‬الإن�ساء منوذج العبارة‪،‬‬ ‫• ‪ :re‬تُ�ستَخدم هذه املكتبة يف البحث عن النّ�سو�س‪ ،‬ومعاجلتها با�ستخدام التعبرات النمطية‪.‬‬
‫وه��و من��وذج مُيكن��ه التع�رّف عل��ى العب��ارات املكون��ة م��ن ع��دة كلم��ات يف جمل��ة معط��اة‪ .‬ي�س��تخدم املقطع الربجم��ي التايل‬
‫بيانات التدريب ‪ IMDB‬اخلا�سة ب� (‪ )X_train_text‬لبناء مثل هذا النموذج‪:‬‬ ‫‪%%capture‬‬

‫‪!pip install nltk # install nltk‬‬


‫‪sentences=[] # list of all the tokenized sentences across all the docs in this dataset‬‬ ‫‪!pip install gensim # install gensim‬‬

‫‪for doc in X_train_text: # for each doc in this dataset‬‬ ‫‪import nltk # import nltk‬‬
‫‪sentences+=tokenize_doc(doc) # get the list of tokenized sentences in this doc‬‬ ‫‪nltk.download('punkt') # install nltk's tokenization tool, used to split a text into sentences.‬‬

‫‪# build a phrase model on the given data‬‬ ‫‪import re‬‬ ‫‪# import re‬‬
‫‪imdb_phrase_model = Phrases(sentences, 1‬‬
‫‪connector_words=ENGLISH_CONNECTOR_WORDS, 2‬‬ ‫‪from gensim.models.phrases import Phrases, ENGLISH_CONNECTOR_WORDS # import tools‬‬
‫‪scoring='npmi', 3‬‬ ‫‪from the gensim library.‬‬
‫‪threshold=0.25).freeze() 4‬‬

‫كما هو مو�سح باالأعلى‪ ،‬ت�ستقبل الدالة ()‪ Phrases‬اأربعة متغرات‪:‬‬ ‫ديد العبارات ‪e ecting Phrases‬‬
‫التق�سيم (‪:) o eni tion‬‬
‫ُق�سمة من جمموعة الن�سو�س املُعطاة‪.‬‬ ‫‪ 1‬قائمة ا ُ‬
‫جلمل امل َّ‬ ‫مُيك��ن ا�س��تخدام الدال��ة االآتي��ة لتق�س��يم م�س��تند حُم��دد‬
‫يق�س��د ب��ه‪ :‬عملي��ة تق�س��يم البيان��ات الن�سي��ة اإىل اأج��زاء مث��ل‬ ‫ُق�س��مة‪ ،‬حي��ث مُيك��ن متثي��ل كل‬
‫‪ 2‬قائمة بالكلمات االإجنليزية ال�سائعة التي تظهر ب�سورة متكررة يف العبارات (مثل‪ ،the :‬و ‪ ،)of‬ولي�س لها اأي قيمة موجبة‬ ‫وجمل‪ ،‬ورموز‪ ،‬وعنا�سر اأخرى يطلق عليها الرموز‪.‬‬ ‫كلمات‪ُ ،‬‬ ‫جلم��ل امل َّ‬
‫اإىل قائم��ة م��ن ا ُ‬
‫اأو �سالبة‪ ،‬ولكن مُيكنها اإ�سفاء امل�ساعر ح�سب ال�سياق‪ ،‬ولذلك يتم التعامل معها ب�سورة خمتلفة‪.‬‬ ‫ق�سمة بقائمة من الكلمات‪:‬‬ ‫جملة ُم َّ‬
‫‪ 3‬تُ�ستَخدم دالة ت�سجيل النقاط لتحديد ما اإذا كان ت�سمني جمموعة من الكلمات يف العبارة نف�سها واجبًا‪ .‬املقطع الربجمي‬ ‫دالة ()‪ sent_tokenize‬تُق�سِّ م‬
‫باالأعلى َي�ستخدم مقيا�س املعلومات النقطية امل�سرتكة امل ُعايَر (‪)Normalized Pointwise Mutual Information - NPMI‬‬ ‫‪# convert a given doc to a list of tokenized sentences.‬‬
‫‪def tokenize_doc(doc:str):‬‬
‫الجمل‪.‬‬ ‫المُ�ستنَد اإلى قائمة من ُ‬
‫له��ذا الغر���س‪ .‬ي�س��تند ه��ذا املقيا���س عل��ى تك��رار ت��وارد الكلم��ات يف العب��ارة املُر�س��حة وتك��ون قيمت��ه ب��ني ‪ -1‬و يرم��ز اإىل‬ ‫‪return [re.findall(r'\b\w+\b',‬‬
‫اال�ستقاللية الكاملة (‪ ،)Complete Independence‬و ‪ +1‬ويرمز اإىل التوارد الكامل (‪.)Complete Co-occurrence‬‬ ‫])‪sent.lower()) for sent in nltk.sent_tokenize(doc‬‬

‫‪ 4‬يف ح��دود دال��ة ت�س��جيل النق��اط يت��م جتاه��ل العب��ارات ذات النق��اط ا أالق��ل‪ .‬وم��ن الناحي��ة العملي��ة‪ ،‬مُيك��ن �سبط ه��ذه احلدود‬ ‫دالة ()‪ sent_tokenize‬من مكتبة ‪ nltk‬تُق�سِّ م املُ�ستنَد اإىل قائمة من اجلُمل‪.‬‬
‫لتحديد القيمة التي تُعطي اأف�سل النتائج يف التطبيقات النهائية مثل‪ :‬النمذجة التنبوؤية‪.‬‬ ‫بع��د ذل��ك‪ ،‬يت��م كتاب��ة كل جمل��ة باأح��رف �سغ��رة وتغذيته��ا اإىل دال��ة ()‪ findall‬م��ن مكتب��ة ‪ re‬لتق��وم بتحدي��د تك��رارات‬
‫ُحُتوِّل دالة ()‪ freeze‬منوذج العبارة اإىل تن�سيق غر قابل للتغير اأي ُجممّد (‪ )Frozen‬لكنّه اأكر �سرعة‪.‬‬ ‫التعبرات النمطية '‪� .'\b\w+\b‬ستختربها على ال�سل�سلة الن�سية املوجودة يف متغر ‪ . raw_text‬يف هذا ال�سياق‪:‬‬
‫‪147‬‬ ‫‪146‬‬
:‫ �س ُيحقق منوذج العبارة النتائج التالية‬،‫عند تطبيقها على اجلملتني املُق�سَّ متني باملثال املُو�سح باالأعلى‬
# an example of an annotated document from the imdb training data
X_train_text_annotated[0]
imdb_phrase_model[tokenized_sentences[0]]

'i_grew up b 1965 watching and loving the thunderbirds all my_mates at school watched
we played thunderbirds before school during lunch and after school we all wanted to ['the', 'movie', 'was', 'too_long']
be virgil or scott no_one wanted to be alan counting down from 5 became an art_form
i took my children to see the movie hoping they would get_a_glimpse of what i_loved
as a child how bitterly disappointing the only high_point was the snappy theme_tune
not that it could compare with the original score of the thunderbirds thankfully imdb_phrase_model[tokenized_sentences[1]]
early saturday_mornings one television_channel still plays reruns of the series
gerry_anderson and his_wife created jonatha frakes should hand in his directors chair
his version was completely hopeless a waste of film utter_rubbish a cgi remake may_be ['i', 'fell_asleep', 'after', 'the', 'first', '2_hours']
acceptable but replacing marionettes with homo_sapiens subsp sapiens was a huge error
of judgment'
،)‫ (طوي��ل ج��دً ا‬too_long‫ (�س��قط نائ ًم��ا) و‬fell_asleep :‫يح��دِّ د من��وذج العب��ارة ثالث��ة عب��ارات عل��ى النح��و الت��ايل‬
.‫�ساعة) وجميعها حُتمل معلومات اأكر من كلماتها املفردة‬-2( 2_hours‫و‬
‫ تكرار امل�ستند العك�سي‬- ‫تكرار امل�سطل‬ ‫تكرار املُ�ستنَد‬- ‫ا�ستخدام مقيا�ض تكرار امل�سطل‬
Term Frequency Inverse Document ‫العك�س�ي يف الربجم�ة األ اهي�ة للن�سو��ض‬ ‫�سلبي‬
‫مُق�سَّ م‬
‫ُحمايد‬ ‫ُحمايد‬ ‫ (طوي��ل‬too_long ‫ حُتم��ل عب��ارة‬،‫عل��ى �س��بيل املث��ال‬
Frequency )TF-IDF( too_long long too ‫ عل��ى الرغ��م م��ن اأن‬،‫ج��دً ا) م�س��اعر �س��لبية وا�سح��ة‬
Using TF-IDF for Text Vec ori tion
‫ تك��رار املُ�س��تنَد العك�س��ي ه��و‬-‫تك��رار امل�سطل��ح‬ ‫ الطريقة املُثلى‬.‫متثيال دقيقًا الأهميتها‬ ً ‫تكرار الكلمة يف املُ�ستنَد ال ُيع ُّد دومً ا‬ ‫�سلبي‬ ‫�سلبي‬ ‫ (طوي��ل) ال تع��ربان ع��ن ال�سياق‬long‫ (ج��دً ا) و‬too ‫كلمت��ي‬
.‫طريقة تُ�ستخدم لتحديد اأهمية الرموز يف املُ�ستنَد‬ fell_asleep
‫مُق�سَّ م‬ asleep fell ‫ فعل��ى الرغ��م م��ن اأن كلم��ة‬،‫ وباملث��ل‬،‫ذل��ك منفردت��ني‬
‫ تك��رار امل ُ�س��تنَد‬- ‫لتمثي��ل التك��رار ه��ي املقيا���س ال�س��هر لتك��رار امل�سطل��ح‬ ،‫ (نائ��م) يف مراجع��ة الفيل��م متثل داللة �س��لبية‬asleep
‫ ي�ستخدم هذا املقيا�س �سيغة ريا�سية ب�سيطة لتحديد‬.)TF-IDF( ‫العك�سي‬ ‫ال�سياق امل ُحدد‬ ‫ال�سياق‬ ‫ (�س��قط نائ ًم��ا) تو�س��ل ر�س��الة ال�سياق‬fell_asleep ‫فالعب��ارة‬
)Corpus( ‫الن�سي‬
ّ ‫االأ�سل‬ :‫ الكلمات اأو العبارات يف املُ�ستنَد بنا ًء على عاملني‬:‫اأهمية الرموز مثل‬ ‫م‬ َّ‫ُق�س‬
‫م‬
2_hours hours 2 2_hours ‫ ت�س��تنبط م��ن‬،‫ و اأ خ �رًا‬.‫اأ ك��ر و�سوحً ��ا‬
‫ بقيا���س عدد مرات ظهوره يف املُ�س��تنَد مق�سومً ا‬،‫• تكرار الرمز يف املُ�س��تنَد‬ ‫ امل�ساعر االإيجابية وال�سلبية قبل التق�سيم وبعده‬:3.12 ‫�سكل‬ 2 ‫�س��اعة) �س��ياقًا اأك��ر حُتدي��دً ا م��ن الكلمت��ني‬-2(
.‫على اإجمايل عدد الرموز يف جميع املُ�ستنَدات‬ .‫ كلٍّ على حدة‬hours‫و‬
‫ املح�سوب بق�سمة اإجمايل عدد املُ�ستنَدات‬،‫• تكرار املُ�ستنَد العك�سي للرمز‬ :‫ت�ستخدم الدالة التالية اإمكانية حُتديد العبارات بهذا ال�سكل لتف�سر العبارات يف وثيقة مُعطاه‬
.‫يف جمموعة البيانات على عدد املُ�ستنَدات التي حُتتوي على الرمز‬
‫امل ُ�ستنَد‬ ‫الكلمة‬ ‫امل�سطلح‬ def annotate_phrases(doc:str, phrase_model):
‫ الكلمات وامل�سطلحات الواردة يف امل�ستند‬:3.13 ‫�سكل‬
‫العام��ل االأول يتجن��ب املبالغ��ة يف تقدي��ر اأهمي��ة امل�سطلح��ات الت��ي تظه��ر يف‬
‫ اأ ّم��ا العام��ل الث��اين في�س��تبعد امل�سطلح��ات الت��ي تظه��ر يف‬،‫الوثائ��ق االأط��ول‬ sentences=tokenize_doc(doc)# split the document into tokenized sentences.
‫الن�سي‬
ّ ‫عدد امل ُ�ستنَدات يف االأ�سل‬ ‫ مما ي�س��اعد على اإثبات حقيقة اأن بع�س الكلمات هي‬،‫كث ٍر من املُ�س��تنَدات‬
‫تكرار امل ُ�ستنَد العك�سي‬
‫عدد امل ُ�ستنَدات التي حتتوي على امل�سطلح‬ tokens=[] # list of all the words and phrases found in the doc
.‫اأكر �سيوعً ا من غرها‬ for sentence in sentences: # for each sentence
‫عدد مرات هور امل�سطلح يف امل ُ�ستنَد‬
‫تكرار امل�سطلح‬ # use the phrase model to get tokens and append them to the list.
‫عدد الكلمات يف امل ُ�ستنَد‬
‫تكرار امل�سطلح تكرار امل ُ�ستنَد العك�سي القيمة‬ tokens+=phrase_model[sentence]
ec ori er ‫اأداة‬ return ' '.join(tokens) # join all the tokens together to create a new annotated document.

‫تك��رار امل ُ�س��تنَد‬-‫) اأداة تدع��م ه��ذا الن��وع م��ن الربجم��ة االجتاهي��ة لتك��رار امل�سطلح‬Sklearn( ‫توف��ر مكتب��ة �س��كلرن‬ ‫ لتف�س��ر كلٍ م��ن تقييم��ات التدري��ب واالختب��ار م��ن‬annotate_phrases)( ‫ي�س��تخدم املقط��ع الربجم��ي الت��ايل دال��ة‬
.‫ لتمثيل عبارة با�ستخدام املتَّجهات‬TfidfVectorizer ‫ مُيكن ا�ستخدام اأداة‬.)TF-IDF( ‫العك�سي‬ .IMDb ‫جمموعة بيانات‬
from sklearn.feature_extraction.text import TfidfVectorizer # annotate all the test and train reviews.
# Train a TF-IDF model with the IMDb training dataset X_train_text_annotated=[annotate_phrases(doc,imdb_phrase_model) for doc in X_
vectorizer_tf = TfidfVectorizer(min_df=10) train_text]
vectorizer_tf.fit(X_train_text_annotated) X_test_text_annotated=[annotate_phrases(text,imdb_phrase_model)for text in X_
X_train_tf = vectorizer_tf.transform(X_train_text_annotated) test_text]

149 148
‫ يَ�س��تخدم املقط��ع الربجم��ي الت��ايل مُف�سِّ ��ر‬.‫يتنب�اأ خ��ط االأنابي��ب اجلدي��د ب�س��كل �سحي��ح بالقيم��ة االإيجابي��ة له��ذا التقيي��م‬ ‫مُيك��ن االآن اإدخ��ال اأداة التمثي��ل باملتَّجَ ه��ات يف مُ�س َّن��ف باي��ز ال�س��اذج لبن��اء خ��ط اأنابيب منوذج تن ُّبوؤ جدي��د وتطبيقه على‬
:‫) لتف�سر املنطق وراء هذا التنبوؤ‬LIME( ‫النموذج املحايد املحلي القابل للتف�سر وال�سرح‬ :IMDb ‫بيانات اختبار‬

# create an explainer. # train a new Naive Bayes Classifier on the newly vectorized data.
explainer_tf = LimeTextExplainer(class_names=class_names) model_tf =MultinomialNB()
model_tf.fit(X_train_v2, Y_train)
# explain the prediction of the second pipeline for this example.
exp = explainer_tf.explain_instance(mistake_example_annotated, prediction_ # create a new prediction pipeline.
pipeline_tf.predict_proba, num_features=10) prediction_pipeline_tf = make_pipeline(vectorizer_tf, model_tf)

# visualize the results. # get predictions using the new pipeline.


fig = exp.as_pyplot_figure() predictions_tf = prediction_pipeline_tf.predict(X_test_text_annotated)

# print the achieved accuracy.


accuracy_score(Y_test, predictions_tf)

0.8858

ُ ‫ وه��و‬،88.58% ‫يحق��ق خ��ط االأنابي��ب اجلدي��د دق��ة ت�س��ل اإىل‬


‫حُت�س��ن كب��ر باملقارن��ة م��ع الدقة ال�س��ابقة الت��ي و�سلت اإىل‬
َّ ‫ مُيك��ن االآن ا�س��تخدام النم��وذج امل‬.84.68%
‫ُح�س��ن الإع��ادة النظ��ر يف مث��ال االختب��ار ال��ذي مت ت�سنيف��ه ب�س��كل خاط��ئ‬
:‫بوا�سطة النموذج االأول‬

# get the review example that confused the previous algorithm


mistake_example_annotated=X_test_text_annotated[4600]

print('\nReview:',mistake_example_annotated)

# get the correct labels of this example.


print('\nCorrect Label:', class_names[Y_test[4600]])

# get the prediction probabilities for this example.


‫ تكرار املُ�ستنَد العك�سي وم�سنّف بايز ال�ساذج‬-‫ تاأثر الكلمة يف مزيج تكرار امل�سطلح‬:3.14 ‫�سكل‬ print('\nPrediction Probabilities for neg, pos:',prediction_pipeline_
tf.predict_proba([mistake_example_annotated]))

‫ فه��و ُيح��دد ب�س��كل �سحي��ح امل�س��اعر االإيجابي��ة للعبارات‬.‫توؤك��د النتائ��ج اأن خ��ط االأنابي��ب اجلدي��د يتب��ع منط ًق��ا اأك��ر ذكا ًء‬ Review: i_personally thought the movie was_pretty good very_good acting by tadanobu_
‫ وال‬،)‫ (جي��د ج��دً ا‬very good‫ و‬،)‫ (متثيل_رائ��ع‬superb_acting ‫ و‬،)‫ (لقط��ة _ جميل��ة‬beautifully_shot :‫مث��ل‬ asano of ichi_the_killer fame i really can_t say much about the story but there_were
parts that confused me a little_too much and overall i_thought the movie was just too
.‫مُيكن ت�سليله با�ستخدام الكلمات التي جعلت خط االأنابيب االأول يتنباأ بنتائج خاطئة‬ lengthy other_than that however the movie contained superb_acting great fighting and
‫ باإ�س��تبدال م�سنف بايز الب�س��يط بط��رق اأكر تطورًا مع‬،‫مُيك��ن حُت�س��ني اأداء خ��ط االأنابي��ب لنم��وذج التن ُّبوؤ بطرق متعددة‬ a lot of the locations were beautifully_shot great effects and a lot of sword play
another solid effort by tadanobu_asano in my_opinion well i really can_t say anymore
‫ وث َّم��ة خي��ار اآخر يتلخ�س يف ا�س��تخدام تقنيات الربجمة االجتاهي��ة البديلة التي ال‬.‫�سب��ط متغراته��ا لزي��ادة احتماالته��ا‬ about the movie but if_you re only outlook on asian_cinema is crouching_tiger hidden_
.‫ و�س ُي�ستعر�س ذلك يف الدر�س التايل‬،‫ مثل ت�سمني الكلمات و الن�سو�س‬،‫ت�ستند اإىل تكرار الرمز‬ dragon or house of flying_daggers i_would suggest_you trying to rent_it but if_you re
a die_hard asian_cinema fan i_would say this has to be in your_collection very_good
japanese film

Correct Label: pos

Prediction Probabilities for neg, pos: [[0.32116538 0.67883462]]

151 150
‫‪ 4‬لدي��ك ‪ X_train_text‬وه��ي عب��ارة ع��ن م�سفوف��ة ‪ numPy‬تت�سم��ن م�س��تندًا واح �دًا يف كل �س��ف‪ .‬لدي��ك كذل��ك‬
‫مترينات‬
‫م�سفوف��ة ثاني��ة ‪ Y_train‬تت�سم��ن قي��م امل ُ�س��تنَدات يف ‪ .X_train_text‬اأكم��ل املقط��ع الربجم��ي الت��ا بحي��ث مُيك��ن‬
‫ا�س��تخدام تك��رار امل�سطل��ح‪ -‬تك��رار امل ُ�س��تنَد العك�س��ي (‪ )TF-IDF‬لتمثي��ل البيان��ات باملتَّجَ ه��ات‪ ،‬وتدري��ب ��وذج ت�سني��ف‬ ‫‪1‬‬
‫‪ MultinomialNB‬عل��ى االإ�س��دار امل ُ َم َّث��ل باملتَّجَ ه��ات‪ ،‬ث��م مي��ع اأداة التمثي��ل باملتَّجَ ه��ات و ��وذج الت�سني��ف يف خ��ط‬
‫اأنابيب تنبوؤ واحد‪:‬‬ ‫خاطئة‬ ‫�سحيحة‬ ‫حدِّد اجلملة ال�سحيحة واجلملة اخلاطئة فيما يلي‪:‬‬
‫‪ .1‬يف التعلُّم املوجَّ ه‪ ،‬تُ�ستخدم جمموعات البيانات املُعنوَنة لتدريب النموذج‪.‬‬
‫‪from‬‬ ‫‪.naive_bayes import MultinomialNB‬‬
‫‪from sklearn.pipeline import make_pipeline‬‬
‫‪ .2‬الربجمة االجتاهية هي تقنية لتحويل البيانات من تن�سيق متَّجَ ه رقمي اإىل بيانات اأولية‪.‬‬
‫‪from sklearn.feature_extraction.text import‬‬ ‫‪ .3‬تتطلب امل�سفوفة املتباعدة ذاكرة اأقل بكثر من امل�سفوفة الكثيفة‪.‬‬
‫= ‪vectorizer‬‬ ‫)‪(min_df=10‬‬
‫‪ .4‬تُ�ستخدم خوارزمية مُ�سنَّف بايز ال�ساذج لبناء خط اأنابيب التنبوؤ‪.‬‬
‫(‪vectorizer.fit‬‬ ‫‪) # fits the vectorizer on the training data‬‬
‫‪ .5‬تكرار الكلمة يف املُ�ستنَد يُع ُّد التمثيل الدقيق الوحيد الأهمية هذه الكلمة‪.‬‬
‫‪X_train = vectorizer.‬‬ ‫‪(X_train_text) # uses the fitted vectorizer to vectorize the data‬‬
‫‪model_MNB=MultinomialNB() # a Naive Bayes Classifier‬‬

‫‪model_MNB.fit(X_train,‬‬ ‫‪) # fits the classifier on the vectorized training data‬‬ ‫‪ 2‬ا�سرح ملاذا تتطلب امل�سفوفة الكثيفة م�ساحة من الذاكرة اأكرب من امل�سفوفة املتباعدة‪.‬‬
‫(‪prediction_pipeline = make_pipeline‬‬ ‫‪,‬‬ ‫)‬

‫‪ 5‬اأكم��ل املقط��ع الربجم��ي الت��ا بحي��ث مُيكن��ه ِبن��اء مُف�سِّ ��ر ن�سو���س النم��وذج املحاي��د املحل��ي القاب��ل للتف�س��ر وال�س��رح‬
‫(‪ )LIME‬خلط اأنابيب التنب ؤو الذي قمت ببنائه يف التدريب ال�سابق‪ ،‬وا�ستخدِ م امل ُف�سِّ ر لتف�سر التنب ؤو على مثال ٍ‬
‫لن�س‬
‫اآخر‪.‬‬

‫‪from‬‬ ‫‪import LimeTextExplainer‬‬ ‫‪ 3‬ح ِّل��ل كي��ف يُ�س��تخدَم العام��الن الرّيا�س ّي��ان يف تك��رار امل�سطل��ح‪ -‬تك��رار امل ُ�س��تنَد العك�س��ي (‪ )TF-IDF‬لتحدي��د اأهمي��ة‬
‫"‪text_example="I really enjoyed this movie, the actors were excellent‬‬ ‫الكلمة يف الن�س‪.‬‬
‫‪class_names=['neg','pos'] # creates a local explainer for explaining individual predictions‬‬

‫= ‪explainer‬‬ ‫‪(class_names=class_names) # explains the prediction for this example‬‬

‫‪exp = explainer.‬‬ ‫‪(text_example.lower(),prediction_pipeline.‬‬ ‫‪,‬‬

‫‪=10) # focuses the explainer on the 10 most influential features‬‬

‫‪print(exp.‬‬ ‫‪) # prints the words with the highest influence on the prediction‬‬

‫‪153‬‬ ‫‪152‬‬
‫املوجه هي اأنه مُيكن ا�س��تخدامه‬‫واإحدى املزايا الرئي�س��ة ال�س��تخدام التعلُّم غر َّ‬
‫العنقود (‪:)Cluster‬‬ ‫للك�س��ف ع��ن االأمن��اط والعالق��ات الت��ي ق��د ال تب��دو وا�سح��ة على الف��ور للمراقب‬ ‫الدر�ض الثاين‬
‫العنق��ود ه��و جمموع��ة من االأ�س��ياء‬
‫املت�س��ابهة‪ .‬ويف تعلُّ��م االآل��ة‪ ،‬ي�س��ر‬
‫الب�س��ري‪ .‬وق��د يك��ون ه��ذا مفي��دً ا ب�س��كل خا���س يف فه��م جمموع��ات البيان��ات‬
‫الكب��رة املكون��ة م��ن الن�سو���س غ��ر املُرتاكبة‪ ،‬حيث يكون التحلي��ل اليدوي غر‬
‫املوجه‬
‫التع ُّلم غري َّ‬
‫التجمي��ع ( ‪ )Clustering‬اإىل‬ ‫عملي‪ .‬يف هذه الوحدة‪� ،‬ستَ�ستخدم جمموعة بيانات متوافرة للعا ّمة من املقاالت‬
‫عملي��ة جتمي��ع البيا ن��ات غ��ر‬ ‫االإخبارية من هيئة االإذاعة الربيطانية (‪ )BBC‬بوا�سطة جرين وكوننجهام‪،‬‬
‫املُعنوَنة يف عناقيد متجان�سة‪.‬‬ ‫(‪)Greene & Cunningham،2006‬لتو�سي��ح بع���س التقني��ات الرئي�س��ة‬ ‫ا�ستخدام التعلُّم غري املوجَّ ه لفهم الن�سو�ض‬
‫املوجه‪ُ .‬ي�ستخدم املقطع الربجمي التايل لتحميل جمموعة البيانات‪،‬‬ ‫للتعلُّم غر َّ‬
‫املُنظّ مة يف خم�س��ة جملدات اإخبارية خمتلفة متثل مقاالت من اأق�س��ام اإخبارية‬ ‫‪Unsupervised Learning to Understand Text‬‬
‫خمتلف��ة‪ ،‬ه��ي‪ :‬االأعم��ال التجاري��ة‪ ،‬وال�سيا�س��ة‪ ،‬والريا�س��ة‪ ،‬والتقني��ة‪ ،‬والرتفي��ه‪.‬‬ ‫قدم له جمموع��ة من االأمثل��ة التي يتوىل‬ ‫املوج��ه ه��و ن��وع م��ن تعلُّ��م االآل��ة‪ ،‬ي�س��تخدم في��ه النم��وذج بيان��ات غ��ر ُمعَنونة‪ ،‬حي� ُ�ث ُي ِّ‬
‫التعلُّ��م غ��ر َّ‬
‫ُ�ستخدمة يف هذه‬
‫لن ت�ستخدم القيم اخلم�سة يف توجيه اأيٍ من اخلوارزميات امل َ‬ ‫املوجه يف حُتديد‬‫البحث فيها عن االأمناط والعالقات بني البيانات من تلقاء نف�سه‪ .‬ويف �سياق فهم الن�س‪ ،‬مُيكن ا�ستخدام التعلُّم غر َّ‬
‫�دال م��ن ذل��ك‪� ،‬س ُت�س��تخدم فق��ط الأغرا���س الت�سوي��ر وامل�سادق��ة‪.‬‬ ‫الوح��دة‪ .‬وب� ً‬ ‫الهي��اكل واالأمن��اط الكامن��ة �سم��ن جمموع��ة بيانات املُ�س��تنَدات الن�سية‪ .‬هناك العديد من التقنيات املختلفة التي مُيكن ا�س��تخدامها يف‬
‫يت�سم��ن كل جمل��د اإخب��اري مئ��ات امللف��ات الن�سي��ة‪ ،‬وكل مل��ف يت�سم��ن حُمت��وى‬ ‫املوج��ه للبيان��ات الن�سي��ة‪ ،‬مب��ا يف ذل��ك خوارزمي��ات التجمي��ع (‪ ،)Clustering Algorithms‬وتقني��ات تقلي���س االأبع��اد‬ ‫التعلُّ��م غ��ر َّ‬
‫مقالة واحدة حُمددة‪ .‬وقد ُحملّت جمموعة البيانات بالفعل اإىل مفكرة جوبيرت‬ ‫(‪ ،)Dimensionality Reduction Techniques‬والنماذج التوليدية (‪ُ .)Generative Models‬ت�س��تخدم خوارزميات التجميع‬
‫(‪ )Jupyter Notebook‬و�س��تقوم لبنة التعليمات الربجمية بفتح وا�س��تخراج‬ ‫ل�سم املُ�ستنَدات املت�سابهة معًا‪ ،‬بينما تُ�ستخدم تقنيات تقلي�س االأبعاد لتقلي�س اأبعاد‬
‫كل املُ�ستنَدات والقيم املطلوبة يف تركيبتني لبيانات القوائم‪ ،‬على التوايل‪.‬‬ ‫التعلُّم غري املوجَّ ه‬ ‫البيانات وحُتديد اخل�سائ�س الهامة‪ .‬ومن ناحية اأخرى‪ ،‬تُ�ستخدم النماذج التوليدية‬
‫�سكل ‪ :3.16‬متثيل عنقود‬
‫(‪:)Unsupervised Learning‬‬ ‫لتعلُّم التوزيع االأ�سا�سي للبيانات وتوليد ن�س جديد م�سابه ملجموعة البيانات االأ�سلية‪.‬‬
‫املوج��ه‪ُ ،‬ي��زوَّد النم��وذج‬
‫َّ‬ ‫�ر‬ ‫�‬ ‫غ‬ ‫�م‬‫�‬‫ُّ‬ ‫ل‬ ‫التع‬ ‫يف‬
‫‪BBC open dataset‬‬ ‫بكمي��ات كب��رة من البيانات غر املُعنوَنة‬ ‫‪Clustering Algorithms‬‬
‫‪https: www.kaggle.com datasets shivamkushwaha bbc-full-text-document-classification‬‬ ‫ويتوج��ب علي��ه البح��ث ع��ن االأمن��اط يف‬ ‫مُيكن خلوارزميات التجميع جتميع العمالء املت�سابهني ا�ستنادًا اإىل ال�سلوكيات‬
‫‪D. Greene and P. Cunningham. "Practical Solutions to the Problem of Diagonal Dominance in Kernel Document Clustering",Proc.‬‬
‫‪ICML 2006. All rights, including copyright, in the content of the original articles are owned by the BBC.‬‬ ‫البيا ن��ات غ��ر ا ملُرتاكب��ة م��ن خ��الل‬ ‫�تهدف وزي��ادة‬
‫اأو الدمُيوغرافي��ا‪ ،‬اأو �س��جل امل�س��رتيات؛ الأغرا���س الت�س��ويق املُ�س� َ‬
‫املالحظة والتجميع‪.‬‬ ‫معدالت االحتفاظ بالعمالء‪.‬‬
‫‪# used to list all the files and subfolders in a given folder‬‬ ‫تقنيات تقلي�ض األأبعاد‬
‫‪from os import listdir‬‬ ‫‪i ension i‬‬ ‫‪e uction ec ni ues‬‬
‫‪# used for generating random number‬‬
‫تقلي�ض األأبعاد‬
‫تُ�س��تخدم تقني��ات تقلي���س االأبع��اد يف �سغ��ط ال�س��ورة لتقلي��ل ع��دد وح��دات‬
‫‪import random shuffling lists‬‬ ‫(‪:)Dimensionality e uction‬‬ ‫البيك�س��ل فيه��ا مم��ا ي�س��اعد عل��ى تقلي���س حج��م البيانات الالزم��ة لتمثيلها مع‬
‫تقني��ة تقلي�س االأبع��اد هي اإحدى تقنيات‬ ‫احلفاظ على خ�سائ�سها الرئي�سة‪.‬‬
‫‪bbc_docs=[] # holds the text of the articles‬‬
‫‪bbc_labels=[] # holds the news section for each article‬‬
‫تعلُّ��م االآل��ة وحُتلي��ل البيان��ات املُ�س��تخدَ مة‬
‫‪ener ti e‬‬ ‫النماذج التوليدية ‪o e s‬‬
‫لتقلي���س ع��دد اخل�سائ���س (االأبع��اد)‬
‫‪for folder in listdir('bbc'): # for each news-section folder‬‬ ‫يف جمموع��ة البيان��ات م��ع االحتف��اظ‬ ‫تُ�س��تخدم النماذج التوليدية يف تطبيقات الك�س��ف عن االختالف؛ حيث ُحُتدِّ د‬
‫‪for file in listdir('bbc/'+folder): # for each text file in this folder‬‬ ‫باأكرب قدر ممكن من املعلومات‪.‬‬ ‫االختالفات يف البيانات بتعلُّم االأمناط الطبيعية للبيانات با�ستخدام النموذج‬
‫التوليدي‪.‬‬
‫‪# open the text file, use encoding='utf8' because articles may include non-ascii characters‬‬
‫‪with open('bbc/'+folder+'/'+file,encoding='utf8',errors='ignore') as f:‬‬ ‫مُدخَ الت البيانات‬
‫‪bbc_docs.append(f.read()) # read the text of the article and append to the docs list‬‬ ‫املعاجلة‬
‫َ‬ ‫اخلوارزمية‬ ‫التف�سر‬ ‫االأولية‬
‫‪# use the name of the folder (news section) as a label for this doc‬‬
‫)‪bbc_labels.append(folder‬‬
‫‪# shuffle the docs and labels lists in parallel‬‬ ‫امل ُخرَج املتوقع‬
‫‪merged = list(zip(bbc_docs, bbc_labels)) # link the two lists‬‬
‫)‪random.shuffle(merged) # shuffle them in parallel (with the same random order‬‬
‫‪bbc_docs, bbc_labels = zip(*merged) # separate them again into individual lists.‬‬
‫�سكل ‪ :3.15‬متثيل التعلُّم غر املوجَّ ه‬
‫‪155‬‬ ‫‪154‬‬
‫يف التعلُّ��م غ��ر املوجَّ ��ه‪ ،‬ي�س��ر ع��دد العناقي��د اإىل ع��دد املجموع��ات اأو‬ ‫ميع املُ�ستنَدات ‪Document Clustering‬‬
‫الت ميع الهرمي‬ ‫الت�سنيف��ات الت��ي تنق�س��م اإليه��ا البيان��ات بوا�س��طة اخلوارزمي��ة‪ .‬و ُيع� ُّد‬ ‫ميع املُ�ستنَدات‬
‫(‪:)Hierarchical Clustering‬‬ ‫حُتدي��د ع��دد العناقي��د ال�سحي��ح اأمرًا مه ًم��ا الأنه يوؤثر عل��ى دقة النتائج‬ ‫(‪:)Document Clustering‬‬ ‫االآن بع��د حُتمي��ل جمموع��ة البيان��ات ف�اإن اخلط��وة التالي��ة ه��ي جترب��ة ع��دة ط��رق غ��ر‬
‫التجمي��ع الهرم��ي ه��و خوارزمي��ة التجمي��ع املُ�س��تخدَ مة‬
‫وقابليتها للتف�سر‪ .‬اإذا كان عدد العناقيد كبرًا للغاية‪ ،‬فاإنّ املجموعات‬ ‫املوجه ��ة االأك ��ر �س ��هرة يف ه ��ذا‬
‫موجه ��ة‪ ،‬ومنه ��ا‪ :‬التجمي ��ع ال ��ذي ُيع � ّد الطريق ��ة غ ��ر َّ‬ ‫َّ‬
‫جتمي��ع املُ�س��تنَدات هو طريقة تُ�س��تخدم‬ ‫النط ��اق‪ .‬وبال ّنظ ��ر اإىل جمموع ��ة م ��ن املُ�س ��تنَدات غ ��ر املُعن َون ��ة‪� ،‬س ��يكون اله ��دف ه ��و‬
‫لتجمي��ع البيان��ات يف عناقي��د بن��ا ًء عل��ى الت�س��ابه‪ .‬يف‬
‫�س��تكون حُم� ّدد ًة ج��دً ا وب��دون معن��ى‪ .‬يف ح��ني اأنه اإذا كان ع��دد العناقيد‬ ‫لتجمي��ع املُ�س��تنَدات الن�س ّي��ة يف عناقيد‬
‫التجميع الهرمي‪ ،‬تُنظّ م نقاط البيانات يف تركيب ي�سبه‬ ‫منخف� ًس��ا للغاي��ة‪ ،‬ف �اإنّ املجموع��ات �س��تكون ممت��دة عل��ى نط��اق وا�س��ع‬ ‫جتميع الوثائق املت�س��ابهة معًا‪ ،‬ويف الوقت نف�س��ه الف�سل بني الوثائق غر املت�س��ابهة‪.‬‬
‫بنا ًء على ت�سابه حُمتواها‪.‬‬
‫جدً ا‪ ،‬ولن ت�ستنبط الرتكيب االأ�سا�سي للبيانات‪ .‬من ال�سروري حُتقيق‬
‫ال�س��جرة‪ ،‬حي��ث تك��ون كل ُعق��دة مبثاب��ة عنق��ود‪ ،‬وتك��ون‬
‫العُقدة االأم هي نقطة التقاء ال ُعقد املتفرعة منها‪.‬‬ ‫كاف من العناقيد ال�ستنباط اأمناط ذات معنى‪،‬‬ ‫عدد ٍ‬ ‫التوازن بني توفر ٍ‬ ‫جدول  ‪ :3.2‬العوامل التي ُ دد جودة النتائج‬
‫واأال تك��ون كث��رة يف الوق��ت نف�س��ه بالق��در ال��ذي يجع��ل النتائ��ج ُمعق��دة‬
‫للغاية وغر مفهومة‪.‬‬ ‫طريقة متثيل البيانات باملتَّجَ هات‪ .‬على الرغم من اأن تقنية تكرار امل�سطلح‪ -‬تكرار امل ُ�ستنَد العك�سي (‪ )TF-IDF‬اأثبتت‬ ‫‪1‬‬
‫كفاءتها وفعاليتها يف هذا املجال‪ ،‬اإال اأنّك �ستتعرف يف هذه الوحدة على مزيد من البدائل االأكر تطورًا وتعقيدً ا‪.‬‬
‫ُي�ستخدَ م املقطع الربجمي التايل ال�ستراد مكتبات حُمددة تُ�ستخدَ م يف التجميع الهرمي من بدايته حتى نهايته‪:‬‬
‫التعري��ف الدقي��ق للت�س��ابه ب��ني م�س��تند واآخ��ر‪ .‬بالن�س��بة للبيان��ات الن�س ّي��ة املُمثل��ة باملتَّجَ ه��ات‪ ،‬تك��ون مقايي���س امل�س��افة‬ ‫‪2‬‬
‫‪# used for tfi-df vectorization, as seen in the previous unit‬‬ ‫االإقليدية وجيب التمام هما االأكر �سيوعً ا‪� .‬س ُي�ستخدم االأول يف االأمثلة امل�سروحة يف هذه الوحدة‪.‬‬
‫‪from sklearn.feature_extraction.text import TfidfVectorizer‬‬
‫‪from sklearn.cluster import AgglomerativeClustering # used for agglomerative clustering‬‬
‫ع��دد العناقي��د امل ُخت��ارة‪ .‬يوف��ر التجمي��ع التكتل��ي (‪ )Agglomerative Clustering - AC‬طريق��ة وا�سح��ة لتحدي��د‬ ‫‪3‬‬
‫العدد املنا�سب من العناقيد �سمن جمموعة حُمددة من البيانات‪ ،‬وهو التحدي الرئي�س الذي يواجه مهام التجميع‪.‬‬
‫‪# used to visualize and support hierarchical clustering tasks‬‬
‫‪import scipy.cluster.hierarchy as hierarchy‬‬ ‫ديد عدد العناقيد‬
‫‪# set the color palette to be used by the 'hierarchy' tool.‬‬ ‫‪Se ecting the Number of Clusters‬‬
‫‪hierarchy.set_link_color_palette‬‬ ‫امل�سافة األإقليدية‬ ‫حُتدي��د الع��دد ال�سحي��ح للعناقي��د ه��و خط��وة �سروري��ة �سم��ن مه��ام التجمي��ع‪.‬‬
‫)]'‪(['blue','green','red','yellow','brown','purple','orange','pink','black‬‬ ‫(‪:)Euclidean Distance‬‬ ‫لالأ�س��ف‪ ،‬تعتم��د الغالبي��ة العظم��ى م��ن خوارزمي��ات التجمي��ع على املُ�س��تخدِ م يف‬
‫‪import matplotlib.pyplot as plt # used for general visualizations‬‬
‫امل�س��افة االإقليدي��ة ه��ي م�س��افة اخلط امل�س��تقيم‬ ‫حُتدي��د ع��دد العناقي��د ال�سحيح��ة �سم��ن املُدخَ ��الت‪ .‬رمب��ا يك��ون للع��دد املح��دد‬
‫ب��ني نقطت��ني يف ف�س��اء متعدد االأبعاد‪ُ .‬وحُت�س��ب‬ ‫تاأث�رًا كب�رًا عل��ى ج��ودة النتائ��ج وقابليته��ا للتف�س��ر‪ ،‬ولك��ن هن��اك العدي��د م��ن‬
‫باجل��ذر الرتبيع��ي ملجم��وع مربع��ات الفروق��ات‬ ‫املقايي�س اأو املوؤ�سرات التي مُيكن ا�ستخدامها لتحديد عدد العناقيد‪.‬‬
‫الربجمة األ اهية للن�سو�ض ‪Text ec ori tion‬‬ ‫بني االأبعاد املناظرة للنقاط‪ُ .‬ت�س��تخدم امل�سافة‬
‫يل باملتَّجَ هات يف تن�سيق رقميّ ‪ ،‬كما ّمت عر�سه يف الوحدة ال�سابقة‪،‬‬
‫الن�س االأو ّ‬
‫املوجه متثيل ّ‬
‫تتطلب العديد من طرق التعلُّم غر َّ‬ ‫• اإحدى الطرائق ال�سائعة هي ا�ستخدام مقيا�س الرتا�س (‪.)Compactness‬‬
‫االإقليدي��ة يف التجمي��ع لقيا���س الت�س��ابه ب��ني‬ ‫مُيكن القيام بذلك عن طريق ح�ساب جمموع امل�سافات بني النقاط �سمن كل‬
‫وي�ستخدم املقطع الربجمي التايل اأداة ‪ TfidfVectorizer‬التي اُ�ستخدمت يف الدر�س ال�سابق لهذا الغر�س‪:‬‬ ‫نقطتي بيانات‪.‬‬ ‫عنقود‪ ،‬وحُتديد عدد العناقيد الذي يقلل من هذا املجموع اإىل احلد االأدنى‪.‬‬
‫• هن��اك طريق��ة اأخ��رى تتلخ���س يف مقيا���س الف�س��ل (‪ )Separation‬ب��ني‬
‫‪vectorizer = TfidfVectorizer(min_df=10) # apply tf-idf vectorization, ignore words that‬‬ ‫م�سافة جيب التمام‬ ‫العناقيد‪ ،‬مثل متو�سط امل�سافة بني النقاط يف العناقيد املختلفة‪،‬وبناء عليه‪،‬‬
‫‪appear in more than 10 docs.‬‬ ‫(‪:)Cosine Distance‬‬ ‫يتم حُتديد عدد العناقيد الذي يرفع من هذا املتو�سط‪.‬‬
‫‪text_tfidf=vectorizer.fit_transform(bbc_docs) # fit and transform in one line‬‬ ‫ت�س��تخدم م�س��افة جي��ب التمام لقيا���س الت�س��ابه‬ ‫وب�س��كل عمل��ي‪ ،‬غال ًب��ا م��ا تتعار���س املنهجي��ات املذك��ورة باالأعل��ى م��ع بع�سه��ا من‬
‫يف جي��ب التم��ام ب��ني نقطت��ي البيان��ات‪ .‬فه��ي‬ ‫حي��ث التو�سي��ة باأرق��ام خمتلف��ة‪ ،‬ومُي ّث��ل ه��ذا حُت ّد ًي��ا م�س��رتكًا عن��د التعام��ل م��ع‬
‫‪text_tfidf‬‬ ‫حُت�سب جيب متام الزاوية بني م َّت َجهني مُيثالن‬ ‫البيانات الن�سية ب�سكلٍ خا�س‪ ،‬فعاد ًة ما ي�س ُعب متييز تركيبها‪.‬‬
‫�تخدم ع��اد ًة يف جتمي��ع‬
‫نق��اط البيان��ات‪ ،‬وتُ�س� َ‬
‫'>'‪<2225x5867 sparse matrix of type '<class 'numpy.float64‬‬ ‫البيان��ات الن�س ّي��ة‪ .‬وتق��ع قيم��ة جيب التمام بني‬
‫>‪with 392379 stored elements in Compressed Sparse Row format‬‬ ‫‪ 1-‬و ‪1‬؛ حي��ث ت�س��ر القيم��ة ‪ 1-‬اإىل االجت��اه‬
‫العك�س��ي‪ ،‬بينم��ا ت�س��ر القيم��ة ‪ 1‬اإىل االجت��اه‬
‫االآن حُتوَّلت بيانات الن�س اإىل تن�سيق رقمي متباعد كما اُ�ستخدمت يف الدر�س ال�سابق‪.‬‬ ‫نف�سه‪.‬‬
‫�سكل ‪ :3.17‬اآلة ح�ساب امل�سافات بني النقاط‬
‫‪157‬‬ ‫‪156‬‬
‫اإح��دى اخل�سائ���س الرئي�س��ة لتقني��ة ت�سم��ني املج��اور الع�س��وائي امل��وزَّع عل��ى �س��كل ‪ )T-SNE( T‬ه��ي حُماول��ة احلف��اظ عل��ى‬ ‫يَ�س��تخدِ م املقط��ع الربجم��ي الت��ايل اأداة ‪ TSENVisualizer‬م��ن مكتب��ة ‪ yellowbrick‬الإ�س��قاط وت�سوي��ر الن�سو���س‬
‫الرتكيب املحلي للبيانات قدر االإمكان‪ ،‬حتى تتقارب نقاط البيانات ال�سبيهة يف التمثيل منخف�س االأبعاد‪ ،‬ويتحقق ذلك بتقلي�س‬ ‫املُمثلة باملتَّجَ هات يف ف�ساء ثنائي االأبعاد‪:‬‬
‫التباعد بني التوزيعني املحتملني‪ :‬توزيع البيانات عالية االأبعاد‪ ،‬وتوزيع البيانات منخف�سة االأبعاد‪.‬‬
‫‪%%capture‬‬
‫م�ستقال‬
‫ً‬ ‫جمموعة بيانات هيئة االإذاعة الربيطانية املُمثلة باملتَّجَ هات تُ�سنَّف بالتاأكيد كبيانات عالية االأبعاد‪ ،‬الأنها تت�سمن بُعدً ا‬ ‫‪!pip install yellowbrick‬‬
‫اأي عمودًا (‪ )Column‬لكل كلمة فريدة تظهر يف البيانات‪ُ .‬يح�سب العدد االإجمايل لالأبعاد كما يلي‪:‬‬ ‫‪from yellowbrick.text import TSNEVisualizer‬‬

‫‪print('Number of unique words in the BBC documents vectors:',‬‬ ‫تقلي�ض األأبعاد ‪Dimensionality Re uction‬‬
‫)))(‪len(vectorizer.get_feature_names_out‬‬ ‫اور الع�سوائي املوزع على �سكل ‪T‬‬ ‫ت�سمن امل‬ ‫يكون تقلي�س االأبعاد مفيدً ا يف العديد من التطبيقات مثل‪:‬‬
‫‪t-Distributed S oc stic Neighbor‬‬
‫‪Number of unique words in the BBC documents vectors: 5867‬‬ ‫(‪Embedding )T-SNE‬‬
‫• ت�سوي��ر البيان��ات عالي��ة االأبع��اد‪ :‬م��ن ال�سع��ب ت�سوي��ر البيانات‬
‫يف ف�س��اء ع��ايل االأبع��اد‪ ،‬ولذل��ك تُق ّل���س االأبع��اد لي�س��هل ت�سوي��ر‬
‫خوارزمي��ة ت�سم��ني املج��اور الع�س��وائي امل��وزَّع عل��ى‬ ‫البيانات وفهمها يف هذه احلالة‪.‬‬
‫يُ�س��تخدَ م املقط��ع الربجم��ي الت��ايل الإ�س��قاط ‪ُ 5,867‬بع��دً ا يف حُموري��ن فق��ط وهم��ا حُم��وري ‪ X‬و ‪ Y‬يف الر�س��م البي��اين‪.‬‬
‫ُي�ستخدَ م املقطع الربجمي التايل لت�سميم ُخمطَّ ط االنت�سار حيث مُيثل كل لون اأحداالأق�سام االإخبارية اخلم�سة‪.‬‬ ‫�س��كل ‪ )T-SNE( T‬ه��ي خوارزمي��ة تعلُّ��م االآل��ة غ��ر‬ ‫• تب�سيط النموذج‪ :‬النموذج ذو االأبعاد االأقل يكون اأب�سط واأ�سهل‬
‫املوجه املُ�ستخدَ مة لتقلي�س االأبعاد‪.‬‬
‫َّ‬ ‫فهمًا‪ ،‬وي�ستغرق وقتًا اأقل يف عملية التدريب‪.‬‬
‫)]'‪tsne = TSNEVisualizer(colors=['blue','green','red','yellow','brown‬‬ ‫• حت�س��ني اأداء النم��وذج‪ُ :‬ي�س��اعد تقلي���س االأبع��اد يف التخل���س من‬
‫)‪tsne.fit(text_tfidf,bbc_labels‬‬ ‫ح�سن اأداء النموذج‪.‬‬ ‫الت�سوي�س وتكرار البيانات‪ ،‬مما ُي ّ‬
‫;)(‪tsne.show‬‬

‫جدول  ‪ :3.3‬تقنيات تقلي�ض األأبعاد‬


‫مثال التطبيق العملي‬ ‫الو�سف‬ ‫التقنية‬
‫حُتت��وي جمموع��ات البيان��ات الطبي��ة عل��ى مئ��ات م��ن‬ ‫حتديد اخل�سائ�س حُتد ي��د اخل�سائ���س يت�سم��ن حُتد ي��د‬
‫اأعمدة البيانات ذات ال�سلة بحالة املري�س‪ .‬مُيكن لعدد‬ ‫جممو ع��ة فرعي��ة م��ن اخل�سائ���س‬ ‫(‪Feature‬‬
‫قلي��ل م��ن ه��ذه اخل�سائ���س م�س��اعدة النم��وذج يف‬ ‫‪ )selection‬الرئي�سة‪.‬‬
‫الت�س��خي�س ال�س��ليم حلالة املري�س‪ .‬بينما تكون ال�س��مات‬
‫االأخرى غر مرتبطة بالت�س��خي�س وقد تُ�س��تت النموذج‪،‬‬
‫وحُتدي��د اخل�سائ�س يتجاهل كل اخل�سائ�س باإ�س��تثناء‬
‫االأكر متيزًا منها‪.‬‬
‫اإذا تو َّق��ع النم��وذج اإقام��ة املري���س يف امل�ست�س��فى‪ ،‬مُيك��ن‬ ‫حتويل اخل�سائ�س يت�سم��ن حُتو ي��ل اخل�سائ���س جتمي��ع‬
‫اإن�س��اء خ�سائ���س اإ�سافي��ة للنم��وذج با�س��تخدام‬ ‫اخل�سائ���س االأ�سلي��ة اأو حُتويله��ا الإن�س��اء‬ ‫(‪Feature‬‬
‫اخل�سائ�س احلالية ل�س��جالت احلالة الطبية للمري�س‪.‬‬ ‫‪ )transformation‬جممو ع��ة جد ي��دة م��ن اخل�سائ���س‪،‬‬
‫عل��ى �س��بيل املث��ال‪ ،‬ح�س��اب ع��دد الفحو�س��ات املخربي��ة‬ ‫وا�س��تبدال اخل�سائ���س الرئي�س��ة اإذا مل‬
‫املطلوب��ة عل��ى م��دار االأ�س��بوع املا�س��ي‪ ،‬اأو ع��دد الزي��ارات‬ ‫تكن هناك حاجة اإليها‪.‬‬
‫عل��ى م��دار ال�س��هر املا�س��ي‪ .‬وهن��اك مث��ال اآخ��ر‪ ،‬وه��و‪:‬‬
‫�سكل ‪ :3.18‬اإ�سقاط ت�سمني املجاور الع�سوائي املوزَّع على �سكل ‪)T-SNE( T‬‬
‫ح�ساب م�ساحة امل�ستطيل باإ�ستخدام ارتفاعه وعر�سه‪.‬‬
‫مُيك��ن له��ذه التقني��ات حُتوي��ل �س��ورة عالي��ة االأبع��اد اإىل‬ ‫تقني�ات التعلُّ�م املت�س�عِّب‪ ،‬مث�ل ت�سم�ني‬ ‫التعلُّم املت�سعِّب‬
‫�تخدم ه��ذا الت�س��ور قيم��ة ‪( ground-truth‬بيان��ات احلقيق��ة املعتم��دة) من الق�س��م االإخب��اري (‪)News Section‬‬ ‫يَ�س� ِ‬ ‫ف�س��اء منخف���س االأبع��اد م��ع احلف��اظ عل��ى اخل�سائ���س‬ ‫املج�اور الع�س�وائي ا مل�و زَّع عل�ى �س�كل‬ ‫(‪Manifold‬‬
‫يف كل م�س��تند للك�س��ف عن انت�س��ار كل قيمة يف اإ�س��قاط ف�ساء الربجمة االجتاهية ثنائي االأبعاد‪ِ .‬‬
‫يو�سح ال�س��كل اأنه على‬ ‫والرتكي��ب االأ�سا�س��يني له��ا‪ .‬ونظ�رًا الأن ه��ذا يقل���س م��ن‬ ‫‪ ) T-SNE ( T‬والتقر ي�ب وا الإ�س�قاط‬ ‫‪)learning‬‬
‫امل�س��احة املطلوب��ة‪ ،‬فاإن��ه مُيك��ن تخزي��ن واإر�س��ال ه��ذا‬ ‫املت�س�عِّب املنتظ�م (‪Uniform Manifold‬‬
‫الرغ��م م��ن ظه��ور بع���س ال�س��وائب يف فراغ��ات ُحُم� َّددة من ف�س��اء البيانات‪ ،‬اإال اأن االأق�س��ام االإخبارية اخلم�س��ة منف�سلة‬ ‫التمثي��ل واإع��ادة بن��اء ال�س��ورة االأ�سلي��ة م��ع خ�س��ارة اأق��ل‬ ‫‪Approximation and Projection‬‬
‫ُح�سنة للحد من هذه ال�سوائب‪.‬‬ ‫ب�سكل جيد‪ .‬و�سن�ستعر�س الحقًا الربجمة االجتاهية امل َّ‬ ‫قدر من املعلومات‪.‬‬ ‫‪ ) -UMAP‬هي تقنيات التعلُّم غر َّ‬
‫املوجه‬
‫الت�ي ته�دف اإىل احلف�اظ عل�ى تركي�ب‬
‫البيانات يف الف�ساء منخف�س االأبعاد‪.‬‬
‫‪159‬‬ ‫‪158‬‬
‫م�سافة وارد ‪Ward Distance‬‬ ‫ميع التكتلي (‪gg o er ti e Clustering )AC‬‬ ‫الت‬
‫امل�ستوى ال�ساد�س‬
‫�تخدم املث��ال اأع��اله طريق��ة وارد (‪ )Ward‬القيا�س��ية لقيا���س امل�س��افة للمتغ��ر الث��اين‪ .‬ت�س��تند م�س��افة وارد (‪)Ward‬‬ ‫يَ�س� ِ‬ ‫التجميع التكتلي (‪ )AC‬هو الطريقة االأكر انت�سارًا وفعالي ًة يف هذا الف�ساء‪ ،‬فمن‬
‫اإىل مفهوم التباين داخل العنقود‪ ،‬وهو جمموع امل�سافات بني النقاط يف العنقود‪ .‬يف كل تكرار‪ ،‬تُقيِّم الطريقة كل عملية‬ ‫امل�ستوى اخلام�س‬ ‫خاللها مُيكن التغلّب على هذا التحدي بتوفر طريقة وا�سحة لتحديد العدد املنا�سب‬
‫دم��ج ممكن��ة بح�س��اب التباي��ن داخ��ل العنق��ود قب��ل عمل ّي��ة الدم��ج‪ ،‬وبعده��ا‪ ،‬ثم تب��داأ عملية الدم��ج التي حُتقِّق اأق��ل ارتفاع‬ ‫امل�ستوى الرابع‬ ‫من العناقيد‪ .‬ي�ستند التجميع التكتلي (‪ )AC‬اإىل منهجية الت�سميم من اأ�سفل اإىل‬
‫يف التباي��ن‪ .‬اأظه��رت م�س��افة وارد (‪ )Ward‬نتائ��ج جي��دة يف معاجل��ة البيان��ات الن�س ّي��ة‪ ،‬بالرغ��م م��ن وج��ود العدي��د م��ن‬ ‫امل�ستوى الثالث‬ ‫اأعلى‪ ،‬حيث تبداأ بح�ساب امل�سافة بني كل اأزواج نقاط البيانات‪ ،‬ثم اختيار النقطتني‬
‫اخليارات االأخرى‪.‬‬ ‫امل�ستوى الثاين‬ ‫االأقرب ودجمهما يف عنقود واحد‪ .‬تتكرر هذه العملية حتى تُدمج كل نقاط البيانات‬
‫امل�ستوى االأول‬ ‫يف عنقود واحد‪ ،‬اأو حتى الو�سول اإىل العدد املطلوب من العناقيد‪.‬‬
‫‪a b c d e f g h i‬‬
‫�سكل ‪ :3.19‬التجميع التكتلي (‪)AC‬‬ ‫دالة ()‪Linkage‬‬
‫تُنفِذ لغة البايثون التجميع التكتلي (‪ )AC‬با�ستخدام دالة ()‪.linkage‬‬
‫يجب توفر متغرين لدالة ()‪:linkage‬‬
‫• البيانات الن�سيّة املُمثلة باملتَّجَ هات‪ ،‬ومُيكن ا�ستخدام دالة ()‪ toarray‬لتحويل البيانات اإىل تن�سيق كثيف مُيكن لهذه الدالة‬
‫�سكل ‪ :3.21‬مثال على طريقة وارد (‪)Ward‬‬
‫اأن تتعامل معه‪.‬‬
‫• مقيا���س امل�س��افة الذي يجب ا�س��تخدامه لتحديد العناقيد التي �س�تُدمج اأثناء عملية التجميع التكتلي‪ .‬تتوفر عدة خيارات من‬
‫الر�س��م ال�س��جري يف ال�س��كل ‪ 3.20‬يعر���س طريق��ة وا�سح��ة لتحدي��د‬ ‫مقايي���س امل�س��افة لالختيار من بينها وفقًا ملتطلبات وتف�سيالت املُ�س� ِ‬
‫�تخدم‪ ،‬مثل امل�س��افة االإقليدية (‪ ،)Euclidian‬وم�س��افة‬
‫الر�سم ال�س ري (‪:)Dendrogram‬‬ ‫ع��دد العناقي��د‪ .‬يف ه��ذا املث��ال‪ ،‬تق��رتح املكتب��ة ا�س��تخدام ‪ 7‬عناقي��د‪،‬‬ ‫مانهاتن (‪ ...)Manhattan‬اإل ‪ ،‬ولكن يف هذا امل�سروع �ست�ستخدم طريقة وارد (‪ )ward‬القيا�سية‪.‬‬
‫الر�س��م ال�س��جري ه��و ر�س��م تخطيط��ي‬ ‫م��ع متيي��ز كل عنق��ود بلون خمتلف‪ .‬قد يتبنى املُ�س� ِ‬
‫�تخدم هذا املُقرتح‬ ‫ي�س��تخدم املقط��ع الربجم��ي الت��ايل دال��ة ()‪ linkage‬م��ن االأداة الهرمي��ة (‪ )Hierarchy‬ال��واردة باالأعل��ى لتطبي��ق ه��ذه العملية‬
‫تفر ع��ي يو�س��ح العال ق��ة الهرمي��ة ب��ني‬ ‫�ستخدم الر�سم ال�سجري الختيار رقم خمتلف‪ .‬على �سبيل املثال‪،‬‬ ‫اأو َي ِ‬ ‫على بيانات هيئة االإذاعة الربيطانية املُمثَّلة باملتَّجَ هات‪:‬‬
‫البيان��ات‪ ،‬وياأت��ي ع��ادة يف �س��ورة اأح��د‬ ‫ُد ِّم��ج اللون��ني االأزرق واالأخ�س��ر يف اآخ��ر خطوة م��ع جمموعة العناقيد‬
‫ُخم َرجات التجميع الهرمي‪.‬‬ ‫ل��كل االأل��وان االأخ��رى‪ .‬وهك��ذا‪� ،‬س��يوؤدي اختي��ار ‪ 6‬عناقي��د اإىل دم��ج‬ ‫‪plt.figure() # create a new empty figure‬‬
‫اللون��ني االأرج��واين والربتق��ايل‪ ،‬بينم��ا اختيار ‪ 5‬عناقيد �س��يوؤدي اإىل‬
‫‪# iteratively merge points and clusters until all points belong to a single cluster‬‬
‫دمج اللونني االأزرق واالأخ�سر‪.‬‬ ‫‪# return the linkage of the produced tree‬‬
‫يتبن��ى املقط��ع الربجم��ي الت��ايل مقرتح��ات االأداة ويَ�س� ِ‬ ‫)'‪linkage_tfidf=hierarchy.linkage(text_tfidf.toarray(),method='ward‬‬
‫�تخدم اأداة التجمي��ع التكتل��ي م��ن مكتب��ة �س��كلرن (‪)Sklearn‬‬
‫لتق�س��يم املُخطَّ ط ال�س��جري بعد اإن�س��اء العناقيد ال�س��بع‪:‬‬ ‫‪# visualize the linkage‬‬
‫)‪hierarchy.dendrogram(linkage_tfidf‬‬
‫‪AC_tfidf=AgglomerativeClustering(linkage='ward',n_clusters=7) # prepare the tool,‬‬
‫‪set the number of clusters.‬‬ ‫‪# show the figure‬‬
‫)(‪plt.show‬‬
‫‪AC_tfidf.fit(text_tfidf.toarray()) # apply the tool to the vectorized BBC data.‬‬

‫‪pred_tfidf=AC_tfidf.labels_ # get the cluster labels.‬‬

‫‪pred_tfidf‬‬

‫)‪array([6, 2, 4, ..., 6, 3, 5], dtype=int64‬‬

‫الح��ظ اأن قيم��ة ‪( ground-truth‬بيان��ات احلقيق��ة املعتم��دة) من الق�س��م االإخباري (‪ )News Section‬يف كل م�س��تند‬
‫�دال م��ن ذلك‪ ،‬عوجلت عملية التجميع ا�س��تنادًا اإىل ن�س حُمتوى كل وثيقة‬ ‫مل تُ�س��تخدَ م عل��ى ا إالط��الق يف ه��ذه العملي��ة‪ .‬وب� ً‬
‫عل��ى ح��ده‪ .‬ا َّإن قي��م بيان��ات احلقيق��ة املعتم��دة مفي��دة يف التطبي��ق العمل��ي‪ ،‬فه��ي تتي��ح التحق��ق م��ن �سحة نتائ��ج التجميع‪.‬‬
‫وقيم بيانات احلقيقة املعتمدة احلالية موجودة يف قائمة ‪( bbc_labels‬قيم_ هيئة االإذاعة الربيطانية)‪.‬‬
‫�سكل ‪ :3.20‬الر�سم ال�سجري الهرمي لبيانات هيئة االإذاعة الربيطانية‬
‫‪161‬‬ ‫‪160‬‬
‫الربجمة األ اهية للكلمات با�ستخدام ال�سبكات الع�سبية‬ ‫يَ�س� ِ‬
‫�تخدم املقط��ع الربجم��ي الت��ايل قي��م بيان��ات احلقيق��ة املعتم��دة وثالث��ة دوال خمتلف��ة لت�س��جيل النق��اط م��ن مكتب��ة �س��كلرن‬
‫(‪ )Sklearn‬لتقييم جودة جتميع البيانات‪:‬‬
‫‪Word ec ori tion with Neural Networks‬‬
‫• تك��ون قي��م موؤ�س��ر التجان���س (‪ )Homogeneity Score‬ب��ني ‪ 0‬و ‪ 1‬ومُيك��ن زي��ادة ه��ذه القيم عندم��ا تكون كل النقاط يف كل‬
‫الربجم��ة االجتاهي��ة لتك��رار امل�سطلح‪-‬تك��رار امل ُ�س��تنَد العك�س��ي (‪ )TF-IDF‬ت�س��تند اإىل ح�س��اب تك��رار الكلم��ات ومعاجلته��ا ع��رب‬ ‫عنقود لها قيمة بيانات احلقيقة املعتمدة‪ .‬وباملثل‪ ،‬يحتوي كل عنقود على نقاط البيانات وحيدة الت�سنيف‪.‬‬
‫املُ�س��تنَدات يف جمموع��ة البيان��ات‪ .‬بالرغ��م م��ن اأن ه��ذا يحق��ق نتائ��ج جي��دة‪ ،‬اإال اأنّ القي��ود الكب��رة تعي��ب الطرائ��ق امل�س��ت ِندة اإىل‬
‫التك��رار‪ .‬فه��ي تتجاه��ل متامً ��ا العالق��ة الداللي��ة ب��ني الكلم��ات‪ .‬عل��ى �س��بيل املث��ال‪ ،‬عل��ى الرغ��م م��ن اأن كلمت��ي ‪( trip‬نزه��ة) و‬ ‫• تك��ون قيم��ة موؤ�س��ر ران��د املُع��دل (‪ )Adjusted Rand Score‬ب��ني ‪ -0.5‬و ‪ 1.0‬ومُيك��ن زي��ادة ه��ذه القي��م عندم��ا تق��ع كل‬
‫االجتاهيّة املُ�ستنِدة اإىل التّكرار �ستتعامل معهما باعتبارهما كلمتان منف�سلتان‬ ‫‪( journey‬رحلة) مرتادفتان‪ ،‬اإال اأنّ الربجمة ّ‬ ‫نقاط البيانات ذات القيم نف�سها يف العنقود نف�سه وكل نقاط البيانات ذات القيم املختلفة يف عناقيد خمتلفة‪.‬‬
‫متامً ��ا ولهم��ا خ�سائ���س م�س��تقلة‪ .‬وباملث��ل‪ ،‬بالرغ��م م��ن اأن كلمت��ي ‪( apple‬تفاح��ة) و ‪( fruit‬فاكه��ة) مرتابطت��ان دالل ًي��ا؛ الأن‬ ‫• تك��ون قيم��ة موؤ�س��ر االكتم��ال (‪ )Completeness Score‬ب��ني ‪ 0‬و ‪ 1‬ومُيك��ن زي��ادة ه��ذه القيم��ة بتعي��ني كل نق��اط البيان��ات‬
‫أي�سا‪.‬‬
‫التفاح نوع من الفاكهة اإال اأنّ ذلك لن يوؤخذ بعني االعتبار ا ً‬ ‫من ت�سنيف ُحُمدد يف العنقود نف�سه‪.‬‬
‫توؤثر هذه القيود كثرًا على التطبيقات التي ت�ستخدم هذا النوع من الربجمة االجتاهية‪ .‬فكِّر يف اجلملتني التاليتني‪:‬‬
‫• ‪( I have a very high fever، so I have to visit a doctor‬لديّ حمّى �سديدة‪ ،‬ويجب عليّ زيارة الطبيب)‪.‬‬ ‫_‪from sklearn.metrics import homogeneity_score,adjusted_rand‬‬
‫‪score,completeness_score‬‬
‫• ‪My body temperature has risen significantly، so I need to see a healthcare professional‬‬
‫(ارتفعت درجة حرارة ج�سمي كثرًا‪ ،‬ويجب عليّ زيارة اأخ�سائي الرعاية ال�سحية)‪.‬‬ ‫))‪print('\nHomogeneity score:',homogeneity_score(bbc_labels,pred_tfidf‬‬
‫))‪print('\nAdjusted Rand score:',adjusted_rand_score(bbc_labels,pred_tfidf‬‬
‫بالرغ��م م��ن اأن اجلملت��ني ت�سف��ان احلال��ة نف�س��ها اإال اأنهم��ا ال تت�س��اركان اأي كلم��ات داللي��ة‪ .‬ولذلك‪� ،‬ستف�س��ل خوارزميات‬ ‫))‪print('\nCompleteness score:',completeness_score(bbc_labels,pred_tfidf‬‬
‫التجميع املُ�ست ِندة اإىل تكرار امل�سطلح‪-‬تكرار امل ُ�ستنَد العك�سي (‪ )TF-IDF‬اأو اأي برجمة اجتاهية (ت�ستند اإىل التكرار)‬
‫يف روؤية الت�سابه بني الكلمات‪ ،‬ومن املحتمل اأال ت�سعها يف نف�س العنقود‪.‬‬ ‫‪Homogeneity score: 0.6224333236569846‬‬ ‫الموؤ�سر اأقرب اإلى ‪ 1‬وهذا يعني اأن مجموعة‬
‫الن�سو�س في العنقود تنتمي اإلى قيمة واحدة‪.‬‬
‫الكلمات املُ�ستبعَدة (‪:)Stopwords‬‬ ‫َ ه ‪Word2Vec‬‬ ‫منوذج الكلمة اإىل امل َّت‬ ‫‪Adjusted Rand score: 0.4630492696176891‬‬
‫الكلم��ات املُ�س��تبعَدة ه��ي كلم��ات �س��ائعة يف‬ ‫مُيك��ن معاجل��ة ه��ذه القي��ود بالطرائق الت��ي تاأخذ بعني االعتبار الت�س��ابه‬ ‫الموؤ�سر اأقرب اإلى ‪ 1‬وهذا يعني اإن�ساء روابط‬
‫‪Completeness score: 0.5430590192420555‬‬
‫اللغ��ات تُ�س��تبعد ع��اد ًة اأثن��اء املعاجل��ة املُ�س �بَقة‬ ‫ال��داليل ب��ني الكلم��ات‪ .‬اإح��دى الط��رق ال�س��هرة املُتبع��ة يف ه��ذا ال�س��دد‬ ‫اأف�سل بين العناقيد والقيم؛ ك ٌّل على حده‪.‬‬
‫للن�سو ���س �سم��ن مه��ام معا جل��ة اللغ��ات‬ ‫�تخدم بُني��ة‬‫ه��ي ��وذج الكلم��ة اإىل املتَّجَ ��ه (‪ )Word2Vec‬الت��ي تَ�س� ِ‬
‫الطبيعي��ة (‪ )NPL‬مث��ل الربجم��ة االجتاهي��ة‬ ‫تَ�س��تنِد اإىل ال�س��بكات الع�سبي��ة‪ .‬يَ�س��تنِد ��وذج الكلم��ة اإىل املتَّجَ ��ه‬ ‫ال�س��تكمال حُتلي��ل البيان��ات‪ُ ،‬يع��اد جتمي��ع البيان��ات با�س��تخدام ‪ 5‬عناقي��د‪ ،‬بالت�س��اوي م��ع الع��دد احلقيق��ي لقي��م‬
‫للكلمات‪ .‬هذه الكلمات ت�س��مل اأدوات التعريف‪،‬‬ ‫(‪ )Word2Vec‬اإىل فك��رة اأن الكلم��ات املت�س��ابهة دالل ًي��ا ُحُت��اط بكلمات‬ ‫‪( ground-truth‬بيانات احلقيقة املعتمدة)‪:‬‬
‫وح��روف العط��ف‪ ،‬وح��روف اجل��ر‪ ،‬والكلم��ات‬ ‫مماثل��ة يف ال�س��ياق نف�س��ه‪ .‬ولذل��ك‪ ،‬جن��د ال�س��بكات الع�سبي��ة ت�س��تخدم‬
‫الت��ي ال تك��ون مفي��دة لتحدي��د معن��ى الن� ّ��س‪ ،‬اأو‬ ‫)‪AC_tfidf=AgglomerativeClustering(linkage='ward',n_clusters=5‬‬
‫الت�سم��ني اخلف��ي ل��كل كلم��ة للتنبوؤ بال�س��ياق‪ ،‬مع �سرورة اإن�س��اء الروابط‬ ‫))(‪AC_tfidf.fit(text_tfidf.toarray‬‬
‫�سياقه‪.‬‬ ‫ب��ني الكلم��ات والت�سمين��ات ال�س��بيهة‪ .‬عمل ًي��ا‪ ،‬يخ�سع ��وذج الكلمة اإىل‬ ‫_‪pred_tfidf=AC_tfidf.labels‬‬
‫املتَّجَ ��ه (‪ )Word2Vec‬للتدري��ب املُ�س�بَق عل��ى ماليني املُ�س��تنَدات لتعلُّم‬
‫الت�سمن (‪:)Embedding‬‬ ‫الت�سم��ني ع��ايل الدق��ة للكلم��ات‪ .‬مُيك��ن حُتمي��ل النم��اذج املُد َّربة م�س� َبقًا‬ ‫))‪print('\nHomogeneity score:',homogeneity_score(bbc_labels,pred_tfidf‬‬
‫وا�س��تخدامها يف التطبيق��ات املُ�س��تنِدة اإىل الن�سو���س‪ .‬يَ�س��تخدِ م املقطع‬ ‫))‪print('\nAdjusted Rand score:',adjusted_rand_score(bbc_labels,pred_tfidf‬‬
‫الت�سم��ني ُيع� ِّ�رب ع��ن الكلم��ات اأو الرم��وز يف‬ ‫الربجم��ي الت��ايل مكتب��ة جين�س��م (‪ )Gensim‬لتحمي��ل من��وذج �س��هر‬
‫ف�س��اء امل َّت َج��ه امل�س��تمر حي��ث ترتب��ط الكلم��ات‬ ‫))‪print('\nCompleteness score:',completeness_score(bbc_labels,pred_tfidf‬‬
‫ُم��د َّر ب م�س � َبقًا عل��ى جممو ع��ة كب��رة ج��دً ا م��ن اأخب��ار قو ق��ل‬
‫املت�سابهة دالليًا مع النقاط القريبة‪.‬‬ ‫(‪:)Google News‬‬ ‫‪Homogeneity score: 0.528836079209762‬‬ ‫نظرًا لقدرة التجميع الهرمي على اإيجاد‬
‫العدد الحقيقي من القيم‪ ،‬وتوفير موؤ�سر‬
‫‪import gensim.downloader as api‬‬ ‫‪Adjusted Rand score: 0.45628412883628383‬‬ ‫اكتمال اأكثر دقة‪� ،‬ستح�سل على عملية‬
‫)'‪model_wv = api.load('word2vec-google-news-300‬‬
‫‪Completeness score: 0.6075627851312266‬‬ ‫تجميع اأف�سل من حيث تمثيل البيانات‪.‬‬
‫هذا النموذج يربط كل كلمة‬ ‫]'‪fox_emb=model_wv['fox‬‬
‫بت�سمين مكوّن من ‪ُ 300‬بعد‪.‬‬ ‫))‪print(len(fox_emb‬‬
‫عل��ى الرغ��م م��ن اأن نتائ��ج املوؤ�س��ر تُظه��ر اأن التجمي��ع التكتل��ي با�س��تخدام الربجم��ة االجتاهي��ة لتك��رار امل�سطلح‪-‬تك��رار‬
‫‪300‬‬
‫امل ُ�س��تنَد العك�س��ي (‪ )TF-IDF‬حُتقق نتائج معقولة‪ ،‬اإال اأنّه ال يزال باالإمكان حُت�س��ني دقة عملية التجميع‪� .‬س��يو�سح الق�س��م‬
‫التايل كيف مُيكن اأن نحقق نتائج مبهرة با�ستخدام تقنيات الربجمة االجتاهية املُ�ست ِندة على ال�سبكات الع�سبية‪.‬‬
‫‪163‬‬ ‫‪162‬‬
:‫ (ثعلب) مو�سحة باالأ�سفل‬fox ‫االأبعاد الع�سرة االأوىل للت�سمني العددي لكلمة‬
%%capture
import nltk # import the nltk library for nlp.
import re # import the re library for regular expressions. fox_emb[:10]
import numpy as np # used for numeric computations
from collections import Counter # used to count the frequency of elements in a given list
from sklearn.manifold import TSNE # Tool used for Dimensionality Reduction. array([-0.08203125, -0.01379395, -0.3125 , -0.04125977, 0.05493164,
-0.12988281, -0.10107422, -0.00164795, 0.15917969, 0.12402344],
# download the 'stopwords' tool from the nltk library. It includes very common words for different dtype=float32)
languages
nltk.download('stopwords')
ِ �‫يَ�س‬
car ‫ ف ِّك��ر يف املث��ال الت��ايل حي��ث تُظه��ر املقارن��ة ب��ني كلم��ة‬.‫�تخدم النم��وذج ت�سمين��ات الكلم��ات لتقيي��م درج��ة الت�س��ابه‬
from nltk.corpus import stopwords # import the 'stopwords' tool. .1 ‫ و‬0 ‫ عل ًما باأن قيم الت�سابه تقع دومً ا بني‬.‫(ال�سيارة) والكلمات االأخرى درجة الت�سابة من خالل تناق�س قيم الت�سابة‬
stop=set(stopwords.words('english')) # load the set of english stopwords.
pairs = [
('car', 'minivan'),
‫حدد‬
ِّ ‫ ُي‬.‫تُ�س��تخدَ م الدال��ة االآتي��ة الح ًق��ا لتحدي��د عين��ة من الكلمات التمثيلية من جمموعة بيانات هيئ��ة االإذاعة الربيطانية‬ ('car', 'bicycle'),
‫املقط��ع الربجم��ي الكلم��ات اخلم�س��ني االأك��ر تك��رارًا عل��ى وج��ه التحدي��د م��ن االأق�س��ام االإخباري��ة اخلم�س��ة لهيئ��ة االإذاعة‬ ('car', 'airplane'),
('car', 'street'),
‫) وه��ي الكلمات االإجنليزية ال�س��ائعة ج��دً ا والكلمات التي مل‬Stopwords( ‫الربيطاني��ة م��ع ا�س��تثناء الكلم��ات امل ُ�س��تبعَدة‬ ('car', 'apple'),
.‫) املُدرَّب م�سبقًا‬Word2Vec( ‫تُ�س َّمن يف وذج الكلمة اإىل املتَّجَ ه‬ ]
for w1, w2 in pairs:
print(w1, w2, model_wv.similarity(w1, w2))
def get_sample(bbc_docs:list,
bbc_labels:list
‫بع�س الكلمات االإ ليزية ال�سائعة التي تعترب كلمات مُ�ستبعَدة‬
): .)‫ (يكونون‬are ‫ (يكون) و‬is ‫ (ال) و‬the ‫ (اأ) و‬a ‫) هي‬Stopwords( car minivan 0.69070363
car bicycle 0.5364484
word_sample=set() # a sample of words from the BBC dataset
car airplane 0.42435578
# for each BBC news section car street 0.33141237
for label in ['business', 'entertainment', 'politics', 'sport', 'tech']: car apple 0.12830706

# get all the words in this news section, ignore stopwords.


# for each BBC doc and for each word in the BBC doc :‫ُمُيكن ا�ستخدام املقطع الربجمي التايل للعثور على الكلمات اخلم�سة امل�سابهة الإحدى الكلمات‬
# if the word belongs to the label and is not a stopword and is included in the Word2Vec model
label_words=[word for i in range(len(bbc_docs))
print(model_wv.most_similar(positive=['apple'], topn=5))
for word in re.findall(r'\b\w\w+\b',bbc_docs[i].lower())
if bbc_labels[i]==label and
word not in stop and
[('apples', 0.720359742641449), ('pear', 0.6450697183609009),
word in model_wv]
('fruit', 0.6410146355628967), ('berry', 0.6302295327186584), ('pears',
cnt=Counter(label_words) # count the frequency of each word in this news section. 0.613396167755127)]

# get the top 50 most frequent words in this section.


top50=[word for word,freq in cnt.most_common(50)] :‫ ُومُيكن حُتقيق ذلك عرب‬،‫ُمُيكن ا�ستخدام الت�سوير يف التحقق من �سحة ت�سمينات هذا النموذج املُدرَّب مُ�سبقًا‬
# add the top50 words to the word sample.
word_sample.update(top50)
.‫• حُتديد مناذج الكلمات من جمموعة بيانات هيئة االإذاعة الربيطانية‬
‫ بع� ٍ�د ل��كل‬300 � ‫) لتخفي���س الت�سم��ني ذي ال‬T-SNE( T ‫• ا�س��تخدام ت�سم��ني املج��اور الع�س��وائي امل��وزَّع عل��ى �س��كل‬
word_sample=list(word_sample) # convert the set to a list.
.‫كلمة اإىل نقطة ثنائية االأبعاد‬
return word_sample .‫• ت�سوير النقاط يف ُخمطَّ ط االنت�سار يف الف�ساء ثنائي االأبعاد‬
word_sample=get_sample(bbc_docs,bbc_labels)

165 164
‫الربجمة األ اهية لل ُ مل با�ستخدام التعلُّم العميق‬ ‫واأخ �رًا‪� ،‬ستَ�س� ِ‬
‫�تخدم طريق��ة ت�سم��ني املج��اور الع�س��وائي امل��وزَّع عل��ى �س��كل ‪ )T-SNE( T‬لتخفي���س الت�سمين��ات ذات‬
‫بعد للكلمات يف العينة �سمن النقاط ثنائية االأبعاد‪ .‬بعدها‪ُ ،‬متثَّل النقاط يف ُخمطَّ ط انت�سار ب�سيط‪.‬‬‫ال� ‪ٍ 300‬‬
‫‪Sentence ec ori tion with Deep Learning‬‬
‫عل��ى الرغ��م م��ن اإمكاني��ة ا�س��تخدام ��وذج الكلم��ة اإىل املتَّجَ ��ه (‪ )Word2Vec‬يف منذج��ة الكلم��ات الفردي��ة‪ ،‬يتطل��ب التجمي��ع‬
‫جلمل ثنائية اال ا من‬ ‫الربجمة االجتاهية للن�س باأكمله‪ .‬اإحدى الطرائق االأكر �س��هرة لتحقيق ذلك هي متثيالت ترميز ا ُ‬
‫املحوالت (‪ )SBERT‬املُ�ستنِدة اإىل منهجية التعلُّم العميق‪.‬‬
‫متثيالت الرتميز ثنائية األ اه من املحوألت‬
‫(‪i irection Encoder e resen tions from Transformers )BERT‬‬
‫متثي��الت الرتمي��ز ثنائي��ة اال ��ا م��ن املح��والت (‪ )BERT‬ه��ي من��وذج متثي��ل لغ��وي ق��وي طورت��ه �س��ركة قوق��ل‪ ،‬ويع� ُّد‬
‫التدريب املُ�سبَق وال�سبط الدقيق عامالن رئي�سان وراء قدرة متثيالت الرتميز ثنائية اال ا من املحوالت (‪)BERT‬‬
‫عل��ى تطبي��ق نق��ل التعلُّ��م‪ ،‬اأي الق��درة عل��ى االحتف��اظ باملعلوم��ات ح��ول م�س��كلة ما واال�س��تفادة منها يف حلِّ م�س��كلة اأخرى‪،‬‬
‫ويت��مّ التدري��ب املُ�س�بَق ع��رب تغذي��ة النم��وذج بكمي��ة هائلة م��ن البيانات غر املُعنوَنة لع��دة مهام‪ ،‬مثل التنب�وؤ اللغوي املُقنَّع‬
‫دخالت الن�سو�س وامل ُِه َّمة هي التنبوؤ بهذه الكلمات)‪ُ .‬يه ِّيئ منوذج متثيالت الرتميز‬ ‫(اإخفاء الكلمات الع�س��وائية يف ُم َ‬
‫ثنائي��ة اال ��ا م��ن املح��والت (‪ )BERT‬املتغ��رات امل َّ‬
‫ُدرب��ة ُم�س��بقًا لل�سب��ط الدقي��ق‪ ،‬كم��ا تُ�س��تخدَ م جمموع��ات البيان��ات‬
‫املُعنوَنة من املهام النهائية ل�سبط دقة عمل النموذج‪ ،‬ويكون لكل ُم ِه َّمة نهائية مناذج دقيقة منف�سلة‪ ،‬برغم اأنها مُهيئَّة‬
‫باملتغ��رات املُد َّرب��ة نف�س��ها م�س��بقًا‪ .‬عل��ى �س��بيل املث��ال‪ ،‬تختلف عملية ال�سب��ط الدقيق لنموذج حُتليل امل�س��اعر عن منوذج‬
‫االإجابة على االأ�سئلة‪ .‬ومن املهم معرفة اأن الفروقات يف بنية النماذج ت�سبح �سئيلة اأو منعدمة بعد خطوة �سبط الدقة‪.‬‬
‫اه من املحوألت ‪SBERT‬‬ ‫متثيالت ترميز ا ُ مل ثنائية األ‬
‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ )SBERT‬ه��ي االإ�س��دار املُع�دَّل م��ن متثيالت الرتمي��ز ثنائية‬ ‫متثي��الت ترمي��ز ا ُ‬
‫اال ��ا م��ن املح��والت (‪ُ .)BERT‬ت��د َّرب متثي��الت الرتمي��ز ثنائي��ة اال ��ا م��ن املح��والت (‪ )BERT‬مث��ل ��وذج‬
‫الكلم��ة اإىل املتَّجَ ��ه (‪ )Word2Vec‬للتنب�وؤ بالكلم��ات بن��ا ًء عل��ى �س��ياق ا ُ‬
‫جلم��ل ال��واردة به��ا‪ .‬وم��ن ناحي��ة اأخ��رى‪ُ ،‬ت��د َّرب‬
‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ )SBERT‬للتنب � ؤو مب��ا اإذا كان��ت جملت��ان مت�س��ابهتني دالل ًي��ا‪.‬‬ ‫متثي��الت ترمي��ز ا ُ‬
‫تُ�ستخدَ م متثيالت ترميز اجلُمل ثنائية اال ا من املحوالت (‪ )SBERT‬الإن�ساء ت�سمينات الأجزاء الن�سو�س االأطول‬
‫جلم��ل‪ ،‬مث��ل الفق��رات‪ ،‬اأو الن�سو���س الق�س��رة‪ ،‬اأو املق��االت يف جمموع��ة بيان��ات هيئ��ة االإذاع��ة الربيطاني��ة حُم��ل‬ ‫م��ن ا ُ‬
‫الدرا�س��ة يف ه��ذه الوح��دة‪ .‬بالرغ��م م��ن اأن النم��اذج الث��الث ت�س��تند جميعه��ا اإىل ال�س��بكات الع�سبي��ة‪ ،‬اإال اأن متثي��الت‬
‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪)SBERT‬‬ ‫الرتمي��ز ثنائي��ة اال ��ا م��ن املح��والت (‪ )BERT‬ومتثي��الت ترمي��ز ا ُ‬
‫تتبعان ُبنية خمتلفة ب�سكل كبر واأكر تعقيدً ا من وذج الكلمة اإىل املتَّجَ ه (‪.)Word2Vec‬‬ ‫�سكل ‪ :3.22‬متثيل الكلمات االأكر تكرارًا من جمموعة بيانات هيئة االإذاعة الربيطانية‬
‫ُ مل واملحوألت ‪Sentence_transformers Library‬‬ ‫مكتبة ا‬
‫جلم��ل واملح��والت (‪ )sentence_transformers‬الوظائ��ف الكامل��ة لنم��وذج متثي��الت ترمي��ز ا ُ‬
‫جلم��ل‬ ‫تُطب��ق مكتب��ة ا ُ‬ ‫يُثب��ت املُخطَّ ��ط اأن ت�سمين��ات ��وذج الكلم��ة اإىل املتَّجَ ��ه (‪ )Word2Vec‬ت�س��تنبط االرتباط��ات الداللي��ة ب��ني الكلم��ات‪ ،‬كم��ا‬
‫ثنائي��ة اال ��ا م��ن املح��والت (‪ .)SBERT‬تاأت��ي املكتب��ة بالعدي��د م��ن من��اذج متثي��الت ترمي��ز ا ُ‬
‫جلم��ل ثنائي��ة اال ��ا‬ ‫يت�سح من جمموعات الكلمات الوا�سحة مثل‪:‬‬
‫م��ن املح��والت (‪ )SBERT‬املُد َّرب��ة ُم�س��بقًا؛ ك ٌل منه��ا ُم��د َّرب عل��ى جمموع��ة بيان��ات خمتلف��ة ولتحقي��ق اأه��داف خمتلف��ة‪.‬‬ ‫• ‪( economy‬االقت�س��اد)‪( economic،‬االقت�سادي��ة)‪( business ،‬االأعم��ال)‪( financial ،‬املالي��ة)‪( sales ،‬املبيعات)‪،‬‬
‫يعمل املقطع الربجمي التايل على حُتميل اأحد النماذج العامة ال�س��هرة املُد َّربة ُم�س��بقًا‪ ،‬وي�س��تخدمها الإن�س��اء ت�سمينات‬ ‫‪( bank‬امل�سرف)‪( firm ،‬ال�سركة)‪( firms ،‬ال�سركات)‪.‬‬
‫للم�ستندات يف جمموعة بيانات هيئة االإذاعة الربيطانية‪:‬‬ ‫• ‪( Internet‬االإنرتن��ت)‪( mobile ،‬الهات��ف املحم��ول)‪( phones ،‬الهوات��ف)‪( phone ،‬الهات��ف)‪broadband ،‬‬
‫(النطاق العري�س)‪( online ،‬مت�سل)‪( digital ،‬رقمي)‪.‬‬
‫‪%%capture‬‬
‫‪!pip install sentence_transformers‬‬ ‫• ‪( actor‬ممث��ل)‪( actress ،‬ممثل��ة)‪( film ،‬فيل��م)‪( comedy ،‬كومي��دي)‪( films ،‬اأف��الم)‪(festival ،‬مهرج��ان)‪،‬‬
‫‪from sentence_transformers import SentenceTransformer‬‬
‫‪( band‬فرقة)‪( movie ،‬فيلم)‪.‬‬
‫‪model = SentenceTransformer('all-MiniLM-L6-v2') # load the pre-trained model.‬‬ ‫• ‪( game‬لعب��ة)‪( team ،‬فري��ق)‪( match ،‬مب��اراة)‪( players ،‬العب��ون)‪( coach ،‬م��درِّب)‪( injury ،‬اإ�ساب��ة)‪،‬‬
‫‪text_emb = model.encode(bbc_docs) # embed the BBC documents.‬‬ ‫‪( club‬نادي)‪( rugby ،‬الرجبي)‪.‬‬
‫‪167‬‬ ‫‪166‬‬
‫مو�س��ح يف ال�س��كل ‪ ،3.24‬ف�اإن اأداة الر�س��م ال�س��جري ت�س��ر اإىل ‪ 4‬عناقي��د‪ ،‬كل واح��د منه��ا ُممي��ز بل��ون خمتل��ف‪.‬‬
‫كم��ا ه��و ّ‬ ‫لق��د ا�س��تخدمت يف وق��ت �س��ابق يف ه��ذه الوح��دة اأداة ت�سم��ني املج��اور الع�س��وائي امل��وزع عل��ى �س��كل ‪ T‬والت��ي ه��ي‬
‫َ�ستخدم املقطع الربجمي التايل هذا املقرتح حل�ساب العناقيد وح�ساب مقايي�س التقييم‪:‬‬ ‫ي ِ‬ ‫(‪ ،)TSNEVisualizer‬لت�سوي��ر املُ�س��تندات املُمثل��ة باملتُّجَ ه��ات املُنتج��ة با�س��تخدام اأداة تك��رار امل�سطلح‪-‬تكرار امل�س��تند‬
‫العك�س��ي (‪ .)TF-IDF‬مُيكن االآن ا�س��تخدامها للت�سمينات املُنتَجة بوا�س��طة متثيالت ترميز اجلُمل ثنائية اال ا من‬
‫)‪AC_emb=AgglomerativeClustering(linkage='ward',n_clusters=4‬‬ ‫املحوالت (‪:)SBERT‬‬
‫)‪AC_emb.fit(text_emb‬‬
‫_‪pred_emb=AC_emb.labels‬‬ ‫)]'‪tsne = TSNEVisualizer(colors=['blue','green','red','yellow','brown‬‬
‫)‪tsne.fit(text_emb,bbc_labels‬‬
‫))‪print('\nHomogeneity score:',homogeneity_score(bbc_labels,pred_emb‬‬ ‫;)(‪tsne.show‬‬
‫))‪print('\nAdjusted Rand score:',adjusted_rand_score(bbc_labels,pred_emb‬‬
‫))‪print('\nCompleteness score:',completeness_score(bbc_labels,pred_emb‬‬

‫‪Homogeneity score: 0.6741395570357063‬‬

‫‪Adjusted Rand score: 0.6919474005627763‬‬

‫‪Completeness score: 0.7965514907905805‬‬

‫اإذا كان��ت البيان��ات ق��د مت اإع��ادة جتميعه��ا با�س��تخدام الع��دد ال�سحي��ح من ‪ 5‬عناقيد‪ ،‬فالعنقود االأ�سفر املُحدد بال�س��كل‬
‫اأعاله �سينق�سم اإىل اثنني‪ ،‬و�ستكون النتائج على النحو التايل‪:‬‬

‫)‪AC_emb=AgglomerativeClustering(linkage='ward',n_clusters=5‬‬ ‫�سكل ‪ :3.23‬اإ�سقاط ت�سمني املجاور الع�سوائي املوزَّع على �سكل ‪ )T-SNE( T‬للت�سمينات‬
‫)‪AC_emb.fit(text_emb‬‬ ‫املُنتجة بوا�سطة متثيالت ترميز اجلُمل ثنائية االجتاه من املحوالت (‪)SBERT‬‬
‫_‪pred_emb=AC_emb.labels‬‬ ‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ )SBERT‬ت �وؤدي اإىل ف�س��لٍ‬
‫اأك��ر و�سوحً ��ا‬ ‫يو�س��ح ال�س��كل اأن متثي��الت ترمي��ز ا ُ‬
‫))‪print('\nHomogeneity score:',homogeneity_score(bbc_labels,pred_emb‬‬ ‫لالأق�س��ام االإخباري��ة املختلف��ة م��ع ع��دد اأق��ل م��ن ال�س��وائب م��ن تك��رار امل�سطلح‪-‬تك��رار امل ُ�س��تنَد العك�س��ي (‪.)TF-IDF‬‬
‫))‪print('\nAdjusted Rand score:',adjusted_rand_score(bbc_labels,pred_emb‬‬ ‫اخلطوة التالية هي ا�ستخدام الت�سمينات لتدريب خوارزمية التجميع التكتلي‪:‬‬
‫))‪print('\nCompleteness score:',completeness_score(bbc_labels,pred_emb‬‬
‫‪plt.figure() # create a new figure.‬‬
‫‪Homogeneity score: 0.7865655030556284‬‬ ‫‪# iteratively merge points and clusters until all points belong to a single cluster. Return the the linkage of‬‬
‫‪the produced tree.‬‬
‫‪Adjusted Rand score: 0.8197670431956582‬‬ ‫)'‪linkage_emb=hierarchy.linkage(text_emb, method='ward‬‬

‫‪Completeness score: 0.7887580797775077‬‬ ‫‪hierarchy.dendrogram(linkage_emb) # visualize the linkage.‬‬


‫‪plt.show() # show the figure.‬‬

‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ )SBERT‬يف الربجم��ة االجتاهي��ة‬ ‫تُظهِ ��ر النتائ��ج اأن ا�س��تخدام متثي��الت ترمي��ز ا ُ‬
‫للن�سو���س يَنت��ج عن��ه نتائ��ج جتمي��ع ُحُم َّ�س��نة باملقارن��ة م��ع تك��رار امل�سطلح‪-‬تك��رار امل ُ�س��تنَد العك�س��ي (‪ .)TF-IDF‬اإذا كان‬
‫ع��دد العناقي��د ه��و ‪ 5‬لتك��رار امل�سطلح‪-‬تك��رار امل ُ�س��تنَد العك�س��ي (‪( )TF-IDF‬القيم��ة ال�سحيح��ة) و‪ 4‬عناقي��د لتمثيالت‬
‫ترميز اجلُمل ثنائية اال ا من املحوالت (‪ ،)SBERT‬فاإن املقايي�س الثالثة لتمثيالت ترميز اجلُمل ثنائية اال ا‬
‫من املحوالت (‪ )SBERT‬ال تزال هي االأعلى بفارق كبر‪ .‬ثم تزداد الفجوة اإذا كان العدد ‪ 5‬لكلٍ من الطريقتني‪.‬‬
‫وه��ذا ُيع� ُّد دلي� ً�ال عل��ى اإمكان��ات ال�س��بكات الع�سبي��ة‪ ،‬الت��ي ت�س��مح له��ا بُنيته��ا املتط��ورة بفهم ا أالمن��اط الداللي��ة املُعقدة يف‬
‫البيانات الن�سيّة‪.‬‬

‫�سكل ‪ :3.24‬الر�سم ال�سجري الهرمي لتمثيالت ترميز اجلُمل ثنائية االجتاه من املحوالت (‪)SBERT‬‬
‫‪169‬‬ ‫‪168‬‬
‫‪ 4‬لدي��ك م�سفوف��ة ‪ numPy‬تدع��ى '‪ 'Docs‬تت�سم��ن م�س��تندًا ن�سي��ا واح �دًا يف كل �س��ف‪ .‬لدي��ك كذل��ك م�سفوف��ة‬ ‫مترينات‬
‫‪ labels‬تت�سم��ن قي��م كل م�س��تند يف ‪ .Docs‬اأكم��ل املقط��ع الربجم��ي الت��ا بحي��ث ت�س��تخدم ��وذج متثي��الت ترمي��ز‬
‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ )SBERT‬املُ��درَّب مُ�س��بقًا حل�س��اب ت�سمين��ات كل الوثائ��ق يف ‪ Docs‬ث��م ا�س��تخدم‬ ‫ا ُ‬ ‫‪1‬‬
‫اأداة ‪ TSNEVisualizer‬ت�سم��ني املج��اور الع�س��وائي امل��وزَّع عل��ى �س��كل ‪ T‬لت�سوي��ر الت�سمين��ات يف الف�س��اء ثنائ��ي االأبع��اد‪،‬‬
‫با�ستخدام لون خمتلف لكل واحد من القيم االأربعة املحتملة‪:‬‬ ‫خاطئة‬ ‫�سحيحة‬ ‫حدِّد اجلملة ال�سحيحة واجلملة اخلاطئة فيما يلي‪:‬‬
‫‪ .1‬يف التعلُّم غر املوجَّ ه‪ ،‬تُ�ستخدم جمموعات البيانات املُعنوَنة لتدريب النموذج‪.‬‬
‫‪from sentence_transformers import‬‬
‫‪ .2‬يتطلب التعلُّم غر املوجَّ ه الربجمة االجتاهية للبيانات‪.‬‬
‫‪from‬‬ ‫= ‪import TSNEVisualizer model‬‬ ‫‪('all-MiniLM-‬‬ ‫جلم��ل ثنائي��ة االجت��اه م��ن املح��والت (‪ُ )SBERT‬تع� ُّد اأف�س��ل م��ن تك��رار‬
‫‪ .3‬متثي��الت ترمي��ز ا ُ‬
‫‪L6-v2') # loads the pre-trained model.‬‬ ‫امل�سطلح‪-‬تكرار امل�ستند العك�سي (‪ )TF-IDF‬للربجمة االجتاهية للكلمات‪.‬‬
‫‪docs_emb = model.‬‬ ‫‪(Docs) # embeds the docs‬‬ ‫‪ .4‬يَتبع التجميع التكتلي منهجية الت�سميم من اأعلى اإىل اأ�سفل لتحديد العناقيد‪.‬‬

‫= ‪tsne‬‬ ‫(‬ ‫)]'‪=['blue','green','red','yellow‬‬ ‫‪ .5‬متثيالت ترميز اجلُمل ثنائية االجتاه من املحوالت (‪ )SBERT‬مُدرَّبة للتنبوؤ مبا اإذا كانت‬
‫جملتان خمتلفتني دالليًا‪.‬‬
‫‪tsne.‬‬ ‫(‬ ‫‪,‬‬ ‫)‬

‫;)(‪tsne.show‬‬

‫‪ 2‬ا�ستعرِ�س بع�س التطبيقات التي يُ�ستخدم فيها تقلي�س االأبعاد‪ِ .‬‬


‫و�سف التقنيات امل�ستخدمة فيه‪.‬‬

‫‪ 5‬اأكمل املقطع الربجمي التا بحيث تَ�ستخدم وذج الكلمة اإىل املتَّجَ ه (‪ )Word2Vec‬ال�ستبدال كل كلمة يف اإحدى‬
‫اجلُمل باأخرى تكون اأك �سبهًا بها‪:‬‬

‫‪import gensim.downloader as‬‬


‫‪import re‬‬

‫= ‪model_wv‬‬ ‫‪.‬‬ ‫)'‪('word2vec-google-news-300‬‬


‫'‪old_sentence='My name is John and I like basketball.‬‬
‫''=‪new_sentence‬‬
‫‪ 3‬ا�سرح و ائف الربجمة اال اهية ملقيا�س تكرار امل�سطلح‪-‬تكرار امل�ستند العك�سي (‪.)TF-IDF‬‬
‫‪for word in re.‬‬ ‫‪(r'\b\w\w+\b',old_sentence.lower()):‬‬

‫‪replacement=model_wv.‬‬ ‫‪(positive=['apple'],‬‬ ‫]‪=1)[0‬‬

‫=‪new_sentence+‬‬
‫)(‪sentence=new_sentence.strip‬‬

‫‪171‬‬ ‫‪170‬‬
‫هناك اأربع اأنواع من توليد اللغات الطبيعية (‪:)NLG‬‬
‫الدر�ض الثالث‬
‫تولي��د اللغ��ات الطبيعي��ة املبن��ي عل��ى القوال��ب تولي��د اللغ��ات الطبيعي��ة املبن��ي عل��ى األختي��ار‬ ‫توليد الن�ض‬
‫‪Se ection se‬‬ ‫‪Template-Based NLG‬‬
‫املبني على االختيار حُتديد جمموعة‬ ‫يت�سمن توليد اللغات الطبيعية ّ‬ ‫يت�سم�ن تولي�د اللغ�ات الطبيعي�ة املبن ّ�ي عل�ى القوال�ب ا�س�تخدام‬
‫للن�س االأ�سلي االأكرب‬
‫جلمل اأو الفقرات الإن�ساء ملخّ �س ّ‬ ‫فرعية من ا ُ‬ ‫قوال�ب ُحُم� َّددة ُم�س�بقًا حُت�دد بنية وحُمت�وى الن�س املتولِّ�د‪ .‬تُزَ وّد‬
‫ن�سو�س��ا جدي��دة‪ ،‬اإال‬
‫ً‬ ‫حج ًم��ا‪ .‬بالرغ��م م��ن اأن ه��ذه املنهجي��ة ال تُو ِّل��د‬ ‫ه�ذه القوال�ب مبعلوم�ات ُحُم َّددة لتوليد الن�س النهائي‪ُ .‬تع ُّد هذه‬ ‫توليد اللغات الطبيعية (‪Natural Language ener tion )NLG‬‬
‫اأنه��ا ُمطب َّق��ة عمل ًي��ا على نطاق وا�س��ع؛ وذلك الأ ّنه��ا تاأخذ العينات من‬ ‫املنهجية ب�سيطة ن�سبيًا وحُتقق فعالية يف توليد الن�سو�س للمهام‬ ‫تولي��د اللغ��ات الطبيعي��ة (‪ )NLG‬ه��و اأح��د ف��روع معاجل��ة اللغ��ات الطبيعي��ة (‪ )NLP‬الت��ي تر ِّك��ز عل��ى تولي��د الن�سو���س الب�س��رية‬
‫جلم��ل املكتوب��ة بوا�س��طة الب�س��ر‪ ،‬مُيك��ن احل��د م��ن‬ ‫جمموع��ة م��ن ا ُ‬ ‫املُح� َّددة واملُع َّرف�ة جي�دً ا‪ .‬م�ن ناحية اأخرى‪ ،‬ق�د تواجه �سعوبة مع‬ ‫با�س��تخدام خوارزمي��ات احلا�س��ب‪ .‬اله��دف م��ن تولي��د اللغ��ات الطبيعي��ة (‪ )NLG‬ه��و تولي��د اللغ��ات املكتوب��ة اأو املنطوق��ة ب�س��ورة‬
‫خماط��رة تولي��د الن�سو���س غ��ر املُتنب��ئ به��ا اأو �سعيف��ة البني��ة‪ .‬على‬ ‫امله�ام املفتوح�ة اأو امله�ام التي تتطلب درجة عالية من التباين يف‬ ‫طبيعي��ة ومفهوم��ة للب�س��ر دون احلاج��ة اإىل تدخ��ل ب�س��ري‪ .‬توج��د العدي��د م��ن املنهجي��ات املختلف��ة لتولي��د اللغ��ات الطبيعي��ة‪ ،‬مث��ل‬
‫�س��بيل املث��ال‪ُ ،‬مو ِّل��د تقري��ر الطق���س املبن� ّ�ي عل��ى االختي��ار ق��د ي�س��م‬ ‫الن��س املُ َولَّ�د‪ .‬عل�ى �س�بيل املثال‪ ،‬قالب تقرير حالة الطق��س رمبا‬ ‫املنهجيات املُ�ست ِندة اإىل القوالب‪ ،‬واملُ�ست ِندة اإىل القواعد‪ ،‬واملُ�ستنِدة اإىل تعلُّم االآلة‪.‬‬
‫قاع��دة بيان��ات م��ن العب��ارات مث��ل‪( It is hot outside :‬الطق���س‬ ‫يبدو كما يلي‪Today in [city]، it is [temperature] degrees :‬‬
‫ح��ار باخل��ارج)‪ ،‬و ‪( The temperature is rising‬درج��ة احل��رارة‬ ‫‪( with [weather condition].‬الي�وم يف [املدين�ة]‪ ،‬درج�ة‬ ‫معا ة اللغات الطبيعية‬
‫ترتفع)‪ ،‬و ‪( Expect sunny skies‬تنبوؤات بطق�س ُم�سم�س)‪.‬‬ ‫احلرارة هي [درجة احلرارة] مئوية و [حالة الطق�س]‪.).‬‬ ‫(‪:)Natural Language Processing-NLP‬‬ ‫علوم احلا�سب‬
‫تولي��د اللغ��ات الطبيعي��ة املبن��ي عل��ى القواع��د توليد اللغات الطبيعية املبني على تعلُّم األلة‬ ‫معاجل��ة اللغ��ات الطبيعي��ة (‪ )NLP‬ه��و اأح��د ف��روع ال��ذكاء‬
‫اال�سطناع��ي ال��ذي مُين��ح اأجه��زة احلا�س��ب الق��درة عل��ى‬
‫‪Machine Learning-Based NLG‬‬ ‫‪Rule-Based NLG‬‬ ‫حُماكاة اللغات الب�سرية الطبيعية‪.‬‬
‫املبني على تعلُّم االآلة تدريب منوذج‬ ‫يَ�س��تخدِ م تولي��د اللغ��ات الطبيعي��ة املبن� ّ�ي عل��ى القواع��د جمموع��ة‬ ‫معاجلة اللغات‬
‫يت�سمن ت�وليد اللغات الطبيعية ّ‬ ‫الطبيعية‬
‫تعلُّ��م االآل��ة عل��ى جمموع��ة كب��رة م��ن بيان��ات الن�سو���س الب�س��رية‪.‬‬ ‫م��ن القواع��د املُح � َّددة مُ�س��بقًا لتولي��د الن���س‪ .‬ق��د حُت��دد ه��ذه‬
‫يتع ّل��م النم��وذج اأمن��اط الن� ّ��س وبنيت��ه‪ ،‬وم��ن ث��م مُيكن��ه تولي��د الن�س‬ ‫جلم��ل‪ ،‬اأو‬
‫القواع��د طريق��ة جتمي��ع الكلم��ات والعب��ارات لت�س��كيل ا ُ‬ ‫توليد اللغات الطبيعية‬ ‫الذكاء‬ ‫علم اللُغويات‬
‫اجلديد الذي ي�سبه الن�س الب�سري يف االأ�سلوب واملحتوى‪ .‬قد تكون‬ ‫�تخدمة في��ه‪ .‬ع��اد ًة‬
‫كيفي��ة اختي��ار الكلم��ات وف ًق��ا لل�س��ياق املُ�س� َ‬ ‫‪:)Natural Language ener tion‬‬ ‫(‬ ‫اال�سطناعي‬
‫املنهجي��ة اأك��ر فعالي��ة يف املهام التي تتطلب درجة عالية من التباين‬ ‫تُ�س��تخدم ه��ذه القواع��د لت�سمي��م روب��وت الدرد�س��ة خلدم��ة‬ ‫تولي��د اللغ��ات الطبيعي��ة ( ‪ )NLG‬ه��ي عملي��ة تولي��د‬
‫يف الن���س املُو َّل��د‪ .‬وق��د تتطل��ب املنهجي��ة جمموعات اأك��رب من بيانات‬ ‫العم��الء‪ .‬ق��د يك��ون م��ن ال�س��هل تطبي��ق االأنظم��ة املبني��ة عل��ى‬ ‫الن�سو�س الب�سرية با�ستخدام الذكاء اال�سطناعي (‪.)AI‬‬ ‫�سكل ‪ُ :3.25‬خمطَّ ط فِنْ (‪ )Venn‬ملعاجلة اللغات الطبيعية (‪)NLP‬‬
‫التدريب واملوارد احل�سابية‪.‬‬ ‫القواعد‪ .‬ويف بع�س االأحيان قد تت�سم باجلمود وال تُولِّد ُخم َرجات‬
‫تبدو طبيعية‪.‬‬
‫جدول  ‪ :3.4‬تاأثري توليد اللغات الطبيعية‬
‫ا�ستخدام توليد اللغات الطبيعية املبني على القوالب ‪Using Template-Based NLG‬‬
‫فعاال يف توليد الن�سو�س للمهام املُح َّددة واملُع َّرفة مثل اإن�ساء التقارير‬ ‫املبني على القوالب ب�سيط ن�سبيًا وقد يكون ً‬ ‫توليد اللغات الطبيعية ّ‬
‫اأو تو�سي��ف البيان��ات‪ .‬اإح��دى ممي��زات تولي��د اللغ��ات الطبيعي��ة املبن� ّ�ي عل��ى القوال��ب ه��و �س��هولة التطبي��ق وال�سيان��ة‪ُ .‬ي�س ِّم��م االأ�س��خا�س‬ ‫يُ�س��تخدم تولي��د اللغ��ات الطبيعي��ة (‪ )NLG‬لتولي��د املق��االت والتقاري��ر االإخباري��ة‪ ،‬واملحتوى‬
‫القوال��ب‪ ،‬دون احلاج��ة اإىل خوارزمي��ات تعلُّ��م االآل��ة املُعق� َ�دة اأو جمموعات كبرة من بيانات التدريب‪ .‬وهذا يجعل توليد اللغات الطبيعية‬ ‫املكتوب اآليًا مما يوفّر الوقت‪ ،‬وي�ساعد االأ�سخا�س يف الرتكيز على املهام االإبداعية اأو املهام‬
‫ن�س حُم ّددين‪ ،‬دون احلاج��ة اإىل اإجراء تغيرات كبرة‪.‬‬ ‫املبن� ّ�ي عل��ى القوال��ب ه��و اخلي��ار املنا�س��ب للمه��ام التي تك��ون ذات بنية وحُمتوى ّ‬ ‫عالية امل�ستوى‪.‬‬
‫تَ�س��تنِد قوالب توليد اللغات الطبيعية (‪ )NLG‬اإىل اأي بُنية لغوية ُحُم َّددة ُم�س��بقًا‪ .‬اإحدى املمار�س��ات ال�س��ائعة هي اإن�س��اء القوالب التي‬
‫تتطلب كلمات بو�سوم حُمددة كجزء من الكالم الإدراجها يف الفراغات املُح َّددة �سمن اجلملة‪.‬‬ ‫مُيكن اال�ستفادة من ذلك يف حُت�سني كفاءة وفعالية روبوت الدرد�سة خلدمة العمالء ومتكينه‬
‫من تقدمي ردود طبيعية ومفيدة الأ�سئلتهم وا�ستف�ساراتهم‪.‬‬
‫و�سوم اأق�سام الكالم ‪Part of Speech )POS( Tags‬‬
‫‪PRON‬‬ ‫‪VERB‬‬ ‫‪DET‬‬ ‫‪ADJ‬‬ ‫‪NOUN‬‬
‫و�س�وم اأق�س�ام ال�كالم (‪ ،)Part Of Speech‬الت�ي ُتع� َّرف كذل�ك با�س�م‬
‫ُخ�س��س للكلم�ات يف الن��س لالإ�س�ارة اإىل البن�اء‬ ‫و�س�وم ‪ POS‬ه�ي قي�م ت َّ‬ ‫مُيك��ن اال�س��تفادة م��ن تولي��د اللغ��ات الطبيعي��ة (‪ )NLG‬يف حُت�س��ني اإمكاني��ة الو�س��ول ل��ذوي‬
‫‪I‬‬ ‫‪want‬‬ ‫‪an‬‬ ‫‪early‬‬ ‫‪upgrade‬‬ ‫النح�وي للكلم�ات‪ ،‬اأو ج�زء ال�كالم يف اجلمل�ة‪ .‬على �س�بيل املثال‪ ،‬قد تكون‬ ‫االإعاق��ة اأو ل��ذوي احلواج��ز اللغوي��ة‪ ،‬بتمكينه��م م��ن التوا�س��ل م��ع االآالت بطريق��ة طبيعي��ة‬
‫�سكل ‪ :3.26‬مثال على عملية و�سم اأق�سام الكالم‬ ‫فعال اأو �سف ًة اأو ظرفًا‪ ،‬اإل ‪ ،‬وتُ�ستخدَ م و�سوم اأق�سام الكالم‬
‫الكلمة ا�سمًا اأو ً‬ ‫وبديهية تنا�سبهم‪.‬‬
‫الن�س وفهم معناه‪.‬‬‫يف معاجلة اللغات الطبيعية (‪ )NLP‬لتحليل بنية ّ‬
‫‪173‬‬ ‫‪172‬‬
Paraphrase)( ‫دالة‬ Syntax Analysis ‫ُ مل‬ ‫ليل بِناء ا‬
‫جلملة بكلمة‬ ُ ‫ ثم حُتاول ا�ستبدال كل كلمة يف ا‬.‫جلمل‬ ُ ‫تُق�سِّ م الدالة يف البداية الن�س املُكوَّن من فقرة اإىل جمموعة من ا‬ ّ ‫) يف توليد اللغات الطبيعية‬POS( ‫ُي�ستخدم حُتليل ِبناء اجلُمل عاد ًة اإىل جانب و�سوم اأق�سام الكالم‬
‫املبني على القوالب ل�سمان‬
‫) ال��ذي در�س��ته يف‬Word2Vec( ‫ ُيق َّي��م الت�س��ابه ال��داليل بوا�س��طة ��وذج الكلم��ة اإىل املتَّجَ ��ه‬.‫اأخ��رى مت�س��ابهة دالل ًي��ا‬ ‫ والعالقات‬،‫جلم��ل‬
ُ ‫جلم��ل التع�رّف عل��ى اأجزاء ال��كالم يف ا‬
ُ ‫ يت�سم��ن حُتلي��ل ِبن��اء ا‬.‫ق��درة القوال��ب عل��ى تولي��د الن�سو���س الواقعي��ة‬
‫) با�س��تبدال الكلمة يف اجلملة بكلمة اأخرى م�س��ابهة‬Word2Vec( ‫ قد يو�سي منوذج الكلمة اإىل امل َّتجه‬.‫الدر���س ال�س��ابق‬ : ‫ مثل‬.‫جلملة اأنواعً ا خمتلفة من عنا�سر بناء اجلُملة‬ ُ ‫ تت�سمن ا‬.‫للجملة‬ ُ ‫بينها لتحديد البناء النحوي‬
‫ ولتجن��ب مث��ل ه��ذه احل��االت تُ�س��تخدم دال��ة مكتب��ة‬،)‫ (تف��اح‬apples � ‫ (تفاح��ة) ب‬apple ‫ ا�س��تبدال‬:‫ مث��ل‬،‫له��ا‬ .‫ وهو عاد ًة يعرب عمّا يقوم به الفاعل اأو عمّا يحدث‬.‫جلملة الذي يحتوي على الفعل‬ ُ ‫) هو ق�سم ا‬Predicate( ‫• الفعل‬
.‫ ال�سهرة لتقييم ت�سابه املُفردات بني الكلمة االأ�سلية والكلمة البديلة‬fuzzywuzzy .‫جلملة الذي يُنفّذ الفعل‬ ُ ‫) هو ق�سم ا‬Subject( ‫• الفاعل‬
:‫الدالة نف�سها مُو�سحَّ ة باالأ�سفل‬ .‫) هو ا�سم اأو �سمر ي�سر اإىل ال�سخ�س اأو ال�سيء الذي يتاأثر مبا�سر ًة بالفعل‬Direct Object( ‫• املفعول به‬
def paraphrase(text:str, # text to be paraphrased
ُ ‫) الت��ي تتب��ع منهجي��ة ِبن��اء ا‬Wonderwords( ‫يَ�س��تخدِ م املقط��ع الربجم��ي الت��ايل مكتب��ة وون��درووردز‬
‫جلم��ل لعر���س بع���س‬
stop:set, # set of stopwords .‫املبني على القوالب‬
ّ ‫االأمثلة على توليد اللغات الطبيعية‬
model_wv,# Word2Vec Model
lexical_sim_ubound:float, # upper bound on lexical similarity
%%capture
semantic_sim_lbound:float # lower bound on semantic similarity
): !pip install wonderwords
# used to generate template-based randomized sentences
words=word_tokenize(text) # tokenizes the text to words from wonderwords.random_sentence import RandomSentence

new_words=[] # new words that will replace the old ones. # make a new generator with specific words
generator=RandomSentence(
# specify some nouns
for word in words: # for every word in the text nouns=["lion", "rabbit", "horse","table"],
verbs=["eat","run","laugh"], # specify some verbs.
word_l=word.lower() # lower-case the word. adjectives=['angry','small']) # specify some adjectives.

# if the word is a stopword or is not included in the Word2Vec model, do not try to replace it. # generates a sentence with the following template: [subject (noun)] [predicate (verb)]
if word_l in stop or word_l not in model_wv: generator.bare_bone_sentence()
new_words.append(word) # append the original word

'The table runs.'


else: # otherwise

# get the 10 most similar words, as per the Word2Vec model.


# returned words are sorted from most to least similar to the original. # generates a sentence with the following template:
# semantic similarity is always between 0 and 1. # the [(adjective)] [subject (noun)] [predicate (verb)] [direct object (noun)]
replacement_words=model_wv.most_similar(positive=[word_l], generator.sentence()
topn=10)
# for each candidate replacement word
for rword, sem_sim in replacement_words: 'The small lion runs rabbit.'
# get the lexical similarity between the candidate and the original word.
# the partial_ratio function returns values between 0 and 100. ‫جلمل وف��ق بُنية ُحُم َّددة‬
# it compares the shorter of the two words with all equal-sized substrings
ُ ‫املبني عل��ى القوالب لتوليد ا‬
ّ ‫ بينم��ا يُ�س��تخدَ م تولي��د اللغ��ات الطبيعية‬،‫تو�س��ح االأمثل��ة باالأعل��ى اأن��ه‬
# of the original word. ‫ وعل��ى الرغ��م م��ن اإمكاني��ة حُت�س��ني دق��ة النتائج اإىل‬.‫�زى عمل��ي‬
ً �‫جلم��ل ق��د ال تك��ون ذات مغ‬ ُ ‫ اإال اأنّ ه��ذه ا‬،‫و ُمعتم��دة ُم�س��بقًا‬
lex_sim=fuzz.partial_ratio(word_l,rword) ‫ اإال اأن ه��ذه املنهجي��ة غ��ر عملي��ة‬،‫ح� ٍ�د كب��ر بتحدي��د قوال��ب متط��ورة وو�س��ع املزي��د م��ن القي��ود عل��ى ا�س��تخدام املف��ردات‬
‫ُ�ستخدم املنهجية االأخرى لتوليد‬ َ ‫ ت‬،‫فبدال من اإن�ساء القوالب املُح َّددة ُم�سبقًا‬
ً .‫نطاق وا�سع‬ ٍ ‫لتوليد الن�سو�س الواقعية على‬
# if the lexical sim is less than the bound, stop and use this candidate.
if lex_sim<lexical_sim_ubound: ‫ تتبنى‬.‫واملفردات نف�سها املُكوِّنة الأي جملة حقيقية كقالب ديناميكي متغر‬ ِ ‫اللغات الطبيعية القائمة على القوالب البني َة‬
break .‫ هذه املنهجية‬paraphrase)( ‫دالة‬

fuzzywuzzy ‫ ت�سير اإلى مكتبة‬fuzz

175 174
‫ا�ستخدام توليد اللغات الطبيعية املبني على األختيار‬ # quality check: if the chosen candidate is not semantically similar enough to
# the original, then just use the original word.
Using Se ection-Based NLG if sem_sim<semantic_sim_lbound:
‫ هذه املنهجية ُجت ِ�سد ا�ستخدام‬.‫جلمل الفرعية من وثيقة ُحُم َّددة‬ new_words.append(word)
ُ ‫ �ست�ستعر�س منهجية عملية الختيار منوذج من ا‬،‫يف هذا الق�سم‬ else: # use the candidate.
:‫املبني على االختيار ي�ستند اإىل لبنتني رئي�سيتني‬
ّ ‫ومزايا توليد اللغات الطبيعية‬ new_words.append(rword)

َ ‫) امل‬Word2Vec( ‫• وذج الكلمة اإىل املتَّجَ ه‬


.‫ُ�ستخدم لتحديد اأزواج الكلمات املت�سابهة دالليًا‬ return ' '.join(new_words) # re-join the new words into a single string and return.
.‫ُ�ستخدمة الإن�ساء ومعاجلة اأنواع خمتلفة من بيانات ال�سبكة‬َ ‫ ال�سهرة �سمن لغة البايثون امل‬Networkx ‫• مكتبة‬
.2022 ‫النَّ�س املُدخَ ل الذي �س ُي�ستخدم يف هذا الف�سل هو مقالة اإخبارية نُ�سرت بعد املباراة النهائية لكاأ�س العامل‬
.‫المُخرَج هو اإ�سدار مُعاد �سياغته من الن�س المُدخَ ل‬
# reads the input document that we want to summarize
with open('article.txt',encoding='utf8',errors='ignore') as f: text=f.read() ‫ ويف املرب��ع االأبي���س‬paraphrase)( ‫يُ�س��تخدَ م املقط��ع الربجم��ي الت��ايل ال�س��تراد كل االأدوات الالزم��ة لدع��م دال��ة‬
text[:100] # shows the first 100 characters of the article
:text ‫) للن�س املُ�سند اإىل املتغر‬Paraphrase( ‫ حُت�سل على ُخم َرج طريقة اإعادة ال�سياغة‬،‫اأدناه‬

%%capture
'It was a consecration, the spiritual overtones entirely appropriate.
Lionel Messi not only emulated '
import gensim.downloader as api # used to download and load a pre-trained Word2Vec model
model_wv = api.load('word2vec-google-news-300')
َ ‫ والتعبر النمطي نف�سه امل‬re ‫ يُر َّمز الن�س با�ستخدام مكتبة‬،‫يف البداية‬
:‫ُ�ستخدم يف الوحدات ال�سابقة‬
import nltk
# used to split a piece of text into words. Maintains punctuations as separate tokens
import re # used for regular expressions from nltk import word_tokenize
nltk.download('stopwords') # downloads the stopwords tool of the nltk library
# tokenize the document, ignore stopwords, focus only on words included in the Word2Vec model. # used to get list of very common words in different languages
tokenized_doc=[word for word in re.findall(r'\b\w\w+\b',text.lower()) if word from nltk.corpus import stopwords
not in stop and word in model_wv] stop=set(stopwords.words('english')) # gets the list of english stopwords

# get the vocabulary (set of unique words).


!pip install fuzzywuzzy[speedup]
vocab=set(tokenized_doc)
from fuzzywuzzy import fuzz

Networkx ‫مكتبة‬ text='We had dinner at this restaurant yesterday. It is very close to my
house. All my friends were there, we had a great time. The location is
‫مطعم‬ 2
.)Weighted Graph( ‫مُيكن االآن منذجة مفردات املُ�ستنَد يف ُخمطَّ ط موزون‬ excellent and the steaks were delicious. I will definitely return soon, highly
‫منزل‬ ‫ يف لغ��ة البايث��ون جمموع��ة وا�س��عة م��ن االأدوات الإن�س��اء‬Networkx ‫تُوف��ر مكتب��ة‬ recommended!'
‫رائع‬ # parameters: target text, stopwords, Word2Vec model, upper bound on lexical similarity, lower bound
3 ‫ ُي�س��اعد‬،‫ يف تولي��د اللغ��ات الطبيعي��ة املبن� ّ�ي عل��ى االختي��ار‬.‫وحُتلي��ل املُخطَّ ط��ات‬ on semantic similarity
2 1 ‫متثي��ل مف��ردات الوثيق��ة يف ُخمطَّ ��ط م��وزون يف حُتدي��د العالق��ات ب��ني الكلم��ات‬ paraphrase(text, stop, model_wv, 80, 0.5)
2 ‫ ُمتث��ل كل‬،‫ يف املُخطَّ ��ط امل��وزون‬.‫جلم��ل ذات ال�سل��ة‬
‫ع�ساء‬ ُ ‫وت�س��هيل اختي��ار العب��ارات وا‬
2
.‫ ُومتث��ل احل��واف بني ال ُعق��د العالقات بني ه��ذه املفاهيم‬،‫ُعق��دة كلم� ًة اأو مفهومً ��ا‬ 'We had brunch at this eatery Monday. It is very close to my bungalow. All
‫ مم��ا ي�س��مح لنظ��ام تولي��د‬،‫ُتع��رب االأوزان عل��ى احل��واف ع��ن ق��وة ه��ذه العالق��ات‬ my acquaintances were there, we had a terrific day. The locale is terrific
‫لذيذ‬ 1 ‫املوقع‬ and the tenderloin were delicious. I will certainly rejoin quickly, hugely
،‫ عن��د تولي��د الن�سو���س‬.‫اللغ��ات الطبيعي��ة بتحدي��د املفاهي��م االأق��وى ارتبا ًط��ا‬
advised!'
3 ‫جلمل ا�س��تنادًا اإىل العالقات‬ ُ ‫ُي�س��تخدم املُخطَّ ��ط امل��وزون للبح��ث عن العب��ارات وا‬
‫مُو�سي به‬ ‫�ستخدم النظام املُخطَّ ط للبحث عن الكلمات‬ ِ ‫ قد َي‬،‫ على �سبيل املثال‬.‫بني الكلمات‬
‫ مُيك��ن حُت�س��ني النتائ��ج باإ�ساف��ة املزي��د م��ن القي��ود لت�سحي��ح بع���س‬،‫كم��ا يف املنهجي��ات االأخ��رى املُ�س��ت ِندة اإىل القوال��ب‬
‫والعبارات االأكر ارتباطً ا لو�سف كيان ُحُم َّدد ثم ا�ستخدام هذه الكلمات لتحديد‬ ‫ يو�س��ح املث��ال اأعاله اأن��ه ُمُيكن با�س��تخدام هذه الدالة الب�س��يطة‬،‫ وم��ع ذل��ك‬.‫البدائ��ل االأق��ل و�سو ًح��ا واملذك��ورة يف االأعل��ى‬
.‫جلملة االأكر مالءم ًة من قاعدة بيانات النظام‬ ُ ‫ا‬ .‫توليد ن�سو�س واقعية للغاية‬
Networkx � ‫ مثال على ُخمطَّ ط موزون ل‬:3.27 ‫�سكل‬
177 176
Louvain Algorithm ‫خوارزمية لوفان‬ Build_graph)( ‫دالة‬
‫ واحدة م��ن اخليارات‬.‫ العدي��د م��ن اخلوارزمي��ات لتحلي��ل املُخطَّ ��ط والبح��ث ع��ن املجت َمعات‬Networkx ‫تت�سم��ن مكتب��ة‬ :‫ الإن�ساء ُخمطَّ ط يت�سمن‬NetworkX ‫ مكتبة‬Build_graph)( ‫تُ�ستخدم دالة‬
‫االأكر فعالية هي خوارزمية لوفان التي تعمل عرب حُتريك ال ُعقد بني املجت َمعات حتى جتد بُنية املجتمع التي متثل الربط‬ .‫• عُ قدة واحدة لكل كلمة �سمن مفردات حُمددة‬
.‫االأف�سل يف ال�سبكة ال�سمنية‬ Doc2Vec ‫ املح�س��وب بوا�س��طة اأداة‬،‫ ال��وزن عل��ى احلاف��ة ي�س��اوي الت�س��ابه الداليل بني الكلمات‬.‫• حاف��ة ب��ني كل كلمت��ني‬
‫الن�س كم َّت َجه وه��ي تعميم ملنهجية وذج الكلم��ة اإىل املتَّجَ ه‬
ّ ‫وه��ي اأداة معاجل��ة اللغ��ات الطبيعي��ة املُخ�س�س��ة لتمثي��ل‬
e co unities)( ‫دالة‬ .)Word2Vec(
‫ َحُت�س��ب الدالة كذلك‬.‫املبني عل��ى الكلمات‬
ّ ‫تَ�س��تخدِ م الدال��ة االآتي��ة خوارزمي��ة لوف��ان للبح��ث ع��ن املجت َمع��ات يف املُخطَّ ��ط‬ ‫ توج��د كذلك حافة بني عُ قدتني اإذا كان ت�س��ابه‬.‫تَر�س��م الدال��ة خمطّ طً ��ا ذا عُ ق��دة واح��دة ل��كل كلم��ة يف املف��ردات املُح َّددة‬
:‫ ثم تكون املُخ َرجات يف �سورة قامو�سني‬.‫موؤ�سر االأهمية لكل جمتمع على حده‬ .‫) اأكرب من احلد املُعطى‬Word2Vec( ‫وذج الكلمة اإىل املتَّجَ ه‬
.‫ الذي يربط الكلمة باملجتمع‬word_to_community •
# tool used to create combinations (e.g. pairs, triplets) of the elements in a list
.‫ الذي يربط املجتمع بدرجة االأهمية‬community_scores • from itertools import combinations
5 ‫ اإذا كان املجتم��ع يت�سم��ن ثالث��ة كلم��ات تظهر‬،‫ عل��ى �س��بيل املث��ال‬.‫الدرج��ة ت�س��اوي جمم ��وع تك��رار الكلم��ات يف املجتم��ع‬ import networkx as nx # python library for processing graphs

ّ ‫ مُيثل املوؤ�س��ر جزءًا من‬،‫ ومن ناحية املفهوم‬.19 ‫ فاإنّ موؤ�سّ ��ر املجتمع حينئذٍ ي�س��اوي‬،‫الن�س‬
‫الن�س الذي‬ ّ ‫ مرات يف‬6‫ و‬8‫و‬ def build_graph(vocab:set, # set of unique words
.‫ي�س ُّمه املجتمع‬
ُ model_wv # Word2Vec model
):
# gets all possible pairs of words in the doc
from networkx.algorithms.community import louvain_communities
pairs=combinations(vocab,2)
from collections import Counter # used to count the frequency of elements in a list

G=nx.Graph() # makes a new graph


def get_communities( G, # the input graph
tokenized_doc:list): # the list of words in a tokenized document
for w1,w2 in pairs: # for every pair of words w1, w2
sim=model_wv.similarity(w1, w2) # gets the similarity between the two words
# gets the communities in the graph
G.add_edge(w1,w2,weight=sim)
communities=louvain_communities(G, weight='weight')
word_cnt=Counter(tokenized_doc)# counts the frequency of each word in the doc
return G
word_to_community={}# maps each word to its community
# creates a graph for the vocabulary of the World Cup document
G=build_graph(vocab,model_wv)
community_scores={}# maps each community to a frequency score
# prints the weight of the edge (semantic similarity) between the two words
G['referee']['goalkeeper']
for comm in communities: # for each community
# convert it from a set to a tuple so that it can be used as a dictionary key.
comm=tuple(comm)
{'weight': 0.40646762}
score=0 # initialize the community score to 0.

for word in comm: # for each word in the community ‫ مُيك��ن‬،‫وبالنظ��ر اإىل ذل��ك املُخطَّ ��ط املبن��ي عل��ى الكلم��ة‬
word_to_community[word]=comm # map the word to the community
‫متثي��ل جمموع��ة م��ن الكلمات املت�س��ابهة دالل ًي��ا يف �سورة‬
‫عناقي��د م��ن ال ُعق��د املت�سل��ة م ًع��ا بوا�س��طة ح��واف عالي��ة‬
score+=word_cnt[word] # add the frequency of the word to the community's score. ‫ ُيطل��ق عل��ى عناقي��د ال ُعق��د كذل��ك املجت َمع��ات‬.‫ال��وزن‬
community_scores[comm]=score # map the community to the score.
‫ ُخم � َرج املُخطَّ ��ط ه��و جمموع��ة‬.)Communities(
‫ مل ُجترى عملية‬.‫ب�سيطة من الروؤو�س واحلواف املوزونة‬
return word_to_community, community_scores 3.28 ‫ يف ال�س��كل‬.‫التجمي��ع حت��ى االآن الإن�س��اء املجت َمعات‬
‫تُ�س��تخدم األ��وان خمتلف��ة لتميي��ز املجت َمع��ات يف املُخطَّ ��ط‬
.‫املذكور باملثال ال�سابق‬
‫ املجت َمعات يف املُخطَّ ط‬:3.28 ‫�سكل‬
179 178
word in model_wv] # ignores words that are not in the Word2Vec model word_to_community, community_scores = get_communities(G,tokenized_doc)
word_to_community['player'][:10] # prints 10 words from the community of the word 'team'
sentence_score=0 # the score of the sentence

for word in sentence_words: # for each word in the sentence ('champion',


'stretch',
word_comm=word_to_community[word] # get the community of this word 'finished',
sentence_score+=community_scores[word_comm] # add the score of this 'fifth',
community to the sentence score. 'playing',
'scoring',
scored_sentences.append((sentence_score,raw_sent)) # stores this sentence and 'scorer',
its total score 'opening',
'team',
# scores the sentences by their score, in descending order 'win')
scored_sentences=sorted(scored_sentences,key=lambda x:x[0],reverse=True)

return scored_sentences
‫ �ستكون اخلطوة التالية هي ا�ستخدام هذه املعلومات‬،‫ وربط املجتمع مبوؤ�سر االأهمية‬،‫االآن بعد ربط كل الكلمات باملجتمع‬
.‫ مُ�سمَّمة لهذا الغر�س‬evaluate_sentences)( ‫ دالة‬.‫لتقييم اأهمية كل جملة يف املُ�ستنَد االأ�سلي‬
scored_sentences=evaluate_sentences(text,word_to_community,community_
scores,model_wv) Evaluate_sentences)( ‫دالة‬
len(scored_sentences)
.‫ ا�س��تنادًا اإىل الكلم��ات الت��ي تت�سمنه��ا‬،‫ ث��م ح�س��اب موؤ�س��ر االأهمي��ة ل��كل ُجمل��ة‬.‫تب��داأ الدال��ة بتق�س��يم املُ�س��تنَد اإىل ُجم��ل‬
.‫تكت�سب كل كلمة موؤ�سر االأهمية من املجتمع الذي تنتمي اإليه‬
61
‫ تنتمي��ان‬w2‫ و‬w1 ‫ الكلمت��ان‬.w1، w2، w3، w4، w5 ‫ لدي��ك جمل��ة مكون��ة م��ن خم�س��ة كلم��ات‬،‫عل��ى �س��بيل املث��ال‬
ُ ‫ ويُ�س��تخدَ م املقط��ع الربجم��ي الت��ايل للعث��ور عل��ى ا‬،‫ جُ مل��ة‬61 ‫يت�سم��ن املُ�س��تنَد االأ�سل��ي اإجم��ايل‬
‫جلم��ل الثالث��ة االأك��ر‬ ‫ تنتم��ي اإىل‬w5 ‫ والكلم��ة‬،30 ‫ تنتمي��ان اإىل جمتم��ع مبوؤ�س��ر قيمت��ه‬w4‫ و‬w3 ‫ والكلمت��ان‬،25 ‫اإىل جمتم��ع مبوؤ�س��ر قيمت��ه‬
ِ �‫ تَ�س‬.125=15+30+30+25+25 ‫جلم��ل ه��و‬
‫�تخدم الدال��ة بع��د ذل��ك هذه‬ ُ ‫ جمم��وع موؤ�س��رات ا‬.15 ‫جمتم��ع مبوؤ�س��ر قيمت��ه‬
:‫جلمل‬ ُ ‫اأهمية من بني هذه ا‬ .‫ من االأكر اإىل االأقل اأهمية‬،‫جلمل يف ترتيب تنازيل‬ ُ ‫املوؤ�سرات لت�سنيف ا‬
for i in range(3):
print(scored_sentences[i],'\n') from nltk import sent_tokenize # used to split a document into sentences

def evaluate_sentences(doc:str, # original document


(3368, 'Lionel Messi not only emulated the deity of Argentinian football, word_to_community:dict,# maps each word to its community
Diego Maradona, by leading the nation to World Cup glory; he finally community_scores:dict, # maps each community to a score
plugged the burning gap on his CV, winning the one title that has eluded model_wv): # Word2Vec model
him – at the fifth time of asking, surely the last time.')
# splits the text into sentences
(2880, 'He scored twice in 97 seconds to force extra-time; the first a sentences=sent_tokenize(doc)
penalty, the second a sublime side-on volley and there was a point towards scored_sentences=[]# stores (sentence, score) tuples
the end of regulation time when he appeared hell-bent on making sure that
the additional period would not be needed.') for raw_sent in sentences: # for each sentence

(2528, 'It will go down as surely the finest World Cup final of all time, # get all the words in the sentence, ignore stopwords and focus only on words that are in the
the most pulsating, one of the greatest games in history because of how Word2Vec model.
Kylian Mbappé hauled France up off the canvas towards the end of normal sentence_words=[word
time.') for word in re.findall(r'\b\w\w+\b',raw_sent.lower()) # tokenizes
if word not in stop and # ignores stopwords

181 180
‫مُيكن تو�سيع قاعدة املعرِ فة الب�سيطة لت�سمل م�ستويات اأكر من االأ�سئلة واالأجوبة‪ ،‬وجتعل روبوت الدرد�سة اأكر ذكاءً‪.‬‬
‫‪print(scored_sentences[-1]) # prints the last sentence with the lowest score‬‬
‫)(‪print‬‬
‫{=‪QA‬‬ ‫‪print(scored_sentences[30]) # prints a sentence at the middle of the scoring scale‬‬
‫‪"Q1":"What type‬‬ ‫‪of‬‬ ‫‪courses are you interested in?",‬‬
‫‪"A1":[["Courses‬‬ ‫‪in‬‬ ‫‪Computer Programming","2"],‬‬
‫‪["Courses‬‬ ‫‪in‬‬ ‫‪Engineering","3"],‬‬
‫)'‪(0, 'By then it was 2-0.‬‬
‫‪["Courses‬‬ ‫‪in‬‬ ‫‪Marketing","4"]],‬‬

‫‪"Q2":"What type of Programming Languages are you interested in?",‬‬ ‫‪(882, 'Di María won the opening penalty, exploding away from Ousmane‬‬
‫‪"A2":[["Java",None],["Python",None]],‬‬ ‫)'‪Dembélé before being caught and Messi did the rest.‬‬

‫‪"Q3":"What type of Engineering are you interested in?",‬‬


‫‪"A3":[["Mechanical Engineering",None],["Electrical Engineering",None]],‬‬ ‫جلم��ل االأ�سا�س��ية الت��ي ت�س��تنبط النق��اط الرئي�س��ة يف املُ�س��تنَد االأ�سلي‪ ،‬مع‬
‫النتائ��ج توؤك��د اأن ه��ذه املنهجي��ة ُحُت� ِّ�دد بنج��اح ا ُ‬
‫تعيني موؤ�سرات اأقل للجُ مل االأقل داللةً‪ .‬تُط َّبق املنهجية نف�سها كما هي لتوليد ملخّ �س الأي وثيقة ُحُم َّددة‪.‬‬
‫‪"Q4":"What type of Marketing are you interested in?",‬‬
‫‪"A4":[["Social Media Marketing",None],["Search Engine‬‬
‫]]‪Optimization",None‬‬ ‫ا�ستخدام توليد اللغات الطبيعية املبني على القواعد ألإن�ساء روبوت الدرد�سة‬
‫}‬
‫‪Using Rule-Based NLG to Create a Chatbot‬‬
‫دالة ()‪Chat‬‬ ‫يف ه��ذا الق�س��م‪� ،‬س�تُ�سمِّم روب��وت درد�س��ة (‪ )Chatbot‬وف��ق امل�س��ار املُح� َّدد املو�س��ي ب��ه باجلم��ع ب��ني قواع��د املعرِ ف��ة الرئي�س��ة‬
‫�تخدم دال��ة ()‪ Chat‬ملعاجل��ة قاع��دة املعرِ ف��ة وتنفي��ذ روب��وت الدرد�س��ة‪ .‬بع��د ط��رح ال�س�وؤال‪ ،‬يق��راأ روب��وت‬
‫يف النهاي��ة‪ ،‬تُ�س� َ‬ ‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ ،)SBERT‬وي�س��ر ه��ذا اإىل اأن‬ ‫لالأ�س��ئلة واالأجوب��ة والنم��وذج الع�سب��ي متثي��الت ترمي��ز ا ُ‬
‫الدرد�سة رد امل ِ‬
‫ُ�ستخدم‪.‬‬ ‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ )SBERT‬ل��ه البنية نف�س��ها كما يف متثيالت‬ ‫�تخدم يف متثي��الت ترمي��ز ا ُ‬
‫نق��ل التعلُّ��م املُ�س� َ‬
‫جلمل ثنائية اال ا من املحوالت (‪ all-MiniLM-L6-v2 )SBERT‬و�سوف يه َّياأ ب�سكل دقيق ملُهِ َّمة اأخرى غر حُتليل‬ ‫ترميز ا ُ‬
‫• اإن كان الرد م�سابهًا دالليًا الأحد خيارات االإجابات املقبولة لهذا ال�سوؤال‪ُ ،‬يح َّدد ذلك اخليار وينتقل روبوت الدرد�سة‬ ‫امل�ساعر‪ ،‬وهي‪ :‬توليد اللغات الطبيعية‪.‬‬
‫اإىل ال�سوؤال التايل‪.‬‬
‫• اإن مل يت�سابه الرد مع اأيٍ من اخليارات‪ُ ،‬يطلب من امل ِ‬
‫ُ�ستخدم اإعادة �سياغة الرد‪.‬‬ ‫‪ .1‬ميل منوذج متثيالت ترميز ا ُ مل ثنائية األ اه من املحوألت املُدرَّب مُ�سبقًا‬
‫‪Load the Pre-Trained SBERT Model‬‬
‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ )SBERT‬لتقيي��م موؤ�س��ر الت�س��ابه ال��داليل ب��ني‬ ‫تُ�س��تخدَ م دال��ة متثي��الت ترمي��ز ا ُ‬
‫الرد وكل اخليارات املُر�سَّ حة‪ُ .‬يع ُّد اخليار مت�سابهًا اإذا كان املوؤ�سر اأعلى من ُمتغر احلد االأدنى ‪. sim_lbound‬‬ ‫اخلطوة االأوىل هي حُتميل منوذج متثيالت ترميز اجلُمل ثنائية اال ا من املحوالت (‪ )SBERT‬املُدرَّب مُ�سبقًا‪:‬‬
‫‪%%capture‬‬
‫‪import numpy as np # used for processing numeric data‬‬ ‫‪from sentence_transformers import SentenceTransformer, util‬‬
‫)'‪model_sbert = SentenceTransformer('all-MiniLM-L6-v2‬‬
‫‪def chat(QA:dict, # the Question-Answer script of the chatbot‬‬
‫‪model_sbert, # a pre-trained SBERT model‬‬
‫‪sim_lbound:float): # lower bound on the similarity between the user's response and the‬‬
‫‪closest candidate answer‬‬
‫‪ .2‬اإن�ساء قاعدة معرِ فة ب�سيطة ‪Create a Simple Knowledge Base‬‬
‫اخلطوة الثانية هي اإن�س��اء قاعدة معرِ فة ب�س��يطة لتحديد الن�س الربجمي املكون من االأ�س��ئلة واالأجوبة التي ي�س��تخدمها‬
‫‪qa_id='1' # the QA id‬‬
‫روب��وت الدرد�س��ة‪ .‬يت�سم��ن الن���س الربجم��ي ‪ 4‬اأ�س��ئلة (ال�س �وؤال ‪ 1‬اإىل ‪ )4‬واالأجوب��ة عل��ى كل �س �وؤال (االإجاب��ة ‪ 1‬اإىل‬
‫‪while True: # an infinite loop, will break in specific conditions‬‬ ‫‪ .)4‬كل اإجاب��ة مكون��ة م��ن جمموع��ة م��ن اخلي��ارات كل خي��ار يتك��ون من قيمتني فق��ط‪ُ ،‬متثِّل القيمة الثانية ال�س�وؤال التايل‬
‫‪print('>>',QA['Q'+qa_id]) # prints the question for this qa_id‬‬
‫الذي ي�س��تخدمه روبوت الدرد�س��ة‪ .‬اإذا كان هذا هو ال�س�وؤال االأخر‪� ،‬س��ت�سبح القيمة الثانية خالية‪ .‬هذه اخليارات متثل‬
‫‪candidates=QA["A"+qa_id] # gets the candidate answers for this qa_id‬‬ ‫االإجاب��ات ال�سحيح��ة املحتمل��ة عل��ى االأ�س��ئلة املعني��ة به��ا‪ .‬عل��ى �س��بيل املث��ال‪ ،‬االإجاب��ة عل��ى ال�س�وؤال الث��اين له��ا خي��اران‬
‫‪print(flush=True) # used only for formatting purposes‬‬
‫حُمتم��الن [‪"[(]"Java"،None[ and ]"Python"،None‬جاف��ا"‪،‬ال يوج��د] و ["البايث��ون"‪،‬ال يوج��د])‪ .‬كل خي��ار‬
‫‪response=input() # reads the user's response‬‬ ‫ُمكون من قيمتني‪:‬‬
‫‪# embed the response‬‬ ‫• الن�س احلقيقي لالإجابة املقبولة مثل‪( Java :‬جافا) اأو ‪( Courses on Marketing‬دورات تدريبية يف الت�سويق)‪.‬‬
‫_‪response_embeddings = model_sbert.encode([response], convert_to‬‬
‫)‪tensor=True‬‬
‫• ُمع�رِّف ي�س��ر اإىل ال�س�وؤال الت��ايل ال��ذي �س��يطرحه روب��وت الدرد�س��ة عن��د حُتدي��د ه��ذا اخلي��ار‪ .‬عل��ى �س��بيل املث��ال‪ ،‬اإذا‬
‫‪# embed each candidate answer. x is the text, y is the qa_id. Only embed x.‬‬ ‫�تخدم خي��ار ["‪"[( ]"Courses on Engineering"،"3‬دورات تدريبي��ة يف الهند�س��ة"‪)]"3" ،‬كاإجاب��ة‬ ‫ح � َّدد املُ�س� ِ‬
‫على ال�سوؤال االأول‪ ،‬يكون ال�سوؤال التايل الذي �سيطرحه روبوت الدرد�سة هو ال�سوؤال الثالث‪.‬‬
‫‪183‬‬ ‫‪182‬‬
‫التفاعل الثاين‬
‫‪candidate_embeddings = model_sbert.encode([x for x,y in candidates],‬‬
‫)‪chat(QA,model_sbert, 0.5‬‬ ‫)‪convert_to_tensor=True‬‬

‫‪# gets the similarity score for each candidate‬‬


‫_‪similarity_scores = util.cos_sim(response_embeddings, candidate‬‬
‫?‪>> What type of courses are you interested in‬‬
‫)‪embeddings‬‬
‫‪cooking classes‬‬
‫‪>> Apologies, I could not understand you. Please rephrase your response.‬‬ ‫‪# finds the index of the closest answer.‬‬
‫?‪>> What type of courses are you interested in‬‬
‫‪# np.argmax(L) finds the index of the highest number in a list L‬‬
‫‪software courses‬‬ ‫)]‪winner_index=np.argmax(similarity_scores[0‬‬
‫‪>> You have selected: Courses on Computer Programming‬‬ ‫‪# if the score of the winner is less than the bound, ask again.‬‬
‫?‪>> What type of Programming Languages are you interested in‬‬ ‫‪if similarity_scores[0][winner_index]<sim_lbound:‬‬
‫‪print('>> Apologies, I could not understand you. Please rephrase‬‬
‫‪C++‬‬ ‫)'‪your response.‬‬
‫‪>> You have selected: Java‬‬ ‫‪continue‬‬

‫‪>> Thank you, I just emailed you a list of courses.‬‬ ‫)‪# gets the winner (best candidate answer‬‬
‫]‪winner=candidates[winner_index‬‬
‫يف التفاع��ل الث��اين‪ ،‬يفه��م روب��وت الدرد�س��ة اأن ‪( Cooking Classes‬درو���س الطهي) ال ت�س��به دالل ًي��ا اخليارات املوجودة‬
‫‪# prints the winner's text‬‬
‫يف قاع��دة املعرِ ف��ة‪ .‬وه��و ذك��ي بالق��در ال��كايف ليفه��م اأن ‪( Software courses‬ال��دورات التدريبي��ة يف الربجم��ة) يج��ب‬ ‫)]‪print('\n>> You have selected:',winner[0‬‬
‫اأن ترتب��ط بخي��ار ‪( Courses on Computer Programming‬ال��دورات التدريبي��ة يف برجم��ة احلا�س��ب)‪ .‬اجل��زء‬ ‫)(‪print‬‬
‫�تخدم ‪ C++‬و ‪ .Java‬عل��ى‬ ‫االأخ��ر م��ن التفاع��ل ي�س��لط ال�س��وء عل��ى نق��اط ال�سع��ف‪ :‬يرب��ط روب��وت الدرد�س��ة ب��ني رد املُ�س� ِ‬ ‫‪qa_id=winner[1] # gets the qa_id for this winner‬‬
‫الرغ��م م��ن اأن لغت��ي الربجم��ة مرتبطت��ان بالفع��ل ومُيكن القول باأنهما اأكر ارتباطً ا من لغتي البايثون و ‪ ،C++‬اإال اأن الرد‬
‫‪if qa_id==None: # no more questions to ask, exit the loop‬‬
‫املنا�س��ب يجب اأن ُيو�سح اأن روبوت الدرد�س��ة ال يتمتع بالدراية الكافية للتو�سية بالدورات التدريبية يف لغة ‪ .C++‬اإحدى‬ ‫)'‪print('>> Thank you, I just emailed you a list of courses.‬‬
‫�دال م��ن الت�س��ابه ال��داليل للمقارن��ة ب��ني ال��ردود‬
‫الطرائ��ق ملعاجل��ة ه��ذا الق�س��ور ه��ي ا�س��تخدام الت�س��ابه ب��ني املف��ردات ب� ً‬ ‫‪break‬‬
‫واخليارات ذات ال�سلة ببع�س االأ�سئلة‪.‬‬
‫اأنظر اإىل التفاعلني التاليني بني روبوت الدرد�سة واملُ�ستخدِ م‪:‬‬
‫ا�ستخدام تعلُّم األلة لتوليد ن�ض واقعي‬
‫التفاعل االأول‬
‫‪Using Machine Learning to Generate Re istic Text‬‬
‫الطرائق املو�سحة يف االأق�سام ال�سابقة ت ِ‬
‫َ�ستخدم القوالب‪ ،‬والقواعد‪ ،‬اأو تقنيات التحديد لتوليد الن�سو�س للتطبيقات املختلفة‪.‬‬ ‫)‪chat(QA,model_sbert, 0.5‬‬

‫ُ�ستخدمة يف توليد اللغات الطبيعية (‪.)NLG‬‬


‫يف هذا الق�سم‪� ،‬ستتع َّرف على اأحدث تقنيات تعلُّم االآلة امل َ‬
‫?‪>> What type of courses are you interested in‬‬
‫جدول  ‪ :3.5‬تقنيات تعلُّم األلة املُتقدمة املُ�ستخدَ مة يف توليد اللغات الطبيعية‬ ‫‪marketing courses‬‬
‫الو�سف‬ ‫التقنية‬ ‫‪>> You have selected: Courses on Marketing‬‬
‫�س��بكة الذاك��رة امل ُطو ّل��ة ق�س��رة تتكون �سبكة الذاكرة امل ُطولّة ق�سرة املدى (‪ )LSTM‬من خاليا ذاكرة (‪)Memory Cells‬‬ ‫?‪>> What type of Marketing are you interested in‬‬
‫امل��دى ( ‪ Long Short-Term‬مرتبط�ة ببع��س‪ .‬عن�د اإدخ�ال �سل�س�لة من البيانات اإىل ال�س�بكة‪ ،‬تت�وىل معاجلة كل عن�سر‬ ‫‪seo‬‬
‫يف ال�سل�س�لة واح�دًا تل�و ا آالخ�ر‪ُ ،‬وحُت ِّ�دث ال�س�بكة خالي�ا الذاك�رة لتوليد ُخم� َرج لكل عن�سر‬ ‫‪)Memory - LSTM‬‬ ‫‪>> You have selected: Search Engine Optimization‬‬
‫على حده‪� .‬س�بكات الذاكرة امل ُطولّة ق�سرة املدى (‪ )LSTM‬تنا�س�ب مهام توليد اللغات‬
‫‪>> Thank you, I just emailed you a list of courses.‬‬
‫الطبيعية (‪ )NLG‬لقدرتها على االحتفاظ باملعلومات من �سال�سل البيانات (مثل التع ّرف‬
‫على الكالم اأو الكتابة اليدوية) ومعاجلة تعقيد اللغات الطبيعية‪.‬‬ ‫يف التفاع ��ل االأول‪ ،‬يفه ��م روب ��وت الدرد�س ��ة اأن املُ�س � ِ‬
‫�تخدم يبح ��ث ع ��ن دورات تدريبي ��ة يف الت�س ��ويق‪ .‬وكذل ��ك‪ ،‬روب ��وت‬
‫النماذج املبنية على املحوالت النماذج املبنية على املحوالت هي تلك التي تفهم اللغات الب�س�ريّة وتولّدها‪ ،‬وتَ�س�ت ِند هذه‬ ‫الدرد�س ��ة ذك ��ي بالق ��در ال ��كايف ليفه ��م اأن امل�سطل ��ح ‪ SEO‬ي�س ��به دالل ًي ��ا م�سطل ��ح ‪Search Engine Optimization‬‬
‫النم�اذج يف عمله�ا اإىل تقني�ة االنتب�ا الذات�ي (‪ )Self-Attention‬التي متكِّنها من فهم‬ ‫(‪Transformer-Based‬‬ ‫(حُت�سني حُمركات البحث) مما يوؤدي اإىل اإنهاء املناق�سة بنجاح‪.‬‬
‫جلمل‪.‬‬‫العالقات بني الكلمات املختلفة يف ا ُ‬ ‫‪)Models‬‬
‫‪185‬‬ ‫‪184‬‬
OUTPUT N OUTPUT 2 OUTPUT 1
excellent and the steaks were delicious. I will definitely return soon, highly ‫مُفكِّك الرتميز‬ ‫امل ُرمِّز‬
recommended!' )DECODERS( )ENCODERS( LSTM LSTM LSTM
# encodes the given text into tokens
‫امل ُخرَج‬ ‫امل ُدخَ ل‬ INPUT N INPUT 2 INPUT 1
encoded_text = tokenizer.encode(text, return_tensors='pt')
‫اأنا طالب‬ I am a student "today" "am" "I"
# use the generator to generate more tokens. ‫ املُحوِّل‬:3.30 ‫�سكل‬ ‫ الذاكرة املُطولّة ق�سرة املدى‬:3.29 ‫�سكل‬
# do_sample=True prevents GPT-2 from just predicting the most likely word at every step.
generated_tokens = generator.generate(encoded_text, Transformers ‫املُحوِّألت‬
max_length=200) # max number of new tokens to
generate ،‫ يف منوذج املُحوِّالت‬.‫املُحوِّالت منا�سبة ملهام توليد اللغات الطبيعية لقدرتها على معاجلة البيانات املُدخَ لة املُت�سل�سلة بكفاءة‬
#decode the generates tokens to convert them to words ‫ ثم ُمُي َّرر التمثيل عرب ُمفكِّك الرتميز الذي‬.‫ُمت� َّرر البيان�ات املُدخَ ل�ة ع�رب املُرمِّ �ز ال�ذي يُحوّل املُدخَ الت اإىل متثيل م�س�تمر‬
# skip_special_tokens=True is used to avoid special tokens such as '>' or '-' characters.
print(tokenizer.decode(generated_tokens[0], skip_special_tokens=True))
‫ اإحدى اخل�سائ�س الرئي�سة لهذه النماذج هي ا�ستخدام اآليات االنتباه التي ت�سمح للنموذج بالرتكيز‬.‫ُيولِّد الت�سل�سل املُخرَج‬
‫ اأظهرت مناذج املُح ِّوالت كف�اءة يف توليد الن�س‬.ً‫عل�ى االأج�زاء املُهِ َّم�ة م�ن الت�سل�س�ل يف ح�ني تتجاه�ل االأجزاء االأقل دالل�ة‬
.‫ واالإجابة على االأ�سئلة‬،‫ والتلخي�س‬،‫عايل الدقة للعديد من مهام توليد اللغات الطبيعية مبا يف ذلك ترجمة االآلة‬
We had dinner at this restaurant yesterday. It is very close to my house.
All my friends were there, we had a great time. The location is excellent
and the steaks were delicious.I will definitely return soon, highly OpenAI GPT-2 Model ‫منوذج األإ�سدار الثاين من املُحوِّل التوليدي مُ�سبَق التدريب‬
recommended!
‫) وهو منوذج‬GPT-2( ‫ �س��وف ت�س��تخدم االإ�سدار الثاين من وذج امل ُحوِّل التوليدي مُ�س�بَق التدريب‬،‫يف هذا الق�س��م‬
I've been coming here for a while now and I've been coming here for a while ‫) لتولي��د الن�سو���س املُ�س��تنِدة اإىل الن���س التلقين��ي املُدخَ ��ل بوا�س��طة‬OpenAI( ‫لغ��وي ق��وي طورت��ه �س��ركة اأوب��ن اأي اآي‬
now and I've been coming here for a while now and I've been coming here for
a while now and I've been coming here for a while now and I've been coming )GenerativePre-trainingTransformer2-GPT-2( ‫ االإ�سدار الثاين من امل ُحوِّل التوليدي مُ�سبق التدريب‬.‫ُ�ستخدم‬ ِ ‫امل‬
here for a while now and I've been coming here for a while now and I've ‫ُم��د َّرب عل��ى جمموع��ة بيان��ات ت�س��م اأك��ر م��ن ثم��ان مالي��ني �سفحة ويب ويتمي��ز بالقدرة على اإن�س��اء الن�سو�س الب�س��رية‬
been coming here for a while now and I've been coming here for a while now
and I've been coming here for a while now and I've been coming here for a ‫) املبنية على املُحوِّل ت�سمح‬GPT-2( ‫ ُبنية االإ�سدار الثاين من امل ُحوِّل التوليدي مُ�سبق التدريب‬.‫بعدَّة لغات واأ�ساليب‬
while now and I've been coming here for a while now and I've been coming
here for a while now and I've been coming here for a while now and I've ‫ وهو ُمد َّرب للتنبوؤ بالكلم��ة التالية وفقًا‬،‫) بعي��دة امل��دى وتولي��د الن�سو���س ا ُملتَّ�س��قة‬Dependencies( ‫بتحدي��د التبع َّي��ات‬
been coming here for a while now and ‫ مُيكن ا�س��تخدام النموذج لتوليد ن�سو�س طويلة ج ًدا عرب التنبوؤ امل�س��تمر‬،‫ وبالتايل‬،‫لكل الكلمات ال�س��ابقة �سمن الن�س‬
.‫واإ�سافة املزيد من الكلمات‬
# use the generator to generate more tokens.
# do_sample=True prevents GPT-2 from just predicting the most likely word at every step. %%capture
generated_tokens = generator.generate(encoded_text, !pip install transformers
max_length=200, # max number of new tokens to !pip install torch
generate import torch # an open-source machine learning library for neural networks, required for GPT2.
do_sample=True) from transformers import GPT2LMHeadModel, GPT2Tokenizer

print(tokenizer.decode(generated_tokens[0],skip_special_tokens=True)) # initialize a tokenizer and a generator based on a pre-trained GPT2 model.

# used to:
We had dinner at this restaurant yesterday. It is very close to my house. # -encode the text provided by the user into tokens
All my friends were there, we had a great time. The location is excellent # -translate (decode) the output of the generator back to text
and the steaks were delicious.I will definitely return soon, highly tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
recommended!
# used to generate new tokens based on the inputted text
If you just found this place helpful. If you like to watch videos or generator = GPT2LMHeadModel.from_pretrained('gpt2')
go to the pool while you're there, go for it! Good service - I'm from
Colorado and love to get in and out of this place. The food was amazing!
Also, we were happy to see the waitstaff with their great hands - I went
for dinner. I ordered a small side salad (with garlic on top), and had a
:)GPT-2( ‫يُقدَّم الن�س التايل كاأ�سا�س ي�ستند اإليه االإ�سدار الثاين من امل ُحوِّل التوليدي مُ�سبق التدريب‬
slice of tuna instead. When I was eating, I was able to get up and eat my
salad while waiting for my friend to pick up the plate, so I had a great
time too. Staff was welcoming and accommodating. Parking is cheap in this text='We had dinner at this restaurant yesterday. It is very close to my
neighborhood, and it is in the neighborhood that it needs to house. All my friends were there, we had a great time. The location is

187 186
‫مترينات‬ ‫ي�ستخدم الن�س مفردات غنية وهو‬ِ ‫ حيث‬،‫ مع احلفاظ على دقة و�سالمة الن�س املوَّلد‬،‫يحقّق هذا ُخمرَجات اأكر تنوعً ا‬
.‫) بتخ�سي�س املُخ َرج ب�سكل اأف�سل‬GPT-2( ‫ ي�سمح االإ�سدار الثاين من امل ُحوِّل التوليدي مُ�سبق التدريب‬.‫�سليم نحويًا‬
‫ (درج�ة احل�رارة) ال�ذي ي�س�مح للنم�وذج بتقبل املزيد م�ن املخاطر‬temperature ‫يت�س�ح ذل�ك عن�د ا�س�تخدام ُمتغ�ر‬
1 :‫ مثل‬.‫ القيم االأعلى لهذا املُتغر توؤدي اإىل ن�سو�س اأكر تنوعً ا‬.‫احتماال‬
ً ‫بل واأحيانًا اختيار بع�س الكلمات االأقل‬
‫خاطئة‬ ‫�سحيحة‬ :‫حدِّد اجلملة ال�سحيحة واجلملة اخلاطئة فيما يلي‬ # Generate tokens with higher diversity
generated_tokens = generator.generate(
ّ ‫ توليد اللغات الطبيعية‬.1
‫املبني على تعلُّم االآلة يتطلب جمموعات كبرة من بيانات التدريب‬ encoded_text, max_length=200, do_sample=True, temperature=2.0)
.‫واملوارد احل�سابية‬
print(tokenizer.decode(generated_tokens[0], skip_special_tokens=True))

.)POS( ‫ الفعل هو نوع من و�سوم اأق�سام الكالم‬.2


We had dinner at this restaurant yesterday. It is very close to my house.
ُ ‫ يف حُتلي��ل ِبن��اء ا‬.3
‫ يُ�س��تخدَ م التحلي��ل‬،‫جلم��ل لتولي��د اللغ��ات الطبيعي��ة املبن��يّ عل��ى القوال��ب‬ All my friends were there, we had a great time. The location is excellent
and the steaks were delicious.I will definitely return soon, highly
.)POS( ‫ب�سورة منف�سلة عن و�سوم اأق�سام الكالم‬ recommended!

Worth a 5 I thought a steak at a large butcher was the end story!! We were
.‫ املجت َمعات هي عناقيد العُقد التي ُمتثِّل الكلمات املختلفة دالليًا‬.4 lucky. The price was cheap!! That night though as soon as dinner was on
my turn that price cut completely out. At the tail area they only have
‫ ي�سب��ح روب��وت الدرد�س��ة اأك��ر ذكا ًء كلم��ا ازداد ع��دد م�س��تويات االأ�س��ئلة واالأجوب��ة املُ�سافة‬.5 french fries or kiwifet - no gravy - they get a hard egg the other day too
they call kawif at 3 PM it will be better this summer if I stay more late
.‫اإىل قاعدة املعرِ فة‬ with friends. When asked it takes 2 or 3 weeks so far to cook that in this
house. Once I found a place it was great. Everything I am waiting is just
perfect as usual....great prices especially at one where a single bite
would suffice or make more as this only runs on the regular hours

.)NLG( ‫ قارن بني املنهجيات املختلفة لتوليد اللغات الطبيعية‬2 ‫ فاإنّ النموذج �سيتجاهل االإر�سادات االأ�سا�سية التي تظهر يف امل ُدخَ ل‬،‫ اإذا كانت درجة احلرارة مرتفعة للغاية‬،‫ومع ذلك‬
:‫) ويُولِّد ُخمرجً ا اأقل واقعية ولي�س له معنى‬Original Seed( ّ ‫االأو‬

# Too high temperature leads to divergence in the meaning of the tokens


generated_tokens = generator.generate(
encoded_text, max_length=200, do_sample=True, temperature=4.0)

print(tokenizer.decode(generated_tokens[0], skip_special_tokens=True))

We had dinner at this restaurant yesterday. It is very close to my house.


All my friends were there, we had a great time. The location is excellent
.)NLG( ‫ حدِّد ثالث تطبيقات خمتلفة لتوليد اللغات الطبيعية‬3 and the steaks were delicious.I will definitely return soon, highly
recommended! It has the nicest ambagas of '98 that I like; most Mexican.
And really nice steak house; amazing Mexican atmosphere to this very
particular piece of house I just fell away before its due date, no surprise
my 5yo one fell in right last July so it took forever at any number on
it being 6 (with it taking two or sometimes 3 month), I really have found
comfort/affability on many more restaurants when ordering.If you try at
it they tell ya all about 2 and three places will NOT come out before they
close them/curry. Also at home i would leave everything until 1 hour but
sometimes wait two nights waiting for 2+ then when 2 times you leave you
wait in until 6 in such that it works to

189 188
ُ ‫ ��وذج متثي��الت ترمي��ز ا‬get_max_sim)( ‫�تخدم الدال��ة‬
‫جلم��ل ثنائي��ة‬ ِ �‫ اأكم��ل املقط��ع الربجم��ي الت��ا حت��ى تَ�س‬5 ‫ مف��ردات ُحم � َّددة م��ن الكلم��ات و ��وذج الكلم��ة‬build_graph)( ‫ اأكم��ل املقط��ع الربجم��ي الت��ا حت��ى تقب��ل الدال��ة‬4
ُ ‫ وكل ا‬my_sentence ‫) للمقارن��ة ب��ني جُ مل��ة ُحم� َّددة‬SBERT( ‫اال ��ا م��ن املح��والت‬
‫جلم��ل ال��واردة يف قائم��ة اأخ��رى‬ ‫ يج��ب اأن يحت��وي‬.‫) املُ��د َّرب لر�س��م ُخمطَّ ��ط ذي ُعق��دة واح��دة ل��كل كلم��ة يف املف��ردات املُح� َّددة‬Word2Vec( ‫اإىل املتَّجَ ��ه‬
.my_sentence ‫ اإىل‬L1 ‫ يجب اأن تُعيد الدالة اجلُملة ذات ُموؤ�سر الت�سابه االأعلى من‬.L ‫جلمل‬ ُ ‫من ا‬ ‫) اأك��رب م��ن م�س��توى الت�س��ابه‬Word2Vec( ‫امل ُخطَّ ��ط عل��ى حاف��ة ب��ني عُقدت��ني اإذا كان ت�س��ابه ��وذج الكلم��ة اإىل املتَّجَ ��ه‬
.‫ يجب اأال تكون هناك اأوزان على احلواف‬.‫امل ُعطى‬

from sentence_transformers import , util


from import combinations # tool used to create combinations

from import combinations # tool used to create combinations


import networkx as nx # python library for processing graphs

model_sbert = ('all-MiniLM-L6-v2') def build_graph(vocab:set, # set of unique words

model_wv, # Word2Vec model


def get_max_sim(L1,my_sentence):

similarity_threshold:float

# embeds my_sentence
):

my_embedding = model_sbert, ([my_sentence], convert_to_tensor=True)


pairs=combinations(vocab, ) # gets all possible pairs of words in the vocabulary

# embeds the sentences from L2 G=nx. # makes a new graph

for w1,w2 in pairs: # for every pair of words w1,w2


L_embeddings = model_sbert. (L, convert_to_tensor=True)

sim=model_wv. (w1, w2)# gets the similarity between the two words
similarity_scores = .cos_sim( , )

if :

winner_index=np.argmax(similarity_scores[0])
G. (w1,w2)

return
return G

191 190
‫ماذا تع ّلمت‬ ‫الم�سروع‬

‫ت�سنيف الن�س هو عملية مكونة من خطوتني ت�سمل‪:‬‬


‫اخلطوة االأوىل‪ :‬ا�ستخدام جمموعة من ن�سو�س التدريب ذات القيم (الت�سنيفات) املعروفة لتدريب منوذج‬
‫الت�سنيف‪.‬‬
‫ ت�سنيف الن�ض با�ستخدام مناذج التعلُّم غري املوجَّ ه‪.‬‬ ‫اخلط��وة الثاني��ة‪ :‬ا�س��تخدام من��وذج التدري��ب للتنب�وؤ بالقي��م ل��كل ن� ّ��س يف جمموع��ة بيان��ات االختب��ار‪ .‬القي��م يف‬
‫جمموعة بيانات االختبار اإما غر معروفة اأو خم َّباأة وتُ�ستخدم الحقًا يف عملية التحقق‪.‬‬
‫ ليل الن�ض با�ستخدام مناذج التعلُّم املوجَّ ه‪.‬‬
‫ ا�ستخدام مناذج تعلُّم األلة لتوليد اللغات الطبيعية‪.‬‬
‫يج��ب متثي��ل الن�سو���س يف كل م��ن جمموعات بيانات التدريب واالختبار باملتَّجَ هات قبل ا�س��تخدامها‪ .‬تُ�س��تخدَ م‬
‫ برجمة روبوت درد�سة ب�سيط‪.‬‬ ‫اأدوات ‪ CountVectorizer‬اأو ‪ TfidfVectorizer‬من مكتبة �سكلرن (‪ )Sklearn‬يف الربجمة االجتاهية‪.‬‬

‫تُقدِّ م مكتبة �سكلرن (‪ )Sklearn‬يف لغة البايثون قائمة طويلة من مناذج الت�سنيف‪ .‬مثل‪:‬‬
‫> ()‪GradientBoostingClassifier‬‬
‫> ()‪DecisionTreeClassifier‬‬
‫امل�سطلحات الرئي�سة‬
‫> ()‪RandomForestClassifier‬‬

‫‪Black-Box‬‬ ‫‪Part of Speech‬‬


‫‪predictors‬‬
‫متنبئات ال�سندوق االأ�سود‬ ‫‪)POS( Tags‬‬
‫و�سوم اأق�سام الكالم‬
‫‪Chatbot‬‬ ‫روبوت الدرد�سة‬ ‫‪Senti en‬‬ ‫مهمت��ك ه��ي ا�س��تخدام جمموع��ة بيان��ات التدري��ب ‪ IMDB‬املُ�س��تخدَ مة يف ه��ذا الدر���س لتدري��ب النم��وذج ال��ذي‬
‫‪Analysis‬‬
‫حتليل امل�ساعر‬ ‫يحق��ق اأعل��ى درج��ة م��ن الدق��ة عل��ى جمموع��ة بيان��ات االختب��ار ‪.)imdb_data imdb_ test.csv( IMDB‬‬
‫‪Cluster‬‬ ‫عنقود‬
‫‪Supervised‬‬
‫التعلُّم املوجَّ ه‬ ‫مُيكنك حُتقيق ذلك عرب‪:‬‬
‫‪Dendrogram‬‬ ‫الر�سم ال�سجري‬ ‫‪Learning‬‬
‫‪Dimensionality‬‬ ‫‪Syntax Analysis‬‬ ‫حتليل بِناء اجلُمل‬
‫‪e uction‬‬
‫تقلي�س االأبعاد‬
‫‪1‬‬
‫‪Document‬‬
‫‪o eni tion‬‬ ‫التق�سيم‬ ‫ا�س��تبدال املُ�س ِّن��ف ‪ MultinomialNB‬بنم��اذج ت�سني��ف اأخ��رى م��ن مكتب��ة �س��كلرن (‪)Sklearn‬‬
‫‪Clustering‬‬
‫ميع امل ُ�ستنَدات‬ ‫‪Transfer Learning‬‬ ‫التعلُّم املنقول‬ ‫مثل املو�سحة باالأعلى‪.‬‬
‫‪Natural Language‬‬ ‫‪Unsupervised‬‬
‫‪ener tion‬‬
‫توليد اللغات الطبيعية‬ ‫‪Learning‬‬
‫التعلُّم غر املوجَّ ه‬
‫‪2‬‬
‫‪Natural Language‬‬
‫معاجلة اللغات الطبيعية‬ ‫‪ec ori tion‬‬ ‫الربجمة اال اهية‬ ‫اإعادة ت�سغيل املفكرة التفاعلية لديك بعد اال�ستبدال‪ ،‬حل�ساب دقة كل منوذج جديد بعد جتربته‪.‬‬
‫‪Processing‬‬

‫‪3‬‬
‫اإن�ساء تقرير للمقارنة بني دقة كل النماذج التي ج َّربتها وحُتديد النموذج الذي حقق نتائجَ دقيقة‪.‬‬

‫‪193‬‬ ‫‪192‬‬
‫‪ .4‬التع� ّ�رف على ال�سور‬
‫�س ��يتعرّ ف الطال ��ب يف ه ��ذه الوح ��دة عل ��ى التع ُّل ��م املوجَّ ��ه وغ ��ري املوجَّ ��ه‪ ،‬وكيفي ��ة‬
‫تو يفهم� ��ا للتع� ��رّ ف عل� ��ى ال�س� ��ور (‪ )Image ecognition‬ع� ��ن طري� ��ق اإن�س� ��اء‬
‫من��وذج وتدريب��ه لي�سب� قادرًا على ت�سنيف �سور لروو���ض احليوان��ات اأو ميعها‪.‬‬
‫أي�س ��ا عل ��ى تولي ��د ال�س ��ور (‪ )Image ener tion‬وكيفي ��ة تغيريه ��ا‪،‬‬ ‫و�س ��يتعرّ ف ا ً‬
‫اأو اإكمال األأجزاء الناق�سة فيها مع احلفا على واقعيتها‪.‬‬

‫ا زء الثاين‬
‫اأهداف التعلُّم‬ ‫الوحدة الرابعة‬
‫بنهاية هذه الوحدة �سيكون الطالب قادرًا على اأن‪:‬‬ ‫التعرّف على ال�سور‬
‫ يُعالج ال�سور معا ة اأولية وي�ستخل�ض خ�سائ�سها‪.‬‬ ‫الوحدة اخلام�سة‬
‫موجه خا�ض بت�سنيف ال�سور‪.‬‬ ‫ ُيد ِّرب منوذج تعلُّم َّ‬ ‫خوارزميات التح�سني واتخاذ القرار‬
‫عرف هيكل ال�سبكة الع�سبية‪.‬‬ ‫ ُي ِّ‬ ‫الوحدة ال�ساد�سة‬
‫موجه خا�ض بت ميع ال�سور‪.‬‬ ‫ ُيد ِّرب منوذج تعلُّم غري َّ‬ ‫الذكاء اال�سطناعي واملجتمع‬
‫ يولِّد �سورًا بناءً على توجيه ّ‬
‫ن�سي‪.‬‬
‫ يُكمل األأجزاء الناق�سة يف �سورة ُمعطاة بطريقة واقعية‪.‬‬

‫األأدوات‬
‫ مفكرة جوبيرت (‪)Jupyter Notebook‬‬
‫ قوقل كوألب (‪)Google Colab‬‬

‫‪196‬‬
‫املوجه على التع ّرف‬
‫من ت�سنيف ال�سور اأو مقاطع الفيديو اجلديدة بدقة‪ .‬فعلى �سبيل املثال‪ :‬قد تُد َّرب خوارزمية التعلُّم َّ‬ ‫الدر�ض األأول‬
‫عل��ى �س��الالت ُخمتلف��ة م��ن القط��ط بن��ا ًء عل��ى ال�س��ور املُعَن َون��ة لكل �س��اللة (انظ��ر ال�س��كل ‪ ،)4.1‬و�س��يتم الرتكيز يف هذا‬

‫املوجه عادة على اأربع خطوات رئي�سة وهي‪ :‬جمع البيانات‪ ،‬وعَ نوَنتها‪ ،‬والتدريب عليها‪ ،‬ثم االختبار‪.‬‬
‫املوجه‪.‬‬
‫الدر�س على التعلُّم َّ‬
‫ت�ستمل عملية التعلُّم َّ‬
‫املوجه لتحليل ال�سور‬
‫التع ُّلم َّ‬
‫اأثن��اء جم��ع البيان��ات وو�س��ع امل�س��ميات‪ُ ،‬جتم��ع ال�س��ور اأو مقاطع الفيديو وتنظّ م يف جمموعة بيان��ات‪ ،‬ثم تُعنون كل �سورة‬
‫اأو مقطع فيديو بعنوان �سنف اأو فئة‪ ،‬مثل‪(eagle :‬الن�سر) اأو ‪( cat‬القطّ ة)‪.‬‬
‫وت�س� ِ‬
‫�تخدم خوارزمي��ة تعلُّ��م االآل��ة اأثن��اء مرحل��ة التدريب جمموعة البيان��ات املُعَنوَنة "لتتعلّم" االأمناط وال�س��مات املرتبطة‬ ‫التعلُّم املوجَّ ه يف روية احلا�سب ‪Supervised Learning for Computer Vision‬‬
‫ب��كل �سن��ف اأو فئ��ة‪ ،‬وكلم��ا زادت بيان��ات التدري��ب الت��ي ُتق��دم للخوارزمي��ة اأ�سبح��ت اأك��ر دق��ة يف التع� ّرف عل��ى الفئ��ات‬ ‫ُتع� ُّد روؤي��ة احلا�س��ب (‪ )Computer Vision‬جم� ً�اال فرع ًي��ا م��ن جم��االت ال��ذكاء اال�سطناع��ي‪ ،‬والذي ُيركّز على تعليم اأجهزة احلا�س��ب‬
‫يتح�سن اأداوؤها‪.‬‬
‫املُختلفة يف جمموعة البيانات‪ ،‬وبالتايل ُّ‬ ‫طريق��ة تف�س��ر ال َع� َ�امل املرئ��ي وفهم��ه‪ ،‬ويت�سمن ا�س��تخدام ال�سور الرقمي��ة ومقاطع الفيديو؛ لتدريب االآالت عل��ى التع ّرف على املعلومات‬
‫ومبج��رد اأن ُي��د َّرب النم��وذج‪ ،‬يت��م اختب��اره عل��ى جمموع��ة منف�سل��ة غ��ر الت��ي مت التدري��ب عليه��ا م��ن ال�س��ور اأو مقاط��ع‬ ‫املرئية وحُتليلها مثل‪ :‬االأ�س��ياء واالأ�س��خا�س واملَ�س��اهد‪ .‬ويتمثّل الهدف النهائي الذي ت�س��عى روؤية احلا�س��ب اإىل حُتقيقه يف متكني االآالت‬
‫الفيدي��و؛ لتقيي��م اأدائ��ه‪ ،‬وتختل��ف جمموع��ة االختب��ار عن جمموعة التدري��ب؛ للتاأكد من قدرة النم��وذج على التعميم على‬ ‫من "روؤية" الع ََامل كما يراه الب�سر‪ ،‬وا�ستخدام هذه املعلومات؛ التخاذ قرارات‪ ،‬اأو للقيام باإجراءات‪.‬‬
‫البيان��ات اجلدي��دة‪ .‬عل��ى �س��بيل املث��ال‪ :‬حُتت��وي البيان��ات اخلا�س��ة ب � ‪( cat‬القطّ ��ة) عل��ى خ�سائ���س مث��ل‪ :‬ال��وزن والل��ون‬ ‫هناك جمموعة كبرة من التطبيقات التي تُ�ستخدم فيها روؤية احلا�سب‪ ،‬مثل‪:‬‬
‫وال�ساللة وما اإىل ذلك‪ ،‬وتُقيّم دقة النموذج بنا ًء على مدى كفاءة اأَدائه يف جمموعة االختبار‪.‬‬ ‫• الت�سوير الطبي‪ :‬مُيكن اأن ت�ساعد روؤية احلا�سب االأطباء واملخت�سني يف الرعاية ال�سحية على ت�سخي�س االأمرا�س من خالل حُتليل‬
‫املوجه الأنواع ُخمتلفة من البيانات مثل الن�سو�س‪ ،‬ولكن‬ ‫ت�سبه العملية ال�سابقة اإىل حد كبر العملية املُتّبعة يف مهام التعلُّم َّ‬ ‫ال�سور الطبية مثل‪ :‬االأ�س ّعة ال�سينية‪ ،‬والت�سوير بالرنني املغناطي�سي‪ ،‬واالأ�س ّعة املقطعية‪.‬‬
‫مو�سح يف اجلدول ‪.4.1‬‬ ‫الن�س الأ�سباب متعددة كما هو َّ‬ ‫البيانات املرئية عادة ما تُع ُّد اأكر �سعوبة يف التعامل معها من ّ‬ ‫�تخدم ال�س��يارات ذاتية القيادة والطائرات املُ�س� َّ�رة روؤية احلا�س��ب للتعرف على اإ�س��ارات املرور واأ�س��كال‬ ‫• املركبات ذاتية القيادة‪ :‬ت�س� ِ‬
‫الطرق العامة وطرق امل�ساة والعقبات يف الطريق واجلو‪ ،‬ولِتمكينها من التنقل باأمان وكفاءة‪.‬‬
‫جدول  ‪ :4.1‬د ّيات ت�سنيف البيانات املرئية‬ ‫ال�سناعات‪ ،‬مثل‪� :‬سناعة‬ ‫• �سبط اجلودة‪ :‬تُ�ستخدم روؤية احلا�سب لفح�س املنتجات وحُتديد عيوب الت�سنيع‪ ،‬وذلك يف ُخمتلف اأنواع ّ‬
‫ال�سيارات واالإلكرتونيات واملن�سوجات‪.‬‬
‫حُتت��وي ال�س��ور عل��ى كمي��ة كب��رة م��ن البيان��ات‪ ،‬مم��ا يجع��ل معاجلته��ا وحُتليله��ا اأك��ر‬ ‫البيان��ات املرئي��ة عالي��ة‬
‫�سعوب��ة م��ن البيان��ات الن�س َّي��ة‪ ،‬فف��ي حني اأن العنا�سر االأ�سا�س��ية للم�س��تند الن�سيّ هي‬ ‫االأبعاد‬ ‫• الروبوتية‪ :‬تُ�ستخدم روؤية احلا�سب مل�ساعدة الروبوتات على التنقل والتفاعل مع بيئتها عن طريق التعرّف على االأ�سياء والتعامل معها‪.‬‬
‫الكلم��ات‪ ،‬ف �اإن عنا�س��ر ال�س��ورة ه��ي وح��دات البك�س��ل‪ ،‬و�س��رتى يف ه��ذا الف�س��ل اأنّ‬ ‫املوج��ه نوع��ني رئي�س��ني م��ن تعلُّ��م االآل��ة ُي�س��تخدمان بطريق��ة �س��ائعة يف تطبيق��ات ر ؤوي��ة احلا�س��ب‪ ،‬ويت�سم��ن كال‬
‫املوج��ه وغ��ر َّ‬ ‫ُيع� ُّد التعلُّ��م َّ‬
‫ال�سغرة منها‪.‬‬‫ال�سورة مُيكن اأن تتكون من اآالف وحدات البك�سل‪ ،‬حتّى ّ‬ ‫النوعني خوارزميات تدريب على جمموعات كبرة من ال�سور اأو مقاطع الفيديو؛ لكي تتمكن االآالت من التع ّرف على املعلومات املرئية‬
‫املوج��ه يف الدر�س��ني االأول والثاين م��ن الوحدة الثالثة‪ ،‬وكالهم��ا طُ ِّبق يف معاجلة‬ ‫املوج��ه وغ��ر َّ‬
‫وتف�س��رها‪� .‬س��بق اأن تع ّرف��ت عل��ى التعلُّ��م َّ‬
‫مُيك��ن اأن تتاأث��ر ال�س��ور بالتفا�سي��ل الكث��رة‪ ،‬واالإ�س��اءة‪ ،‬والت�سوي���س‪ ،‬وعوام��ل اأخ��رى‬ ‫البيان��ات املرئي��ة حُتت��وي‬ ‫اللغات الطبيعية (‪ )NLP‬وتوليداللغات الطبيعية (‪ ،)NLG‬و�سيتم تطبيقهما يف هذا الدر�س على حُتليل ال�سور‪.‬‬
‫جتع��ل ت�سنيفه��ا بدق��ة عملي��ة �سعب��ة‪ .‬باالإ�ساف��ة اإىل ذل��ك‪ ،‬هن��اك جمموعة وا�س��عة من‬ ‫عل��ى تفا�سي��ل كث��رة‬ ‫املوج��ه خوارزمي��ات تدري��ب عل��ى جمموع��ات بيانات غ��ر ُمعَنوَنة ‪ -‬اأي ال توجد فيها عناوي��ن اأو فئات �سريحة ‪ ،-‬ثم‬ ‫يت�س َّم��ن التعلُّ��م غ��ر َّ‬
‫البيانات املرئية املتن ّوعة ذات العديد من العنا�سر‪ ،‬وامل�ساهد‪ ،‬وال�سياقات التي ي�سعب‬ ‫ومتن ّوعة للغاية‬ ‫تتع ّل��م اخلوارزمي��ة حُتدي��د االأمن��اط املت�س��ابهة يف البيان��ات دون اأن تك��ون لديه��ا اأي معرف��ة م�س��بقة بالعناوي��ن‪ .‬عل��ى �س��بيل املث��ال‪ :‬مُيك��ن‬
‫ت�سنيفها بدقة‪.‬‬ ‫املوجه لتجميع ال�سور املت�سابهة معًا بنا ًء على ال�سمات امل�سرتكة بينها مثل‪ :‬اللون اأو النق�س (‪)Texture‬‬ ‫ا�ستخدام خوارزمية التعلُّم غر َّ‬
‫يتب��ع الن� ّ��س بُني��ة لغوي��ة وقواع��د نحو ّي��ة عامة‪ ،‬بينم��ا ال تخ�سع البيان��ات املرئية لقواعد‬ ‫البيان��ات املرئي��ة ال تتب��ع‬ ‫املوجه بالتف�سيل يف الدر�س الثاين‪.‬‬ ‫اأو ال�سكل‪ .‬و�سيتم تو�سيح التعلُّم غر َّ‬
‫ثابتة؛ مما يجعل عملية التحليل اأكر تعقيدً ا و�سعوبة وتكلفة‪.‬‬ ‫هيكلة حُمددة‬ ‫املوج��ه تدري��ب اخلوارزمي��ات على جمموعات بيان��ات ُمعَنوَنة؛ حيث يُخ�س�س عنوان اأو فئة مع ّينة لكل �سورة‬ ‫يف املقاب��ل‪ ،‬يت�سم��ن التعلُّ��م َّ‬
‫اأو مقطع فيديو‪ ،‬ثم تقوم اخلوارزمية بعد ذلك بالتع ّرف على اأمناط وخ�سائ�س كل عنوان؛ لتتمكن‬
‫امل ُخرَج املُعَنون‬ ‫وذج ت�سنيف تعلُّم االآلة‬ ‫�سورة خام‬
‫متخ�س�سة‪ ،‬وتتناول هذه الوحدة التقنيات التي‬
‫ّ‬ ‫نتيجة لهذه التعقيدات يتطلب الت�سنيف الفعّال للبيانات املرئية اأ�ساليب‬
‫ِ‬
‫ت�ستخدم اخل�سائ�س الهند�سية واللونية لل�سور‪ ،‬باالإ�سافة اإىل اأ�ساليب تعلُّم االآلة املُتقدمة القائمة على ال�سبكات الع�سبية‪.‬‬ ‫ر عربي‬ ‫‪98%‬‬

‫يو�سح الدر�س االأول كيفية ا�ستخدام لغة البايثون (‪ )Python‬يف‪:‬‬ ‫ِّ‬


‫• حُتميل جمموعة بيانات من ال�سور املُعَنوَنة‪.‬‬ ‫‪ 1%‬تفاحة‬
‫• حُتويل ال�سور اإىل �سيغة رقمية مُيكن اأن ت�ستخدمها خوارزميات روؤية احلا�سب‪.‬‬
‫• تق�سيم البيانات الرقمية اإىل جمموعات بيانات للتدريب‪ ،‬وجمموعات بيانات لالختبار‪.‬‬ ‫‪� 1%‬سيارة‬
‫�سكل ‪ :4.1‬ت�سنيف ال�سور با�ستخدام روؤية احلا�سب‬
‫‪198‬‬ ‫‪197‬‬
‫• حُتليل البيانات؛ ال�ستخراج اأمناط وخ�سائ�س مفيدة‪.‬‬
‫‪resized_images, labels, filenames = resize_images("AnimalFace/Image",‬‬
‫‪width=100, height=100) # retrieves the images with their labels and resizes them to 100 x 100‬‬ ‫• ا�ستخدام البيانات امل�ستخل�سة؛ لتدريب مناذج الت�سنيف التي مُيكن ا�ستخدامها للتنب ؤو بعناوين ال�سور اجلديدة‪.‬‬
‫حُتتوي جمموعة البيانات التي �ست�ستخدمها على األف و�سبعمئة وثالثني (‪� )1,730‬سورة لوجوه �ستّة ع�سر نوعً ا ُخمتلفًا‬
‫‪BearHead‬‬ ‫‪EagleHead‬‬ ‫‪PigeonHead‬‬ ‫هذه هي اأ�سماء المجلدات‪ ،‬وبدون‬ ‫املوجه لتطبيق التقنيات املذكورة �سابقًا‪.‬‬
‫من احليوانات‪ ،‬وبالتايل فهي جمموعة مثالية للتعلُّم َّ‬
‫‪CatHead‬‬ ‫‪ElephantHead‬‬ ‫‪RabbitHead‬‬ ‫المقطع الالحق ‪( Head‬راأ�س)‪ ،‬تُمثِّل‬
‫‪ChickenHead‬‬ ‫‪LionHead‬‬ ‫‪SheepHead‬‬ ‫تها األأولية ‪Loading and Preprocessing Images‬‬ ‫ميل ال�سور ومعا‬
‫‪CowHead‬‬ ‫‪MonkeyHead‬‬ ‫‪TigerHead‬‬
‫هذه االأ�سماء عناوين لل�سور الموجودة‬
‫‪DeerHead‬‬ ‫‪Natural‬‬ ‫‪WolfHead‬‬ ‫داخلها‪.‬‬ ‫ي�س��تورد املقط��ع الربجم��ي الت��ايل جمموع��ة م��ن املكتب��ات الت��ي تُ�س��تخدم لتحمي��ل ال�س��ور م��ن جمموع��ة بيان��ات‬
‫‪DuckHead‬‬ ‫‪PandaHead‬‬ ‫‪( LHI-Animal- Faces‬وجوه _احليوانات) وحُتويلها اإىل �سيغة رقمية‪:‬‬

‫تُن�س��ئ دال��ة ()‪ imread‬تن�س��يق األ��وان لل�س��ورة ُيع��رف ب � "‪،"RGB‬‬ ‫‪%%capture‬‬


‫‪import matplotlib.pyplot as plt # used for visualization‬‬
‫ويُ�س��تخدم ه��ذا التن�س��يق عل��ى نط��اق وا�س��ع؛ الأن��ه ي�س��مح بتمثي��ل‬ ‫‪from os import listdir # used to list the contents of a directory‬‬
‫جمموعة وا�سعة من االألوان‪ .‬ويف نظام االألوان ‪ ،RGB‬تعني االأحرف‬
‫‪!pip install scikit-image # used for image manipulation‬‬
‫‪ R‬و ‪ G‬و ‪ B‬احت��واء التن�س��يق عل��ى ثالث��ة مكون��ات رئي�س��ة لالأل��وان‪،‬‬ ‫)‪from skimage.io import imread # used to read a raw image file (e.g. png or jpg‬‬
‫وه��ي الل��ون االأحم��ر (‪ )R = Red‬والل��ون االأخ�سر (‪)G = Green‬‬ ‫‪from skimage.transform import resize # used to resize images‬‬
‫والل��ون االأزرق (‪ُ .)B = Blue‬مُي َّث��ل كل بك�س��ل بث��الث قن��وات وه��ي‪:‬‬ ‫‪# used to convert an image to the "unsigned byte" format‬‬
‫(قن��اة لل��ون االأحم��ر‪ ،‬وقن��اة لل��ون االأخ�سر‪ ،‬وقناة لل��ون االأزرق)‪ ،‬كل‬ ‫‪from skimage import img_as_ubyte‬‬
‫قن��اة حُت��وي ثماني��ة ب��ت (‪ ،)8-bit‬ومُيك��ن اأن ياأخ��ذ البك�س��ل قيم��ة‬
‫ب��ني‪ 0 :‬و‪ُ .255‬يع��رف التن�س��يق ‪ 255-0‬ا ً‬
‫أي�س��ا با�س��م تن�س��يق الباي��ت‬ ‫تتطل�ب خوارزمي�ات التعلُّ�م املوجَّ �ه اأن تك�ون كل ال�س�ور يف جمموع�ة البيان�ات له�ا االأبع�اد نف�س�ها‪ ،‬ولذل�ك ف�اإن املقط�ع‬
‫بدون اإ�سارة (‪.)Unsigned byte‬‬ ‫الربجم�ي الت�ايل يق�راأ ال�س�ور م�ن ‪( input_folder‬جمل�د_ املُدخَ �الت) و ُيغ ِّ�ر حج�م كل منه�ا بحي�ث تك�ون له�ا اأبع�اد‬
‫�سكل ‪� :4.2‬سورة راأ�س اأ�سد اأ�سلية‬ ‫الطول والعر�س نف�سها‪:‬‬
‫يتي��ح اجلم��ع ب��ني ه��ذه القن��وات الث��الث متثي��ل جمموع��ة وا�س��عة م��ن‬
‫االألوان يف البك�سل‪ ،‬على �سبيل املثال‪ :‬البك�سل ذو القيمة (‪� )255 ،0 ،0‬سيكون لونه اأحمر بالكامل‪ ،‬والبك�سل ذو القيمة‬
‫‪def resize_images(input_folder:str,‬‬
‫(‪� )0 ،255 ،0‬س��يكون لون��ه اأخ�س��ر بالكام��ل‪ ،‬والبك�س��ل ذو القيم��ة (‪� )0 ،0 ،255‬س��يكون لون��ه اأزرق بالكام��ل‪ ،‬والبك�س��ل‬ ‫‪width:int,‬‬
‫ذو القيمة (‪� )255 ،255 ،255‬سيكون لونه اأبي�س‪ ،‬والبك�سل ذو القيمة (‪� )0 ،0 ،0‬سيكون لونه اأ�سود‪.‬‬ ‫‪height:int‬‬
‫‪):‬‬
‫يف نظ��ام االأل��وان ‪ُ ،RGB‬ترت��ب قي��م البك�س��ل يف �س��بكة ثنائي��ة االأبع��اد‪ ،‬حُتت��وي على �سف��وف واأعمدة ُمت ِّث��ل اإحداثيات ‪ x‬و‪y‬‬
‫للبك�س��الت يف ال�س��ورة‪ ،‬و ُي�س��ار اإىل ه��ذه ال�س��بكة با�س��م م�سفوف��ة ال�س��ور (‪ .)Image Matrix‬عل��ى �س��بيل املث��ال‪� ،‬س��ع‬ ‫‪labels = [] # a list with the label for each image‬‬
‫يف اعتبارك ال�سورة املوجودة يف ال�سكل ‪ 4.2‬واملقطع الربجمي املرتبط بها اأدناه‪:‬‬ ‫‪resized_images = [] # a list of resized images in np array format‬‬
‫‪filenames = [] # a list of the original image file names‬‬

‫‪# reads an image file, stores it in a variabe and‬‬ ‫‪for subfolder in listdir(input_folder): # for each sub folder‬‬
‫‪# shows it to the user in a window‬‬
‫)'‪image = imread('AnimalFace/Image/LionHead/lioni78.jpg‬‬ ‫)‪print(subfolder‬‬
‫)‪plt.imshow(image‬‬ ‫‪path = input_folder + '/' + subfolder‬‬
‫‪image.shape‬‬
‫‪for file in listdir(path): # for each image file in this subfolder‬‬

‫)‪(169, 169, 3‬‬


‫‪image = imread(path + '/' + file) # reads the image‬‬
‫‪resized = img_as_ubyte(resize(image, (width, height))) # resizes the image‬‬
‫تك�س��ف طباع��ة �س��كل ال�س��ورة ع��ن م�سفوف��ة ‪ ،169 × 169‬باإجم��ايل‪ :‬ثماني��ة وع�س��رين األ ًف��ا وخم�س��مئة وواح��د و�س��تني‬ ‫‪labels.append(subfolder[:-4]) # uses subfolder name without "Head" suffix‬‬
‫(‪ )28,561‬بك�سل‪ ،‬ومُيثِّل الرقم ‪ 3‬يف العمود الثالث القنوات الثالث (اأحمر اأخ�سر اأزرق) لنظام االألوان ‪.RGB‬‬ ‫‪resized_images.append(resized) # stores the resized image‬‬
‫)‪filenames.append(file‬‬ ‫‪# stores the filename of this image‬‬
‫على �سبيل املثال‪� ،‬سيطبع املقطع الربجمي التايل قيمة االألوان للبك�سل االأول من هذه ال�سورة‪:‬‬
‫‪return resized_images, labels, filenames‬‬
‫‪# the pixel at the first column of the first row‬‬ ‫‪[102‬‬ ‫‪68‬‬ ‫]‪66‬‬
‫)]‪print(image[0][0‬‬
‫‪200‬‬ ‫‪199‬‬
‫يوؤدي تغير احلجم اإىل حُتويل ال�سور من تن�سيق ‪ RGB‬اإىل تن�سيق مُ�ستنِد على عدد حقيقي (‪:)Float-based‬‬
‫]‪pos1 = violations[0‬‬
‫]‪pos2 = violations[1‬‬
‫))‪resized = resize(image, (100, 100‬‬
‫)]‪print(filenames[pos1‬‬ ‫)‪print(resized.shape‬‬
‫)‪print(resized_images[pos1].shape‬‬ ‫)]‪print(resized[0][0‬‬
‫)]‪plt.imshow(resized_images[pos1‬‬
‫)]‪plt.title(labels[pos1‬‬
‫)‪(100, 100, 3‬‬
‫]‪[0.40857161 0.27523827 0.26739514‬‬
‫‪cow1.gif‬‬
‫)‪(100, 100, 4‬‬
‫عل��ى الرغ��م م��ن اأن ال�س��ورة ق��د غُ � ّ�ر حجمه��ا اإىل م�سفوف��ة ذات اأبع��اد ‪ ،100 × 100‬ف�اإن قي��م القن��وات الث��الث ‪RGB‬‬
‫ل��كل بك�س��ل مت ت�س��ويتها (‪ )Normalized‬لتك��ون ذات قيم��ة ب��ني ‪ 0‬و‪ ،1‬ومُيك��ن اإع��ادة حُتويله��ا م��رة اأخ��رى اإىل تن�س��يق‬
‫البايت بدون اإ�سارة من خالل املقطع الربجمي التايل‪:‬‬
‫�سكل ‪� :4.4‬سورة باالأحمر واالأخ�سر واالأزرق واألفا (‪)RGBA‬‬
‫)‪resized = img_as_ubyte(resized‬‬ ‫)‪(100, 100, 3‬‬
‫;)]‪print(filenames[pos2‬‬ ‫)‪print(resized.shape‬‬ ‫]‪[104 70 68‬‬
‫;)‪print(resized_images[pos2].shape‬‬ ‫)]‪print(resized[0][0‬‬ ‫]‪[102 68 66‬‬
‫;)]‪plt.imshow(resized_images[pos2‬‬ ‫)]‪print(image[0][0‬‬
‫;)]‪plt.title(labels[pos2‬‬

‫تختلف قيم االألوان ‪ RGB‬للبك�س��ل الذي غُ ّر حجمه اختالفًا ب�س��يطً ا‬


‫‪tiger0000000168.jpg‬‬ ‫ع��ن القي��م املوج��ودة يف ال�س��ورة االأ�سلي��ة‪ ،‬وه��و م��ن االآث��ار ال�س��ائعة‬
‫)‪(100, 100‬‬
‫الناجتة عن تغير احلجم‪ ،‬وعند طباعة ال�سورة التي غُ ّر حجمها‪،‬‬
‫يتب��ني اأنه��ا اأق��ل و�سوحً ��ا‪ ،‬كم��ا يظه��ر يف ال�س��كل ‪ ،4.3‬وه��ذا ن��اجت ع��ن‬
‫ال�سورة االأوىل‪ :‬لها �سكل ذو اأبعاد (‪ ،)100 ،100 ،4‬ويد ُّل الرقم‬ ‫�سغط امل�سفوفة ‪ 169 × 169‬اإىل تن�سيق ‪.100 × 100‬‬
‫�دال م�ن تن�س�يق ‪ ، RGB‬و ه�ذا التن�س�يق‬ ‫‪ 4‬اأنه�ا بتن�س�يق ‪ RGBA‬ب ً‬
‫يحت�وي عل�ى قن�اة اإ�سافي�ة رابع�ة تدع�ى قن�اة األف�ا (‪ )Alpha‬الت�ي‬ ‫‪# displays the resized image‬‬
‫�سكل ‪� :4.5‬سورة ّ‬
‫تبني �سفافية كل بك�سل‬
‫ُمتثِّل �س�فافية كل بك�س�ل‪ .‬على �س�بيل املثال‪:‬‬ ‫;)‪plt.imshow(resized‬‬

‫‪# prints the first pixel of the RGBA image‬‬ ‫قبل بدء التدريب على خوارزميات التعلُّم املوجَّ ه‪ ،‬من اجليد التحقق‬
‫‪# a value of 255 reveals that the pixel is not transparent‬‬ ‫�سكل ‪� :4.3‬سورة راأ�س اأ�سد غُ ّر حجمها‬ ‫مم��ا اإذا كان��ت اأي �س��ورة م��ن ال�س��ور املوج��ودة يف جمموعة البيانات‬
‫‪at all.‬‬ ‫غر مطابقة للتن�سيق (‪.)100 ،100 ،3‬‬
‫]‪resized_images[pos1][0][0‬‬

‫‪violations = [index for index in range(len(resized_images)) if‬‬


‫)‪array([135, 150, 84, 255], dtype=uint8‬‬ ‫])‪resized_images[index].shape != (100,100,3‬‬

‫‪violations‬‬
‫ال�س��ورة الثاني��ة‪ :‬له��ا �س��كل ذو اأبع��اد (‪ ،)100 ،100‬وي��د ُّل غي��اب‬
‫ال ُبع��د الثال��ث عل��ى اأن ال�سورة بتن�س��يق ت��درج رم��ادي (‪)Grayscale‬‬
‫ولي�س��ت بتن�س��يق ‪ ،RGB‬والتن�س��يق امل�س ِّل��ل اأ�سف��ر اأزرق‬ ‫]‪[455, 1587‬‬

‫(‪ )Misleading yellow blue‬املب��ني �س��ابقًا يع��ود اإىل خريط��ة‬


‫�سكل ‪� :4.6‬سورة بتدرج رمادي‬ ‫لوني��ة ُتطبّقه��ا الدال��ة ‪ imshow‬ب�س��كل افرتا�س��ي عل��ى ال�س��ور ذات‬ ‫يك�س��ف ه��ذا املقط��ع الربجم��ي ع��ن وج��ود �سورت��ني غ��ر مطابقت��ني لتل��ك ال�سيغ��ة‪ ،‬وه��ذا غ��ر متوق��ع الأن دال��ة‬
‫التدرج الرمادي‪ ،‬ومُيكن اإلغاوؤه كما يلي‪:‬‬ ‫()‪َّ resize_image‬مت تطبيقه��ا عل��ى جمي��ع ال�س��ور املوج��ودة يف جمموعة البيانات‪ .‬يقوم املقطعان الربجميان التاليان‬
‫بطباعة هاتني ال�سورتني‪ ،‬باالإ�سافة اإىل اأبعادهما وا�سمي ملفيهما‪:‬‬
‫)'‪plt.imshow(resized_images[pos2], cmap = 'gray‬‬

‫‪202‬‬ ‫‪201‬‬
‫تتم ّث��ل اخلط��وة التالي��ة يف حُتوي��ل ‪( resized_images‬ال�س��ور _ املُع� َّدل حجمه��ا) وقوائ��م العناوي��ن اإىل م�سفوف��ات‬ ‫(بدال من قنوات ‪ RGB‬الثالث)‪ ،‬وقيمة كل بك�سل عبارة عن رقم واحد يرتاوح‬ ‫�سور التدرج الرمادي لها قناة واحدة فقط ً‬
‫أي�سا‬ ‫‪( Numpy‬منب��اي) ح�س��ب م��ا تتوقع��ه العدي��د م��ن خوارزمي��ات روؤي��ة احلا�س��ب‪ .‬ي�س� ِ‬
‫�تخدم املقط��ع الربجمي الت��ايل ا ً‬ ‫من ‪ 0‬اإىل ‪ ،255‬حيث ُمتثِّل قيمة البك�سل ‪ 0‬اللون االأ�سود‪ ،‬بينما ُمتثِّل قيمة البك�سل ‪ 255‬اللون االأبي�س‪ .‬على �سبيل املثال‪:‬‬
‫املتغرات (‪ )X، Y‬التي تُ�س��تخدم يف العادة لتمثيل البيانات والعناوين على التوايل يف مهام التعلُّم َّ‬
‫املوجه‪:‬‬ ‫ِّ‬
‫]‪resized_images[pos2][0][0‬‬
‫‪import numpy as np‬‬
‫)‪X = np.array(resized_images‬‬
‫‪100‬‬
‫)‪Y = np.array(labels‬‬

‫‪X.shape‬‬ ‫وكاختب��ار اإ�س��ايف جل��ودة البيان��ات‪ ،‬يق��وم املقط��ع الربجم��ي الت��ايل بح�س��اب تك��رار عن��وان كل �س��ورة حي��وان يف جمموعة‬
‫البيانات‪:‬‬
‫)‪(1720, 100, 100, 3‬‬
‫‪# used to count the frequency of each element in a list.‬‬ ‫‪Counter({'Bear': 101,‬‬
‫‪from collections import Counter‬‬ ‫‪'Cat': 160,‬‬
‫يو�س��ح �س��كل جمموع��ة بيان��ات ‪ X‬النهائي��ة ا�س��تمالها عل��ى أال��ف و�س��بعمئة وع�س��رين �س��ورة بتن�س��يق ‪ ،RGB‬بن��ا ًء عل��ى عدد‬
‫ِّ‬ ‫‪'Chicken': 100,‬‬
‫القنوات‪ ،‬وجميعها باأبعاد ‪( 100 × 100‬اأي ع�س��رة اآالف بك�س��ل)‪ .‬اأخرًا‪ ،‬مُيكن ا�س��تخدام دالة ()‪train_test_split‬‬ ‫)‪label_cnt = Counter(labels‬‬ ‫‪'Cow': 104,‬‬
‫من مكتبة ‪ sklearn‬لتق�سيم جمموعة البيانات اإىل جمموعة تدريب وجمموعة اختبار‪.‬‬ ‫‪label_cnt‬‬ ‫‪'Deer': 103,‬‬
‫‪'Duck': 103,‬‬
‫‪'Eagle': 101,‬‬
‫‪from sklearn.model_selection import train_test_split‬‬ ‫‪'Elephant': 100,‬‬
‫‪'Lion': 102,‬‬
‫(‪X_train, X_test, y_train, y_test = train_test_split‬‬ ‫‪'Monkey': 100,‬‬
‫‪X,‬‬ ‫‪'Nat': 8,‬‬
‫‪y,‬‬
‫هنا يمكنك روؤية القيمة المتطرفة وهي فئة‬
‫‪'Panda': 119,‬‬
‫‪test_size = 0.20, # uses 20% of the data for testing‬‬ ‫‪ Nature( Nat‬اأو الطبيعة)‪ ،‬وتحتوي على‬ ‫‪'Pigeon': 115,‬‬
‫‪shuffle = True,‬‬ ‫‪# to randomly shuffle the data.‬‬ ‫ثمانية عنا�سر فقط مقارنة بالفئات االأخرى‪.‬‬ ‫‪'Rabbit': 100,‬‬
‫‪random_state = 42, # to ensure that data is always shuffled in the same way‬‬
‫‪'Sheep': 100,‬‬
‫)‬
‫‪'Tiger': 114,‬‬
‫)}‪'Wolf': 100‬‬
‫نظرًا الأن جملدات �سور احليوانات حُ مّلت جملّدً ا تلو االآخر‪ ،‬فاإن ال�سور من كل جملد جُ معت معًا يف القوائم ال�س��ابقة‪،‬‬
‫وقد يوؤدي ذلك اإىل ت�سليل العديد من اخلوارزميات‪ ،‬خا�سة يف جمال روؤية احلا�سب‪ ،‬و�سبط ‪( shuffle=True‬تفعيل‬ ‫حُتت�وي جمموع�ة البيان�ات عل�ى �س�ور حيوان�ات و�س�ور اأخ�رى م�ن الطبيعة؛ وذل�ك بهدف التعرّف عل�ى ال�سور التي ت�س�ذ عن �سور‬
‫اإعادة الرتتيب) يف املقطع الربجمي ال�س��ابق يحل هذه امل�س��كلة‪ ،‬وبوجه عام‪ ،‬من اجليد اإعادة ترتيب البيانات ع�س��وائيًا‬ ‫احليوان�ات‪ .‬يك�س�ف ‪( Counter‬الع�داد) ع�ن فئ�ة �سغ�رة جدًا عنوانها ‪( Nat‬الطبيع�ة)‪ ،‬وحُتتوي على ثماين �سور فقط‪ ،‬وعندما‬
‫قبل اإجراء اأي حُتليل‪.‬‬ ‫تقوم بك�سف �سريع يت�سح لك اأن هذه الفئة ذات قيم متطرفة (‪ )Outlier‬حُتتوي على �سور ملناظر طبيعية وال يوجد بها اأي وجه‬
‫الأي حيوان‪.‬‬
‫التنبو بدون هند�سة اخل�سائ�ض ‪re iction without Feature Engineering‬‬
‫عل��ى الرغ��م م��ن اأن اخلط��وات املتَّبع��ة يف الق�س��م ال�س��ابق ق��د ح َّول��ت البيان��ات اإىل تن�س��يق رقم��ي‪ ،‬اإال اأن��ه لي���س بالتن�س��يق‬ ‫يق�وم املقط�ع الربجم�ي الت�ايل باإزال�ة �سورة ‪ RGBA‬و�سورة الت�درج الرمادي‪ ،‬وكذلك كل ال�سور التي تنتمي لفئة ‪( Nat‬الطبيعة)‬
‫القيا�س��ي اأح��ادي ال ُبع��د ال��ذي تتوقع��ه العدي��د م��ن خوارزمي��ات تعلُّم االآلة‪ .‬على �س��بيل املثال‪ ،‬و�سفتْ الوح��دة الثالثة كيف‬ ‫من قوائم اأ�سماء امللفات‪ ،‬والعناوين‪ ،‬وال�سور التي غُ ّر حجمها‪.‬‬
‫يج��ب حُتوي��ل كل م�س��تند اإىل متَّجَ ��ه رقم��ي اأح��ادي ال ُبع��د قبل ا�س��تخدام البيانات يف تدريب مناذج تعلُّ��م االآلة واختبارها‪،‬‬
‫بينما حُتتوي كل نقطة بيانات يف جمموعة البيانات املرئية هنا على تن�سيق ثالثي االأبعاد‪.‬‬ ‫)‪N = len(labels‬‬

‫‪resized_images = [resized_images[i] for i in range(N) if i not in violations‬‬


‫‪X_train[0].shape‬‬ ‫]"‪and labels[i] != "Nat‬‬
‫‪filenames = [filenames[i] for i in range(N) if i not in violations and‬‬
‫]"‪labels[i] != "Nat‬‬
‫)‪(100, 100, 3‬‬
‫=! ]‪labels = [labels[i] for i in range(N) if i not in violations and labels[i‬‬
‫]"‪"Nat‬‬

‫‪204‬‬ ‫‪203‬‬
‫لذل��ك مُيك��ن ا�س��تخدام املقط��ع الربجم��ي الت��ايل لت�س��طيح (‪ )Flatten‬كل �س��ورة يف متَّجَ ��ه أاح��ادي ال ُبع��د‪ ،‬ف��كل �س��ورة‬
‫االآن ممثَّلة كمتَّجَ ه رقمي م�سطح قيمته ‪ 30,000 = 100 × 100 × 3‬قيمة‪.‬‬
‫)]‪X_train_flat = np.array([img.flatten() for img in X_train‬‬
‫)]‪X_test_flat = np.array([img.flatten() for img in X_test‬‬
‫‪X_train_flat[0].shape‬‬

‫)‪(30000,‬‬

‫ت�ساعد القيم الم�سوّاة‬


‫(‪)Normalized Values‬‬ ‫مُيكن ا�س��تخدام هذا التن�س��يق امل�س��طح مع اأي خوارزمية ت�سنيف قيا�س��ية دون بذل اأي جهد اإ�سايف لهند�س��ة خ�سائ�س‬
‫على روؤية العنا�سر على‬ ‫�يو�سح الق�س��م الت��ايل مث� ً�اال عل��ى هند�س��ة اخل�سائ���س لبيان��ات �س��ورة‪ ،‬وي�س��تخدم املقط��ع الربجم��ي‬
‫تنبوؤي��ة اأخ��رى‪ ،‬و�س� ِّ‬
‫هيئة ن�سب مئوية‪.‬‬ ‫الت��ايل مُ�س ِّن��ف باي��ز ال�س��اذج (‪ )Naive Bayes - NB‬ال��ذي ا�س �تُخدم ا ً‬
‫أي�س��ا لت�سني��ف البيان��ات الن�س َّي��ة يف الوح��دة‬
‫الثالثة‪:‬‬

‫‪from sklearn.naive_bayes import MultinomialNB # imports the Naive Bayes Classifier‬‬

‫)(‪model_MNB = MultinomialNB‬‬
‫‪model_MNB.fit(X_train_flat,y_train) # fits the model on the flat training data‬‬

‫�سكل ‪ :4.7‬م�سفوفة الدقة اخلا�سة باأداء خوازرمية ‪Multinomial B‬‬ ‫)(‪MultinomialNB‬‬

‫ُحُتق�ق خوارزمي�ة باي�ز ال�س�اذجة متع�ددة احل�دود(‪ )MultinomialNB‬دق�ة‬


‫خوارزمية بايز ال�ساذجة متعددة‬ ‫تق�ارب ‪ ،30%‬وعل�ى الرغ�م م�ن اأن ه�ذه الن�س�بة ق�د تب�دو قليل�ة‪ ،‬اإال اأن علي�ك‬ ‫‪from sklearn.metrics import accuracy_score # used to measure the accuracy‬‬
‫احلدود( ‪:) u tino i‬‬ ‫النظ�ر اإليه�ا يف �س�وء اأن جمموع�ة البيان�ات تت�سم�ن ع�س�رين عنوانً�ا ُخمتلف�ا‪.‬‬ ‫‪pred = model_MNB.predict(X_test_flat) # gets the predictions for the flat test set‬‬
‫ه ��ي خوارزمي ��ة تعلُّ ��م آال ��ة تُ�س ��تخدم لت�سني ��ف‬
‫افرت��س وج�ود جمموعة بيان�ات متوازنة ن�س�بيًا ُيغطي فيها‬ ‫ويعن�ي ذل�ك اأنّ�ه ل�و ُ‬ ‫)‪accuracy_score(y_test,pred‬‬
‫الن�سو� ��س اأو البيان ��ات ا أالخ ��رى يف فئ ��ات‬‫كل عنوان ‪ 20 1‬من البيانات‪ ،‬فاإن املُ�سنِّف الع�سوائي الذي ُيخ�س�س عنوانًا‬
‫ُخمتلف��ة‪ ،‬وتعتم��د عل��ى خوارزمي��ة باي��ز ال�س��اذج‬
‫لكل نقطة اختبار ب�سكل ع�سوائي‪� ،‬سيحقق دقة تبلغ حوايل ‪ ،5%‬ولذلك �ستكون‬ ‫‪0.36046511627906974‬‬
‫(‪ )Naive Bayes‬وه��ي طريق��ة ب�س��يطة وفعّال��ة‬ ‫الدقة بن�سبة ‪ 30%‬اأعلى ب�ست مرات من التخمني الع�سوائي‪.‬‬
‫حلل م�سكالت الت�سنيف‪.‬‬ ‫مو�سح يف االأق�سام التالية‪ ،‬مُيكن حُت�سني هذه الدقة حُت�سينًا‬ ‫ومع ذلك‪ ،‬كما هو َّ‬ ‫يعر�س املقطع الربجمي التايل م�سفوفة الدقة (‪)Confusion Matrix‬اخلا�سة بالنتائج الإعطاء روؤية اإ�سافية‪:‬‬
‫جماال للتح�س�ني‪ .‬على �س�بيل‬‫أي�س�ا اأن هناك ً‬ ‫ملحوظً �ا‪ ،‬وتوؤك�د م�سفوف�ة الدق�ة ا ً‬
‫خوارزمية مُ�سنِّف األنحدار التَّدرجي‬ ‫املث�ال‪ ،‬غالبً�ا م�ا يخط�ئ من�وذج باي�ز ال�س�اذج وي�سنِّ�ف ‪( Pigeons‬احلَ مَ�ام)‬ ‫‪%%capture‬‬
‫عل�ى اأنه�ا ‪( Eagles‬ن�س�ور) اأو ي�سنِّ�ف ‪( Wolves‬الذئ�اب) عل�ى اأنه�ا ‪Cats‬‬ ‫‪!pip install scikit-plot‬‬
‫‪:)S‬‬ ‫الع�سوائي(‪ssi er‬‬ ‫‪import scikitplot‬‬
‫ه�ي خوارزمي�ة تعلُّ�م اآل�ة تُ�س�تخدم يف ت�سني�ف‬ ‫(قط�ط)‪ .‬تكم�ن اأ�س�هل طريق�ة ملحاول�ة حُت�س�ني النتائ�ج يف ت�رك البيانات كما‬
‫البيانات يف فئات ُخمتلفة اأو جمموعات‪ ،‬وتعتمد‬ ‫ه�ي‪ ،‬والتجري�ب با�س�تخدام مُ�س ِّنف�ات ُخمتلف�ة‪ ،‬وم�ن النم�اذج الت�ي ثب�ت اأنه�ا‬
‫على اأ�سلوب ي�سمى االنحدار التَّدرجي الع�سوائي‬ ‫تعم�ل ب�س�كل جي�د م�ع بيان�ات ال�س�ورة املح َّول�ة اإىل م َّت َج َه�ات من�وذج‪ :‬مُ�س ِّن�ف‬ ‫‪scikitplot.metrics.plot_confusion_matrix(y_test, # actual labels‬‬
‫االنحدار التَّدرجي الع�سوائي(‪ )SGDClassifier‬من مكتبة ‪ ،Sklearn‬حيث‬ ‫‪pred, # predicted labels‬‬
‫(‪،)Stochastic Gradient Descent - SGD‬‬ ‫‪title = "Confusion Matrix",‬‬
‫يعم�ل من�وذج ‪ SGDClassifier‬اأثن�اء التدريب على �سبط اأوزان النموذج بنا ًء‬
‫وه�ي طريق�ة فعّال�ة لتح�س�ني االأن�واع املتع�ددة‬ ‫‪cmap = "Purples",‬‬
‫للنماذج وتدريبها‪ ،‬مبا فيها املُ�سنِّفات‪.‬‬ ‫على بيانات التدريب‪ ،‬والهدف من ذلك يتمثّل يف العثور على جمموعة االأوزان‬ ‫‪figsize = (10,10),‬‬
‫الت�ي تقل�ل م�ن دال�ة اخل�س�ارة(‪ ،)Loss Function‬وه�ي الدال�ة الت�ي تقي��س‬ ‫‪x_tick_rotation = 90,‬‬
‫الفرق بني العناوين املتوقَّعة والعناوين احلقيقية يف بيانات التدريب‪.‬‬ ‫‪normalize = True # to print percentages‬‬
‫)‬
‫ي�ستخدم املقطع الربجمي التايل مُ�سنِّف ‪ SGDClassifier‬لتدريب منوذج على جمموعة بيانات م�سطحة‪.‬‬ ‫ِ‬
‫‪206‬‬ ‫‪205‬‬
‫التنبو بانتقاء اخل�سائ�ض ‪re iction with Feature Se ection‬‬ ‫‪from sklearn.linear_model import SGDClassifier‬‬
‫ر َّك��ز الق�س��م ال�س��ابق عل��ى تدري��ب النم��اذج ع��ن طري��ق ت�س��طيح البيان��ات‪ ،‬يف ح��ني �س��ي�سف ه��ذا الق�س��م كيفية حُتويل‬
‫البيان ��ات االأ�سلي ��ة لهند�س ��ة اخل�سائ� ��س الذكي ��ة‬ ‫)(‪model_sgd = SGDClassifier‬‬
‫)‪model_sgd.fit(X_train_flat, y_train‬‬
‫املخططات التكرارية للتدرجات املوجَّ هة‬ ‫الت��ي تلتق��ط ال�سف��ات الرئي�س��ة لبيان��ات ال�س��ورة‪،‬‬
‫)‪pred=model_sgd.predict(X_test_flat‬‬
‫(‪:)Histogram of Oriented Gradients -HOG‬‬ ‫يو�س ��ح الق�س ��م تقني ��ة‬
‫وعل ��ى و ج ��ه التحد ي ��د ِّ‬ ‫)‪accuracy_score(y_test,pred‬‬
‫املوجه��ة بتق�س��يم‬ ‫�ات‬‫�‬ ‫ج‬ ‫للتدر‬ ‫�ة‬‫�‬‫ي‬ ‫التكرار‬ ‫�ات‬‫�‬‫ط‬ ‫املخط‬ ‫�وم‬ ‫�‬ ‫ق‬‫ت‬ ‫�سائعة ت�سمى املخطط التكراري للتدرجات املوجَّ هة‬
‫َّ‬
‫ال�س��ورة اإىل اأق�س��ام �سغ��رة وحُت ِّل��ل توزي��ع تغ��رات الكثافة‬ ‫(‪.)Histogram of Oriented Gradients -HOG‬‬ ‫‪0.46511627906976744‬‬
‫حُتدد وتفهم �سكل الكائن يف ال�سورة‪.‬‬ ‫يف كل ق�سم حتّى ِّ‬ ‫تتم ّث ��ل اخلط ��وة االأوىل يف هند�س ��ة املخطط ��ات‬
‫املوجه ��ة يف حُتوي ��ل ال�س ��ور‬
‫التكراري ��ة للتدرج ��ات َّ‬ ‫يُحقق م�سنِّف ‪ SGDClassifier‬دقة اأعلى ب�س��كل ملحوظ تزيد عن ‪،46%‬‬
‫م ��ن تن�س ��يق ‪ RGB‬اإىل �س ��ور ذات ت ��درج رم ��ادي‪ ،‬ومُيك ��ن القي ��ام بذل ��ك با�س ��تخدام الدال ��ة ()‪ rgb2gray‬م ��ن مكتب ��ة‬ ‫التح يم القيا�سي‬ ‫عل��ى الرغ��م م��ن تدريب��ه عل��ى البيان��ات نف�س��ها الت��ي ُد ِّرب ُم�س ِّن��ف‬
‫‪:sckit-image‬‬ ‫(‪:)Standard scaling‬‬ ‫‪ MultinomialNB‬عليه��ا‪ ،‬وي��دل ذل��ك عل��ى فائ��دة جترب��ة خوارزمي��ات‬
‫ه��و تقني��ة معاجل��ة اأولي��ة تُ�س��تخدم‬ ‫ت�سني��ف ُخمتلف��ة؛ للعث��ور عل��ى اأف�س��ل خوارزمي��ة تتنا�س��ب م��ع اأي جمموع��ة‬
‫‪from skimage.color import rgb2gray # used to convert a multi-color (rgb) image to grayscale‬‬ ‫يف تعلُّ��م ا آالل��ة لتحجي��م خ�سائ���س‬ ‫بيان��ات مُعط��اة‪ ،‬وم��ن املهم فهم نقاط القوة وال�سعف لكل خوارزمية‪ ،‬فعلى‬
‫‪# converts the training data‬‬ ‫جمموع��ة البيان��ات بحي��ث تك��ون‬
‫)]‪X_train_gray = np.array([rgb2gray(img) for img in X_train‬‬ ‫�س��بيل املث��ال‪ :‬م��ن املع��روف اأن خوارزمي��ة ‪ SGDClassifier‬تعم��ل ب�س��كل‬
‫‪# converts the testing data‬‬ ‫ذات متو�س��ط ح�س��ابي �سف��ري‬ ‫اأف�س��ل عندم��ا ُحُتجّ ��م بيان��ات االإدخ��ال وتوُحّ ��د اخل�سائ���س؛ وله��ذا ال�س��بب‬
‫)]‪X_test_gray = np.array([rgb2gray(img) for img in X_test‬‬ ‫وتباين اأحادي الوحدة‪.‬‬ ‫�ست�ستخدم التحجيم القيا�سي يف منوذجك‪.‬‬

‫;)'‪plt.imshow(X_train_gray[0],cmap='gray‬‬ ‫;)]‪plt.imshow(X_train[0‬‬ ‫ي�ستخدِ م املقطع الربجمي التايل اأداة ‪( StandardScaler‬املُحجِّ م القيا�سي) من مكتبة ‪ sklearn‬لتحجيم البيانات‪:‬‬

‫‪from sklearn.preprocessing import StandardScaler‬‬

‫)(‪scaler = StandardScaler‬‬
‫)‪X_train_flat_scaled = scaler.fit_transform(X_train_flat‬‬
‫)‪X_test_flat_scaled = scaler.fit_transform(X_test_flat‬‬

‫‪print(X_train_flat[0]) # the values of the first image pre-scaling‬‬


‫‪print(X_train_flat_scaled[0]) # the values of the first image post-scaling‬‬

‫‪[144 142 151 ... 76 75‬‬ ‫]‪80‬‬


‫‪[ 0.33463473 0.27468959‬‬ ‫‪0.61190285 ... -0.65170221 -0.62004162‬‬
‫]‪-0.26774175‬‬

‫مُيكن االآن تدريب منوذج جديد واختباره با�ستخدام جمموعات البيانات التي مت حُتجيمها‪:‬‬
‫�سكل ‪� :4.9‬سورة ذات تدرج رمادي‬ ‫�سكل ‪� :4.8‬سورة باالألوان االأ�سا�سية‬
‫)(‪model_sgd = SGDClassifier‬‬ ‫‪0.4906976744186046‬‬
‫بدال من التن�سيق ‪ RGB‬املُ�ستنِد اإىل‪:3×100 × 100‬‬
‫ال�سكل اجلديد لكل �سورة اأ�سبح بتن�سيق ‪ً ،100 × 100‬‬ ‫)‪model_sgd.fit(X_train_flat_scaled, y_train‬‬
‫)‪pred=model_sgd.predict(X_test_flat_scaled‬‬
‫)‪accuracy_score(y_test,pred‬‬
‫)‪print(X_train_gray[0].shape‬‬
‫)‪print(X_train[0].shape‬‬
‫حُت�س��ن بع��د التحجي��م‪ ،‬وم��ن املحتم��ل اأن يح��دث حُت�س��ني اإ�س��ايف بوا�س��طة جتري��ب خوارزمي��ات‬
‫ت��دل النتائ��ج عل��ى وج��ود ُّ‬
‫)‪(100, 100‬‬
‫متغراتها حتّى تتنا�سب مع جمموعة البيانات ب�سكل اأف�سل‪.‬‬ ‫اأخرى و�سبط ِّ‬
‫)‪(100, 100, 3‬‬

‫‪208‬‬ ‫‪207‬‬
‫تتمثّل اخلطوة التالية يف اإن�ساء خ�سائ�س املخطط التكراري للتدرجات املوجَّ هة لكل �سورة يف البيانات‪ ،‬ومُيكن حُتقيق‬
‫‪scikitplot.metrics.plot_confusion_matrix(y_test, # actual labels‬‬
‫‪pred, # predicted labels‬‬
‫مثاال على ال�س��ورة االأوىل يف‬ ‫ذل��ك م��ن خ��الل دال��ة ()‪ hog‬م��ن مكتب��ة ‪ِّ ،sckit-image‬‬
‫ويو�س��ح املقط��ع الربجم��ي التايل ً‬
‫‪title = "Confusion Matrix", # title to use‬‬ ‫جمموعة بيانات التدريب‪:‬‬
‫‪cmap = "Purples", # color palette to use‬‬
‫‪figsize = (10,10), # figure size‬‬
‫‪x_tick_rotation = 90‬‬ ‫‪from skimage.feature import hog‬‬
‫;)‬
‫(‪hog_vector, hog_img = hog‬‬
‫‪X_train_gray[0],‬‬
‫‪visualize = True‬‬
‫)‬
‫‪hog_vector.shape‬‬

‫)‪(8100,‬‬

‫‪ hog_vector‬ه��و م َّتجَ ��ه اأح��ادي ال ُبع��د ذو ثماني��ة اآالف ومئ��ة قيم��ة‬


‫�سكل ‪ :4.10‬خمطط تكراري للتدرجات املوجَّ هة ل�سورة‬ ‫عددي��ة‪ ،‬ومُيك��ن ا�س��تخدامها لتمثي��ل ال�سورة‪ ،‬و َيظه��ر التمثيل الب�سري‬
‫لهذا امل َّتجَ ه با�ستخدام‪:‬‬
‫;)‪plt.imshow(hog_img‬‬

‫ي�س� ِّور ه��ذا التمثي��ل اجلدي��د ح��دود االأ�س��كال االأ�سا�س��ية يف ال�س��ورة‪ ،‬ويح��ذف التفا�سي��ل االأخ��رى و ُير ِّك��ز عل��ى االأج��زاء‬
‫املفي��دة الت��ي مُيكنه��ا اأن ت�س��اعد املُ�س ِّن��ف عل��ى اأن يق��وم بالتنب�وؤ‪ ،‬ويط ِّب��ق املقط��ع الربجم��ي الت��ايل ه��ذا التغي��ر عل��ى كل‬
‫ال�سور يف كل من جمموعة التدريب وجمموعة االختبار‪:‬‬

‫)]‪X_train_hog = np.array([hog(img) for img in X_train_gray‬‬


‫)]‪X_test_hog = np.array([hog(img) for img in X_test_gray‬‬

‫مُيكن االآن تدريب ‪ SGDClassifier‬على هذا التمثيل اجلديد‪:‬‬


‫‪# scales the new data‬‬
‫)(‪scaler = StandardScaler‬‬
‫)‪X_train_hog_scaled = scaler.fit_transform(X_train_hog‬‬
‫)‪X_test_hog_scaled = scaler.fit_transform(X_test_hog‬‬
‫�سكل ‪ :4.11‬م�سفوفة الدقة الأداء خوارزمية ‪SGDClassi er‬‬
‫‪# trains a new model‬‬
‫)(‪model_sgd = SGDClassifier‬‬
‫حُت�س��ن هائ��ل يف الدق��ة الت��ي قف��زت لت�س��ل اإىل اأك��ر م��ن ‪ ،70 %‬وجت��اوزت بكث��ر الدق��ة‬
‫تك�س��ف النتائ��ج اجلدي��دة ع��ن ُّ‬ ‫)‪model_sgd.fit(X_train_hog_scaled, y_train‬‬
‫أي�س��ا يف‬
‫التح�س��ن ا ً‬
‫ُّ‬ ‫الت��ي حققه��ا املُ�س ِّن��ف نف�س��ه عل��ى البيان��ات امل�س��طحة دون القي��ام ب�اأي هند�س��ة للخ�سائ���س‪ ،‬ويت�س��ح‬
‫‪# tests the model‬‬
‫ويو�س��ح ذل��ك اأهمي��ة‬
‫م�سفوف��ة الدق��ة املُح َّدث��ة الت��ي ت�س��مل ع��ددًا اأق��ل م��ن االأخط��اء (التنب�وؤات االإيجابي��ة اخلاطئ��ة)‪ِّ ،‬‬ ‫)‪pred = model_sgd.predict(X_test_hog_scaled‬‬
‫ا�ستخدام تقنيات روؤية احلا�سب لهند�سة خ�سائ�س ذكية تلتقط ال�سفات املرئية املُختلفة للبيانات‪.‬‬ ‫)‪accuracy_score(y_test,pred‬‬

‫‪0.7418604651162791‬‬

‫‪210‬‬ ‫‪209‬‬
‫‪['Elephant', 'Duck', 'Monkey', 'Cow', 'Sheep', 'Wolf', 'Tiger', 'Deer',‬‬
‫التنبو با�ستخدام ال�سبكات الع�سبية ‪re iction Using Neural Networks‬‬
‫]'‪'Cat', 'Lion', 'Rabbit', 'Panda', 'Pigeon', 'Chicken', 'Eagle', 'Bear‬‬ ‫يو�س��ح ه��ذا الق�س��م كيفي��ة ا�س��تخدام ال�س��بكات الع�سبي��ة لت�سميم مُ�س ِّنف��ات خم�س�سة لبيانات ال�س��ور‪ ،‬وكيف مُيكنها‬ ‫ِّ‬
‫]'‪['Panda' 'Pigeon' 'Monkey' 'Panda' 'Sheep‬‬ ‫يف كث��ر م��ن االأحي��ان اأن تتف�وّق عل��ى التقني��ات عالي��ة الفعالي��ة مث��ل‪ :‬عملي��ة املخط��ط التك��راري للتدرج��ات املوجَّ ه��ة الت��ي‬
‫]‪[11 12 2 11 4‬‬ ‫ُو�سفت يف الق�سم ال�سابق‪ ،‬و ُت�ستخدم مكتبة ‪ TensorFlow‬ومكتبة ‪ Keras‬ال�سهرتان لهذا الغر�س‪.‬‬
‫ومُيكن االآن ا�ستخدام اأداة ‪( Sequential‬التتابع) من مكتبة ‪ Keras‬لبناء �سبكة ع�سبية يف �سكل طبقات متتابعة‪.‬‬ ‫مكتب��ة ‪ tensorflow‬ه��ي مكتب��ة منخف�س��ة امل�س��توى تُو ِّف��ر جمموع��ة وا�س��عة م��ن اأدوات تعلُّ��م ا آالل��ة وال��ذكاء اال�سطناعي‪،‬‬
‫�تخدمني بتعري��ف احل�س��ابات العددي��ة الت��ي تت�سم��ن م َّتجَ ه��ات متع��ددة االأبع��اد(‪ )Tensors‬ومعاجلته��ا‪،‬‬ ‫وت�س��مح للم�س� ِ‬
‫وه��ي م�سفوف��ات متع��ددة االأبع��اد م��ن البيانات‪.‬م��ن ناحي��ة اأخ��رى‪ُ ،‬تع� ُّد مكتب��ة ‪ Keras‬ذات م�س��توى اأعل��ى وتُو ِّف��ر واجه��ة‬
‫‪from keras.models import Sequential # used to build neural networks as sequences of layers‬‬
‫‪# every neuron in a dense layer is connected to every other neuron in the previous layer.‬‬ ‫اأب�س ��ط لبن ��اء النم ��اذج وتدريبه ��ا‪ ،‬وه ��ي مبني ��ة با�س ��تخدام مكتب ��ة ‪( TensorFlow‬اأو مكتب ��ات خلفي ��ة اأخ ��رى) وتُو ِّف ��ر‬
‫‪from keras.layers import Dense‬‬ ‫و�سممت مكتبة‬ ‫جمموعة من الطبقات والنماذج املع َّرفة م�س��بقًا والتي مُيكن جتميعها ب�س��هولة لبناء منوذج تعلُّم عميق‪ُ .‬‬
‫�تخدم و�س��هلة اال�س��تخدام؛ مم��ا يجعلها خيارًا رائجً ا للممار�س��ني‪.‬‬ ‫‪ Keras‬لتك��ون �سديق��ة للم�س� ِ‬
‫‪# builds a sequential stack of layers‬‬
‫)(‪model = Sequential‬‬ ‫دوال التن�س��يط (‪ )Activation Functions‬ه��ي دوال ريا�سي��ة تُطَ َّب��ق عل��ى ُخم َرج��ات كل خلي��ة ع�سبي��ة يف ال�س��بكة‬
‫‪# adds a dense hidden layer with 200 neurons, and the ReLU activation function.‬‬ ‫الع�سبية‪،‬كم��ا تتمي��ز باأنه��ا ت�سي��ف خ�سائ� َ��س غ��ر خطي��ة (‪ )Non-linear‬للنم��وذج وت�س��مح لل�س��بكة بتعلُّ��م االأمن��اط‬
‫))'‪model.add(Dense(200,input_shape = (X_train_hog.shape[1],), activation='relu‬‬
‫‪# adds a dense output layer and the softmax activation function.‬‬ ‫املعق��دة يف البيان��ات‪ ،‬و ُيع� ُّد اختي��ار دال��ة التن�س��يط اأم�رًا مه ًم��ا ومُيك��ن اأن يوؤث��ر عل��ى اأداء ال�س��بكة‪ ،‬حي��ث تتلق��ى اخلالي��ا‬
‫))'‪model.add(Dense(len(classes), activation='softmax‬‬ ‫الع�سبي ��ة املُدخَ ��الت وتعاجله ��ا م ��ن خ ��الل‬
‫املُخرَج‬ ‫دالة التن�سيط‬ ‫متغري التح ُّيز‬ ‫متغرات‬ ‫املُدخَ الت‬
‫)(‪model.summary‬‬ ‫متغ��رات االأوزان والتح ُّي��زات وتنت��ج ُخم َرجات‬
‫االأوزان‬
‫بن��اء عل��ى دال��ة التن�س��يط كم��ا يظهر يف ال�س��كل‬
‫"‪Model: "sequential‬‬ ‫‪x1‬‬ ‫‪ .4.12‬تُن�س��اأ ال�س ��بكات الع�سبي ��ة م ��ن خ ��الل‬
‫_________________________________________________________________‬
‫)‪Layer (type‬‬ ‫‪Output Shape‬‬ ‫‪Param #‬‬
‫‪x2‬‬ ‫رب ��ط العدي ��د م ��ن اخلالي ��ا الع�سبي ��ة م ًع ��ا يف‬
‫=================================================================‬ ‫طبق��ات‪ ،‬و ُت��د َّرب عل��ى �سب��ط متغ��رات االأوزان‬
‫)‪dense (Dense‬‬ ‫)‪(None, 200‬‬ ‫‪1620200‬‬
‫والتح ُّيزات وحُت�سني اأدائها مبرور الوقت‪.‬‬
‫)‪dense_1 (Dense‬‬ ‫)‪(None, 16‬‬ ‫‪3216‬‬
‫‪xn‬‬
‫�سكل ‪ :4.12‬دالة التن�سيط‬
‫=================================================================‬ ‫يُث ِّب��ت املقط��ع الرب جم��ي الت��ايل مكتب��ة‬
‫‪Total params: 1,623,416‬‬ ‫‪%%capture‬‬
‫‪Trainable params: 1,623,416‬‬ ‫‪!pip install tensorflow‬‬ ‫‪ tensorflow‬ومكتبة ‪:keras‬‬
‫‪Non-trainable params: 0‬‬ ‫‪!pip install keras‬‬
‫_________________________________________________________________‬
‫يف الوح��دة ال�س��ابقة‪ ،‬تع ّرف��ت عل��ى اخلالي��ا الع�سبي��ة اال�سطناعي��ة وعل��ى معماري��ات ال�س��بكات الع�سبي��ة‪ ،‬وعل��ى وج��ه‬
‫عدد الخاليا الع�سبية في الطبقة المخفية يعتمد على‬ ‫التحدي��د تع ّرف��ت عل��ى من��وذج الكلم��ة اإىل امل َّتجَ ��ه (‪ )Word2Vec‬ال��ذي َي�س��تخدم طبق��ة خمفي��ة وطبق��ة ُخم َرج��ات؛‬
‫الخيار الذي يُتخذ عند الت�سميم‪ ،‬وعدد الفئات يحدِّ د‬ ‫ليتنب�اأ ب�س��ياق الكلم��ات لكلم��ة ُمعط��اة يف جمل��ة‪ .‬وبع��د ذل��ك تُ�س��تخدم مكتب��ة ‪ Keras‬الإن�س��اء معماري��ة ع�سبي��ة م�س��ابهة‬
‫عدد الخاليا الع�سبية في طبقة المُخرَجات‪.‬‬ ‫لل�سور‪ .‬ا ًأوال‪ُ :‬حُت َّول العناوين يف ‪ y_train‬اإىل تن�سيق اأعداد �سحيحة‪ ،‬طبقًا ملتطلبات مكتبة ‪.keras‬‬

‫للمتغرات التي يجب اأن يتعلّمها النم��وذج من خالل �سبطها على بيانات‬ ‫يك�س��ف ملخ���س النم��وذج ع��ن الع��دد االإجم��ايل‬ ‫‪# gets the set of all distinct labels‬‬
‫ِّ‬ ‫))‪classes=list(set(y_train‬‬
‫دخ��ل‪ ،‬وه��ي اأبع��اد �س��ور املخط��ط التك��راري‬ ‫التدري��ب‪ ،‬ومب��ا اأن املُدخَ ��الت حُتت��وي عل��ى ثماني��ة اآالف ومئ��ة (‪ُ )8,100‬م َ‬ ‫)‪print(classes‬‬
‫)(‪print‬‬
‫املوجه��ة ‪ X_train_hog‬وحُتت��وي الطبق��ة املخفي��ة عل��ى مئت��ي خلي��ة ع�سبي��ة‪ ،‬وه��ي طبق��ة كثيف��ة مت�سل��ة‬ ‫للتدرج��ات َّ‬
‫(متغراتها)‪.‬‬ ‫ِّ‬ ‫كامال‪ ،‬فاإن املجموع ‪ 1,620,000 = 200 × 8,100‬و�سلة موزونة يجب تعلُّم اأوزانها‬ ‫ات�ساال ً‬ ‫ً‬ ‫باملُدخَ الت‬ ‫‪# replaces each label with an integer (its index in the classes lists) for both the training and testing data‬‬
‫)]‪y_train_num = np.array([classes.index(label) for label in y_train‬‬
‫مت��ت اإ�ساف��ة مئت��ي متغ� ِّ�ر حت ُّي��ز (‪ )Bias‬اإ�س��ايف‪ ،‬بواق��ع متغ� ِّ�ر ل��كل خلي��ة ع�سبي��ة يف الطبق��ة املخفي��ة‪ ،‬ومتغ� ِّ�ر التح ُّي��ز‬ ‫)]‪y_test_num = np.array([classes.index(label) for label in y_test‬‬
‫دخالت كل خلية ع�سبية يف ال�س��بكة الع�سبية‪ ،‬وتُ�س��تخدم لتوجيه دالة تن�س��يط اخلاليا الع�سبية‬ ‫هو قيمة ُت�ساف اإىل ُم َ‬ ‫)(‪print‬‬

‫اإىل اجلان��ب ال�س��لبي اأو االإيجاب��ي‪ ،‬مم��ا ي�س��مح لل�س��بكة بنمذج��ة عالق��ات اأك��ر تعقي��دً ا ب��ني بيان��ات املُدخَ ��الت وعناوي��ن‬ ‫‪# example:‬‬
‫‪print(y_train[:5]) # first 5 labels‬‬
‫املُخرَجات‪.‬‬ ‫‪print(y_train_num[:5]) # first 5 labels in integer format‬‬

‫‪212‬‬ ‫‪211‬‬
‫ومبا اأن طبقة املُخرَجات حُتتوي على �ستّ ع�سرة خلية ع�سبية مت�سلة بالكامل مبئتي خلية ع�سبية موجودة يف الطبقة‬
‫‪Epoch‬‬ ‫‪1/40‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 1s 16ms/step - loss: 2.2260 - accuracy: 0.3333‬‬
‫املخفي��ة‪ ،‬ف�اإن جمم��وع الو�س��الت املوزون��ة يبل��غ ‪ .3,216 = 200 × 16‬و ُي�س��اف �س��تة ع�س��ر متغ� ِّ�ر حُت ُّي��ز اإ�س��ايف‪ ،‬بواق��ع‬
‫‪Epoch‬‬ ‫‪2/40‬‬ ‫متغر واحد لكل خلية ع�سبية يف طبقة املُخرَجات‪ ،‬و ُي�ستخدم ال�سطر الربجمي التايل لتجميع (‪ )Compile‬النموذج‪:‬‬ ‫ِّ‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 15ms/step - loss: 1.1182 - accuracy: 0.7256‬‬
‫‪Epoch‬‬ ‫‪3/40‬‬
‫‪# compiling the model‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 15ms/step - loss: 0.7198 - accuracy: 0.8155‬‬
‫= ‪model.compile(loss = 'sparse_categorical_crossentropy', metrics‬‬
‫‪Epoch‬‬ ‫‪4/40‬‬
‫)'‪['accuracy'], optimizer = 'adam‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 15ms/step - loss: 0.4978 - accuracy: 0.9031‬‬
‫‪Epoch‬‬ ‫‪5/40‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 16ms/step - loss: 0.3676 - accuracy: 0.9388‬‬ ‫تُ�س��تخدم دال��ة اإع��داد النم��وذج الذك��ي يف مكتب��ة ‪ Keras‬واملعروف��ة بالتجمي��ع (()‪ )model.compile‬يف عملي��ة‬
‫‪...‬‬
‫‪Epoch‬‬ ‫‪36/40‬‬ ‫حُتدي��د اخل�سائ���س االأ�سا�س��ية للنم��وذج الذك��ي واإع��داده للتدري��ب والتحق��ق والتنب�وؤ‪ ،‬وتتخ��ذ ثالثة مُعامِ الت رئي�س��ة كما‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 15ms/step - loss: 0.0085 - accuracy: 1.0000‬‬ ‫مو�سح يف اجلدول ‪.4.2‬‬‫هو َّ‬
‫‪Epoch‬‬ ‫‪37/40‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 21ms/step - loss: 0.0080 - accuracy: 1.0000‬‬
‫‪Epoch‬‬ ‫‪38/40‬‬ ‫جدول  ‪ُ :4.2‬معامِالت طريقة الت ميع‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 15ms/step - loss: 0.0076 - accuracy: 1.0000‬‬
‫‪Epoch‬‬ ‫‪39/40‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 15ms/step - loss: 0.0073 - accuracy: 1.0000‬‬ ‫ه��ي الدال��ة الت��ي تُ�س��تخدم لتقيي��م اخلط�اأ يف النم��وذج اأثن��اء التدري��ب‪ ،‬وتقي���س م��دى تطاب��ق‬
‫‪Epoch‬‬ ‫‪40/40‬‬ ‫تنب�وؤات النم��وذج م��ع العناوي��ن احلقيقي��ة ملجموع��ة معيّنة من بيانات املُدخَ ��الت‪ .‬الهدف من‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 15ms/step - loss: 0.0071 - accuracy: 1.0000‬‬
‫التدريب تقليل دالة اخل�سارة مما يت�سمن يف العادة تعديل اأوزان النموذج ومقدار التح ُّيز‪،‬‬ ‫اخل�سارة‬
‫ويف ه��ذه احلال��ة تك��ون دال��ة اخل�س��ارة ه��ي‪ sparse_categorical_crossentropy :‬وهي‬ ‫(‪)loss‬‬
‫تُ�س��تخدم دال��ة () ‪ fit‬لتدري��ب من��وذج عل��ى جمموع��ة مع ّين��ة م��ن بيان��ات االإدخ��ال والعناوي��ن‪ ،‬وتتخ��ذ اأرب��ع مُعامِ ��الت‬ ‫متعددة الفئات؛ حيث تكون العناوين اأعدادًا �سحيحة‬ ‫دالة خ�سارة منا�سبة ملهام الت�سنيف ِّ‬
‫مو�سح يف اجلدول ‪.4.3‬‬ ‫رئي�سة‪ ،‬كما هو َّ‬ ‫كما يف ‪.y_train_num‬‬
‫جدول  ‪ُ :4.3‬معامِالت طريقة‬ ‫ه��ي قائم��ة املقايي���س امل�س��تخدَ مة لتقيي��م النم��وذج اأثن��اء التدري��ب واالختب��ار‪ُ ،‬وحُت�س��ب ه��ذه‬
‫املقايي���س با�س��تخدام ُخم َرج��ات النم��وذج والعناوي��ن احلقيقي��ة‪ ،‬ومُيك��ن ا�س��تخدامها ملراقبة‬ ‫املقايي�س‬
‫هو مُعامِ ل بيانات االإدخال امل�ستخدَ مة لتدريب النموذج‪ ،‬وتتكون من البيانات املحوَّلة‬ ‫اأداء النم��وذج وحُتدي��د املج��االت الت��ي مُيك��ن حُت�س��ينه فيه��ا‪ .‬مقيا���س الدق��ة (‪)Accuracy‬‬ ‫(‪)metrics‬‬
‫أي�س��ا لتدري��ب‬
‫املوجه��ة الت��ي ا�س�تُخدمت ا ً‬
‫ع��ن طري��ق املخط��ط التك��راري للتدرج��ات َّ‬ ‫‪X_train_hog‬‬ ‫هو مقيا�س �سائع ملهام الت�سنيف يقي�س ن�سبة التنبوؤات ال�سحيحة التي قام بها النموذج‪.‬‬
‫اأحدث اإ�سدار من خوارزمية ‪ SGDClassifier‬يف الق�سم ال�سابق‪.‬‬
‫ه��و خوارزمي��ة التح�س��ني الت��ي تُ�س��تخدم يف �سب��ط اأوزان النم��وذج ومق��دار التح ُّي��ز اأثن��اء‬
‫هو مُعامِ ل يت�سمّن عنوانًا لكل �سورة بتن�سيق اأعداد �سحيحة‪.‬‬ ‫‪y_train_num‬‬ ‫املح�سن دالة اخل�سارة واملقايي�س الإر�ساد عملية التدريب‪ ،‬ويقوم ب�سبط‬ ‫التدريب‪ .‬وي�ستخدم ِّ‬ ‫امل ُح�سِّ ن‬
‫متغ� ِّ�رات النم��وذج يف حُماول��ة لتقلي��ل اخل�س��ارة وزي��ادة اأداء النم��وذج اإىل احل��د االأق�س��ى‪.‬‬
‫ويف ه��ذه احلال��ة فق��د مت ا�س��تخدام املُح�سِّ ��ن ‪ ،adam‬ال��ذي ُيع� ُّد خوارزمي��ة �س��ائعة لتدري��ب‬ ‫(‪)optimizer‬‬
‫ه��و ع��دد العين��ات الت��ي مت��ت معاجلته��ا يف كل دُفع��ة اأثن��اء التدري��ب‪ ،‬ويق��وم النم��وذج‬
‫بتحدي��ث اأوزان��ه ومق��دار التح ُّي��ز بع��د كل دُفع��ة‪ ،‬ومُيك��ن اأن ي ؤوث��ر حج��م ال ُدفع��ة عل��ى‬ ‫ال�سبكات الع�سبية‪.‬‬
‫�س��رعة عملي��ة التدري��ب‪ ،‬وا�س��تقراراها‪ ،‬كم��ا مُيك��ن اأن ت�وؤدي اأحج��ام ال ُدفع��ات االأكرب‬ ‫‪batch_size‬‬
‫اإىل تدريب اأ�س��رع‪ ،‬ولكنها قد تكون اأكر تكلفة من الناحية احل�س��ابية وقد توؤدي اإىل‬ ‫واأخرًا‪ ،‬تُ�ستخدم دالة () ‪ fit‬لتدريب النموذج على البيانات املتاحة‪.‬‬
‫تدرجات اأقل ا�ستقرارًا‪.‬‬
‫‪model.fit(X_train_hog,‬‬ ‫‪# training data‬‬
‫هو عدد املرات التي يتكرر فيها تدريب النموذج با�ستخدام جمموعة البيانات باأكملها‪،‬‬ ‫‪y_train_num,‬‬ ‫‪# labels in integer format‬‬
‫= ‪batch_size‬‬ ‫‪80, # number of samples processed per batch‬‬
‫وتتك�ون الف�رتة (‪ )epoch‬م�ن م�رور واح�د ع�رب جمموع�ة البيان�ات باأكمله�ا‪ .‬ويقوم‬ ‫‪epochs = 40,‬‬ ‫‪# number of iterations over the whole dataset‬‬
‫النموذج بتحديث اأوزانه ومقدار التح ُّيز بعد كل دورة‪ ،‬كما مُيكن اأن يوؤثر عدد الفرتات‬ ‫‪epochs‬‬ ‫)‬
‫متغر مهم‬
‫على قدرة النموذج على التعلُّم والتعميم على البيانات اجلديدة‪ ،‬والفرتة ِّ‬
‫يجب اختياره بعناية‪ ،‬ويف هذه احلالة ُيد َّرب النموذج على اأربعني دورة‪.‬‬
‫‪214‬‬ ‫‪213‬‬
‫عل��ى الرغ��م م��ن فوائ��د ال�س��بكات الع�سبي��ة املعق��دة مث��ل‪:‬‬ ‫ومُيكن االآن ا�ستخدام منوذج التدريب للتنبوؤ بعناوين ال�سور يف جمموعة االختبار‪.‬‬
‫ال�سبكة الع�سبية الرت�سيحية‬ ‫ال�س��بكات الع�سبية الرت�س��يحية اإال اأنه من املهم مالحظة‬
‫(‪:) on o ution Neural Network -CNN‬‬ ‫ما يلي‪:‬‬ ‫)‪pred = model.predict(X_test_hog‬‬
‫ه��ي �س��بكات ع�سبي��ة عميق��ة تتع ّل��م تلقائ ًي��ا ت�سل�س��ل‬ ‫‪pred[0] # prints the predictions for the first image‬‬
‫• تكمن قوة ال�سبكات الع�سبية الرت�سيحية يف قدرتها على‬
‫اخل�سائ���س م��ن البيان��ات اخل��ام‪ ،‬مث��ل ال�س��ور‪ ،‬ع��ن‬ ‫اأن ت�ستخرج اخل�سائ�س املهمة ذات ال�سلة من ال�سور‬
‫طري��ق تطبي��ق �سل�س��لة م��ن الفالت��ر الرت�س��يحية عل��ى‬ ‫‪14/14 [==============================] - 0s 2ms/step‬‬
‫ب�س�كل تلقائ�ي ‪ ،‬دون احلاج�ة اإىل هند�س�ة اخل�سائ��س‬
‫بيان��ات االإدخ��ال‪ ،‬الت��ي يت��م ت�سميمه��ا بحي��ث تكت�س��ف‬ ‫اليدوية (‪.)Manual Feature Engineering‬‬ ‫‪array([4.79123509e-03,‬‬ ‫‪9.79321003e-01,‬‬ ‫‪8.39506648e-03,‬‬ ‫‪1.97884417e-03,‬‬
‫خ�سائ�س حُم َّددة‪.‬‬
‫َ‬ ‫اأمناطً ا اأو‬ ‫• حُتت��وي املعماري��ات الع�سبية االأكر تعقيدً ا على املزيد‬ ‫‪7.83501855e-06,‬‬ ‫‪3.50346789e-04,‬‬ ‫‪3.45465224e-07,‬‬ ‫‪1.19854585e-05,‬‬
‫‪4.41945267e-05,‬‬ ‫‪4.11721296e-04,‬‬ ‫‪1.27362555e-05,‬‬ ‫‪9.83431892e-06,‬‬
‫م��ن املتغ� ِّ�رات الت��ي يج��ب تعلُّمه��ا م��ن البيان��ات اأثن��اء‬ ‫‪1.97038025e-04,‬‬ ‫‪2.34744814e-03,‬‬ ‫‪5.49758552e-04,‬‬ ‫‪1.57057808e-03],‬‬
‫التدري��ب‪ ،‬ويتطل��ب ذل��ك جمموع��ة بيان��ات تدري��ب اأك��رب ق��د ال تك��ون متاح��ة يف بع�س احل��االت‪ ،‬ويف مثل ه��ذه احلاالت‬ ‫)‪dtype=float32‬‬
‫من غر املحتمل اأن يكون اإن�ساء معمارية معقدة للغاية اأمرًا فع ًَّاال‪.‬‬
‫• عل��ى الرغ��م م��ن اأن ال�س��بكات الع�سبي��ة ق��د حقق��ت بالفع��ل نتائ��ج مبه��رة يف معاجل��ة ال�س��ور واملهام االأخ��رى‪ ،‬اإال اأنها‬ ‫احتماال الذي يتنباأ به املُ�سنِّف‪ ،‬تُظهر دالة ()‪predict‬‬
‫ً‬ ‫بينما تُظهر دالة ()‪ predict‬من مكتبة ‪ sklearn‬العنوان االأكر‬
‫ال ت�سمن تقدمي اأف�سل اأداء جلميع امل�سكالت وجمموعات البيانات‪.‬‬ ‫يف مكتب��ة ‪ Keras‬احتم��االت كل العناوي��ن املُر�سَّ ��حة‪ .‬يف ه��ذه احلال��ة‪ ،‬مُيك��ن ا�س��تخدام دال��ة ()‪ np.argmax‬الإظه��ار‬
‫• حتّى لو كانت معمارية ال�سبكة الع�سبية اأف�سل حل ممكن ملُهِ مَّة حُمددة‪ ،‬فقد ي�ستغرق االأمر كثرًا من الوقت واجلهد‬ ‫احتماال‪.‬‬
‫ً‬ ‫موؤ�سر العنوان االأكر‬
‫وامل��وارد احلا�س��وبية لتجرب��ة خي��ارات ُخمتلف��ة اإىل اأن يتم العث��ور على هذه املعمارية‪ .‬لذلك من االأف�سل البدء بنماذج‬
‫‪# index of the class with the highest predicted probability.‬‬
‫اأب�سط (لكنها ال تزال فعّالة)‪ ،‬مثل‪ :‬منوذج ‪ SGDClassifier‬وغره من النماذج االأخرى الكثرة املتوفرة يف املكتبات‬ ‫))]‪print(np.argmax(pred[0‬‬
‫مث��ل‪ :‬مكتب��ة ‪ ،sklearn‬ومبج��رد ح�سول��ك عل��ى تن ُّب�وؤ اأف�س��ل ملجموع��ة البيان��ات وو�سول��ك اإىل النقط��ة الت��ي ال مُيك��ن‬ ‫‪# name of this class‬‬
‫فيها حُت�سني هذه النماذج اأكر من ذلك‪ ،‬فاإن التجريب على املعماريات الع�سبية االأخرى ُي ُّعد خطوة ممتازة‪.‬‬ ‫)])]‪print(classes[np.argmax(pred[0‬‬
‫‪# uses axis=1 to find the index of the max value per row‬‬
‫))‪accuracy_score(y_test_num,np.argmax(pred, axis=1‬‬

‫‪1‬‬
‫‪Duck‬‬
‫‪0.7529021558872305‬‬

‫حُتق��ق ه��ذه ال�س��بكة الع�سبي��ة الب�س��يطة دق��ة تبل��غ ح��وايل ‪ ،75%‬وه��ي دق��ة م�س��ابهة لدق��ة ‪ ،SGDClassifier‬ولك��ن‬
‫ميزة املعماريات الع�سبية تنبع من براعتها‪ ،‬وهو ما ي�سمح لك بتجربة معماريات ُخمتلفة للعثور على اأف�سل ما ينا�سب‬
‫جمموع��ة بيانات��ك‪ .‬مت حُتقي��ق ه��ذه الدق��ة م��ن خ��الل معماري��ة ب�س��يطة ت�سمن��ت طبق��ة خمفي��ة واح��دة حُتت��وي عل��ى مئتي‬
‫خلية ع�سبية‪ ،‬واإ�سافة طبقات اإ�سافية جتعل ال�سبكة اأعمق‪ ،‬بينما توؤدي اإ�سافة املزيد من اخلاليا الع�سبية لكل طبقة‬
‫اإىل جعلها اأو�سع‪ ،‬و ُيع ُّد اختيار عدد الطبقات وعدد اخلاليا الع�سبية لكل طبقة عنا�سر مهمة لت�سميم ال�سبكة الع�سبية‪،‬‬
‫وله��ا تاأث��ر كب��ر عل��ى اأدائه��ا‪ ،‬ولكنه��ا لي�س��ت الطريق��ة الوحي��دة لتح�س��ني االأداء‪ ،‬ويف بع���س احل��االت ق��د يكون ا�س��تخدام‬
‫نوع ُخمتلف من معمارية ال�سبكة الع�سبية اأكر فاعلية‪.‬‬
‫امل ُخرَجات‬ ‫التعلُّم‬ ‫ا�ستخراج اخل�سائ�س يدويًا‬ ‫امل ُدخَ الت‬
‫�سكل ‪� :4.13‬سبكة ع�سبية ذات هند�سة خ�سائ�س يدوية‬
‫التنبو با�ستخدام ال�سبكات الع�سبية الرت�سيحية‬
‫‪re iction Using on o ution Neural Networks‬‬
‫معلومة‬ ‫أاح��د ه��ذه االأن��واع م��ن املعماري��ات الت��ي تنا�س��ب ت�سني��ف ال�س��ور ب�س��كلٍ ج ّي��د يتم ّث��ل يف ال�س��بكة الع�سبي��ة الرت�س��يحية‬
‫من املزايا االأ�سا�سية لل�سبكات الع�سبية الرت�سيحية اأنها جيدة جدًا يف التعلُّم من كميات كبرة‬ ‫(‪ ،)Convolutional Neural Network -CNN‬ومبا اأن ال�س��بكة الع�سبية الرت�س��يحية تعالج بيانات االإدخال‪ ،‬فاإنها‬
‫من البيانات‪ ،‬ومُيكنها يف العادة اأن حتقق م�ستويات عليا يف دقة املهام مثل‪ :‬ت�سنيف ال�سور‬ ‫متغرات الفالتر املر�سَّ ��حَ ة الكت�س��اف االأمناط بنا ًء على البيانات التي تراها؛ حتّى تتمكن ب�س��كل‬ ‫تقوم با�س��تمرار ب�سبط ِّ‬
‫دون احلاجة اإىل هند�سة اخل�سائ�س اليدوية مثل‪ :‬املخطط التكراري للتدرجات املوجَّ هة‪.‬‬ ‫اأف�س��ل م��ن اكت�س��اف اخل�سائ���س املهم��ة‪ ،‬ث��م تنقل ُخم َرج��ات كل طبقة اإىل الطبقة التالية التي يُكت�س��ف فيها خ�سائ�س‬
‫تعقيدا اإىل اأن تُنتج املُخرَجات النهائية‪.‬‬ ‫اأكر ً‬
‫‪216‬‬ ‫‪215‬‬
‫مترينات‬
‫‪ 1‬ما حتديّات ت�سنيف البيانات املرئية؟‬

‫امل ُخرَجات‬ ‫ا�ستخراج اخل�سائ�س والتعلُّم‬ ‫امل ُدخَ الت‬


‫�سكل ‪� :4.14‬سبكة ع�سبية تر�سيحية من دون هند�سة اخل�سائ�س اليدوية‬

‫لدي��ك م�سفوفت��ا قي��م ‪ ،Numpy‬وهم��ا م�سفوف��ة ‪ X_train‬وم�سفوف��ة ‪ .Y_train‬كل �س��ف يف م�سفوف��ة ‪X_train‬‬ ‫‪2‬‬ ‫التعلُّم املنقول ‪Transfer Learning‬‬
‫�س��كله (‪ )100 ،100،3‬مُي ِّث��ل �س��ورة باأبع��اد ‪ 100x100‬وبتن�س��يق ‪ .RGB‬وال�س��ف ‪ n‬يف امل�سفوف��ة ‪ Y_train‬مُي ِّث��ل‬ ‫التعلُّ��م املنق��ول ه��و عملي��ة ُيع��اد فيه��ا ا�س��تخدام �س��بكة ع�سبي��ة مُد َّرب��ة م�س��بقًا يف ح��ل مُهِ َّم��ة جدي��دة‪ .‬يف �س��ياق ال�س��بكات‬
‫ت�س��مية �س��ورة ‪ n‬يف م�سفوف��ة ‪ .X_train‬اأكم��ل املقط��ع الربجم��ي الت��ا ‪ ،‬بحي��ث يُ�س��طّ ح ‪ X_train‬ث��م ُي��درِّب النم��وذج‬ ‫الع�سبي��ة الرت�س��يحية يت�سم��ن التعلُّ��م املنق��ول اأخ��ذ من��وذج م��د َّرب م�س��بقًا عل��ى جمموع��ة بيان��ات كب��رة وتكييف��ه عل��ى‬
‫‪ MultinomialNB‬على جمموعة البيانات هذ ‪:‬‬ ‫جمموع��ة بيان��ات اأو ُمهِ َّم��ة جدي��دة‪ ،‬فب� ً‬
‫�دال م��ن الب��دء م��ن نقط��ة ال�سف��ر‪ ،‬يتي��ح التعلُّ��م املنقول ا�س��تخدام النم��اذج املد َّربة‬
‫م�سبقًا‪ ،‬اأي التي تعلّمت بالفعل خ�سائ�س مهمة مثل‪ :‬احلواف‪ ،‬واالأ�سكال‪ ،‬والنقو�س من جمموعة بيانات التدريب‪.‬‬
‫‪from sklearn.naive_bayes import MultinomialNB # imports the Naive Bayes Classifier from sklearn‬‬

‫(‪X_train_flat = np.array‬‬ ‫)‬

‫اإحالل‬
‫‪model_MNB = MultinomialNB() # new Naive Bayes model‬‬ ‫التنبوؤ وتقييم‬ ‫تدريب‬ ‫حتميل ال�سبكة‬
‫ن�سر النتائج‬ ‫الطبقات‬
‫دقة ال�سبكة‬ ‫ال�سبكة‬ ‫املدرَّبة م�سبقًا‬
‫(‪model_MNB.fit‬‬ ‫‪,‬‬ ‫‪) # fits model on the flat training data‬‬
‫النهائية‬

‫‪�ِ 3‬سف باخت�سار طريقة عمل ال�سبكات الع�سبية الرت�سيحية واإحدى مميزاتها الرئي�سة‪.‬‬ ‫تتم اإ�سافة طبقات جديدة‬
‫حت�سني ال�سبكة‬ ‫لكي تتعلّم الخ�سائ�س‬
‫المحددة لبياناتك‪.‬‬

‫�سكل ‪ :4.15‬اإعادة ا�ستخدام ال�سبكة املدرَّبة م�سبقًا‬

‫‪218‬‬ ‫‪217‬‬
‫الدر�ض الثاين‬
‫لدي��ك م�سفوفت��ا قي��م ‪ ،Numpy‬وهم��ا م�سفوف��ة ‪ X_train‬وم�سفوف��ة ‪ .Y_train‬كل �س��ف يف م�سفوف��ة ‪X_train‬‬ ‫‪4‬‬
‫املوجه لتحليل ال�سور‬
‫التع ُّلم غري َّ‬ ‫�س��كله (‪ )100،100،3‬مُي ِّث��ل �س��ورة باأبع��اد ‪ 199x100‬وبتن�س��يق ‪ .RGB‬وال�س��ف ‪ n‬يف امل�سفوف��ة ‪ Y_train‬مُي ِّث��ل‬
‫ت�س��مية �س��ورة ‪ n‬يف م�سفوف��ة ‪ .X_train‬اأكم��ل املقط��ع الربجم��ي الت��ا ‪ ،‬بحي��ث يط ِّب��ق حتوي��الت املخط��ط التك��راري‬
‫للتدرجات املوجَّ هة ثم ي�ستخدم البيانات املحوّلة يف تدريب وذج ‪:‬‬

‫‪from skimage.color import‬‬ ‫‪# used to convert a multi-color (rgb) image to grayscale‬‬
‫تو ال�سور‬ ‫فهم‬
‫‪from sklearn.‬‬ ‫‪import StandardScaler # used to scale the data‬‬
‫‪Understanding Image Content‬‬
‫يف �سياق روؤية احلا�سب ُي�ستخدم التعلُّم غر املوجَّ ه يف جمموعة متنوّعة من املهام مثل‪:‬‬ ‫‪from sklearn.naive_bayes import MultinomialNB # imports the Naive Bayes Classifier from sklearn‬‬
‫اكت�ساف العنا�سر ال�ساذّة‬ ‫تقطي�ع اأو ز ئ�ة ال�س�ورة( ‪ ،)Image Segmentation‬وتقطي�ع الفيد ي�و‬
‫(‪:)Anomaly e ection‬‬ ‫(‪ ،)Video Segmentation‬واكت�ساف العنا�سر ال�ساذّة (‪،)Anomaly Detection‬‬ ‫[(‪X_train_gray = np.array‬‬ ‫‪(img) for img in X_train]) # converts training data‬‬
‫ه��ي عملي��ة تُ�س��تخدم لتحدي��د االأمناط اأو‬ ‫وم�ن اال�س�تخدامات الرئي�س�ة االأخ�رى للتعلُّ�م غ�ر املوجَّ �ه‪ :‬البح�ث ع�ن ال�س�ورة‬ ‫= ‪X_train_hog‬‬
‫ا أالح��داث اأو نق��اط البيان��ات ال�س��اذّة اأو‬ ‫(‪ )Image Search‬ويت�سم�ن البح�ث يف قاع�دة بيان�ات كب�رة م�ن ال�س�ور للعث�ور على‬
‫غ��ر الطبيعي��ة داخل جمموع��ة البيانات‪،‬‬ ‫ال�سورة امل�سابهة لل�سورة املطلوبة‪.‬‬ ‫)(‪scaler = StandardScaler‬‬
‫وته��دف اإىل الك�س��ف ع��ن ا حل��االت‬ ‫تتمثّ�ل اخلط�وة االأوىل لبن�اء حُم�رك بح�ث لبيان�ات �س�ورة يف حُتدي�د دال�ة الت�س�ابه‬
‫الغريب��ة الت��ي تختل��ف ع��ن املعي��ار وق��د‬ ‫= ‪X_train_hog_scaled‬‬ ‫)‪.fit_transform(X_train_hog‬‬
‫(‪ )Similarity Function‬والت�ي مُيكنه�ا تقيي�م الت�س�ابه ب�ني �سورت�ني بن�ا ًء عل�ى‬
‫حُتتاج اإىل ا�ستق�ساء اإ�سايف‪.‬‬ ‫خ�سائ�سهم�ا املرئي�ة‪ ،‬مث�ل‪ :‬احل�دود‪ ،‬اأو النق��س‪ ،‬اأو ال�س�كل‪ .‬ومبج�رد اأن ُي ِ‬
‫ر�س�ل‬ ‫)(‪model_MNB = MultinomialNB‬‬
‫�تخدم �س�ورة جدي�دة لي�س�تعلم عنه�ا‪ ،‬يق�وم حُم�رك البحث باالط�الع على جميع‬ ‫امل�س ِ‬
‫‪model_MNB.fit(X_train_flat_scaled,‬‬ ‫)‬
‫تقطيع ال�سورة‬ ‫ال�سور املوجودة يف قاعدة البيانات املتاحة‪ ،‬ويعر على ال�سور التي بها اأعلى درجة‬
‫ت�س�ابه‪ ،‬و ُيظهرها للم�س ِ‬
‫�تخدم‪.‬‬
‫(‪:)Image Seg en tion‬‬
‫ه��ي عملي��ة تق�س��يم ال�س��ورة اإىل اأج��زاء‬ ‫وهناك طريقة بديلة تتمثّل يف ا�ستخدام دالة الت�سابه لف�سل ال�سور يف عناقيد؛ بحيث‬
‫اأو مناط��ق متع��ددة تتقا�س��م خ�سائ���س‬ ‫يتك�ون كل عنق�ود م�ن �س�ور مت�س�ابهة ب�سريً�ا مع بع�سها‪ ،‬ث�م ُ َمُيثَّل كل عنق�ود من خالل‬
‫ب�وؤرة مي�ع (‪ :)Centroid‬وه�ي �س�ورة تق�ع يف مرك�ز العنق�ود ومتتلك اأ�سغر م�س�افة‬ ‫اذكر بع�س حتديّات ال�سبكات الع�سبية الرت�سيحية‪.‬‬ ‫‪5‬‬
‫ب�سري��ة م�س��رتكة‪ ،‬وته��دف اإىل جتزئ��ة‬ ‫عامة (اأي اختالف) من ال�سور االأخرى يف العنقود‪ .‬ومبجرد اأن ُي ِ‬
‫ال�س��ورة اإىل أاج��زاء مرتابط��ة‪ ،‬وذات‬ ‫ِ‬
‫امل�ستخدم �سورة‬ ‫ر�سل‬
‫مغ��زى مُيك��ن ا�س��تخدامها يف القي��ام‬ ‫جديدة لال�ستعالم عنها‪ ،‬فاإن حُمرك البحث �سينتقل اإىل جميع العناقيد ويختار العنقود‬
‫بتحليل اإ�سايف‪.‬‬ ‫الذي تكون بوؤرة جتميعه اأكر ت�سابهًا مع ال�سورة املطلوبة من امل�ستخدِ م لتظهر له �سور‬
‫ويو�سح ال�سكل ‪ً 4.16‬‬
‫مثاال على هذا‪.‬‬ ‫العنقود املحددة‪ِّ ،‬‬

‫�سكل ‪ :4.16‬روؤية مركبة ذاتية القيادة من خالل تقطيع ال�سورة‬


‫‪220‬‬ ‫‪219‬‬
‫تها اأوليًا ‪Loading and Preprocessing Images‬‬ ‫ميل ال�سور ومعا‬ ‫العنقود االأول‬

‫ي�ستورد املقطع الربجمي التايل املكتبات التي �ستُ�ستخدم لتحميل ال�سور ومعاجلتها اأوليًا‪:‬‬
‫‪%%capture‬‬
‫‪import matplotlib.pyplot as plt‬‬ ‫‪50%‬‬
‫‪from os import listdiry‬‬
‫العنقود الثاين‬

‫‪!pip install scikit-image‬‬


‫‪from skimage.io import imread‬‬
‫‪90%‬‬
‫‪from skimage.transform import resize‬‬
‫‪from skimage import img_as_ubyte‬‬

‫‪# a palette of 10 colors that will be used to visualize the clusters.‬‬ ‫العنقود الثالث‬
‫‪color_palette = ['blue','green','red','yellow','gray','purple','orange',‬‬ ‫‪40%‬‬
‫]'‪'pink','black','brown‬‬

‫تق��راأ الدال��ة التالي��ة �س��ور جمموع��ة بيان��ات ‪( LHI-Animal-Faces‬وج��وه _احليوان��ات) م��ن ‪( input_folder‬جمل��د_‬
‫املُدخَ ��الت) اخلا���س به��ا‪ ،‬و ُتع� ِّ�دل حج��م كل منه��ا بحي��ث تك��ون له��ا اأبع��اد الط��ول والعر�س نف�س��ها‪ ،‬ثم تقوم بتح�س��ني دالة‬
‫()‪ resize_images‬م��ن الدر���س ال�س��ابق بال�س��ماح للم�س� ِ‬
‫�تخدم ب�اأن يح� ِّ�دد قائم��ة فئ��ات احليوان��ات الت��ي يج��ب اأن توؤخذ‬ ‫�سكل ‪ :4.17‬عناقيد التعرّف على ال�سور‬
‫باالعتب��ار‪ ،‬كم��ا اأنه��ا ت�س��تخدم �س��طرًا واح��دً ا م��ن املقط��ع الربجم��ي بلغ��ة البايث��ون؛ لك��ي تق��ر أا كل �س��ورة وتع� ِّ�دل حجمه��ا‬ ‫املو�س��ح يف ال�س��كل ‪ ،4.17‬حُتت��وي �س��ورة البح��ث عل��ى ت�س��ابه بن�س��بة‪ 40% :‬و‪ 50%‬و‪ 90%‬م��ع ُب �وؤر التجمي��ع‬ ‫يف املث��ال َّ‬
‫وتخزِّ نها‪:‬‬ ‫لعناقي��د ال�س��ور الث��الث عل��ى الت��وايل‪ ،‬و ُيفرت���س اأن تك��ون ن�س��بة الت�س��ابه ب��ني ‪ 0%‬و ‪ ،100%‬وح�سل العنق��ود الثاين على‬
‫اأعل��ى ن�س��بة ت�س��ابه؛ اإذ اأن��ه ي�س��تمل عل��ى قط��ط م��ن نف���س �س��اللة ول��ون القطّ ��ة املح��ددة يف �س��ورة البح��ث‪ ،‬كم��ا اأن نتائ��ج‬
‫‪def resize_images_v2(input_folder:str,‬‬ ‫العنقودين االأول والثالث متقاربة (‪ 40%‬و‪)50%‬؛ اإذ يت�سابه العنقودان مع �سورة البحث بطرائق ُخمتلفة‪ ،‬اأما العنقود‬
‫‪width:int,‬‬ ‫االأول فيت�سم��ن قططً ��ا يختل��ف من��ط األوانه��ا متامً ��ا ع��ن املطل��وب‪ ،‬وبالرغ��م من اأن العنق��ود الثالث مُيثِّل نوعً ��ا ُخمتلفًا من‬
‫‪height:int,‬‬ ‫احليوانات وهو النمر‪ ،‬فاإن منط اللون م�سابه ل�سورة البحث‪.‬‬
‫‪labels_to_keep:list‬‬
‫‪):‬‬ ‫تُ�س��به عملي��ة جتمي��ع البيان��ات املرئي��ة يف عناقيد‪ ،‬عملية جتمي��ع البيانات الرقمية اأو الن�سيَّة‪ ،‬ومع ذلك تتطلب الطبيعة‬
‫][ = ‪labels‬‬ ‫‪# a list with the label for each image‬‬
‫‪resized_images = [] # a list of resized images in np array format‬‬
‫متخ�س�س��ة؛ لتقيي��م الت�س��ابه الب�س��ري‪ ،‬وبالرغ��م م��ن اأن االأ�س��اليب االأق��دم كان��ت‬ ‫ّ‬ ‫الفري��دة للبيان��ات املرئي��ة طرائ��ق‬
‫][ = ‪filenames‬‬ ‫‪# a list of the original image file names‬‬ ‫تعتم��د عل��ى خ�سائ���س م�سنوع��ة يدو ًي��ا‪ ،‬فق��د اأدت التطورات احلديثة يف التعلُّ��م العميق اإىل تطوير مناذج قوية مُيكنها‬
‫تلقائ ًي��ا اأن تتع ّل��م خ�سائ���س متطورة من البيان��ات املرئية غر املُعَنوَنة‪.‬‬
‫‪for subfolder in listdir(input_folder):‬‬
‫ي�س��تخدِ م ه��ذا الدر���س ُمهِ َّم��ة خا�س��ة بتجمي��ع ال�س��ور؛ لتو�سي��ح كي��ف مُيك��ن اأن ي�وؤدي ا�س��تخدام خ�سائ���س اأك��ر تعقي��دً ا‬
‫)‪print(subfolder‬‬ ‫و�سيو�سح هذا الدر�س ‪-‬حُتديدً ا‪ -‬ثالث طرائق ُخمتلفة‪:‬‬ ‫ِّ‬ ‫اإىل تقدمي نتائج اأف�سل ب�سكل ملحوظ‪،‬‬
‫‪path = input_folder + '/' + subfolder‬‬
‫• ت�سطيح البيانات االأ�سلية وجتميعها بدون اأي هند�سة للخ�سائ�س‪.‬‬
‫‪for file in listdir(path):‬‬
‫• حُتوي��ل البيان��ات با�س��تخدام وا�س��ف اخل�سائ���س (‪ )Feature Descriptor‬ال��ذي يعتم��د عل��ى املخط��ط التك��راري‬
‫‪label=subfolder[:-4] # uses the subfolder name without the "Head" suffix‬‬ ‫للتدرجات املوجَّ هة (‪- )HOG‬تعرّفت عليه يف الدر�س ال�سابق‪ -‬ثم جتميع البيانات املح َّولة‪.‬‬
‫‪if label not in labels_to_keep: continue‬‬
‫‪labels.append(label) # appends the label‬‬
‫• ا�ستخدام منوذج ال�سبكة الع�سبية؛ لتجميع البيانات االأ�سلية يف جمموعات عنقودية بدون هند�سة اخل�سائ�س‪.‬‬
‫‪#loads, resizes, preprocesses, and stores the image.‬‬ ‫جمموع��ة بيان��ات ‪( LHI-Animal-Faces‬وج��وه _احليوان��ات) الت��ي ا�س�تُخدمت يف الدر���س ال�س��ابق و�ست�س��تخدم يف هذا‬
‫‪resized_images.append(img_as_ubyte(resize(imread(path+'/'+file),‬‬
‫))))‪(width, height‬‬
‫أي�سا؛ لتقييم التقنيات املتن ّوعة لتجميع ال�سور‪ ،‬ومت ت�سميم هذه املجموعة يف االأ�سل ملهام الت�سنيف‪ ،‬وتت�سمن‬ ‫الدر�س ا ً‬
‫)‪filenames.append(file‬‬ ‫العن��وان احلقيق��ي (ن��وع احلي��وان الفعل��ي) ل��كل �س��ورة‪ .‬ويف ه��ذا الدر���س‪� ،‬ستُ�س��تخدم ه��ذه العناوي��ن فق��ط للتحق��ق م��ن‬
‫�سحته��ا‪ ،‬ول��ن تُ�س��تخدم لتجمي��ع ال�س��ور‪ .‬يج��ب اأن يك��ون اأي اأ�س��لوب جتمي��ع اأ�س��لوبًا ف ّع� ً�اال وق��ادرًا عل��ى جتمي��ع ال�س��ور مع‬
‫‪return resized_images,labels,filenames‬‬
‫العنوان نف�سه‪ ،‬ويف العنقود نف�سه‪ ،‬وعلى ف�سل ال�سور ذات العناوين املُختلفة‪ ،‬وو�سعها يف عناقيد ُمتباينة‪.‬‬
‫‪222‬‬ ‫‪221‬‬
‫تتم ّث��ل اخلط��وة التالي��ة يف حُتوي��ل قائمت��ي ‪( resized_images‬ال�س��ور _املُع�دَّل حجمه��ا)‪ ،‬و‪( labels‬العناوي��ن) اإىل‬ ‫البيان��ات غ��ر امل ُنظّ م��ة (‪ )Unstructured Data‬متن ّوع��ة‪ ،‬ومُيك��ن اأن حُتت��اج اإىل كث��ر م��ن الوقت واملوارد احلا�س��وبية‪،‬‬
‫م�سفوف��ات ‪ ،numpy‬وكم��ا ه��و احل��ال يف الدر���س ال�س��ابق ُي�س��تخدم اال�س��مان املتغ� ِّ�ران القيا�س��يان (‪ )X،Y‬لتمثي��ل‬ ‫و ُيع� ُّد ه��ذا �سحي ًح��ا ب�س��كلٍ خا���س عن��د معاجلته��ا ع��ن طري��ق اأ�س��اليب تعلُّ��م عميق��ة ومعق��دة‪ ،‬كم��ا �س� ُينفذ الح ًق��ا يف ه��ذا‬
‫البيانات والعناوين‪:‬‬ ‫الدر���س‪ ،‬ولتقلي��ل الوق��ت احل�س��ابي يت��م تطبي��ق دال��ة ()‪ resize_images_v2‬عل��ى جمموع��ة فرعي��ة م��ن ال�س��ور م��ن‬
‫فئات احليوانات‪:‬‬
‫‪import numpy as np # used for numeric computations‬‬
‫)‪X = np.array(resized_images‬‬ ‫(‪resized_images,labels,filenames=resize_images_v2‬‬
‫)‪Y = np.array(labels‬‬
‫‪"AnimalFace/Image",‬‬
‫‪X.shape‬‬ ‫‪width = 224,‬‬
‫‪height = 224,‬‬
‫‪labels_to_keep=['Lion', 'Chicken', 'Duck', 'Rabbit', 'Deer',‬‬
‫)‪(1085, 224, 224, 3‬‬
‫]'‪'Cat', 'Wolf', 'Bear', 'Pigeon', 'Eagle‬‬
‫)‬
‫يتحق��ق �س��كل البيان��ات م��ن اأنه��ا ت�س��مل ‪� 1,085‬س��ورة‪ ،‬كل �س��ورة منه��ا ذات اأبع��اد ‪ ،224 × 224‬وذات ث��الث قن��وات‬
‫األوان ‪.RGB‬‬ ‫‪BearHead‬‬ ‫‪MonkeyHead‬‬
‫‪CatHead‬‬ ‫‪Natural‬‬ ‫هذه العناوين الع�سرة‬
‫ميع من دون هند�سة اخل�سائ�ض ‪Clustering without Feature Engineering‬‬ ‫الت‬ ‫‪ChickenHead‬‬ ‫‪PandaHead‬‬ ‫التي �سيتم ا�ستخدامها‪.‬‬
‫�س��رتكز حُماول��ة التجمي��ع االأوىل عل��ى القي��ام بت�س��طيح ال�س��ور؛ لتحوي��ل كل منه��ا اإىل م َّتجَ ��ه أاح��ادي ال ُبع��د اأرقام��ه‬ ‫‪CowHead‬‬ ‫‪PigeonHead‬‬
‫‪DeerHead‬‬ ‫‪RabbitHead‬‬
‫‪ 150,528 = 3 × 224 × 224‬رقمًا‪.‬‬ ‫‪DuckHead‬‬ ‫‪SheepHead‬‬
‫‪EagleHead‬‬ ‫‪TigerHead‬‬
‫وعل��ى غ��رار خوارزمي��ات الت�سني��ف الت��ي مت تو�سيحها يف الدر���س ال�س��ابق‪ ،‬ف�اإن معظم خوارزمي��ات التجميع تتطلب هذا‬ ‫‪ElephantHead‬‬ ‫‪WolfHead‬‬
‫النوع من التن�سيق امل َّتجَ هي‪.‬‬ ‫‪LionHead‬‬

‫)]‪X_flat = np.array([img.flatten() for img in X‬‬ ‫مُيكن��ك ب�س��هولة تعدي��ل املتغ� ِّ�ر ‪( labels_to_keep‬العناوي��ن _ املحتف��ظ به��ا)؛ للرتكي��ز عل��ى فئ��ات معيّنة‪ ،‬و�س��تالحظ‬
‫‪X_flat[0].shape‬‬
‫�دال م��ن ال�س��كل ‪ 100 × 100‬ال��ذي ا�س�تُخدم يف الدر���س‬ ‫اأن عر���س ال�س��ور وارتفاعه��ا مت �سبطهم��ا عل��ى ‪ ،224 × 224‬ب� ً‬
‫ال�س��ابق؛ الأن اإح��دى طرائ��ق التجمي��ع القائم��ة عل��ى التعلُّم العميق ‪-‬الواردة يف هذا الدر���س‪ -‬تتطلب اأن تكون لل�سور هذه‬
‫)‪(150528,‬‬
‫االأبعاد‪ ،‬ولذا اعتُمد ال�سكل ‪224 × 224‬؛ ل�سمان منح حق الو�سول جلميع الطرائق اإىل املُدخَ الت نف�سها‪.‬‬
‫كم��ا ذُ كِ ��ر يف الدر���س ال�س��ابق ف �اإن القوائ��م االأ�سلي��ة‪( resized_images :‬ال�س��ور _املُع � َّدل حجمه��ا)‪ ،‬و‪labels‬‬
‫‪X_flat[0] # prints the first flat image‬‬ ‫(العناوي��ن)‪ ،‬و‪( filenames‬اأ�س��ماء امللف��ات) ت�س��تمل عل��ى ال�س��ور الت��ي تنتم��ي ل��كل فئ��ة ُجم َّمعة معًا‪ .‬على �س��بيل املثال‪،‬‬
‫تظه��ر جمي��ع �س��ور ‪( Lion‬االأ�س��د) م ًع��ا يف بداي��ة القائم��ة املُع� َّدل حجمه��ا‪ ،‬وق��د يُ�س ِل��ل ذل��ك العدي��د م��ن اخلوارزمي��ات‪،‬‬
‫‪array([107, 146, 102, ...,‬‬ ‫‪91,‬‬ ‫)‪86, 108], dtype=uint8‬‬ ‫خا�س��ة يف جم��ال روؤي��ة احلا�س��ب‪ ،‬وطامل��ا اأن��ه مُيك��ن فهر�س��ة ال�س��ور ع�س��وائيًا ل��كل قائمة م��ن القوائم الث��الث‪ ،‬فمن املهم‬
‫التاأكد من ا�ستخدام الرتتيب الع�سوائي نف�سه لهذه القوائم‪ .‬وبخالف ذلك‪ ،‬من امل�ستحيل العثور على العنوان ال�سحيح‬
‫كل قيم��ة عددي��ة يف ه��ذا التن�س��يق امل�س��طح ذات قيم��ة أال��وان ‪ RGB‬ت��رتاوح ب��ني ‪ 0‬و‪ ،255‬ويف الدر���س ال�س��ابق‪ّ ،‬مت‬ ‫ل�سورة مع ّينة اأو ا�سم امللف ال�سحيح لها‪.‬‬
‫تو�سيح اأن التحجيم القيا�سي والت�سوية يوؤديان اأحيانًا اإىل حُت�سني نتائج بع�س خوارزميات التعلُّم االآيل‪.‬‬ ‫يف الدر���س ال�س��ابق‪ ،‬مت اإج��راء اإع��ادة الرتتي��ب (‪ )Shuffling‬با�س��تخدام الدال��ة ()‪ ، train_test_split‬ومب��ا اأن ه��ذه‬
‫مُيكن ا�ستخدام املقطع الربجمي التايل لت�سوية القيم وجعلها ما بني ‪ 0‬و‪:1‬‬ ‫الدالة غر قابلة للتطبيق على مهام التجميع‪ ،‬ف�ست�ستخدم املقطع الربجمي التايل الإعادة الرتتيب‪:‬‬

‫‪X_norm = X_flat / 255‬‬ ‫‪import random‬‬


‫]‪X_norm[0‬‬
‫‪#connects the three lists together, so that they are shuffled in the same order‬‬
‫))‪connected = list(zip(resized_images,labels,filenames‬‬
‫‪array([0.41960784, 0.57254902, 0.4‬‬ ‫‪, ..., 0.35686275, 0.3372549 ,‬‬
‫)‪random.shuffle(connected‬‬
‫)]‪0.42352941‬‬
‫‪# disconnects the three lists‬‬
‫)‪resized_images,labels,filenames= zip(*connected‬‬
‫‪224‬‬ ‫‪223‬‬
‫مُيك��ن االآن ت�سوي��ر البيان��ات ب�سر ًي��ا با�س��تخدام اأداة ‪ TSNEVisualizer‬املاألوف��ة م��ن مكتب��ة ‪ ،yellowbrick‬ومت‬
‫‪from sklearn.cluster import AgglomerativeClustering # used for agglomerative clustering‬‬
‫‪import scipy.cluster.hierarchy as hierarchy‬‬
‫أي�سا يف الدر�س الثاين من الوحدة الثالثة؛ لت�سوير العناقيد ب�سريًا يف البيانات الن�سيَّة‪.‬‬
‫ا�ستخدام هذه االأداة ا ً‬
‫‪hierarchy.set_link_color_palette(color_palette) # sets the color palette‬‬ ‫‪%%capture‬‬
‫)(‪plt.figure‬‬ ‫‪!pip install yellowbrick‬‬
‫‪from yellowbrick.text import TSNEVisualizer‬‬
‫‪# iteratively merges points and clusters until all points belong to a single cluster‬‬
‫)'‪linkage_flat = hierarchy.linkage(X_norm, method = 'ward‬‬
‫)‪hierarchy.dendrogram(linkage_flat‬‬ ‫‪( ward‬وارد) عبارة عن‬ ‫‪tsne = TSNEVisualizer(colors = color_palette) # initializes the tool‬‬
‫)(‪plt.show‬‬ ‫طريقة ربط تُ�ستخدم في‬ ‫‪tsne.fit(X_norm, y) # uses TSNE to reduce the data to 2 dimensions‬‬
‫التجميع التكتلي الهرمي‪.‬‬ ‫;)(‪tsne.show‬‬

‫�سكل ‪ :4.19‬الر�سم ال�سجري يُ�سنف البيانات اإىل عنقودين‬


‫يك�س��ف الر�س��م ال�س��جري عنقودين كبرين مُيكن تق�س��يمهما اإىل عناقيد اأ�سغر‪ ،‬و ُي�س��تخدم املقطع الربجمي التايل اأداة‬
‫‪( AgglomerativeClustering‬التجمي��ع التكتل��ي)؛ الإن�س��اء ع�س��رة عناقي��د‪ ،‬وه��و الع��دد الفعل��ي للعناقي��د املوج��ودة يف‬
‫البيانات‪:‬‬
‫�سكل ‪ :4.18‬ت�سوير العناقيد‬
‫)‪AC = AgglomerativeClustering(linkage = 'ward',n_clusters = 10‬‬
‫‪AC.fit(X_norm) # applies the tool to the data‬‬
‫الت�سوي��ر التمهي��دي ه��ذا لي���س كم��ا ه��و متو َّق��ع‪ ،‬فيبدو اأن فئ��ات احليوانات املُختلف��ة خمتلطة ببع�سه��ا‪ ،‬دون متييز وا�سح‬
‫‪pred = AC.labels_ # gets the cluster labels‬‬
‫بينه��ا وب��دون عناقي��د وا�سح��ة له��ا‪ ،‬وي��دل ذل��ك عل��ى اأن جم��رد القي��ام بت�س��طيح بيانات ال�س��ورة االأ�سلية م��ن املحتمل اأال‬
‫‪pred‬‬ ‫يوؤدي اإىل نتائج ذات جودة عالية‪.‬‬
‫بع��د ذل��ك‪� ،‬ستُ�س��تخدم خوارزمي��ة التجمي��ع التكتل��ي (‪ )Agglomerative Clustering‬نف�س��ها الت��ي ا�س �تُخدمت يف‬
‫)‪array([9, 6, 3, ..., 4, 4, 3], dtype=int64‬‬ ‫الدر���س الث��اين م��ن الوح��دة الثالث��ة؛ لتجمي��ع البيان��ات يف متغ� ِّ�ر ‪ ،X_norm‬وي�س��تورد املقط��ع الربجم��ي الت��ايل جمموعة‬
‫االأدوات املطلوبة‪ ،‬وي�س ِّور الر�سم ال�سجري ملجموعة البيانات‪:‬‬
‫واأخ �رًا‪ ،‬تُ�س��تخدم موؤ�س��رات‪( Homogeneity :‬التجان���س)‪ ،‬و‪( Completeness‬االكتم��ال)‪ ،‬و ‪Adjusted Rand‬‬
‫(راند املُع َّدل) وكلها تع ّرفت عليها يف الدر�س الثاين من الوحدة الثالثة؛ لتقييم جودة العناقيد الناجتة‪.‬‬
‫‪226‬‬ ‫‪225‬‬
‫‪from sklearn.metrics import homogeneity_score, adjusted_rand_score,‬‬
‫‪completeness_score‬‬

‫))‪print('\nHomogeneity score:', homogeneity_score(y, pred‬‬


‫))‪print('\nAdjusted Rand score:', adjusted_rand_score(y, pred‬‬
‫))‪print('\nCompleteness score:', completeness_score(y, pred‬‬

‫‪Homogeneity score: 0.09868725008128477‬‬

‫‪Adjusted Rand score: 0.038254515908926826‬‬

‫‪Completeness score: 0.101897123096584‬‬

‫كما �س��بق تو�سيحه بالتف�سيل يف الدر���س الثاين من الوحدة الثالثة‪ ،‬فاإن موؤ�س��ري التجان���س واالكتمال ياأخذان قيمًا بني‬
‫‪ 0‬و‪ ،1‬وترتفع قيمة موؤ�سر التجان�س اإىل اأق�سى حد عندما يكون جلميع نقاط العنقود الواحد العنوان احلقيقي االأ�سا�سي‬
‫نف�س��ه‪ ،‬كم��ا ترتف��ع قيم��ة موؤ�س��ر االكتم��ال اإىل احل��د االأق�س��ى عندم��ا تنتم��ي جمي��ع نق��اط البيان��ات الت��ي حُتم��ل العن��وان‬
‫احلقيقي االأ�سا�س��ي نف�س��ه اإىل العنقود نف�س��ه‪ ،‬واأخرًا ياأخذ موؤ�س��ر راند املُع َّدل قيمًا بني ‪ -0.5‬و‪ ،1.0‬وترتفع اإىل احلد‬
‫�سكل ‪ :4.20‬ت�سوير العناقيد‬ ‫االأق�سى عندما تكون جميع نقاط البيانات التي لها العنوان نف�سه يف العنقود نف�سه‪ ،‬وتكون جميع النقاط ذات العناوين‬
‫ُيع� ُّد ه��ذا الت�سوي��ر اأك��ر م�سداقي��ة م��ن ال��ذي مت اإنتاج��ه للبيانات غ��ر املح َّولة‪ ،‬وعل��ى الرغم من وجود بع�س ال�س��وائب‪،‬‬ ‫املُختلفة يف عناقيد متباينة‪ ،‬وكما هو متوقَّع تف�سل اخلوارزمية بعد ت�سوير البيانات يف العثور على عناقيد عالية اجلودة‬
‫جيدا‪ ،‬ومُيكن االآن ح�ساب الر�سم ال�سجري ملجموعة البيانات هذه‪.‬‬ ‫فاإن ال�سكل ُيظهر عناقيد وا�سحة ومف�سولة ً‬ ‫تتطابق مع فئات احليوانات الفعلية‪ ،‬حيث اأن قيم املوؤ�سرات الثالث منخف�سة للغاية‪ ،‬وعلى الرغم من اأن جمرد القيام‬
‫بت�سطيح البيانات كان كافيًا للح�سول على نتائج معقولة لت�سنيف ال�سور‪ ،‬اإال اأن جتميع ال�سور يف عناقيد ُمُيثِّل م�سكلة‬
‫)(‪plt.figure‬‬ ‫اأكر �سعوبة‪.‬‬
‫)'‪linkage_2 = hierarchy.linkage(X_hog,method = 'ward‬‬
‫)‪hierarchy.dendrogram(linkage_2‬‬ ‫ميع بانتقاء اخل�سائ�ض ‪Clustering with Feature Se ection‬‬ ‫الت‬
‫)(‪plt.show‬‬ ‫يف الدر���س ال�س��ابق مت تو�سي��ح اأنّ ا�س��تخدام حُتوي��ل املخط��ط التك��راري للتدرج��ات املوجَّ ه��ة (‪ )HOG‬لتحوي��ل بيان��ات‬
‫ال�سور اإىل �سيغة اأكر داللة يوؤدي اإىل اإجناز اأعلى ب�سكل ملحوظ يف ت�سنيف ال�سور‪ ،‬و�س ُيط َّبق التحويل نف�سه الختبار‬
‫أي�سا حُت�سني نتائج مهام جتميع ال�سور‪.‬‬ ‫ما اإذا كان باإمكانه ا ً‬
‫‪from skimage.color import rgb2gray‬‬
‫‪from skimage.feature import hog‬‬
‫‪# converts the list of resized images to an array of grayscale images‬‬
‫)]‪X_gray = np.array([rgb2gray(img) for img in resized_images‬‬
‫‪# computes the HOG features for each grayscale image in the array‬‬
‫)]‪X_hog = np.array([hog(img) for img in X_gray‬‬
‫‪X_hog.shape‬‬

‫)‪(1085, 54756‬‬

‫يك�س��ف �س��كل البيانات املحوَّلة اأن كل �سورة ُمتثَّل االآن على هيئة م َّتجَ ه بقيمة عددية هي‪ :‬اأربعة وخم�س��ون األفًا و�س��بعمئة‬
‫و�ستة وخم�سون (‪.)54,756‬‬
‫ي�ستخدم املقطع الربجمي التايل اأداة ‪ TSNEVisualizer‬لت�سوير هذا التن�سيق اجلديد‪:‬‬ ‫ِ‬
‫)‪tsne = TSNEVisualizer(colors = color_palette‬‬
‫)‪tsne.fit(X_hog, y‬‬
‫املوجهة (‪)HOG‬‬
‫�سكل ‪ :4.21‬الر�سم ال�سجري لفئات وجوه احليوانات املُختلفة با�ستخدام خمطط تكراري للتدرجات َّ‬ ‫;)(‪tsne.show‬‬

‫‪228‬‬ ‫‪227‬‬
‫ميع با�ستخدام ال�سبكات الع�سبية ‪Clustering Using Neural Networks‬‬ ‫الت‬ ‫يق��رتح الر�ص��م ال�ص��جري خم�ص��ة عناقي��د‪ ،‬وه��و بال�صب��ط ن�ص��ف الع��دد ال�صحي��ح البال��غ ع�ص��رة عناقي��د‪ .‬يتبن��ى املقط��ع‬
‫أاح�دث ا�س�تخدام من�اذج التعلُّ�م العمي�ق (ال�س�بكات الع�سبي�ة العميق�ة ذات الطبقات املتعددة) ثورة يف جم�ال جتميع ال�سور من خالل‬ ‫الربجمي التايل هذا االقرتاح ويط ِّبق اأداة ‪( AgglomerativeClustering‬التجميع التكتلي) و ُيظهر نتائج املوؤ�ص��رات‬
‫توفر خوارزميات قوية وعالية الدقة‪ ،‬ومُيكنها جتميع ال�سور املت�سابهة معًا تلقائيًا دون احلاجة اإىل هند�سة اخل�سائ�س‪ .‬تعتمد العديد‬ ‫الثالثة‪:‬‬
‫م�ن الطرائ�ق التقليدي�ة لتجمي�ع ال�س�ور عل�ى خا�سي�ة امل�س�تخرِجات (‪ )Extractors‬ال�س�تخراج معلوم�ات ذات مغ�زى م�ن �س�ورة م�ا‪،‬‬
‫)‪AC = AgglomerativeClustering(linkage = 'ward', n_clusters = 5‬‬
‫طويال وتتطلب خربة يف املجال لت�سميم‬ ‫وا�ستخدام هذه املعلومات لتجميع ال�سور املت�سابهة معًا‪ ،‬ومُيكن اأن ت�ستغرق هذه العملية وقتًا ً‬ ‫)‪AC.fit(X_hog‬‬
‫خا�سي�ة امل�س�تخرِ جات بخ�سائ��س فعّال�ة‪ .‬باالإ�ساف�ة اإىل ذل�ك ‪-‬وكم�ا مت التو�سي�ح يف الدر��س ال�س�ابق‪ -‬عل�ى الرغ�م م�ن اأن خا�سي�ة‬ ‫_‪pred = AC.labels‬‬
‫الوا�سفات (‪ )Descriptors‬مثل‪ :‬حُتويل املخطط التكراري للتدرجات املوجَّ هة مُيكنها بالفعل حُت�سني النتائج‪ ،‬اإال اأنها بعيدة كل ال ُبعد‬ ‫ِ‬
‫))‪print('\nHomogeneity score:', homogeneity_score(y, pred‬‬
‫ع�ن الكم�ال‪ ،‬وبالتاأكي�د يوج�د جم�ال للتح�س�ني‪ .‬م�ن ناحي�ة اأخ�رى‪ ،‬يتمت�ع التعلُّ�م العمي�ق بالق�درة عل�ى تعلُّ�م متثي�الت اخل�سائ��س م�ن‬ ‫))‪print('\nAdjusted Rand score:', adjusted_rand_score(y, pred‬‬
‫البيانات اخلام تلقائيًا‪ ،‬ويتيح ذلك لطرائق التعلُّم العميق معرفة اخل�سائ�س �سديدة التمايز التي تلتقط االأمناط الهامة وراء البيانات‪،‬‬ ‫))‪print('\nCompleteness score:', completeness_score(y, pred‬‬
‫مما يوؤدي اإىل جتميع اأكر دقة وقوة‪ ،‬ولتحقيق ذلك تُ�ستخدم عدة طبقات ُخمتلفة يف ال�سبكة الع�سبية مبا فيها‪:‬‬
‫• الطبقات الكثيفة (‪)Dense Layers‬‬ ‫‪Homogeneity score: 0.4046340612330986‬‬
‫• طبقات التجميع (‪)Pooling Layers‬‬
‫‪Adjusted Rand score: 0.29990205334627734‬‬
‫• طبقات االإق�ساء (‪)Dropout Layers‬‬
‫‪Completeness score: 0.6306921317302154‬‬
‫يف ال�سبكة الع�سبية يف الدر�س االأول من الوحدة الثالثة‪ ،‬مت ا�ستخدام طبقة خمفية‬
‫الطبقة الكثيفة (‪:)Dense Layer‬‬ ‫مكون�ة م�ن ث�الث مئ�ة خلية ع�سبي�ة من من�وذج الكلم�ة اإىل امل َّتجَ �ه(‪)Word2Vec‬؛‬
‫ه�ي طبق�ة يف ال�س�بكات الع�سبي�ة ترتب�ط‬ ‫تك�ص��ف النتائ��ج اأن��ه عل��ى الرغ��م م��ن اأن ع��دد العناقي��د الت��ي مت ا�ص��تخدامها كان اأق��ل بكث��ر م��ن الع��دد ال�صحي��ح‪ ،‬اإال اأن‬
‫لتمثيل كل كلمة‪ ،‬ويف تلك احلالة ُد ِّرب منوذج الكلمة اإىل امل َّتجَ ه م�سبقًا على جمموعة‬ ‫النتائج اأف�صل بكثر من النتائج التي ظهرت عند ا�صتخدام الرقم ال�صحيح على البيانات غر املح َّولة‪.‬‬
‫فيها كل ال ُعقد التي يف الطبقة ال�سابقة بكل‬ ‫بيانات كبرة جدًا حُتتوي على ماليني االأخبار من اأخبار قوقل (‪.)Google News‬‬
‫ال ُعق�د الت�ي يف الطبق�ة احلالي�ة‪ ،‬حي�ث يتم‬ ‫أي�سا يف جمال روؤية احلا�س�ب‪،‬‬ ‫تُع ُّد مناذج ال�س�بكات الع�سبية املد َّربة م�س�بقًا �س�ائعة ا ً‬ ‫املوجهة‪ ،‬ويُثبت اأنه ميكن اأن يوؤدي اإىل حت�ص��ينات‬ ‫ويو�صح ذلك ذكاء التحويل بوا�ص��طة املخطط التكراري للتدرجات َّ‬ ‫ِّ‬
‫متري�ر االإ�س�ارات م�ن ال ُعق�د يف الطبق�ة‬ ‫وم�ن االأمثل�ة املعه�ودة عل�ى ذل�ك من�وذج ‪ VGG16‬ال�ذي ي�س�يع ا�س�تخدامه يف مه�ام‬ ‫املوج��ه يف روؤي��ة احلا�ص��ب‪ ،‬والإكم��ال التحلي��ل ُيعي��د‬
‫املوج��ه ومه��ام التعلُّ��م غ��ر َّ‬
‫رائع��ة يف االأداء ل��كل م��ن مه��ام التعلُّ��م َّ‬
‫ال�س�ابقة يف ال�س�بكة اإىل ال ُعق�د يف الطبق�ة‬ ‫التع�رّف عل�ى ال�س�ور‪ ،‬ويتب�ع من�وذج ‪ VGG16‬معماري�ة عميق�ة قائمة على ال�س�بكات‬ ‫املقط��ع الربجم��ي الت��ايل جُتميع البيانات املح َّول��ة بالعدد ال�صحي��ح للعناقيد‪:‬‬
‫احلالي�ة بوا�س�طة وزني�ة حُم� َّددة‪ ،‬وتُط َّب�ق‬ ‫موج ًه�ا ُد ِّرب على‬
‫منوذجا َّ‬
‫ً‬ ‫الع�سبي�ة الرت�س�يحية يوج�د به�ا �س�ت ع�س�رة طبق�ة‪ ،‬و ُيع� ُّد‬
‫دالَّة التن�سيط (‪)Activation Function‬‬ ‫)‪AC = AgglomerativeClustering(linkage = 'ward', n_clusters = 10‬‬
‫جمموعة بيانات كبرة من ال�سور املُعَنوَنة ت�سمى �سبكة ال�سور(‪ ،)ImageNet‬ومع‬ ‫)‪AC.fit(X_hog‬‬
‫املر�سلة اإىل الطبقة الكثيفة‬‫على االإ�سارات َ‬ ‫ذلك‪ ،‬تتكون جمموعة بيانات التدريب اخلا�سة بنموذج ‪ VGG16‬من ماليني ال�سور‬ ‫_‪pred = AC.labels‬‬
‫لتوليد نتائج االإخراج النهائية‪.‬‬ ‫يح�سن ب�سكل كبر من قدرة النموذج على فهم االأجزاء‬ ‫ومئات العناوين املُختلفة‪ ،‬مما ِّ‬
‫))‪print('\nHomogeneity score:', homogeneity_score(y, pred‬‬
‫املو�سحة‬
‫املُختلف�ة م�ن ال�س�ورة‪ ،‬وعلى غرار ال�س�بكة الع�سبية الرت�س�يحية الب�س�يطة َّ‬ ‫))‪print('\nAdjusted Rand score:', adjusted_rand_score(y, pred‬‬
‫أي�س�ا طبق�ة كثيف�ة نهائية حُتتوي على‬ ‫�تخدم من�وذج ‪ VGG16‬ا ً‬ ‫يف ال�س�كل ‪ ،4.22‬وي�س ِ‬ ‫))‪print('\nCompleteness score:', completeness_score(y, pred‬‬
‫طبقة الت ميع (‪:)Pooling Layer‬‬ ‫اأربعة اآالف و�ستة وت�سعني خلية ع�سبية لتمثيل كل �سورة قبل اإدخالها يف طبقة امل ُخرَج‬
‫ه��ي طبق��ة يف ال�س��بكات الع�سبي��ة‬ ‫ويو�سح هذا الق�سم كيف مُيكن تكييف منوذج ‪ VGG16‬لتجميع‬ ‫(‪ِّ ،)Output Layer‬‬ ‫‪Homogeneity score: 0.5720932612704411‬‬
‫تُ�س��تخدم لتقلي��ل ا الأبع��اد الفراغي��ة‬ ‫ال�سور‪ ،‬على الرغم من اأنه ُ�س ِّمم يف االأ�سل لت�سنيف ال�سور‪:‬‬
‫لبيانات املُدخَ الت‪.‬‬ ‫‪Adjusted Rand score: 0.41243540297103065‬‬
‫‪ 1‬حمِّل النموذج ‪ VGG16‬الذي ُدرِّب م�سبقًا‪.‬‬
‫‪ 2‬احذف طبقة املُخرَج من النموذج‪ ،‬فذلك يجعل الطبقة االأخرة الكثيفة هي طبقة‬ ‫‪Completeness score: 0.617016965322667‬‬
‫املُخرَج اجلديدة‪.‬‬
‫طبقة األإق�ساء (‪:)Dropout Layer‬‬ ‫وكما هو متوقَّع‪ ،‬زادت قيم املوؤ�ص��رات ب�ص��كل عام‪ ،‬فعلى �ص��بيل املثال جُتاوز كل من التجان���ص واالكتمال االآن ‪ ،0.55‬مما‬
‫ه�ي طريق�ة تنظي�م تُ�س�تخدم ملن�ع ف�رط‬ ‫�ذي‬ ‫ل‬ ‫ا‬ ‫�ابق‬ ‫س‬‫ال�‬ ‫�وذج‬ ‫م‬‫‪-‬الن‬ ‫)‬ ‫‪Truncated‬‬ ‫‪Model‬‬ ‫(‬ ‫�ع‬ ‫ط‬‫املقت‬ ‫�وذج‬‫‪ 3‬ا�س�تخدم النم‬
‫اقتُطع�ت الطبق�ة االأخ�رة من�ه‪ -‬؛ لتحوي�ل كل �س�ورة يف جمموع�ة بيان�ات‬ ‫ي��دل عل��ى اأن اخلوارزمي��ة تق��وم بعم��ل اأف�ص��ل فيم��ا يتعل��ق ب��كل م��ن‪ :‬و�ص��ع احليوان��ات الت��ي تنتمي لفئ��ة واح��دة يف العنقود‬
‫التخ�سي��س يف من�وذج ملجموعة بيانات يف‬ ‫نف�صه‪ ،‬واإن�صاء عناقيد نقية (‪ )Pure‬تتكون يف الغالب من فئة احليوان نف�صِ ه‪.‬‬
‫ال�س�بكات الع�سبية عن طريق اإق�ساء عُ قد‬ ‫‪( Animal Faces‬وجوه احليوانات) اإىل م َّتجَ ه عددي له اأرب ُع اآالف ٌ‬
‫و�ست وت�سعون‬
‫موجودة يف الطبقة خالل ك ّل دورة تدريب‪.‬‬ ‫قيمة‪.‬‬
‫‪ 4‬ا�ستخدم التجميع التكتلي ؛ لتجميع امل َّتجَ هات الناجتة عن ذلك‪.‬‬
‫‪230‬‬ ‫‪229‬‬
‫‪Conv 1-1‬‬
‫‪Conv 1-1‬‬

‫‪Conv 2-1‬‬
‫‪Conv 2-2‬‬

‫‪Conv 3-1‬‬
‫‪Conv 3-2‬‬
‫‪Conv 3-3‬‬

‫‪Conv 4-1‬‬
‫‪Conv 4-2‬‬
‫‪Conv 4-3‬‬

‫‪Conv 5-1‬‬
‫‪Conv 5-2‬‬
‫‪Conv 5-3‬‬
‫‪Pooling‬‬

‫‪Pooling‬‬

‫‪Pooling‬‬

‫‪Pooling‬‬

‫‪Pooling‬‬

‫‪Dense‬‬
‫‪Dense‬‬
‫‪Dense‬‬
‫امل ُدخَ ل‬ ‫امل ُخرَج‬

‫�صكل ‪ :4.22‬معمارية منوذج ‪VGG16‬‬


‫ميك��ن ا�ص��تخدام مكتب��ة ‪ TensorFlow‬ومكتب��ة ‪ Keras‬اللت��ني تع ّرف��ت عليهم��ا يف الدر���ص ال�ص��ابق للو�ص��ول اإىل من��وذج‬
‫‪ VGG16‬واقتطاعه‪ ،‬وتتمثّل اخلطوة االأوىل يف ا�صتراد جميع االأدوات املطلوبة‪:‬‬
‫‪from keras.applications.vgg16 import VGG16 # used to access the pre-trained VGG16 model‬‬
‫‪from keras.models import Model‬‬

‫‪model = VGG16() # loads the pretrained VGG16 model‬‬


‫يحذف الطبقة االأخيرة من المُخرَج‪.‬‬
‫‪# removes the output layer‬‬
‫)‪model = Model(inputs = model.inputs, outputs = model.layers[-2].output‬‬

‫يطبِّق املقطع الربجمي التايل املعاجلة االأولية االأ�صا�ص��ية نف�ص��ها التي يتطلبها منوذج ‪ VGG16‬مثل‪ :‬حتجيم قيم األوان‬
‫�صكل ‪ :4.23‬ت�صوير العناقيد املت�صابهه‬ ‫‪ RGB‬لتكون بني ‪ 0‬و‪.1‬‬
‫تُع ُّدالنتائج مذهلة؛ الأن الت�صوير اجلديد يك�صف عناقيد مف�صولة عن بع�صها بو�صوح وتكاد تكون كاملة‪ ،‬كما اأن الف�صل‬
‫املوجهة‪.‬‬ ‫‪from keras.applications.vgg16 import preprocess_input‬‬ ‫)‪(1085, 224, 224, 3‬‬
‫هنا اأف�صل بكثر من الف�صل الذي كان يف البيانات التي ُح ِّولت بوا�صطة املخطط التكراري للتدرجات َّ‬ ‫)‪X_prep = preprocess_input(X‬‬
‫‪X_prep.shape‬‬
‫)'‪linkage_3 = hierarchy.linkage(X_VGG16, method = 'ward‬‬
‫)(‪plt.figure‬‬
‫)‪hierarchy.dendrogram(linkage_3‬‬ ‫الح��ظ اأن �ص��كل البيان��ات يظ��ل كم��ا ه��و‪ ،‬اأي‪ :‬األ��فٌ وخم�� ٌ�ص وثمان��ون �ص��ورة‪ ،‬كل �ص��ورة منها اأبعاده��ا ‪ ،224 × 224‬وثالث‬
‫)(‪plt.show‬‬ ‫قنوات األوان ‪ ،RGB‬وبعد ذلك ميكن ا�صتخدام النموذج املقتطع لتحويل كل �صورة اإىل م َّتجه مكّون من ‪ 4,096‬عدد‪.‬‬

‫)‪X_VGG16 = model.predict(X_prep, use_multiprocessing = True‬‬


‫‪X_VGG16.shape‬‬

‫‪34/34 [==============================] - 57s 2s/step‬‬

‫)‪(1085, 4096‬‬

‫ُي�صب��ط متغ� ِّ�ر املعاجل��ة املتع��ددة ‪( multiprocessing=True‬تفعي��ل املعاجل��ة املتع��ددة) لت�ص��ريع العملي��ة م��ن خ��الل‬
‫ح�ص��اب امل َّتجَ ه��ات لل�ص��ور املتع��ددة بالت��وازي‪ ،‬وقب��ل اإكم��ال خط��وة التجمي��ع ُي�ص��تخدم املقط��ع الربجم��ي الت��ايل لت�صوي��ر‬
‫البيانات املتّجِ هة(‪:)vectorized data‬‬

‫)‪tsne = TSNEVisualizer(colors = color_palette‬‬


‫)‪tsne.fit(X_VGG16, labels‬‬
‫�صكل ‪ :4.24‬الر�صم ال�صجري الهرمي لفئات وجوه احليوانات املُختلفة با�صتخدام منوذج ‪VGG16‬‬ ‫;)(‪tsne.show‬‬
‫يق��رتح الر�ص��م ال�ص��جري اأربع��ة عناقي��د‪ ،‬ويف ه��ذه احلال��ة ميك��ن للممار���ص اأن يتجاهل االقرتاح ب�ص��هولة‪ ،‬وي ّتب��ع الت�صوير‬
‫يبني بو�صوح وجود ع�صرة عناقيد‪.‬‬ ‫بدال منه والذي ّ‬ ‫ال�صابق ً‬
‫‪232‬‬ ‫‪231‬‬
‫مترينات‬ ‫ويو�صح قيم املوؤ�صرات لكل من العناقيد االأربعة والعناقيد الع�صرة‪:‬‬
‫ي�صتخدِ م املقطع الربجمي التايل التجميع التكتلي ِّ‬
‫)‪AC = AgglomerativeClustering(linkage = 'ward',n_clusters = 4‬‬
‫)‪AC.fit(X_VGG16‬‬
‫‪ 1‬اذكر امليزة التي تتمتع بها تقنيات التعلُّم غر املوجَّ ه مقارنة بتقنيات التعلُّم املوجَّ ه يف حتليل ال�صور‪.‬‬ ‫_‪pred=AC.labels‬‬

‫))‪print('\nHomogeneity score:', homogeneity_score(y, pred‬‬


‫))‪print('\nAdjusted Rand score:', adjusted_rand_score(y, pred‬‬
‫))‪print('\nCompleteness score:', completeness_score(y, pred‬‬

‫‪Homogeneity score: 0.504687456015823‬‬

‫‪Adjusted Rand score: 0.37265351562538257‬‬

‫‪Completeness score: 0.9193141240200559‬‬

‫‪ 2‬لدي��ك م�صفوف��ة قي��م موح��دة ‪ X_flat‬ت�ص��مل �ص��ورًا مُ�ص��طحة‪� ،‬كل �ص��ف يف امل�صفوف��ة مي ِّث��ل �ص��ورة م�ص��طحة ُخُمتلف��ة‬
‫عل��ى هيئ��ة متتالي��ة م��ن اآلأع��داد ال�صحيح��ة ت��را�ح ب��ني ‪ .255� 0‬اأكم��ل املقط��ع الربجم��ي الت��ايل‪ ،‬بحي��ث ي�ص��تخدِ م‬ ‫)‪AC = AgglomerativeClustering(linkage='ward',n_clusters = 10‬‬
‫)‪AC.fit(X_VGG16‬‬
‫التجميع التكتلي يف ت�صنيف ال�صور التي من ‪ X_flat‬اإىل خم�صة عناقيد ُخُمتلفة‪:‬‬ ‫_‪pred=AC.labels‬‬

‫))‪print('\nHomogeneity score:', homogeneity_score(y, pred‬‬


‫‪from‬‬ ‫‪import AgglomerativeClustering # used for agglomerative clustering‬‬ ‫))‪print('\nAdjusted Rand score:', adjusted_rand_score(y, pred‬‬
‫))‪print('\nCompleteness score:', completeness_score(y, pred‬‬

‫‪AC = AgglomerativeClustering(linkage='ward',‬‬ ‫)‬


‫‪Homogeneity score: 0.8403973102506642‬‬
‫= ‪X_norm‬‬ ‫‪# normalizes the data‬‬
‫‪Adjusted Rand score: 0.766734821176714‬‬

‫‪AC.fit(X_norm) # applies the tool to the data‬‬ ‫‪Completeness score: 0.8509145102288217‬‬

‫‪pred = AC.‬‬ ‫‪# gets the cluster labels‬‬ ‫تثب��ت النتائ��ج �صح��ة االأدل��ة الت��ي قدمه��ا الت�صوي��ر‪ ،‬وت�وؤدي التح��والت الت��ي اأنتجه��ا من��وذج ‪ VGG16‬اإىل نتائ��ج مذهل��ة‬
‫اإىل حد كبر لكل من العناقيد االأربعة والعناقيد الع�صرة‪ .‬يف الواقع‪ ،‬ظهرت نتائج �صبه مثالية جلميع املوؤ�صرات الثالثة‬
‫عند ا�صتخدام ع�صرة عناقيد‪ ،‬مما يثبت اأن النتائج غالبًا تتوافق متامً ا مع فئات احليوانات يف جمموعة البيانات‪.‬‬
‫ُيع� ُّد من��وذج ‪ VGG16‬م��ن أاق��دم مناذج ال�ص��بكات الع�صبية الرت�ص��يحية عالية الذكاء املد َّربة م�ص��بقًا لغر�ص ا�ص��تخدامها‬
‫‪ 3‬عدِّد بع�ش مزايا ا�صتخدام التعلُّم العميق التي ميتاز بها على طرائق جتميع ال�صور التقليدية‪.‬‬ ‫يف تطبيقات روؤية احلا�ص��ب‪ ،‬ومع ذلك نُ�ص��رت العديد من مناذج ال�ص��بكات الع�صبية الرت�ص��يحية الذكية االأخرى املد َّربة‬
‫م�صبقًا والتي جُتاوز اأداوؤها اأداء منوذج ‪.VGG16‬‬

‫‪234‬‬ ‫‪233‬‬
‫الدر�ص الثالث‬ ‫‪ 4‬لدي��ك م�صفوف��ة قي��م موح��دة ‪ X_flat‬ت�ص��مل �ص��ورًا م�ص��طحة‪� ،‬كل �ص��ف يف امل�صفوف��ة مي ِّث��ل �ص��ورة م�ص��طحة ُخُمتلف��ة‬
‫توليد البيانات املرئية‬ ‫عل��ى هيئ��ة متتالي��ة م��ن اآلأع��داد ال�صحيحةت��را�ح ب��ني ‪ .255� 0‬اأكم��ل املقط��ع الربجم��ي الت��ايل‪ ،‬بحي��ث ي�ص��تخدم‬
‫طريقة �ارد (‪ )ward‬آلإن�صاء �ت�صوير ر�صم �صجري لل�صور يف هذه امل�صفوفة‪:‬‬
‫‪import scipy.cluster.hierarchy as hierarchy # visualizes and supports hierarchical clustering tasks‬‬

‫ا�س��تخدام ال��ذكاء األ�سطناع��ي يف تولي��د‬


‫‪import‬‬ ‫‪as plt‬‬
‫ال�سور ‪Using AI to Generate Images‬‬
‫بينم��ا رك��زت خوارزمي��ات روؤي��ة احلا�ص��ب الت��ي مت تو�صيحه��ا يف الدر�ص��ني‬
‫ال�ص��ابقني م��ن ه��ذه الوح��دة عل��ى فه��م اجلوان��ب املُختلف��ة ل�ص��ورة مع ّين��ة‪،‬‬ ‫= ‪X_norm‬‬ ‫‪# normalizes the data‬‬
‫ُير ّك��ز جم��ال تولي��د ال�ص��ور (‪ )Image Generation‬يف ه��ذا الدر���ص‬
‫على اإن�صاء �صور جديدة‪ .‬فمجال توليد ال�صور (‪)Image Generation‬‬ ‫‪plt.figure() # creates a new empty figure‬‬
‫ل��ه تاري��خ طوي��ل يع��ود اإىل اخلم�ص��ينيات وال�ص��تينيات من القرن الع�ص��رين‪،‬‬
‫عندم��ا ب��د أا الباحث��ون الأول م��رة يف اإج��راء جُت��ارب عل��ى مع��ادالت ريا�صي��ة‬ ‫(‪linkage_flat=hierarchy.linkage‬‬ ‫'=‪, method‬‬ ‫)'‬
‫الإن�ص��اء ال�ص��ور‪ ،‬ويف ع�صرن��ا احل��ايل من��ا ه��ذا املج��ال لي�ص��مل جمموع��ة‬
‫وا�ص��عة م��ن التقني��ات‪ُ .‬يع� ُّد ا�ص��تخدام الفراكت��الت (‪ )Fractals‬من اأقدم‬ ‫‪hierarchy.‬‬ ‫)‪(linkage_flat‬‬
‫واأ�صهر تقنيات اإن�صاء ال�صور‪ ،‬والفراكتل هو �صكل اأو منط هند�صي م�صابه‬
‫لذاته‪ ،‬مما يعني اأنه يبدو مت�ص��ابهًا عند تكبره مبقايي���ص ُخُمتلفة‪ ،‬واأ�ص��هر‬
‫‪plt.show() #shows the figure‬‬
‫�صكل ‪ :4.25‬فراكتال ماندلربوت‬
‫فراكت��ل ه��و ال��ذي ي�صم جمموعة ماندل��رب�ت (‪َّ )Mandelbrot‬‬
‫املو�صح‬
‫يف ال�صكل ‪.4.25‬‬
‫يف اأواخر القرن الع�صرين‪ ،‬بداأ الباحثون يف ا�صتك�صاف اأ�صاليب اأكر تقدمً ا لتوليد ال�صور مثل ال�صبكات الع�صبية‪.‬‬
‫ن�ش (‪ )Text-to-Image Synthesis‬من اأكر التقنيات �ص��يوعً ا الإن�ص��اء ال�صور با�ص��تخدام ال�ص��بكات الع�صبية‪،‬‬ ‫ُيع ُّد اإن�ص��اء �صورة من ّ‬
‫وتت�صم��ن ه��ذه التقني��ة تدري��ب �ص��بكة ع�صبي��ة عل��ى تولي��د �ص��ور م��ن اأو�صاف ن�ص َّي��ة‪ ،‬فتُد َّرب ال�ص��بكة الع�صبية على جمموع��ة بيانات من‬ ‫‪�ِ 5‬صف الطريقة التي يُطبَّق بها التجميع بال�صبكات الع�صبية يف حتليل ال�صور‪.‬‬
‫ال�ص��ور واالأو�ص��اف الن�ص َّي��ة املرتبط��ة به��ا‪ .‬وتتعلّم ال�ص��بكة ربط كلمات اأو عبارات معيّنة بخ�صائ�ص معيّنة لل�صورة مثل‪� :‬ص��كل العن�صر‬
‫اأو لون��ه‪ ،‬ومبج��رد اأن ُت��د َّرب ال�ص��بكة ي�صب��ح م��ن املمك��ن ا�ص��تخدامها يف اإن�ص��اء �ص��ور جدي��دة بن��ا ًء عل��ى االأو�ص��اف ال��واردة يف الن���ص‪،‬‬
‫وتُ�صتخدم هذه التقنية يف اإن�صاء جمموعة وا�صعة من ال�صور ترتاوح ما بني العنا�صر الب�صيطة اإىل امل�صاهد املعقدة‪.‬‬
‫وهن��اك تقني��ة اأخ��رى لتولي��د ال�ص��ورة تتم ّث��ل يف اإن�ص��اء �ص��ورة م��ن �ص��ورة (‪ ،)Image-to-Image Synthesis‬وتت�صم��ن ه��ذه التقني��ة‬
‫تدري��ب �ص��بكة ع�صبي��ة عل��ى جمموع��ة بيان��ات م��ن ال�ص��ور؛ لتتع ّل��م التع�رّف عل��ى اخل�صائ�ص الفري��دة لل�ص��ورة حتّى تولّد �ص��ورًا جديدة‬
‫م�ص��ابهة لل�ص��ورة املوج��ودة‪ ،‬ولك��ن م��ع وج��ود اختالف��ات‪ .‬يف االآون��ة االأخ��رة ا�صتك�ص��ف الباحث��ون اإن�ص��اء �ص��ورة م��ن �ص��ورة باآل�صر�ص��اد‬
‫بن�� ّ�ش (‪ ،)Text-Guided Image-to-Image Synthesis‬مم��ا يجم��ع ب��ني نق��اط الق��وة يف طرائ��ق اإن�ص��اء �ص��ورة م��ن ن� ّ��ص‪ ،‬وطرائ��ق‬
‫اإن�ص��اء �ص��ورة م��ن �ص��ورة م��ن خ��الل ال�ص��ماح للم�ص��تخدِ م بتوجي��ه عملي��ة االإن�ص��اء با�ص��تخدام توجيه��ات ن�ص َّي��ة (‪،)Text Prompts‬‬
‫وتُ�ص��تخدم ه��ذه التقني��ة يف تولي��د �ص��ور عالي��ة اجل��ودة تتواف��ق م��ع التوجي��ه الن�ص� ّ�ي ‪ ،‬وتك��ون يف الوق��ت ذات��ه م�ص��ابهة ب�صر ًي��ا لل�ص��ورة‬
‫الطبيعية‪.‬‬
‫و اأ خ � ًر ا‪ ،‬هن��اك تقني��ة اأ خ��رى م��ن اأ ح��دث التقني��ات يف ه��ذا املج��ال تتم ّث��ل يف ر�ص��م �ص��ورة باآل�صر�ص��اد بن�� ّ�ش‬
‫(‪ ،)Text-Guided Image-Inpainting‬ويُر ِّك��ز عل��ى م��لء االأج��زاء املفق��ودة اأو التالف��ة م��ن ال�ص��ورة بن��ا ًء عل��ى و�ص��ف ن�ص��يٍّ مع��ني‪،‬‬
‫ويقدِّ م الو�صف الن�صيّ معلومات عن ال�ص��كل الذي يجب اأن تبدو عليه االأجزاء املفقودة اأو التالفة من ال�صورة‪ ،‬والهدف من خوارزمية‬
‫الر�ص��م ه��ذه اأن تُ�ص��تخدم املعلوم��ات؛ الإن�ص��اء �ص��ورة واقعي��ة ومرتابط��ة‪ .‬يق��دم ه��ذا الدر���ص اأمثل��ة عملي��ة عل��ى تولي��د ال�ص��ور م��ن خ��الل‪:‬‬
‫بن�ص‪ ،‬ور�صم �صور باال�صرت�صاد بن�ص‪.‬‬ ‫ن�ص‪ ،‬واإن�صاء �صورة من �صورة باال�صرت�صاد ّ‬ ‫اإن�صاء �صورة من ّ‬
‫‪236‬‬ ‫‪235‬‬
‫أل�ستخدام مفكرة البايثون‪:‬‬ ‫توليد ال�سور واملوارد احلا�سوبية‬
‫‪Image Generation and Computational Resources‬‬
‫‪1‬‬ ‫ ا�صغط على ‪( File‬ملف)‪ ،‬ثم على ‪( New notebook‬مفكرة جديدة)‪.‬‬
‫وحدة معاجلة الر�سومات‬ ‫اإن�ص��اء ال�صور م ُِه َّمة مكلِّفة من الناحية احلا�ص��وبيّة؛ الأنها تت�صمن ا�ص��تخدام‬
‫ ا�صغط على ‪( Files‬ملفات)‪ 2 ،‬ويف املنطقة املجاورة التي �صتظهر لك ا�صحب‬ ‫خوارزمي��ات معق��دة تتطل��ب ق��درات عالي��ة م��ن ق��وة املعاجل��ة‪ ،‬وع��اد ًة تت�صم��ن‬
‫واأفلت ‪( images‬ال�صور) التي �صت�صتخدمها يف الدر�ص‪3 .‬‬
‫(‪:)Graphics Processing Unit - GPU‬‬
‫املعاجلات م�صمَّم‬
‫هي نوع خا�ص من اأنواع ِ‬ ‫ه��ذه اخلوارزمي��ات معاجل��ة كمي��ات كب��رة م��ن البيان��ات مث��ل‪ :‬من��اذج ثالثي��ة‬
‫‪4‬‬ ‫ ميكنك االآن كتابة مقطعك الربجمي بلغة البايثون داخل خلية املقطع الربجمي‪،‬‬ ‫أي�صا اإىل زيادة‬
‫االأبع��اد‪ ،‬والنقو���ص‪ ،‬ومعلوم��ات االإ�صاءة‪ ،‬مما ميك��ن اأن يوؤدي ا ً‬
‫ثم �صغِّله من خالل ال�صغط على الزر املوجود بجانبه‪5 .‬‬ ‫للتعامل مع كميات كبرة من العمليات احل�صابية‬
‫املطلوبة ملعاجلة ال�صور والفيديوهات‪.‬‬ ‫املتطلب��ات احلا�ص��وبية للمُهِ َّم��ة‪ُ .‬يع� ُّد ا�ص��تخدام �ح��دات معاجل��ة الر�ص��ومات‬
‫(‪ )Graphics Processing Units - GPUs‬اأح��د التقني��ات الرئي�ص��ة الت��ي‬
‫تُ�ص��تخدم لت�ص��ريع تولي��د ال�ص��ور‪ .‬وعل��ى عك���ص �ح��دة املعاجل��ة املركزي��ة‬
‫(‪ )Central Processing Unit - CPU‬التقليدي��ة املُ�ص َّمم��ة للتعام��ل م��ع جمموع��ة وا�ص��عة م��ن امله��ام‪ ،‬مت حت�ص��ني وح��دة معاجل��ة‬
‫‪1‬‬ ‫الر�ص��ومات حتّى تتنا�ص��ب مع اأنواع العمليات احل�ص��ابية املطلوبة ملعاجلة ال�صور واملهام االأخرى املتعلقة بالر�ص��ومات‪ ،‬مما يجعلها اأكر‬
‫كفاءة يف التعامل مع كميات كبرة من البيانات واإجراء عمليات ح�صابية معقدة‪ ،‬و ُيع ُّد هذا �صببًا يف ا�صتخدامها عادة يف توليد ال�صور‬
‫يو�ص��ح ه��ذا الدر���ص كي��ف ميكن��ك ا�ص��تخدام من�ص��ة قوق��ل ك��وآلب (‪ )Google Colab‬ال�ص��هرة‬ ‫وامله��ام االأخ��رى املك ِّلف��ة حا�ص��وبيًّا‪ِّ .‬‬
‫للو�ص��ول اإىل بُني��ة حتتي��ة قوي��ة قائم��ة عل��ى وح��دة معاجل��ة الر�ص��ومات دون اأي تكلفة‪ ،‬وذلك با�ص��تخدام ح�ص��اب عادي عل��ى قوقل‪ ،‬وقوقل‬
‫�تخدمني كتاب��ة املقاطع الربجمي��ة‪ ،‬وتنفيذها‪ ،‬واإج��راء التجارب‪،‬‬‫ك��والب ه��و من�ص��ة جماني��ة تعتم��د عل��ى التقني��ة ال�ص��حابية‪ ،‬وتتيح للم�ص� ِ‬
‫وتدريب النماذج يف بيئة مفكرة جوبير (‪.)Jupyter Notebook‬‬
‫‪4‬‬
‫‪5‬‬ ‫للو�سول اإىل من�سة قوقل كوألب‪:‬‬
‫‪1‬‬
‫‪2‬‬ ‫ اذهب اإىل‪.https://colab.research.google.com :‬‬
‫‪3‬‬ ‫‪2‬‬
‫ �صجِّ ل الدخول بح�صاب ‪( Google‬قوقل) اخلا�ص بك‪.‬‬
‫ ا�صغط على ‪( Edit‬حترير)‪ ،‬ثم ‪( Notebook settings‬اإعدادات املفكرة)‪3 .‬‬
‫تعمل بيئة قوقل كوالب ب�صكل م�صابه لعمل مفكرة جوبيرت‪ ،‬وفيما يلي جُتد مثال ‪( Hello World‬مرحبًا َ‬
‫بالعامَل) التقليدي‪:‬‬ ‫ اخرت ‪( GPU‬وحدة معاجلة الر�صومات)‪ 4 ،‬ثم ا�صغط على ‪( Save‬حفظ)‪5 .‬‬

‫خوارزميات توليد ال�صور (‪)Image Generation‬‬


‫التي ��صفناها يف هذا الف�صل م�صممة بطريقة جتعلها‬ ‫‪2‬‬
‫اإبداعيًة �بالتايل فهي لي�صت ثابتة‪ ،‬مما يعني اأنه من‬ ‫‪1‬‬
‫غر امل�صمون اأن تقوم دائما بتوليد ال�صورة نف�صها‬
‫للمدخالت نف�صها‪� .‬عليه‪ ،‬فاإن ال�صور املو َّلدَة املدرجة‬
‫يف هذا الف�صل جمرد اأمثلة على ال�صور التي ميكن‬
‫توليدها با�صتخدام املقطع الربجمي‪.‬‬
‫�صكل ‪ :4.27‬ا�صتخدام مفكرة البايثون‬

‫مناذج األنت�سار وال�سبكة التوليدية التناف�سية‬


‫‪Diffusion Models and Generative Adversarial Networks‬‬
‫يف ال�ص��نوات ا أالخ��رة �ص��هد جم��ال تولي��د ال�ص��ور تُقدمً ��ا كب�رًا م��ع تطوي��ر اأ�ص��اليب ومن��اذج ُخُمتلف��ة ميكنه��ا تولي��د �ص��ور‬
‫واقعي��ة وعالي��ة اجل��ودة م��ن م�ص��ادر ُخُمتلف��ة للمعلوم��ات‪ ،‬وهن��اك تقنيت��ان م��ن اأك��ر التقني��ات �ص��يوعً ا وا�ص��تخدامً ا عل��ى‬ ‫‪3‬‬
‫نط��اق وا�ص��ع لتولي��د ال�ص��ور هم��ا‪ :‬ال�ص��بكة التوليد ي��ة التناف�ص��ية ( ‪ ،)GANs‬و من��وذج اآلنت�ص��ار امل�ص��تقر‬
‫(‪� .)Stable Diffusion‬صتتعرف يف هذا الق�صم على املفاهيم واالأ�صاليب الرئي�صة اخلا�صة بال�صبكة التوليدية التناف�صية‬ ‫‪4‬‬
‫ومنوذج االنت�ص��ار امل�ص��تقر‪ ،‬كما �ص��يتم تقدمي نظرة عامة على تطبيقاتها يف توليد ال�صور‪ ،‬و�ص��يتم مناق�ص��ة اأوجه الت�صابه‬ ‫‪5‬‬
‫واالختالف بينهما‪ ،‬ومزايا كل تقنية وعيوبها‪.‬‬
‫�صكل ‪ :4.26‬الو�صول اإىل من�صة قوقل كوالب‬
‫‪238‬‬ ‫‪237‬‬
‫حقَّق ك ٌّل من منوذج ال�ص��بكة التوليدية التناف�ص��ية ومنوذج االنت�ص��ار امل�ص��تقر نتائج مبهرة يف جمال توليد ال�صور‪ ،‬ويُركِّز‬ ‫توليد ال�سور بال�سبكة التوليدية التناف�سية‬
‫اجلزء املتبقي من هذا الدر�ص على تقدمي اأمثلة عملية بلغة البايثون على النهج القائم على اآلنت�صار (‪)Diffusion-Based‬‬ ‫(‪Generating Images with Generative Adversarial Networks )GANs‬‬
‫وال��ذي ُيع� ُّد حال ًي��ا اأح��دث م��ا تو�صل��ت اإلي��ه التقني��ة‪ .‬كم��ا مت التو�صي��ح م��ن قبل‪ُ ،‬يع� ُّد توليد ال�ص��ور مُهِ مَّة مكلِّفة حا�ص��وبيًّا‪،‬‬
‫ولذل��ك نو�صي��ك ب�ص��دة ب�اأن تطب��ق جمي��ع اأمثل��ة البايث��ون عل��ى نظ��ام قوق��ل ك��والب االأ�صا�ص��ي اأو اأي بني��ة اأ�صا�ص��ية ُخُمتلف��ة‬ ‫ال�ص��بكة التوليدي��ة التناف�ص��ية ه��ي فئ��ة م��ن النم��اذج التوليدي��ة الت��ي تتك��ون م��ن مكون��ني رئي�ص��ني وهم��ا‪ :‬املو ِّل��د (‪� )Generator‬املم ِّي��ز‬
‫تدعمها وحدة معاجلة ر�صومات يكون لديك حق الو�صول اإليها‪.‬‬ ‫(‪ ،)Discriminator‬حي��ث يق��وم املو ِّل��د بتولي��د �ص��ور زائف��ة‪ ،‬بينم��ا يح��اول املم ِّي��ز متيي��ز ال�ص��ور املو َّل��دة م��ن ال�ص��ور احلقيقي��ة‪ ،‬و ُيد َّرب‬
‫ي�ص� ِ‬ ‫هذان املكوِّنان تدري ًبا تناف�ص ًّيا‪ ،‬اإذ يحاول املولِّد اأن "يخدع" املم ِّيز‪ ،‬ويحاول املم ِّيز اأن ي�صبح اأف�صل يف اكت�صاف ال�صور الزائفة‪ .‬تتمثّل‬
‫�تخدم ه��ذا الف�ص��ل مكتب��ة ‪ diffusers‬الت��ي تُع ُّد حال ًي��ا اأف�صل مكتبة مفتوحة امل�صدر للنماذج القائمة على االنت�ص��ار‪،‬‬ ‫اإح��دى املزاي��ا الرئي�ص��ة لل�ص��بكة التوليدي��ة التناف�ص��ية يف قدرته��ا عل��ى تولي��د �ص��ور عالي��ة اجل��ودة وواقعي��ة ي�صع��ب متييزه��ا ع��ن ال�ص��ور‬
‫ويقوم املقطع الربجمي التايل بتثبيت املكتبة‪ ،‬وكذلك بع�ص املكتبات االإ�صافية املطلوبة‪:‬‬ ‫أي�ص��ا بع���ص القي��ود مث��ل‪ :‬ع��دم التق��ارب (‪ )Non-Convergence‬اأو بعب��ارة اأخ��رى‪ ،‬ف�ص��ل �ص��بكتي املو ِّل��د‬ ‫احلقيقي��ة‪ ،‬ولك��ن يوج��د به��ا ا ً‬
‫واملم ِّي��ز يف التح�ص��ن م��ع م��رور الوق��ت‪ ،‬ونق���ش التن��وع (‪ )Mode Collapse‬يف املخرج��ات‪ ،‬حي��ث ينت��ج النم��وذج نف���ص املُخ َرج��ات‬
‫‪%%capture‬‬
‫‪!pip install diffusers‬‬
‫املت�صابهة مرارًا وتكرارًا بغ�ص النظر عن املُدخَ الت‪.‬‬
‫‪!pip install transformers‬‬
‫‪!pip install accelerate‬‬ ‫عنا�ين مت التنبوؤ بها‬ ‫املميِّز‬ ‫�صور حقيقية‬ ‫يُطبَّق املولِّد �املميِّز يف ال�صبكة‬
‫التوليدية التناف�صية يف العادة‬
‫‪import matplotlib.pyplot as plt‬‬
‫با�صتخدام ال�صبكات الع�صبية‬
‫‪from PIL import Image # used to represent images‬‬
‫�صور زائفة‬ ‫املولِّد‬ ‫�صو�صاء ع�صوائية‬ ‫الر�صيحية (‪ )CNNs‬اأ� اأي‬
‫معمارية م�صابهة‪.‬‬
‫ن�ص ‪Text-to-Image Generation‬‬
‫توليد ال�سورة من ّ‬ ‫اخل�سارة‬
‫�صكل ‪ :4.28‬معمارية ال�صبكة التوليدية التناف�صية‬
‫يو�ص��ح ه��ذا الق�ص��م الطريق��ة الت��ي ميك��ن به��ا ا�ص��تخدام مكتب��ة ‪ diffusers‬لتولي��د �ص��ور تعتم��د عل��ى التوجي��ه الن�ص� ّ�ي‬
‫ِّ‬
‫ال��ذي يقدم��ه امل�ص��تخدِ م‪ ،‬وتُ�ص��تخدم االأمثل��ة ال��واردة يف ه��ذا الق�ص��م من��وذج ‪( stable-diffusion-v1-4‬االنت�ص��ار‪-‬‬ ‫توليد ال�سور باألنت�سار امل�ستقر ‪Generating Images with Stable Diffusion‬‬
‫امل�صتقر‪ -‬االإ�صدار ‪ ،) 4-1‬وهو منوذج �صائع مُد َّرب م�صبقًا لتوليد ال�صورة من ّ‬
‫ن�ص‪.‬‬ ‫الن�ش (‪،)Text Encoder‬‬ ‫االنت�صار امل�صتقر هو منوذج تعلُّم عميق لتوليد �صورة من ن�ص‪ ،‬وتتكون هذه الطريقة من مكونني رئي�صني‪ :‬مُرمِّز ّ‬
‫الن�ص ومفكِّك الرميز املرئي معًا على جمموعة بيانات مكونة من بيانات‬ ‫رمز ّ‬ ‫ومفكِّك الرميز املرئي(‪ .)Visual Decoder‬و ُيد َّرب ُم ِّ‬
‫‪# a tool used to generate images using stable diffusion‬‬ ‫الن�ص هو �صبكة ع�صبية تاأخذ مُدخَ الت‬
‫‪from diffusers import DiffusionPipeline‬‬
‫ن�صي ب�صورة مقابِلة اأو اأكر‪ .‬مُرمِّ ز ّ‬
‫ن�صو�ص وبيانات �صور مقرتنة ببع�صها؛ حيث يقرتن كل ُمدخَ ل ِّ‬
‫)"‪generator = DiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4‬‬ ‫ن�صيَّ�ة مث�ل‪ :‬جمل�ة اأو فق�رة وحتوِّله�ا اإىل ت�صم�ني (‪ ،)Embedding‬والت�صم�ني ه�و م َّتجَ �ه ع�ددي ل�ه ع�دد ثابت من القي�م‪ ،‬ويلتقط متثيل‬
‫‪# specifies what GPUs should be used for this generation‬‬ ‫الن�ص املُدخَ ل‪ .‬يتم ا�صتخدام نهج م�صابه يف منوذج الكلمة اإىل املتَّجَ ه (‪ )Word2Vec‬و منوذج ترميز اجلُمل ثنائية‬ ‫الت�صمني هذا معنى ّ‬
‫)"‪generator.to("cuda‬‬ ‫اآلجتاه من املحوآلت (‪ )SBERT‬اللذين مت تو�صيحهما يف الوحدة الثالثة‪ ،‬حيث يولّدان ت�صمينات للكلمات واجلمل الفردية على الرتتيب‪.‬‬
‫]‪image = generator("A photo of a white lion in the jungle.").images[0‬‬ ‫الن�ش (‪)Text Embedding‬الذي اأن�صاأه املُرمِّ ز عرب مفكِّك الرتميز املرئي لتوليد �صورة‪ ،‬ومفكِّك الرتميز املرئي‬ ‫ُوميرر بعد ذلك ت�صمني ّ‬
‫;)‪plt.imshow(image‬‬ ‫أي�صا نوع من ال�صبكات الع�صبية و ُينفذ عاد ًة با�صتخدام �صبكة ع�صبية تر�صيحية (‪ )CNN‬اأو معمارية م�صابهة‪ ،‬و ُتقارن ال�صورة املولَّدة‬‫هو ا ً‬
‫بال�ص�ورة احلقيقي�ة املقابل�ة املوج�ودة يف جمموع�ة البيان�ات‪ ،‬و ُي�ص�تخدم الفرق بينهما حل�ص�اب اخل�ص�ارة (‪ ،)Loss‬ثم تُ�ص�تخدم اخل�ص�ارة‬
‫ي�صتجيب النموذج للتوجيه ‪A photo of a white lion in the jungle‬‬ ‫الن�ص ومفكِّك الرتميز املرئي؛ لتقليل االختالف بني ال�صور التي ُولِّدت وال�صور احلقيقية‪.‬‬ ‫رمز ّ‬
‫متغرات ُم ِّ‬
‫لتحديث ِّ‬
‫(�ص��ورة اأ�ص��د اأبي���ص يف الغاب��ة) ب�ص��ورة مبه��رة وواقعي��ة ج��دً ا‪ ،‬كم��ا ه��و‬
‫مو�صح يف ال�ص��كل ‪ ،4.29‬و ُيع ُّدالتجريب با�ص��تخدام التوجيهات االإبداعية‬ ‫َّ‬ ‫جدول  ‪ :4.4‬عملية تدريب األنت�سار امل�ستقر‬
‫ه��و اأف�ص��ل طريق��ة الكت�ص��اب اخل��ربة وفه��م ق��درات ه��ذا النه��ج ونق��اط‬ ‫الن�ص للح�صول على ت�صمني الن�ص‪.‬‬ ‫‪ .1‬مرِّر املُدخَ الت الن�صيَّة عرب مُرمِّ ز ّ‬
‫�صعفه‪.‬‬
‫الن�ص عرب مفكِّك الرتميز املرئي لتوليد �صورة‪.‬‬‫‪ .2‬مرِّر ت�صمني ّ‬
‫‪ .3‬اح�صب اخل�صارة (االختالف) بني ال�صورة املولَّدة وال�صورة احلقيقية املقابلة لها املوجودة يف جمموعة البيانات‪.‬‬
‫الن�ص ومفكِّك الرتميز املرئي‪ ،‬وعندما يكون امل�صتوى عاليًا يت�صمن‬
‫متغرات مُرمِّ ز ّ‬ ‫ِ‬
‫ا�صتخدم اخل�صارة؛ لتحديث ِّ‬ ‫‪.4‬‬
‫معلومة‬ ‫ذل��ك مكاف�اأة(‪ )Rewarding‬اخلالي��ا الع�صبي��ة الت��ي �ص��اعدت عل��ى تقلي��ل اخل�ص��ارة ومعاقب��ة (‪)Punishing‬‬
‫اخلاليا الع�صبية التي �صاهمت يف زيادتها‪.‬‬
‫معمارية اأجهزة احلا�صب املوحد (‪)Compute Unified Device Architecture - CUDA‬‬
‫هي من�صة حو�صبة موازية تتيح ا�صتخدام �حدات معاجلة الر�صومات (‪.)GPUs‬‬ ‫‪ .5‬كرِّر اخلطوات املذكورة �صابقًا مع اأزواج متعددة من الن�صو�ص وال�صور يف جمموعة البيانات‪.‬‬
‫�صكل ‪� :4.29‬صورة مولَّدة الأ�صد اأبي�ص يف الغابة‬
‫‪240‬‬ ‫‪239‬‬
‫ِ‬ ‫ي�صيف التوجيه (‪ )prompt‬التايل بُعدً ا اإ�صافيًّا لعملية التوليد‪ ،‬اإذ يطلب اأن يُر�صم اأ�صد اأبي�ص بطريقة بابلو بيكا�صو‬
‫ي�صتخدم النموذج‬ ‫املثال املوجود يف ال�صكل ‪1.30‬‬
‫املدرَّب م�صبقًا ‪ stable-diffusion-v1-4‬املنا�صب‬ ‫(‪ ،)Pablo Picasso‬وهو من اأ�صهر الر�صامني يف القرن الع�صرين‪.‬‬
‫لتوليد �صورة من �صورة من خالل التوجيه الن�صي‪.‬‬
‫‪image = generator("A painting of a white lion in the style of Picasso.").‬‬
‫]‪images[0‬‬
‫;)‪plt.imshow(image‬‬

‫ومرة اأخرى‪ ،‬النتائج مبهرة وتُظهر االإبداع يف عملية االنت�صار‬


‫�صكل ‪� :4.31‬صورة املنظر الطبيعي االأ�صلية‬
‫امل�ص��تقر‪ ،‬فال�ص��ورة الناجُت��ة ع��ن العملي��ة ه��ي يف الواقع �صورة‬
‫‪# a detailed prompt describing the desired visual‬‬
‫اأ�ص��د اأبي�ص‪ .‬ولكن على عك���ص التوجيه ال�ص��ابق‪ ،‬يوؤدي التوجيه‬
‫‪# for the produced image‬‬ ‫�دال م��ن اأن ت�ص��به ال�ص��ور‬
‫اجلدي��د اإىل �ص��ور ت�ص��به الر�ص��م ب� ً‬
‫‪prompt = "A realistic mountain‬‬ ‫الفوتوغرافي��ة‪ ،‬باالإ�صاف��ة اإىل ذلك‪ ،‬فاإن اأ�ص��لوب اللوحة ي�ص��به‬
‫"‪landscape with a large castle.‬‬ ‫بالفعل وب�صكل ملحوظ اأ�صلوب بابلو بيكا�صو‪.‬‬
‫‪image = generator(prompt=prompt,‬‬
‫‪image = init_image, strength=0.75).‬‬
‫]‪images[0‬‬
‫;)‪plt.imshow(image‬‬
‫توليد �سورة من �سورة من خالل‬
‫األ�سرت�ساد بن�ص‬
‫�صكل ‪� :4.32‬صورة منظر طبيعي مولَّدة بقوة = ‪0.75‬‬
‫‪Image-to-Image Generation‬‬
‫يف الواق��ع‪ ،‬يو ِّل��د النم��وذج �ص��ورة م�ص��تجيب ًة للتوجي��ه الن�ص� ّ�ي وم�ص��ابهة ب�صر ًي��ا لل�ص��ورة االأ�صلي��ة‪ ،‬و ُي�ص��تخدم متغ� ِّ�ر ‪strength‬‬
‫‪with Text Guidance‬‬
‫املتغر قيمًا بني ‪ 0‬و‪ ،1‬وت�ص��مح القيم‬
‫(الق��وة) للتحك��م يف االخت��الف الب�ص��ري ب��ني ال�صورة االأ�صلية وال�صورة اجلديدة‪ ،‬ويتخذ ِّ‬
‫االأعلى للنموذج باأن يكون اأكر مرونة واأقل تق ُّي ًدا بال�صورة االأ�صلية‪ .‬على �صبيل املثال‪ُ ،‬ي�صتخدم املقطع الربجمي التايل لنف�ص‬ ‫�تخدم املث��ال الت��ايل مكتب��ة ‪ diffusers‬لتولي��د �ص��ورة بن��ا ًء‬ ‫ي�ص� ِ‬
‫�صكل ‪� :4.30‬صورة مولَّدة الأ�صد على منط بيكا�صو‬ ‫عل��ى ُمدخَ ل��ني هم��ا‪� :‬ص��ورة موج��ودة تعم��ل كاأ�صا���ص لل�ص��ورة‬
‫املتغر ‪ strength‬لي�صاوي ‪.1‬‬ ‫‪( prompt‬التوجيه) من خالل �صبط ِّ‬
‫اجلدي��دة الت��ي �ص��يتم اإن�ص��اوؤها‪ ،‬وتوجي��ه ن�ص��يّ ي�ص��ف ال�ص��كل‬
‫‪# generate a new image based on the prompt and the‬‬
‫املو�صحة يف الق�ص��م ال�ص��ابق كانت‬ ‫ال��ذي يج��ب اأن تب��دو علي��ه ال�ص��ورة املن َتج��ة‪ .‬مب��ا اأن ُم ِه َّم��ة حتوي��ل الن� ّ��ص اإىل ال�صورة َّ‬
‫‪# initial image using the generator model‬‬ ‫حم��دودة فق��ط بتوجي��ه ن�ص� ّ�ي‪ ،‬فيج��ب اأن ت�صم��ن املُ ِه َّم��ة اجلديدة اأن تكون ال�صورة اجلديدة م�ص��ابهة لل�ص��ورة االأ�صلية‪،‬‬
‫‪image = generator(prompt=prompt,‬‬ ‫الن�صي‪.‬‬
‫ّ‬ ‫وممثِّل ًة ب�صكلٍ دقيق للو�صف الوارد يف التوجيه‬ ‫ُ‬
‫]‪image = init_image, strength=1).images[0‬‬
‫;)‪plt.imshow(image‬‬
‫‪# pipeline used for image to image generation with stable diffusion‬‬
‫‪from diffusers import StableDiffusionImg2ImgPipeline‬‬
‫‪# loads a pretrained generator model‬‬
‫�صكل ‪ :4.33‬اإن�صاء �صورة اأفقية بقوة = ‪1‬‬ ‫‪generator = StableDiffusionImg2ImgPipeline.from_pretrained("runwayml/stable-‬‬

‫توؤك��د ال�ص��ورة الناجُت��ة يف �ص��كل ‪ 4.33‬اأن زي��ادة قيم��ة متغ� ِّ�ر الق��وة ت�وؤدي اإىل �ص��كل‬ ‫)"‪diffusion-v1-5‬‬

‫أي�صا اأقل ت�ص��ابهًا اإىل حد‬


‫ب�ص��ري اأف�ص��ل باالإر�ص��اد ال��وارد يف التوجي��ه الن�ص��ي‪ ،‬ولكن��ه ا ً‬ ‫‪# moves the generator model to the GPU (CUDA) for faster processing‬‬
‫)"‪generator.to("cuda‬‬
‫كبر مع ال�صورة املُدخَ لة‪.‬‬
‫وهذا مثال منوذجي اآخر‪ ،‬يت�صح ُخُمرَجه يف ال�صكل ‪.4.34‬‬ ‫)"‪init_image = Image.open("landscape.jpg‬‬
‫‪init_image.thumbnail((768, 768)) # resizes the image to prepare it as input of the model‬‬
‫)"‪init_image = Image.open("cat_1.jpg‬‬ ‫;)‪plt.imshow(init_image‬‬
‫))‪init_image.thumbnail((768, 768‬‬
‫;)‪plt.imshow(init_image‬‬

‫�صكل ‪� :4.34‬صورة القطّ ة االأ�صلية‬


‫‪242‬‬ ‫‪241‬‬
‫بن�ص ‪Text-Guided Image-Inpainting‬‬
‫ر�سم �سورة باأل�سرت�ساد ّ‬ ‫و�صيُ�صتخدم املقطع الربجمي التايل لتحويل هذه ال�صورة اإىل �صورة ‪( tiger‬منر)‪:‬‬
‫الن�صي باأجزاء‬
‫ّ‬ ‫يُركِّز املثال التايل على ا�صتخدام منوذج االنت�صار امل�صتقر ال�صتبدال �صكل ب�صري جديد ي�صفه التوجيه‬
‫حم��ددة م��ن �ص��ورة مع ّين��ة‪ ،‬و ُي�ص��تخدم له��ذا الغر���ص النم��وذج امل��د َّرب م�ص��بقًا ‪( stable-diffusion-inpainting‬ر�ص��م‬ ‫"‪prompt = "A photo of a tiger‬‬
‫]‪image = generator(prompt=prompt, image=init_image, strength=0.5).images[0‬‬
‫‪-‬االنت�ص��ار‪ -‬امل�ص��تقر)‪،‬ويقوم املقط��ع الربجم��ي الت��ايل بتحمي��ل �ص��ورة قطّ ��ة عل��ى مقع��د‪ ،‬وهن��اك قن��اع (‪ )Mask‬يع��زل‬ ‫;)‪plt.imshow(image‬‬
‫االأجزاء املحددة من ال�صورة التي تغطيها القطّ ة‪:‬‬
‫تتقي��د املحاول��ة االأوىل بقيم��ة املتغ� ِّ�ر ‪ ،strength‬مم��ا اأدّى‬
‫‪# tool used for text-guided image in-painting‬‬
‫‪from diffusers import StableDiffusionInpaintPipeline‬‬ ‫اإىل �ص��ورة تب��دو وكاأنه��ا مزي��ج ب��ني النم��ر والقطّ ��ة املوجودة‬
‫))‪init_image = Image.open("cat_on_bench.png").resize((512, 512‬‬ ‫مو�ص��ح يف ال�ص��كل ‪،4.35‬‬ ‫يف ال�ص��ورة االأ�صلي��ة‪ ،‬كم��ا ه��و َّ‬
‫;)‪plt.imshow(init_image‬‬ ‫و َت� ُدل ال�ص��ورة اجلدي��دة عل��ى اأن اخلوارزمية مَل تكن لديها‬
‫))‪mask_image = Image.open("cat_mask.jpg").resize((512, 512‬‬
‫;)‪plt.imshow(mask_image‬‬ ‫الق��وة الكافي��ة لتحوي��ل وج��ه القطّ ��ة حتوي� ً�ال �صحيحً ��ا اإىل‬
‫وج��ه من��ر‪ ،‬وتظ��ل اخللفي��ة م�ص��ابهة ج��دً ا خللفي��ة ال�ص��ورة‬
‫االأ�صلية‪.‬‬
‫بع��د ذل��ك‪ ،‬تت��م زي��ادة املتغ� ِّ�ر ‪ strength‬لل�ص��ماح للنم��وذج‬
‫باالبتعاد عن ال�صورة االأ�صلية واالقرتاب اأكر من التوجيه‬
‫الن�صي‪.‬‬

‫�صكل ‪� :4.35‬صورة منر مولَّدة بقوة = ‪0.5‬‬

‫‪image = generator(prompt=prompt,‬‬
‫‪image = init_image, strength=0.75).‬‬
‫]‪images[0‬‬
‫;)‪plt.imshow(image‬‬

‫�صكل ‪ :4.38‬قناع �صورة القطّ ة‬ ‫�صكل ‪� :4.37‬صورة القطّ ة االأ�صلية‬ ‫يف الواق��ع‪ ،‬ال�ص��ورة اجلدي��دة املعرو�ص��ة ه��ي �ص��ورة من��ر‪،‬‬
‫ولك��ن الح��ظ اأن البيئ��ة املحيط��ة باحلي��وان وو�صعي��ة جلو�ص��ه‬
‫القناع (‪)Mask‬هو �صورة ب�صيطة باالأبي�ص واالأ�صود لها نف�ص اأبعاد ال�صورة االأ�صلية بال�صبط‪ ،‬واالأجزاء التي ا�صتُبدلت‬ ‫وزواي��اه تظ��ل �ص��ديدة ال�ص��به بال�صورة االأ�صلي��ة‪ ،‬و َي ُدل ذلك‬
‫يف ال�صورة اجلديدة ُمتيز باللون االأبي�ص‪ ،‬يف حني اأن االأجزاء االأخرى من القناع �صوداء‪ .‬بعد ذلك‪ ،‬يتم حتميل النموذج‬ ‫عل��ى اأن النم��وذج م��ا زال واع ًي��ا بال�ص��ورة االأ�صلي��ة وح��اولَ‬
‫امل��درَّب م�ص��بقًا‪ ،‬ويت��م اإن�ص��اء ‪( prompt‬التوجي��ه) لك��ي تو�ص��ع �ص��ورة رائ��د الف�ص��اء م��كان القط��ة الت��ي يف ال�ص��ورة‬ ‫اأن يحاف��ظ عل��ى عنا�ص��ر كان ال ب��د اأال ُتغ��ر؛ ح ّت��ى يق��رتب‬
‫االأ�صلية‪ ،‬كما يظهر يف ال�صكل ‪.4.38‬‬ ‫اأكر من التوجيه الن�صي‪.‬‬
‫‪generator = StableDiffusionInpaintPipeline.from_pretrained("runwayml/stable-‬‬
‫)"‪diffusion-inpainting‬‬
‫)"‪generator = generator.to("cuda‬‬

‫"‪prompt = "A photo of an astronaut‬‬


‫‪image = generator(prompt=prompt, image=init_image, mask_image=mask_image).‬‬ ‫�صكل ‪� :4.36‬صورة النمر مولَّدة بقوة = ‪0.75‬‬
‫]‪images[0‬‬
‫;)‪plt.imshow(image‬‬

‫‪244‬‬ ‫‪243‬‬
‫مترينات‬ ‫جنح��ت ال�ص��ورة اجلدي��دة يف اأن تظه��ر �ص��ورة واقعي��ة للغاي��ة‬
‫لرائد الف�صاء الذي و�صعته مكان القطة التي كانت يف ال�صورة‬
‫االأ�صلية‪ ،‬كما ميتزج هذا ال�ص��كل الب�صري ب�صال�ص��ة مع عنا�صر‬
‫اخللفية واالإ�صاءة يف ال�صورة‪.‬‬
‫‪�ِ 1‬صف باخت�صار عملية ر�صم �صورة باآل�صر�صاد بن�ش‪.‬‬ ‫يف الواق��ع‪ ،‬ح ّت��ى ل��و كان القن��اع اأب�ص��ط واأق��ل دق��ة‪ ،‬ميك��ن اإنت��اج‬
‫بديل واقعي‪ .‬الحظ �صورة املُدخَ ل والقناع التاليني‪:‬‬

‫�صكل ‪� :4.39‬صورة رائد ف�صاء مولَّدة‬

‫))‪init_image = Image.open("desk.jpg").resize((512, 512‬‬


‫;)‪plt.imshow(init_image‬‬
‫))‪mask_image = Image.open("desk_mask.jpg").resize((512, 512‬‬
‫;)‪plt.imshow(mask_image‬‬

‫‪�ِ 2‬صف عملية تدريب مناذج اآلنت�صار امل�صتقر‪.‬‬


‫�صكل ‪ :4.41‬قناع �صورة املكتب‬ ‫�صكل ‪� :4.40‬صورة املكتب االأ�صلية‬

‫يف ه��ذا املث��ال‪ ،‬يغط��ي القن��اع جه��از احلا�ص��ب املحم��ول املوج��ود يف و�ص��ط ال�ص��ورة‪ ،‬ث��م يُ�ص��تخدم ‪( prompt‬التوجي��ه)‬
‫التايل واملقطع الربجمي ليتم و�صع �صورة الكتاب مكان جهاز احلا�صب املحمول املوجود يف ال�صورة االأ�صلية‪:‬‬
‫"‪prompt = "A photo of a book‬‬
‫‪image = generator(prompt=prompt, image=init_image, mask_image=mask_image).‬‬
‫]‪images[0‬‬
‫;)‪plt.imshow(image‬‬

‫عل��ى الرغ��م م��ن اأن ‪( prompt‬التوجي��ه) طل��ب اإدخ��ال كائ��ن‬


‫(كت��اب) يختل��ف اختال ًف��ا كب�رًا عن الكائن الذي ا�ص� ُتبدل وهو‬
‫(جه��از احلا�ص��ب املحم��ول)‪ ،‬فق��د ق��ام النم��وذج بعم��ل جي��د يف‬
‫مزج االأ�صكال واالألوان؛ الإن�صاء �صكل ب�صري دقيق‪ ،‬ومع التُقدم‬
‫امل�صتمر يف تقنيات تعلُّم االآلة ور�صومات احلا�صب‪ ،‬من املحتمل‬
‫اأن تُن�صِ ئَ �صورًا اأكر اإبهارا واأكر واقعية يف امل�صتقبل‪.‬‬

‫�صكل ‪� :4.42‬صورة مكتب مولَّدة وعليها كتاب‬


‫‪246‬‬ ‫‪245‬‬
‫الم�سروع‬ ‫‪�ِ 3‬صف املولِّد �املميِّز يف ال�صبكة التوليدية التناف�صية‪.‬‬

‫ال ت�ص��تجيب كل جمموع��ة بيان��ات بالطريقة نف�ص��ها للتدريب ب��كل خوارزميات الت�صنيف‪،‬‬
‫ولكي حت�صل على اأف�صل النتائج ملجموعة بياناتك عليك اأن جُت ِّرب ا�صتخدام خوارزميات‬
‫ُخُمتلف��ة‪ ،‬و ُتق��دم ل��ك مكتب��ة ‪ Sklearn‬يف البايث��ون جمموع��ة متن ّوع��ة م��ن اخلوارزمي��ات‬
‫التي ميكنك جُتريبها‪ ،‬مبا فيها اخلوارزميات التالية‪:‬‬
‫ من ‪ sklearn.ensemble.forest‬ا�صتورد خوارزمية ‪.RandomForestClassifier‬‬ ‫‪ 4‬ا�ص��تخدم اأداة ‪ DiffusionPipeline‬م��ن مكتب��ة ‪ diffusers‬آلإن�ص��اء �ص��ورة حليوان��ك املف�ص��ل �ه��و ي �اأكل طعام��ك‬
‫املف�صل‪ .‬ميكنك ا�صتخدام من�صة قوقل كوآلب يف هذه امل ُ ِهمَّة‪.‬‬
‫ من ‪ sklearn.naive_bayes‬ا�صتورد خوارزمية ‪.GaussianNB‬‬
‫ من ‪ sklearn.svm‬ا�صتورد خوارزمية ‪.SVC‬‬

‫ا�ص� ِ‬ ‫‪1‬‬
‫�تخدم جمموع��ة تدري��ب وج��وه احليوانات لتدريب من��وذج يحقق اأكرب دقة ممكنة على‬
‫جمموعة االختبار‪.‬‬

‫ا�ص� ِ‬ ‫‪2‬‬
‫�تبدل خوارزمي��ة ‪ SGDClassifier‬ب��كل م��ن اخلوارزمي��ات املذك��ورة اأع��اله‬
‫(‪ )RandomForestClassifier، GaussianNB، SVC‬وحاول اأن ِّ‬
‫حتدد اأف�صلها‪.‬‬

‫‪3‬‬ ‫‪ 5‬ا�ص��تخدم اأداة ‪ StableDiffusion2ImagePipleline‬م��ن مكتب��ة ‪ diffusers‬لتحوي��ل احلي��وان يف ال�ص��ورة املر�ص��ومة‬


‫ا ِأعد ت�صغيل مفكرتك بعد كل عملية ا�صتبدال حل�صاب دقة كل منوذج جديد جُت ِّربه‪.‬‬ ‫يف التدريب ال�صابق اإىل حيوان اآخر من اختيارك‪ .‬ميكنك ا�صتخدام من�صة قوقل كوآلب يف هذه امل ُ ِهمَّة‪.‬‬

‫‪4‬‬
‫اأن�صئ تقريرًا يقارن دقة كل النماذج التي جرّبتَها وحدِّ د النموذج الذي حقق اأف�صل دقة‪.‬‬

‫‪248‬‬ ‫‪247‬‬
‫‪ .5‬خوارزميات التح�س‬ ‫ماذا تع ّلمت‬
‫واتخاذ القرار‬
‫�س��يتعرّ ف الطال��ب يف ه��ذه الوح��دة على عدة خوارزمي��ات وتقنيات ت�س��اعده يف اإيجاد اأك‬
‫ اإعداد ال�سور للتعرُّ ف عليها‪.‬‬
‫احللول كفاءة مل�س��كالت التح�س� املعقدة‪ ،‬كما �س��يتعلّم طريقة عمل خوارزميات التح�س� ‪،‬‬
‫ ا�س ��تخدام املكتب ��ات وال ��دوال ألإن�س ��اء من ��اذج التع ُّل ��م املوجَّ ��ه لت�سني ��ف‬
‫وخوارزمي��ات اتخ��اذ الق��رار‪ ،‬وطريق��ة تطبيقه��ا حل��لّ م�س��كالت متعلق��ة بالع��ا الواقع��ي‬
‫ترتب بتخ�سي�ص املوارد واجلدولة وحت�س امل�سارات‪.‬‬ ‫ال�سور‪.‬‬
‫ و�سف طريقة تركيب ال�سبكات الع�سبية‪.‬‬
‫ ا�س��تخدام املكتب��ات وال��دوال ألإن�س��اء من��اذج التع ُّل��م غ��ري املوجَّ ��ه لعنق��دة‬
‫اأهداف التعلُّم‬ ‫ال�سور‪.‬‬
‫بنهاية هذه الوحدة �سيكون الطالب قادرًا على اأن‪:‬‬ ‫ اإن�ساء ال�سور من خالل توفري التوجيه الن�سي‪.‬‬
‫ يُ�سنّف طرائق التح�س ملعاجلة م�سكالت معقدة‪.‬‬ ‫ اإكمال األأجزاء الناق�سة ل�سورة ببيانات واقعية‪.‬‬
‫ ِ‬
‫ي�سف خوارزميات اتخاذ القرار املُختلفة‪.‬‬
‫ ي�ستخدم البايثون حللّ م�سكالت تخ�سي�ص املوارد املتعلقة بفِر العمل‪.‬‬
‫ يحلّ م�سكالت اجلدولة با�ستخدام خوارزميات التح�س ‪.‬‬ ‫امل�سطلحات الرئي�سة‬
‫ ي�ستخدم البايثون حللّ م�سكالت اجلدولة‪.‬‬
‫ة الريا سية حللّ م�سكالت التح�س ‪.‬‬ ‫ ي�ستخدم ال‬ ‫‪Computer Vision‬‬ ‫ر�ؤية احلا�صب‬ ‫‪Image‬‬ ‫�صورة‬
‫‪Convolutional Neural‬‬ ‫ال�صبكة الع�صبية‬ ‫‪Image Generation‬‬ ‫توليد ال�صور‬
‫ يُعرّ ف م�سكلة حقيبة ال هر (‪.)Knapsack problem‬‬ ‫‪Network - CNN‬‬ ‫الر�صيحية‬
‫‪Diffusion Model‬‬ ‫منوذج اآلنت�صار‬ ‫املعاجلة اآلأ�ليَّة‬
‫ يُعرّ ف م�سكلة البائع املُتجوّل (‪.)Traveling Salesman problem‬‬ ‫‪Image Preprocessing‬‬
‫لل�صور‬
‫‪Feature Engineering‬‬ ‫هند�صة اخل�صائ�ش‬
‫‪Feature Selection‬‬ ‫انتقاء اخل�صائ�ش‬ ‫‪Network Layer‬‬ ‫طبقة ال�صبكة‬
‫‪Generative‬‬
‫‪Recognition‬‬ ‫التعرّف‬
‫‪Adversarial Network‬‬
‫ال�صبكة التوليدية‬
‫التناف�صية‬ ‫‪Stable Diffusion‬‬ ‫اآلنت�صار امل�صتقر‬
‫‪- GAN‬‬
‫األأدوات‬ ‫‪Histogram of Oriented‬‬
‫‪Gradients - HOG‬‬
‫خُمطط تكراري‬
‫للتدرجات املوجَّ هة‬
‫‪Standard Scaling‬‬

‫‪Visual Data‬‬
‫حتجيم قيا�صي‬
‫بيانات مرئية‬
‫ مفكّرة جوبيرت (‪)Jupyter Notebook‬‬

‫‪250‬‬ ‫‪249‬‬
‫بعد ذلك‪� ،‬صت�صاهد عددًا من االأمثلة‪ ،‬ولكل مثال منها قيود ودوال مو�صوعية خا�صة به‪.‬‬
‫الدر�ص األأول‬
‫الد�ال املو�صوعية‬
‫تقلي��ل (‪ )Minimizing‬وق��ت التو�صي��ل وم�ص��افة‬ ‫و�صع اأُطر زمنية للتو�صيل؛ ل�صمان تو�صيل الطرود وفق‬
‫القيود‬ ‫م�سكلة تخ�سي�ص املوارد‬
‫ال�صفر؛ خلف�ص التكلفة وحت�صني الكفاءة‪.‬‬ ‫اإطار زمني حم َّدد‪.‬‬
‫زي��ادة (‪)Maximizing‬ع��دد الط��رود يف كل مركب��ة؛‬ ‫�صركات النقل توف�ر �صِ �عة مركب�ات التو�صي�ل؛ ل�صم�ان ا�ص�تخدام املركب�ة‬
‫لتقليل عدد الرحالت الالزمة‪.‬‬ ‫املنا�ص�بة ل�كل عملي�ة تو�صي�ل‪ ،‬ومقدرته�ا عل�ى حم�ل الكمية‬ ‫خوارزميات التح�س يف الذكاء األ�سطناعي‬
‫الالزمة من الطرود‪.‬‬
‫زي��ادة (‪ )Maximizing‬ر�ص��ا العم��الء م��ن خ��الل‬ ‫‪Optimization Algorithms in AI‬‬
‫تو�صي��ل الط��رود يف وق��ت حم � َّدد وف��ق اإط��ار زمن��ي‬ ‫توفر ال�صائقني واملوظفني ‪ ،‬ومراعاة تق�صيم اأوقات عملهم؛‬ ‫القيود (‪:)Constraints‬‬ ‫يُ�صتخدم الذكاء اال�صطناعي يف ُخُمتلف ال�صناعات التخاذ قرارات تت�صم بالكفاءة والدقة‪ ،‬و ُيع ُّد‬
‫حم َّدد‪.‬‬ ‫ل�صمان كفاءة العمل‪ ،‬وعدم تكليفهم باأعمال فوق قدرتهم‪.‬‬
‫ه��ي مبثا ب��ة �ص��روط تق ِّي��د‬ ‫ُ�صتخدمة يف اتخاذ القرارات‪.‬‬‫ا�صتخدام خوارزميات تعلُّم االآلة اإحدى طرائق الذكاء اال�صطناعي امل َ‬
‫تقلي��ل (‪ )Minimizing‬تاأخ��ر رح��الت الط��ران اأو‬ ‫َت َوفُّر الطائرات وجداول ال�صيانة؛ ل�صمان اإجراء ال�صيانة‬ ‫احل��ل‪ ،‬مث��ل احل��د االأق�ص��ى‬ ‫وكما تعلّمت يف الوحدة ال�صابقة‪ ،‬فاإن خوارزميات تعلُّم االآلة تقوم بتمكني الذكاء اال�صطناعي من‬
‫اإلغائها؛ لزيادة ر�صا العمالء‪.‬‬ ‫اجليدة لها‪ ،‬ومدى جاهزيّتها للرحالت‪.‬‬ ‫ل��وزن الط��رد ا ل��ذي ميك��ن‬ ‫التعلُّم بوا�صطة البيانات ومن ثَمّ القيام بالتنبوؤات اأو تقدمي التو�صيات‪ .‬على �صبيل املثال‪ ،‬يف جمال‬
‫زي��ادة (‪ )Maximizing‬ا�ص��تغالل الطائ��رات؛ لتقليل‬ ‫قي��ود مراقب��ة احلرك��ة اجلوي��ة؛ لتج ُّن��ب التاأخ��ر وتقلي��ل‬ ‫�صحنه‪.‬‬ ‫الرعاي�ة ال�صحي�ة‪ُ ،‬ميك�ن ا�ص�تخدام ال�ذكاء اال�صطناعي للتنبوؤ بنتائج املر�ص�ى والتو�صية بخُ طط‬
‫التكاليف وحت�صني الكفاءة‪.‬‬ ‫ا�صتهالك الوقود‪.‬‬ ‫جد�لة‬ ‫عالجي�ة بن�ا ًء عل�ى البيان�ات الت�ي ُجمعت من ح�االت مماثلة‪ .‬ويف جمال التمويل‪ُ ،‬ميكن ا�ص�تخدام‬
‫مراع��اة حاج��ة امل�ص��افر وتف�صيالت��ه؛ جلدول��ة رح��الت‬ ‫خطو‬ ‫ال�ذكاء اال�صطناع�ي يف اتخ�اذ ق�رارات ا�ص�تثمارية بوا�ص�طة حتليل جمموعات كب�رة من البيانات‬
‫زي��ادة (‪ )Maximizing‬االإي��رادات م��ن خ��الل عم��ل‬ ‫الطران‬
‫عرو���ص خا�ص��ة عل��ى رح��الت الط��ران عالي��ة الطل��ب‪،‬‬ ‫الطران االأن�صب للم�صافرين‪.‬‬ ‫الدوال املو سوعية‬ ‫املالي�ة وحتدي�د االأمن�اط الت�ي تب ّ�ني املخاط�ر اأو الفر�ص املحتملة‪ .‬وعلى الرغم م�ن اأن خوارزميات‬
‫وتعديل اأ�صعار التذاكر بنا ًء على الطلب‪.‬‬ ‫(‪:)Objective Functions‬‬ ‫تعلُّم االآلة حتظى ب�صعبية متزايدة اإال اأنها لي�صت النوع الوحيد من خوارزميات الذكاء اال�صطناعي‬
‫هي معاير حتدد مدى اقرتاب‬ ‫التي ُميكن ا�صتخدامها يف اتخاذ القرارات‪ ،‬فهناك طريقة اأخرى تتمثل يف ا�صتخدام خوارزميات‬
‫تقلي�ل (‪ )Minimizing‬تكالي�ف االإنت�اج م�ن خ�الل‬ ‫�ص��عة االإنت��اج واملهل��ة الزمنية؛ ل�صمان ت�صني��ع املُنتَجات يف‬
‫حت�صني ا�صتخدام املوارد وتقليل الفاقد‪.‬‬ ‫الوقت املنا�صب‪.‬‬ ‫ا حل�ل املق� َّد م م�ن النتا ئ�ج‬ ‫التح�صني التي تُ�صتعمَل بوجه عام الإيجاد اأف�صل ح ّل مل�صكلة حم َّددة بنا ًء على قيود واأهداف معيّنة‪.‬‬
‫زي�ادة (‪ )Maximizing‬كف�اءة االإنت�اج م�ن خ�الل‬ ‫توف��ر امل��واد و�ص��عة التخزي��ن؛ لتج ُّن��ب نف��اد املخ��زون اأو‬ ‫املطلوب�ة‪ ،‬مث�ل تقلي�ل م�ص�افة‬ ‫يهدف التح�صني اإىل حتقيق الت�صميم االأف�صل بالن�صبة ملجموعة من املعاير اأو القيود ذات االأولوية‪،‬‬
‫جدولة دورات االإنتاج؛ لتقليل اأوقات التجهيز والتبديل‪.‬‬ ‫تكد�صه‪.‬‬ ‫امل�ص ِّنعُون‬ ‫ال�صفر ل�صاحنة تو�صيل‪.‬‬ ‫وت�ص�مل تعزيز عوامل مع ّينة مثل‪ :‬االإنتاجية‪ ،‬واملوثوقية‪ ،‬وطول العمر‪ ،‬والكفاءة‪ ،‬ويف الوقت نف�ص�ه‬
‫تق ّلب��ات الطل��ب؛ لتعدي��ل جداول االإنتاج بن��اء على التغرات‬ ‫تقليل عوامل اأخرى مثل‪ :‬التكاليف‪ ،‬والفاقد‪ ،‬والتوقف عن العمل‪ ،‬واالأخطاء‪.‬‬
‫زي�ادة (‪ )Maximizing‬ر�ص�ا العم�الء م�ن خ�الل‬
‫�صمان توفر املُنتَجات عند احلاجة اإليها‪.‬‬ ‫يف طلبات العمالء‪.‬‬ ‫م�سكالت التخ�سي�ص ‪Allocation Problems‬‬
‫زي��ادة (‪ )Maximizing‬الرب��ح م��ن خ��الل �صم��ان‬ ‫�ص��عة تخزي��ن حم��دودة تتطل��ب اإدارة دقيق��ة مل�ص��تويات‬ ‫تُع ُّد م�ص��كالت التخ�صي�ص من م�ص��كالت التح�ص��ني ال�ص��ائعة؛ ففيها يتم تخ�صي�ص جمموعة من املوارد مثل‪ :‬العمّال‪ ،‬اأو االآالت‪،‬‬
‫وجود م�ص��تويات كافية من خُمزون ال�ص��لع ذات هام���ص‬ ‫املخزون‪.‬‬ ‫اأو االأموال ملجموعة من املهام اأو امل�صاريع باأعلى كفاءة ممكنة‪ ،‬وتن�صاأ هذه امل�صكالت يف جمموعة وا�صعة من املجاالت مبا فيها‬
‫الربح العايل‪.‬‬ ‫ف��رتات مهل��ة الت�ص��ليم وتنوّعه��ا‪ ،‬الت��ي توؤث��ر عل��ى مق��دار‬ ‫الت�صني��ع واخلدم��ات اللوج�ص��تية واإدارة امل�ص��اريع والتموي��ل‪ُ ،‬وميك��ن �صياغته��ا بطرائ��ق ُخُمتلف��ة بن��ا ًء على قيوده��ا واأهدافها‪ .‬يف‬
‫املخزون الذي يجب االحتفاظ به يف اأي وقت‪.‬‬ ‫هذا الدر�ص �صتتع ّرف على م�صكالت التخ�صي�ص وخوارزميات التح�صني امل�صتخدَ مة حللّها‪.‬‬
‫تقلي��ل (‪ )Minimizing‬تكالي��ف التخزين من خالل‬ ‫اإدارة املخز�ن‬
‫حت�صني م�صتويات املخزون بنا ًء على توقُّعات الطلب‪.‬‬ ‫توفر ميزانية؛ ل�صراء خُمزون‪.‬‬ ‫يف ال�صركات‬
‫زي��ادة (‪ )Maximizing‬ر�ص��ا العم��الء م��ن خ��الل‬
‫�صمان توفُّر املُنتَجات املنا�ص��بة يف الوقت املنا�ص��ب ويف‬
‫امل��كان املنا�ص��ب‪ ،‬وبتقلي��ل نف��اد املخ��زون والتاأخ��ر‬
‫وامل�صكالت االأخرى التي قد توؤثر على جُتربة العمالء‪.‬‬
‫تقلي��ل (‪ )Minimizing‬تكلف��ة تولي��د الكهرب��اء‬ ‫مراعاة الطلب على الكهرباء وتقلّباته‪.‬‬
‫وتوزيعها من خالل حت�صني ا�صتخدام املوارد‪.‬‬ ‫توفُّر املواد اخلام وموارد الطاقة ال�صرورية‪.‬‬ ‫سوعية (‪)Objective Function‬‬ ‫الدالة املو‬ ‫القيد (‪)Constraint‬‬
‫تقلي��ل ( ‪ )Minimizing‬ه��در الطاق��ة وف�ص��ل‬ ‫قي��ود النق��ل والتوزي��ع مث��ل‪� :‬ص��عة ال�ص��بكة وامل�ص��افة ب��ني‬ ‫ُعاجلة واملر�صَ لة‪.‬‬
‫هي زيادة عدد العنا�صر امل َ‬ ‫هو حتديد الوزن‬
‫اخلدمات‪.‬‬ ‫�صركات‬
‫م�صانع توليد الطاقة وامل�صتهلكني‪.‬‬ ‫الطاقة‬
‫�صكل ‪ :5.1‬ا�صتخدام خوارزميات‬
‫‪252‬‬ ‫‪251‬‬ ‫التح�صني يف م�صتودع‬
‫اخلا�ص��ة باأ�ص��لوب الق��وة املُفرط��ة ت�صم��ن دائ ًم��ا اإيج��اد احل� ّل االأمث��ل‪ ،‬مت��ى اأمك��ن ذلك‪ ،‬ولك��نّ فح�ص كل ال ِف��رق املُمكنة‬
‫ّ‬ ‫الطبيع��ة‬ ‫ُميك��ن منذج��ة كل التطبيق��ات ال��واردة �ص��ابقًا يف �ص��ورة م�ص��كالت معق��دة له��ا ع��دد كب��ر من احلل��ول املُمكنة‪ .‬على �ص��بيل‬
‫فمثال‪:‬‬
‫ُيع ُّد عملية مكلّفة حا�صوبيًا‪ً ،‬‬ ‫املثال‪ ،‬فكِّر يف م�صكلة تخ�صي�ص املوارد املعهودة التي تركِّز على ت�صكيل فريق‪ ،‬حيث تن�ص أا امل�صكلة عندما يكون لديك‪:‬‬
‫• اإذا كان لديك �صتة ع ّمال‪ ،‬ف�صيكون عدد ال ِفرق املُمكنة‪.26 - 1 = 63 :‬‬ ‫• جمموعة كبرة من العمّال ميتلكون مهارات ُخُمتلفة‪.‬‬
‫• اإذا كان لديك ع�صرة ع ّمال‪ ،‬ف�صيكون عدد ال ِفرق املُمكنة‪.210 – 1 = 1,023 :‬‬ ‫• مُهِ مَّة تتطلب جمموع ًة فرعية حم َّددة من املهارات الأجل اإكمالها‪.‬‬
‫عامال‪ ،‬ف�صيكون عدد ال ِفرق املُمكنة‪.215 – 1 = 32,767 :‬‬ ‫• اإذا كان لديك خم�صة ع�صر ً‬ ‫ويتم ّث��ل اله��دف يف تكوي��ن فري��ق باأق��ل ع��دد ممك��ن م��ن الع ّم��ال‪ ،‬م��ع االلت��زام يف الوق��ت نف�ص��ه بالقي��د (‪)Constraint‬‬
‫عامال‪ ،‬ف�صيكون عدد ال ِفرق املُمكنة‪.220 – 1 = 1,048,575 :‬‬ ‫• اإذا كان لديك ع�صرون ً‬ ‫ين�ص على توفّر جميع املهارات املطلوبة يف اأع�صاء الفريق؛ الأداء املُهِ َّمة‪.‬‬ ‫الذي ّ‬
‫عامال‪ ،‬ف�صيكون عدد ال ِفرق املُمكنة‪.250 – 1 = 1,125,899,906,842,623 :‬‬ ‫• اإذا كان لديك خم�صون ً‬
‫على �صبيل املثال‪ ،‬تخيل �صيناريو ب�صيطً ا يوجد فيه خم�صة عمال‪:‬‬
‫من الوا�صح يف مثل هذه املواقف اأن ح�صر عدد ال ِفرق لكل احللول املُمكنة لي�ص‬
‫حتى بالن�صبة لعدد معتدل من ‪ً 50‬‬
‫عامال‪،‬‬ ‫خيارًا عمليًّا‪ ،‬ولذلك مت اقرتاح طرائق حت�صني اأخرى ملعاجلة امل�صكالت املعقدة‬
‫فاإن عدد الفرق املحتملة يت�صخم اإىل اأك‬
‫‪15‬‬
‫من كوادريليون ( ‪.)Quadrillion 10‬‬ ‫ع�ن طري�ق البح�ث يف خي�ارات احلل�ول املُمكن�ة باأ�ص�لوب اأكر كفاءة من اأ�ص�لوب‬
‫القوة املُفرطة‪ُ ،‬وميكن بوجه عام ت�صنيف هذه الطرائق يف ثالث فئات‪:‬‬ ‫العامل الثالث‬ ‫العامل الثاين‬
‫العامل اخلام�ش‬ ‫العامل الرابع‬ ‫العامل اآلأ�ل‬
‫• طرائق اآل�صتدآلل (‪)Heuristic Methods‬‬ ‫املهارات‪ :‬م‪5‬‬ ‫املهارات‪ :‬م‪ ،2‬م‪4‬‬ ‫املهارات‪ :‬م‪ ،1‬م‪ ،2‬م‪3‬‬ ‫املهارات‪ :‬م‪ ،2‬م‪3‬‬ ‫املهارات‪ :‬م‪ ،1‬م‪ ،3‬م‪6‬‬
‫• الربجمة القيدية (‪)Constraint Programming‬‬
‫• الربجمة الريا�صية (‪)Mathematical Programming‬‬ ‫القوة املُفرطة (‪:)Brute-force‬‬ ‫تتطل�ب املُهِ َّم�ة امل�راد اإجنازه�ا كل امله�ارات‪ :‬م‪ ،1‬م‪ ،2‬م‪ ،3‬م‪ ،4‬م‪ ،5‬م‪.6‬‬
‫هي طريقة من طرائق ح ّل امل�صكالت تت�صمن‬ ‫يتمثّ�ل احل� ّل القائ�م عل�ى الق�وة امل ُفرط�ة (‪ )Brute Force‬يف اأخ�ذ كل‬
‫األأمثل ‪Optimal Solution‬‬ ‫احللّ‬ ‫فِ�رق العمّ�ال املُمكن�ة يف االعتب�ار‪ ،‬والرتكي�ز عل�ى ال ِف�رق الت�ي تتوفّر فيها‬
‫التجري�ب املنهج�ي جلمي�ع احلل�ول املمكن�ة‬
‫م��ن املمك��ن اأن تك��ون هن��اك العدي��د م��ن احلل��ول املُثل��ى‪ ،‬كاأن يك��ون لدي��ك ع��دة ِف��رق ت�ص��مل ثالث��ة ع ّم��ال وباإمكانه��ا اأن ت�ص��تويف كل‬ ‫للم�ص�كلة به�دف الو�ص�ول اإىل احل� ّل االأمث�ل‪،‬‬ ‫جمي�ع امله�ارات املطلوبة‪ ،‬واختيار الفري�ق االأقل عددًا‪ ،‬وعلى افرتا�ص اأن‬
‫املهارات املطلوبة‪ ،‬كما اأنه من املمكن اأال يوجد ح ّل لبع�ص امل�صكالت‪ ،‬على �صبيل املثال‪ :‬اإذا كانت املُهِ َّمة تتطلب املهارة ال�صابعة‬ ‫بغ�ص النظر عن التكلفة احلا�صوبية‪.‬‬‫ّ‬ ‫كل فريق يتكون من �ص�خ�ص واحد على االأقل‪ ،‬فيُمكنك اأن تُ�ص�كِّل واحدًا‬
‫وهي ال تتُوفّر يف اأي عامل من العمّال‪ ،‬فلن يكون هناك ح ّل للم�صكلة‪.‬‬ ‫وثالثني فريقًا خُمتلفًا يتكون كل منهم من خم�صة ع ّمال‪.‬‬
‫األإيجابيات‬ ‫طرائق األ�ستدألل (‪)Heuristic Methods‬‬ ‫العدد اآلإجمايل للفِرق‬ ‫بالن�صبة للفريق املُكوَّن من عامل واحد‪ ،‬هناك خم�ص طرائق الختيار عامل واحد من بني العمّال اخلم�صة‪.‬‬ ‫•‬
‫تتميز اال�ص��تدالالت بالكفاءة احلا�ص��وبية‪،‬‬ ‫امل ُختلفة التي ُميكنك‬ ‫بالن�صبة للفريق املُكوَّن من عاملني اثنني‪ ،‬هناك ع�صر طرائق الختيار عاملني من بني الع ّمال اخلم�صة‪.‬‬ ‫•‬
‫ُوميكنه��ا اأن تتن��اول امل�ص��كالت املعق��دة‪،‬‬ ‫تقوم طرائق اآل�صتدآلل (‪ )Heuristic Methods - HM‬يف العادة على التجربة‪،‬‬ ‫تكوينها هو‪:‬‬ ‫بالن�صبة للفريق املُكوَّن من ثالثة ع ّمال‪ ،‬هناك ع�صر طرائق الختيار ثالثة ع ّمال من بني الع ّمال اخلم�صة‪.‬‬ ‫•‬
‫�وال ذات ج��ودة‬
‫كم��ا ُميكنه��ا اأن جُت��د حل� ً‬ ‫اأو البديه�ة‪ ،‬اأو الفط�رة ال�ص�ليمة‪ ،‬ولي��ص عل�ى التحلي�ل الريا�ص�ي الدقي�ق‪ُ ،‬وميك�ن‬ ‫‪،5 10 10 5 1 31‬‬
‫�ميكن ح�صاب العدد‬ ‫ُ‬ ‫بالن�صبة للفريق املُكوَّن من اأربعة ع ّمال‪ ،‬هناك خم�ص طرائق الختيار اأربعة ع ّمال من بني العمّال اخلم�صة‪.‬‬ ‫•‬
‫عالي��ة اإذا ا�ص �تُخدمت له��ا ا�ص��تدالالت‬ ‫ا�ص�تخدامها الإيج�اد حل�ول جي�دة ب�ص�كل �ص�ريع‪ ،‬ولكنه�ا ال ت�صم�ن الو�ص�ول اإىل احل ّل‬
‫االأمثل (اأف�صل حل ميكن احل�صول عليه)‪ ،‬ومن االأمثلة على اخلوارزميات اال�صتداللية؛‬ ‫أي�صا �فقًا للمعادلة‪:‬‬
‫ا ً‬ ‫بالن�صبة للفريق املُكوَّن من خم�صة ع ّمال‪ ،‬هناك طريقة واحدة الختيار كل الع ّمال اخلم�صة‪.‬‬ ‫•‬
‫معقولة‪.‬‬ ‫‪.25 - 1‬‬
‫‪ -‬ال�سلبيات‬
‫اخلوارزمي�ات اجل�ص�عة ( ‪ ،)Greedy Algorithms‬و �اكاة التلد ي�ن‬
‫(‪ ،)Simulated Annealing‬واخلوارزميات اجلينية (‪،)Genetic Algorithms‬‬ ‫يك�ص��ف تقيي��م كل ال ِف��رق االإح��دى والثالثني عن اأف�صل ح ّل ممكن‬
‫ال ت�صم��ن الو�ص��ول اإىل احل� ّل االأمث��ل‪ ،‬كما‬ ‫يتم ّث��ل يف تكوي��ن فري��ق ي�ص��مل الع ّم��ال‪:‬االأول والراب��ع واخلام���ص‪،‬‬
‫اأن بع���ص اال�ص��تدالالت تتطل��ب �صبطً ��ا‬ ‫وحت�صني م�صتعمرة النمل (‪ .)Ant Colony Optimization‬ت�صتخدم هذه الطرائق‬
‫طويال ج�دًّا‪ ،‬ولكن ال‬
‫يف الع�ادة حل� ّل امل�ص�كالت املعق�دة الت�ي ت�ص�تغرق وقتًا حا�ص�وبيًا ً‬ ‫و�ص��يغطي ه��ذا الفري��ق كل امله��ارات ال�ص��ت املطلوب��ة‪ ،‬و�صي�ص��مل‬
‫كبرًا حتى ُتوؤدي اإىل نتائج جيدة‪.‬‬ ‫الفري��ق ثالث��ة ع ّم��ال‪ ،‬وال ُميك��ن تغطي��ة كل املهارات بفريق ي�ص��تمل‬
‫ُميكنها اإيجاد حلول دقيقة‪ ،‬و�صتتعلّم يف الدرو�ص القادمة املزيد عن هذه اخلوارزميات‪.‬‬
‫العامل اخلام�ش‬ ‫العامل الرابع‬ ‫العامل اآلأ�ل‬ ‫عل��ى ع��دد ع ّم��ال اأق��ل م��ن ذل��ك‪ ،‬مم��ا يجع��ل ه��ذا احل� ّل ه��و احل� ّل‬
‫األإيجابيات‬ ‫ة القيدية (‪)Constraint Programming‬‬ ‫ال‬ ‫املهارات‪ :‬م‪5‬‬ ‫املهارات‪ :‬م‪ ،2‬م‪4‬‬ ‫املهارات‪ :‬م‪ ،1‬م‪ ،3‬م‪6‬‬
‫اآلأمثل (‪.)Optimal Solution‬‬
‫ُميك��ن للربجم��ة القيدي��ة اأن تتعام��ل م��ع‬
‫الربجم��ة القيدي��ة (‪ )Constraint Programming - CP‬حت � ّل م�ص��كالت قيود معقدة واأن جُتد اأف�صل احللول‪.‬‬ ‫وهناك ح ّل اآخر يتمثّل يف تكوين فريق ي�ص�مل العمّال‪:‬‬
‫التح�ص��ني ع��ن طري��ق منذج��ة القي��ود واإيج��اد ح � ّل يخ�ص��ع جلمي��ع القي��ود‪ ،‬وه��ذا‬ ‫االأول والثاين والثالث واخلام�ص‪ ،‬وعلى الرغم من اأن‬
‫االأ�ص��لوب مفي��د ب�ص��كل خا���ص يف امل�ص��كالت الت��ي به��ا ع��دد كبر م��ن القي��ود اأو التي ‪ -‬ال�سلبيات‬
‫هذا الفريق يغطي كل املهارات ال�ص�ت‪ ،‬اإال اأنه يتطلب‬
‫ُميك��ن اأن تك��ون ه��ذه الطرائ��ق مك ِّلف��ة‬ ‫تتطلب حت�صني عدة اأهداف‪.‬‬ ‫أي�صا ع ّم ًاال اأكر‪ ،‬مما يجعل هذا احل ّل ممكنًا‪ ،‬ولكنه‬ ‫ا ً‬
‫العامل الثالث العامل اخلام�ش‬ ‫العامل الثاين‬ ‫العامل اآلأ�ل‬
‫حا�صوبيًا يف امل�صكالت الكبرة‪.‬‬ ‫املهارات‪ :‬م‪ ،1‬م‪ ،2‬م‪ 3‬املهارات‪ :‬م‪5‬‬ ‫املهارات‪ :‬م‪ ،1‬م‪ ،3‬م‪ 6‬املهارات‪ :‬م‪ ،2‬م‪3‬‬ ‫لي�ص احل ّل االأمثل‪.‬‬
‫‪254‬‬ ‫‪253‬‬
‫األإيجابيات‬ ‫ة الريا سية (‪)Mathematical Programming‬‬ ‫ال‬
‫‪# creates the global list of skills s1, s2, s3, ...‬‬
‫])‪skills = ['s' + str(i) for i in range(1, skill_number+1‬‬
‫تتعام��ل الربجم��ة الريا�صية مع‬
‫الربجم��ة الريا�صي��ة (‪ )Mathematical Programming - MP‬ه��ي جمموع��ة م��ن جمموع��ة وا�ص��عة من م�ص��كالت‬
‫‪worker_skills = dict() # dictionary that maps each worker to their set of skills‬‬ ‫التقنيات التي تَ�صتخدم مناذج ريا�صية؛ حل ّل م�صكالت التح�صني‪ ،‬وت�صمل‪ :‬الربجمة اخلطية التح�ص��ني وه��ي غال ًب��ا ت�صم��ن‬
‫‪for i in range(1, worker_number+1): # for each worker‬‬
‫(‪� ،)Linear Programming‬الربجم��ة الرباعي��ة (‪ ،)Quadratic Programming‬الو�صول اإىل احل ّل االأمثل‪.‬‬
‫�الربجم��ة غ��ر اخلطي��ة (‪� )Nonlinear Programming‬برجم��ة ا أآلع��داد ال�صحيح��ة‬
‫املختلط��ة (‪ ،)Mixed-Integer Programming‬وتُ�ص��تخدم ه��ذه التقني��ات عل��ى نط��اق ‪ -‬ال�سلبيات‬
‫)‪# makes a worker id (w1, w2, w3, ...‬‬
‫)‪worker_id = 'w' + str(i‬‬ ‫وا�ص��ع يف الكث��ر م��ن املج��االت؛ مب��ا فيه��ا عل��م االقت�ص��اد والهند�ص��ة وعملي��ات البح��ث‪ .‬تلع��ب ُيع� ُّد ك ٌّل من التكلفة احلا�ص��وبية‬
‫اأ�ص��اليب الربجم��ة الريا�صي��ة دورًا مه ًّم��ا يف التع ُّل��م العمي��ق (‪ ،)Deep Learning‬ومتتل��ك للم�ص��كالت الكب��رة وتعقي��د‬
‫)‪# randomly decides the number of skills that this worker should have (at least 1‬‬
‫)‪my_skill_number = random.randint(1, max_skills_per_worker‬‬
‫ُعام��الت الت��ي حتت��اج اأن تتع ّل��م م��ن البيان��ات‪ ،‬حيث اإن�ص��اء ال�صيغ��ة الريا�صي��ة‬
‫من��اذج التعلُّ��م العمي��ق ع��ددًا كب�رًا م��ن امل ِ‬
‫ُعام��الت النم��وذج من اأجل تقليل دال��ة التكلفة التي املنا�ص��بة مرتف َع��ني بالن�ص��بة‬ ‫تُ�ص��تخدم خوارزمي��ات التح�ص��ني لتعدي��ل م ِ‬
‫‪# samples the decided number of skills‬‬ ‫تقي���ص ال َف��رق ب��ني ُخُم َرج��ات النم��وذج املتن ّب�اأ به��ا واملُخ َرج��ات ال�صحيح��ة‪ .‬مت تطوي��ر العدي��د مل�ص��كالت الع��امَل الواقع��ي‬
‫))‪my_skills = set(random.sample(skills, my_skill_number‬‬
‫م��ن خوارزمي��ات التح�ص��ني اخلا�ص��ة بنم��اذج التعلُّ��م العمي��ق مث��ل‪ :‬خوارزمي��ة اآدم (‪ ،)Adam‬املعقدة‪.‬‬
‫‪# remembers the skill sampled for this worker‬‬ ‫وخوارزمي��ة اآل�ص��تقاق التك ُّيف��ي (‪ ،)AdaGrad‬وخوارزمي��ة ن�ص��ر متو�ص��ط اجل��ذر الربيعي‬
‫‪worker_skills[worker_id] = my_skills‬‬ ‫(‪.)RMSprop‬‬
‫‪# randomly samples the set of required skills that the team has to cover‬‬
‫))‪required_skills = set(random.sample(skills, required_skill_number‬‬ ‫مثال عملي‪ :‬حت�س م�سكلة ت�سكيل الفريق‬
‫‪# returns the worker and required skills‬‬ ‫‪A Working Example: Optimization for the Team-Formation Problem‬‬
‫}‪return {'worker_skills':worker_skills, 'required_skills':required_skills‬‬ ‫�يو�صح ه��ذا الدر���ص ا�ص��تخدام خوارزمي��ة الق��وة امل ُفرط��ة (‪ ،)Brute-Force Algorithm‬واخلوارزمي��ة اآل�ص��تدآللية‬ ‫�ص� ِّ‬
‫اجل�ص��عة (‪ )Greedy Heuristic Algorithm‬حل ّل م�ص��كلة اتخاذ القرار املُرتكزة على م�ص��كلة تخ�صي�ص املوارد القائمة على‬
‫�صتقوم االآن باختبار الدالة الواردة �صابقًا من خالل اإن�صاء ن�صخة من م�صكلة معطياتها كالتايل‪ :‬ع�صر مهارات اإجمالية‪،‬‬ ‫الفريق والتي مت و�صفها �صابقًا‪ ،‬بعد ذلك �صتتم مقارنة نتائج هاتني اخلوارزميتني‪.‬‬
‫كحد اأق�صى لكل عامل‪.‬‬
‫و�صتة ع ّمال‪ ،‬وتتطلب خم�ص مهارات ٍّ‬ ‫ُميك��ن ا�ص��تخدام الدال��ة التالي��ة الإن�ص��اء اأمثل��ة ع�ص��وائية مل�ص��كلة ت�ص��كيل ال ِفرق‪،‬‬
‫اخلوارزمية األ�ستدأللية اجل�سعة‬ ‫عامالت هي‪ :‬العدد االإجمايل‬ ‫حدد اأربعة ُم ِ‬ ‫وت�صمح هذه الدالة للم�صتخدِ م اأن ُي ِّ‬
‫‪x10‬‬ ‫(‪:)Greedy Heuristic Algorithm‬‬ ‫للمه��ارات الت��ي يج��ب اأن توؤخ��ذ بع��ني االعتب��ار‪ ،‬والع��دد االإجم��ايل للع ّم��ال‬
‫حتتاج امل�صكلة اإىل‬ ‫ه��ي اأ�ص��لوب ا�ص��تداليل حل� ّل امل�ص��كالت‪،‬‬ ‫املتوفّري��ن‪ ،‬وع��دد امله��ارات الت��ي يج��ب اأن تتو ّف��ر يف اأع�ص��اء الفري��ق ب�ص��كل‬
‫ع�صر مهارات‬ ‫وفي��ه تق��وم اخلوارزمي��ة ب ِبن��اء احل � ّل‬ ‫جماعي حتى ينجزوا املُهِ َّمة‪ ،‬والعدد االأق�صى للمهارات التي ُميكن اأن ميتلكها‬
‫اإجمالية‬ ‫خط��و ًة خط��وةً‪ ،‬وتخت��ار اخلي��ار االأمث��ل‬ ‫كل عامل‪.‬‬
‫حم ِّل ًّي��ا يف كل مرحل��ة‪ ،‬حت��ى ت�ص��ل يف‬ ‫وبع��د ذل��ك‪ ،‬تق��وم الدال��ة باإن�ص��اء واإظهار جمموع��ة ع ّمال لديهم ع��دة مهارات‬
‫النهاية اإىل ح ّل �صامل ونهائي‪.‬‬ ‫ُخُمتلف��ة‪ ،‬وع��دة مه��ارات مطلوب��ة‪ ،‬وتَ�ص��تخدم ه��ذه الدال��ة املكتب��ة ال�ص��هرة‬
‫‪x5‬‬ ‫‪x5‬‬ ‫‪x6‬‬ ‫‪ Random‬الت��ي ُميك��ن ا�ص��تخدامها يف اإخ��راج ع ّين��ة اأع��داد ع�ص��وائية م��ن‬
‫بحدٍّ اأق�صى خم�ص‬ ‫مهارات‬ ‫ع ّمال‬ ‫جمموعة اأعداد معيّنة اأو عنا�صر ع�صوائية من قائمة معيّنة‪.‬‬
‫مهارات لكل عامل‬ ‫مطلوبة‬
‫‪import random‬‬

‫�صكل ‪ :5.2‬ر�صم تو�صيحي للمثال اخلا�ص بامل�صكلة‬ ‫‪def create_problem_instance(skill_number, # total number of skills‬‬
‫‪worker_number, # total number of workers‬‬
‫‪required_skill_number, # number of skills the team has to cover‬‬
‫ب�صبب الطبيعة الع�صوائية للدالة‪� ،‬صتح�صل‬ ‫‪max_skills_per_worker # max number of skills per worker‬‬
‫على ن�صخة خُمتلفة من امل�صكلة يف كل مرة‬ ‫‪):‬‬
‫تقوم فيها بت�صغيل هذا املقطع الربجمي‪.‬‬

‫‪256‬‬ ‫‪255‬‬
‫ وهذه اخلوارزمية تاأخذ بعني‬، ‫ ُميكن اإن�ص��اء الدالة التالية حل ّل م�ص��كلة تكوين الفريق باأ�ص��لوب القوة املُفرطة‬،‫بعد ذلك‬
# the following code represents the above test
‫ ث��م حت�ص��ر ال ِف��رق التي ت�ص��تويف كل‬،‫ و تن�ص��ىء ال ِف��رق بن��ا ًء عل��ى االأع��داد املمكن��ة‬،‫االعتب��ار جمي��ع اأحج��ام الف��رق املمكن��ة‬ sample_problem = create_problem_instance(10, 6, 5, 5)
:‫وحتدد الفريق االأقل عددًا‬ِّ ‫املهارات املطلوبة‬
# prints the skills for each worker
for worker_id in sample_problem['worker_skills']:
def brute_force_solver(problem):
print(worker_id, sample_problem['worker_skills'][worker_id])

worker_skills = problem['worker_skills']
print()
required_skills = problem['required_skills']

worker_ids = list(worker_skills.keys()) # gets the ids of all the workers


# prints the required skills that the team has to cover
worker_num = len(worker_ids) # total number of workers print('Required Skills:', sample_problem['required_skills'])
all_possible_teams = [] # remembers all possible teams
best_team = None # remembers the best (smallest) team found so far
w1 {'s10'}
#for each possible team size (singles, pairs, triplets, ...) w2 {'s2', 's8', 's5', 's6'}
for team_size in range(1, worker_num+1): w3 {'s7', 's2', 's4', 's5', 's1'}
w4 {'s9', 's4'}
# creates all possible teams of this size w5 {'s7', 's4'}
teams = combinations(worker_ids, team_size) w6 {'s7', 's10'}
for team in teams: # for each team of this size
Required Skills: {'s6', 's8', 's7', 's5', 's9'}
skill_union = set() # union of skills covered by all members of this team
for worker_id in team: # for each team member
# adds their skills to the union ‫ وه��ي خوارزمي��ة حت�ص��ني ُميكنه��ا اأن حت��دِّ د اأقل عدد ممكن‬،)Solver( ‫تتمث��ل اخلط��وة التالي��ة يف اإن�ص��اء خوارزمي��ة ح� ّل‬
skill_union.update(worker_skills[worker_id]) .‫لفريق الع ّمال الذي ُميكن اعتماده الإ�صتيفاء كل املهارات املطلوبة‬
# if all the required skills are included in the union
if required_skills.issubset(skill_union):
‫اتخاذ القرار بخوارزمية القوة املُفرطة‬
Decision Making with a Brute-Force Algorithm
# if this is the first team that covers all required skills
# or this team is smaller than the best one or ‫�ص�تُطبِّق اأول خوارزمي��ة ح� ّل اأ�ص��لوب الق��وة املُفرط��ة ال��ذي يعتم��د عل��ى التع��داد ال�ص��امل ل��كل ال ِف��رق املُمكن��ة واأخذه��ا بعني‬
if best_team == None or len(team) < len(best_team): ‫؛ لتولي��د كل ال ِف��رق‬itertools ‫ (توافي��ق) م��ن وح��دة‬combinations ‫ و�صَ تَ�ص��تخدم ه��ذه اخلوارزمي��ة اأدوات‬،‫االعتب��ار‬
best_team = team # makes this team the best one
.‫املُمكنة ذات العدد املحدَّد‬
return best_team # returns the best solution :‫�صيتم تو�صيح االأداة باملثال الب�صيط اأدناه‬
‫ فاإذا كانت جمموعة املهارات املطلوبة ت�ص��مل مه��ارة ال ميتلكها‬،‫م��ن املمك��ن اأال يك��ون هن��اك ح� ّل لن�ص��خة امل�ص��كلة ال��واردة‬ # used to generate all possible combinations in a given list of elements
‫ ويف مث��ل ه��ذه احل��االت �ص�تُظهر‬،‫ فل��ن جُت��د طريق��ة الإن�ص��اء فري��ق يغط��ي كل امله��ارات‬،‫اأي عام��ل م��ن الع ّم��ال املتواجدي��ن‬ from itertools import combinations
.ّ‫اخلوارزمية املذكورة �صابقًا النتيجة بعدم وجود حل‬
L = ['w1', 'w2', 'w3', 'w4']
‫ُميكن��ك االآن ا�ص��تخدام املقط��ع الربجم��ي الت��ايل الختب��ار خوارزمي��ة احل� ّل بالق��وة املُفرط��ة وف ًق��ا للمث��ال ال��ذي مت اإن�ص��اوؤه‬
:‫�صابقًا‬ print('pairs', list(combinations(L, 2))) # all possible pairs
print('triplets', list(combinations(L, 3))) # all possible triplets
# uses the brute-force solver to find the best team for the sample problem
best_team = brute_force_solver(sample_problem)
print(best_team) pairs [('w1', 'w2'), ('w1', 'w3'), ('w1', 'w4'), ('w2', 'w3'), ('w2',
'w4'), ('w3', 'w4')]
triplets [('w1', 'w2', 'w3'), ('w1', 'w2', 'w4'), ('w1', 'w3', 'w4'),
('w2', 'w3', 'w4') ('w2', 'w3', 'w4')]

258 257
‫ي�ص� ِ‬
‫�تخدم املقط��ع الربجم��ي الت��ايل ه��ذه الدال��ة وخوارزمي��ة احل� ّل بالق��وة املُفرط��ة حل�ص��اب احلل��ول املُمكن��ة ملجموع��ات‬ ‫من املوؤكد اأن خوارزمية احل ّل بالقوة املُفرطة �صتجد اأف�صل ح ّل ممكن ‪ ،‬اأي‪ :‬اأق ّل الفرق عددًا طاملا اأن هناك ح ٌّل ممكنٌ ‪،‬‬
‫البيان��ات الت��ي مت اإن�ص��اوؤها �ص��ابقًا واملُك َّون��ة م��ن ‪( 5-workers‬خم�ص��ة _ع ّم��ال)‪ ،‬و‪( 10-workers‬ع�ص��رة _ع ّم��ال)‪،‬‬ ‫ولكن كما مت مناق�صته يف بداية هذا الدر�ص فاإن طبيعة اخلوارزمية ال�صمولية ُتوؤدي اإىل زيادة هائلة يف التكلفة احلا�صوبية‬
‫عامال)‪ ،‬و‪( 20-workers‬ع�صرين _ ً‬
‫عامال)‪:‬‬ ‫و‪( 15-workers‬خم�صة ع�صر _ ً‬ ‫كلما زاد حجم امل�صكلة‪.‬‬
‫ُميك��ن تو�صي��ح ذل��ك م��ن خ��الل اإن�ص��اء نُ�ص��خ مل�ص��كالت متع��ددة م��ن حي��ث تزاي��د ع��دد الع ّم��ال‪ ،‬و ُميك��ن ا�ص��تخدام املقط��ع‬
‫‪brute_solutions_5 = gets_solutions(problems_with_5_workers,‬‬ ‫الربجم��ي الت��ايل لتولي��د نُ�ص��خ متنوع��ة م��ن م�ص��كلة تكوي��ن الفري��ق‪ ،‬حيث يتن��وع عدد الع ّم��ال ليك��ون‪ 5 :‬و‪ 10‬و‪ 15‬و‪ ،20‬ثم‬
‫)‪solver = brute_force_solver‬‬
‫يتم توليد ‪ 100‬ن�ص��خة بعدد الع ّمال‪ ،‬وت�ص��مل كل النُ�ص��خ املهارات االإجمالية الع�ص��ر‪ ،‬واملهارات الثمان املطلوبة‪ ،‬واخلم���ص‬
‫‪brute_solutions_10 = gets_solutions(problems_with_10_workers,‬‬ ‫كحد اأق�صى لكل عامل‪:‬‬ ‫مهارات ٍّ‬
‫)‪solver = brute_force_solver‬‬

‫‪problems_with_5_workers = [] # 5 workers‬‬
‫‪brute_solutions_15 = gets_solutions(problems_with_15_workers,‬‬
‫)‪solver = brute_force_solver‬‬ ‫‪problems_with_10_workers = [] # 10 workers‬‬
‫‪problems_with_15_workers = [] # 15 workers‬‬
‫‪brute_solutions_20 = gets_solutions(problems_with_20_workers,‬‬ ‫‪problems_with_20_workers = [] # 20 workers‬‬
‫)‪solver = brute_force_solver‬‬
‫‪for i in range(100): # repeat 100 times‬‬

‫‪Solved‬‬ ‫‪23‬‬ ‫‪problems‬‬ ‫‪in‬‬ ‫‪0.0019948482513427734 seconds‬‬ ‫))‪problems_with_5_workers.append(create_problem_instance(10, 5, 8, 5‬‬


‫‪Solved‬‬ ‫‪80‬‬ ‫‪problems‬‬ ‫‪in‬‬ ‫‪0.06984829902648926 seconds‬‬ ‫))‪problems_with_10_workers.append(create_problem_instance(10, 10, 8, 5‬‬
‫‪Solved‬‬ ‫‪94‬‬ ‫‪problems‬‬ ‫‪in‬‬ ‫‪2.754629373550415 seconds‬‬ ‫))‪problems_with_15_workers.append(create_problem_instance(10, 15, 8, 5‬‬
‫‪Solved‬‬ ‫‪99‬‬ ‫‪problems‬‬ ‫‪in‬‬ ‫‪109.11902689933777 seconds‬‬ ‫))‪problems_with_20_workers.append(create_problem_instance(10, 20, 8, 5‬‬

‫عل��ى الرغ��م م��ن اأن االأع��داد املطلوب��ة �صُ ��جلت بوا�ص��طة الدال��ة ()‪ gets_solutions‬اإال اأنه��ا �ص��تكون متفاوت��ة نظ�رًا للطبيع��ة‬ ‫تَقبل الدالة التالية قائمة بنُ�ص��خ امل�ص��كلة وخوارزمية احل ّل بالقوة املُفرطة‪ ،‬وتُ�ص��تخدم هذه اخلوارزمية الإجراء العمليات‬
‫الع�صوائية ملجموعات البيانات‪ ،‬و�صيكون هناك منطان ثابتان على الدوام هما‪:‬‬ ‫احل�ص��ابية ث��م ا�ص��تخراج احل� ّل جلمي��ع النُ�ص��خ‪ ،‬كم��ا اأنه��ا تُ�ص��جل الوق��ت االإجم��ايل املطل��وب (بالث��واين) حل�ص��اب احلل��ول‬
‫• زي��ادة ع��دد الع ّم��ال ُت�وؤدي اإىل ع��دد اأك��رب من نُ�ص��خ امل�ص��كالت التي من املمك��ن اإيجاد ح ّل لها‪ ،‬وهذا النم��ط من احللول معقول‬ ‫وكذلك العدد االإجمايل للنُ�صخ التي ُميكن اإيجاد ح ّل منها‪:‬‬
‫واحد على االأقل ميتلك مه��ارة واحدة مطلوبة �صمن‬ ‫ومتو َّق��ع؛ الأن وج��ود ع��دد كب��ر م��ن الع ّم��ال يزي��د من احتم��ال وجود عاملٍ ٍ‬
‫جمموعة الع ّمال املتاحة‪.‬‬ ‫‪import time‬‬
‫• زي��ادة ع��دد الع ّم��ال ي�وؤدي اإىل زي��ادة كب��رة (اأُ�صِّ �يَّة) يف الزم��ن احلا�ص��وبي‪ ،‬وه��ذا متوق��ع ح�ص��ب التحلي��ل ال��ذي مت اإج��راوؤه يف‬ ‫‪def gets_solutions(problems,solver):‬‬
‫عامال‪ ،‬ف�اإن عدد‬
‫بداي��ة ه��ذا الدر���ص‪ ،‬وبالن�ص��بة ملجم��وع الع ّم��ال مم��ن ه��م بع��دد‪ :‬خم�ص��ة‪ ،‬وع�ص��رة‪ ،‬وخم�ص��ة ع�ص��ر‪ ،‬وع�ص��رون ً‬
‫الفِرق املُمكنة ي�صاوي‪ ،32767 ،1023 ،31 :‬و‪ 1048575‬على الرتتيب‪.‬‬ ‫‪total_seconds = 0 # total seconds required to solve all problems with this solver‬‬
‫‪total_solved = 0 # total number of problems for which the solver found a solution‬‬
‫ب�صف� ٍة عام��ة‪ ،‬وبالنظ��ر اإىل ع��دد الع ّم��ال املُعط��ى ‪ ،N‬ف�اإن عدد ال ِفرق املُمكنة ي�ص��اوي ‪ ،2N-1‬وهذا العدد �ص��ي�صبح كبرًا لتقييمه‬ ‫‪solutions = [] # solutions returned by the solver‬‬
‫حتى بالن�ص��بة للقيم ال�صغرة ل� ‪ .N‬كذلك بالن�ص��بة الأي م�ص��كلة ب�ص��يطة بها قيد واحد (يغطي جميع املهارات املطلوبة) وهدف‬
‫واح��د (تقلي��ل حج��م الفري��ق)‪ ،‬ف�اإن الق��وة املُفرطة قابلة للتطبي��ق فقط على جمموعات البيانات ال�صغرة ج��دً ا‪ ،‬وذلك بالتاأكيد‬ ‫‪for problem in problems:‬‬

‫حال عمل ًّيا الأي من م�صكالت التح�صني املعقدة التي نواجها يف الواقع والتي اأ�صرنا اإليها يف بداية هذا الدر�ص‪.‬‬ ‫لي�ص ً‬ ‫‪start_time = time.time() # starts the timer‬‬
‫‪best_team = solver(problem) # computes the solution‬‬
‫اتخاذ القرار با�ستخدام خوارزمية ا�ستدأللية ج�سعة‬ ‫‪end_time = time.time() # stops the timer‬‬
‫‪Decision Making with a Greedy Heuristic Algorithm‬‬ ‫‪solutions.append(best_team) # rememberσ the solution‬‬
‫‪total_seconds += end_time-start_time # computes total elapsed time‬‬
‫تتعام��ل الدال��ة التالي��ة م��ع ه��ذا القي��د بوا�ص��طة تنفي��ذ خوارزمي��ة حت�ص��ني تعتم��د عل��ى االأ�ص��لوب اال�ص��تداليل اجل�ص��ع‪ ،‬حي��ث تق��وم‬
‫اخلوارزمي��ة تدريجيًابتكوي��ن الفري��ق ع��ن طري��ق اإ�صاف��ة ع�ص��و واح��د يف كل م��رة‪ ،‬فالع�ص��و ال��ذي اأ�صي��ف موؤخرًا يك��ون دائمًا هو‬ ‫‪if best_team != None: # if the best team is a valid team‬‬
‫‪total_solved += 1‬‬
‫الع�صو الذي ميتلك معظم املهارات التي مَل توجد يف �صابقه‪ ،‬وت�صتمر العملية حتى ت�صتويف جميع املهارات املطلوبة‪.‬‬ ‫‪print("Solved {} problems in {} seconds".format(total_solved,‬‬
‫))‪total_seconds‬‬
‫الدالة اآل�صتدآللية اجل�صعة (‪ )Greedy Heuristic‬امل�صتخدمة يف هذا املثال هي معيار آلختيار عامل يتوفر فيه اأكرب عدد من املهارات التي‬
‫أ�آل‪.‬‬
‫تُ�صتوفى يف الفريق اإىل اآلآن‪� ،‬ميكن ا�صتخدام دالة ا�صتدآللية اأخرى‪ ،‬مبنية على اإ�صافة العامل الذي يتوفر فيه العدد اآلأكرب من املهارات ا ً‬ ‫‪return solutions‬‬

‫‪260‬‬ ‫‪259‬‬
َّ ‫ ولكنها كما هو‬،‫ال تاأخذ خوارزمية احل ّل اجل�ص��عة كل ال ِفرق املُمكنة بعني االعتبار وال ت�صمن اإيجاد احل ّل االأمثل‬
‫مو�صح‬
def greedy_solver(problem):
‫ هي يف‬،‫�وال جيدة‬
ً �‫ وم��ع ذلك ُميكنه��ا اأن تُنتج حل‬،‫اأدن��اه اأ�ص��رع بكث��ر م��ن خوارزمي��ة احل� ّل الت��ي تعتم��د عل��ى الق��وة املُفرطة‬
.‫حال اإذا كان موجودًا‬ ًّ ‫ ومن املوؤكد اأن جُتد هذه الطريقة‬،‫الغالب حلو ٌل مثلى‬ worker_skills = problem['worker_skills']
required_skills = problem['required_skills']
‫ (خم�ص��ة‬5-workers :‫ي�ص��تخدِ م املقط��ع الربجم��ي الت��ايل خوارزمي��ة احل ّل اجل�ص��عة حل�ص��اب حلول جمموع��ات البيانات‬
‫ (ع�ص��رين‬20-workers‫ و‬،)‫ (خم�ص��ة ع�ص��ر _عام� ً�ال‬15-workers‫ و‬،)‫ (ع�ص��رة _ع ّم��ال‬10-workers‫ و‬،)‫_ع ّم��ال‬ # 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
greedy_solutions_5 = gets_solutions(problems_with_5_workers, uncovered_worker_skills = {}
solver = greedy_solver)
for worker_id in worker_skills:
greedy_solutions_10 = gets_solutions(problems_with_10_workers,
solver = greedy_solver) # remembers only the required uncovered skills that this worker has
uncovered_worker_skills[worker_id] = worker_skills[worker_id].
intersection(uncovered_required_skills)
greedy_solutions_15 = gets_solutions(problems_with_15_workers,
intersections)( ‫تُظهر الدالة‬
solver = greedy_solver)
# while there are still required skills to cover ‫مجموعة جديدة تحتوي فقط على‬
while len(uncovered_required_skills) > 0: ‫المهارات الم�صتركة من جميع‬
greedy_solutions_20 = gets_solutions(problems_with_20_workers,
solver = greedy_solver) best_worker_id = None # the best worker to add next
‫مهارات الع ّمال الموجودة في‬
# number of uncovered skills required for the best worker to cover ‫ والمهارات‬،worker_skills
best_new_coverage = 0 ‫ُ�صتوف في‬
َ ‫المطلوبة التي لم ت‬
Solved 23 problems in 0.0009970664978027344 seconds .uncovered_worker_skills
Solved 80 problems in 0.000997304916381836 seconds for worker_id in uncovered_worker_skills:
Solved 94 problems in 0.001995086669921875 seconds
Solved 99 problems in 0.0019943714141845703 seconds # 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)
# creates 100 problem instances of a team formation problem with 1000 workers
problems_with_1000_workers = [] if best_worker_id != None: # if a best worker was found
best_team.append(best_worker_id) # adds the worker to the solution
for i in range(100): # repeats 100 times
problems_with_1000_workers.append(create_problem_instance(10, 1000, 8, 5)) #removes the best worker's skills from the skills to be covered
uncovered_required_skills = uncovered_required_skills -
# solves the 100-worker problems using the greedy solver uncovered_worker_skills[best_worker_id]
greedy_solutions_1000 = gets_solutions(problems_with_1000_workers,
for worker_id in uncovered_worker_skills:
solver = greedy_solver)
# remembers only the required uncovered skills that this worker has
uncovered_worker_skills[worker_id] =
Solved 100 problems in 0.09574556350708008 seconds
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

262 261
‫مترينات‬ ‫مقارنة اخلوارزميات ‪Comparing the Algorithms‬‬
‫بع��د اأن مت تو�صي��ح مي��زة ال�ص��رعة خلوارزمي��ة احل� ّل اال�ص��تداللية اجل�ص��عة‪ ،‬تتم ّث��ل اخلط��وة التالي��ة يف التحق��ق م��ن ج��ودة‬
‫احلل��ول الت��ي تُنتجه��ا‪ ،‬حي��ث تَقب��ل الدال��ة التالي��ة احلل��ول الت��ي اأنتجته��ا اخلوارزمي��ة اجل�ص��عة وخوارزمي��ة الق��وة املُفرط��ة‬
‫‪ 1‬م��ا مزاي��ا �عي��وب ا�ص��تخدام كل م��ن‪ :‬خوارزمي��ة الق��وة املفرط��ة �اخلوارزمي��ة اآل�ص��تدآللية اجل�ص��عة يف ح� ّل م�ص��كالت‬ ‫تبني النِّ�ص��ب املئوية للنُ�ص��خ التي تقوم كلتا اخلوارزميتني بذكر احل ّل االأمثل لها‬ ‫على نف���ص جمموعة نُ�ص��خ امل�ص��كالت‪ ،‬ثم ّ‬
‫التح�صني؟‬ ‫(الفريق االأقل عد ًدا)‪:‬‬

‫‪def compare(brute_solutions,greedy_solutions):‬‬
‫‪total_solved = 0‬‬
‫‪same_size = 0‬‬

‫‪for i in range(len(brute_solutions)):‬‬

‫‪if brute_solutions[i] != None: # if a solution was found‬‬


‫‪total_solved += 1‬‬

‫‪# if the solvers reported a solution of the same size‬‬


‫‪if len(brute_solutions[i]) == len(greedy_solutions[i]):‬‬
‫‪same_size += 1‬‬

‫)‪return round(same_size / total_solved, 2‬‬

‫ُميك��ن االآن ا�ص��تخدام الدال��ة ()‪ compare‬ملقارن��ة فاعلي��ة اخلوارزميت��ني املطبقت��ني عل��ى‪ :‬اخلم�ص��ة ع ّم��ال‪ ،‬والع�ص��رة‬
‫عامال‪.‬‬
‫عامال‪ ،‬والع�صرين ً‬
‫ع ّمال‪ ،‬واخلم�صة ع�صر ً‬
‫‪ 2‬حلِّل طريقة ا�صتخدام اخلوارزميات اآل�صتدآللية اجل�صعة آلإيجاد احللول امل ُثلى يف م�صكالت التح�صني‪.‬‬ ‫))‪print(compare(brute_solutions_5,greedy_solutions_5‬‬
‫))‪print(compare(brute_solutions_10,greedy_solutions_10‬‬
‫))‪print(compare(brute_solutions_15,greedy_solutions_15‬‬
‫))‪print(compare(brute_solutions_20,greedy_solutions_20‬‬

‫‪1.0‬‬
‫‪0.82‬‬
‫‪0.88‬‬
‫‪0.85‬‬

‫تو�ص��ح النتائ��ج اأن اخلوارزمي��ة اال�ص��تداللية اجل�ص��عة ُميكنه��ا اأن جُت��د با�ص��تمرار احل� ّل االأمث��ل حل��وايل ‪ 80 %‬اأو اأكر من‬ ‫ِّ‬
‫كل نُ�ص��خ امل�ص��كالت القابل��ة للح�لّ‪ .‬ويف الواق��ع‪ُ ،‬ميك��ن التحق��ق ب�ص��هولة م��ن اأن حج��م الفري��ق ال��ذي تُنتج��ه اخلوارزمي��ة‬
‫اال�ص��تداللية اجل�ص��عة حت��ى يف النُ�ص��خ الت��ي تف�ص��ل يف اإيج��اد احلل��ول املُثل��ى له��ا يك��ون قري ًب��ا ج��دً ا م��ن حج��م اأف�ص��ل فري��ق‬
‫ممكن‪.‬‬
‫عملي اأكر للتطبيقات الواقعية‪،‬‬ ‫اإذا متت اإ�صافة ذلك اإىل ميزة ال�صرعة الهائلة‪ ،‬جُتد اأن اخلوارزمية اال�صتداللية خيار ّ‬
‫و�صتكت�صف يف الدر�ص التايل تقنيات حت�صني اأكر ذكا ًء‪ ،‬و�صتتعرّف على كيفية تطبيقها على م�صكالت ُخُمتلفة‪.‬‬

‫‪264‬‬ ‫‪263‬‬
:‫ �يف كل م�صكلة‬،‫ اذكر ثال م�صكالت حت�صني ُخُمتلفة من العا الواقعي‬4 ‫ م��ن خ��الل اإكمال املقطع الربجم��ي التايل بحيث‬،‫ اأن�ص� خوارزمي��ة ح� ّل ج�ص��عة لتح�ص��ني م�ص��كلة تكوي��ن اأع�ص��اء فري��ق‬3
:‫ت�صتخدِ م خوارزمية احل ّل اآل�صتدآللية اجل�صعة لتكليف اأع�صاء الفريق بامل ُ ِهمَّة‬
.‫مثاآل على دالة مو�صوعية‬ً ‫ا�صرب‬ •
.‫ا�صرب مثالني على القيود اإن �ُجِ دَت‬ •
def greedy_solver(problem):
worker_skills=problem['worker_skills'] # worker skills for this problem
required_skills=problem['required_skills'] # required skills for this problem

uncovered_required_skills = required_skills. () # skills not covered


best_team=[] # best solution
uncovered_worker_skills={}
for worker_id in worker_skills:

uncovered_worker_skills[worker_id]=worker_skills[worker_id].
(uncovered_required_skills)
while len(uncovered_required_skills) > 0:

best_worker_id= # the best worker to add next


best_new_coverage=0 # number of uncovered required skills covered by the best worker
for worker_id in uncovered_worker_skills: # for each worker
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

‫ كي��ف يوؤث��ر ذل��ك عل��ى امل�ص��كلة من حيث ع��دد احللول �الزمن‬،‫ اإذا قم��تَ بزي��ادة ع��دد الع ّم��ال يف خوارزمي��ة الق��وة امل ُفرط��ة‬5 best_new_coverage= (my_uncovered_skills)
‫احل�صابي؟‬
if best_worker_id!= : # if a best worker was found

best_team. (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 each worker
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]. (uncovered_required_skills)
else: # no best worker has been found and some required skills are still uncovered

return # no solution could be found


return best_team

266 265
‫يف هذا الدر�ص �صتُ�صتخدم م�صكلة التباطُ وؤ املوز�ن لالآلة الواحدة (‪)Single-Machine Weighted Tardiness - SMWT‬‬
‫كمثال عملي لتو�صيح كيف ُميكن خلوارزميات التح�صني اأن حت ّل م�صكالت اجلدولة‪.‬‬ ‫الدر�ص الثاين‬
‫م�سكلة التباطُ وؤ املوزون لاللة الواحدة‬ ‫م�سكلة جدولة املوارد‬
‫‪Single-Machine Weighted Tardiness )SMWT( Problem‬‬
‫لتو�صيح هذه امل�صكلة‪� ،‬صنفرت�ص اأن مَ �صنعًا يرغبُ يف جدولة مهام اإنتاج عدة �صلع على اآلة واحدة‪ ،‬على النحو التايل‪:‬‬
‫• كل مُهِ مَّة لها وقت معاجلة حمدَّد‪ ،‬وموعد حمدَّد البد اأن تكتمل فيه‪.‬‬ ‫م�سكالت اجلدولة ‪Scheduling Problems‬‬
‫• كل مُهِ مَّة مرتبطة بوزن ميثل اأهميتها‪.‬‬ ‫م�ص��كالت اجلدول��ة �ص��ائعة يف جم��ال التح�ص��ني؛ الأنه��ا تتطل��ب تخ�صي���ص م��وارد حم��دودة مله��ام متع��ددة بطريق��ة ُحت�صِّ ��ن بع���ص‬
‫اإذا كان م��ن امل�ص��تحيل اإجن��از كل امله��ام يف املوع��د النهائ��ي ‪ ،‬ف�ص��يكون ع��دم االلت��زام ب إاجن��از امله��ام ذات ال��وزن ال�صغر‬ ‫ال��دوال املو�صوعي��ة‪ ،‬وع��ادة م��ا تك��ون مل�ص��كالت اجلدول��ة قي��ود اإ�صافي��ة مث��ل‪ :‬احلاج��ة اإىل تنفيذ امله��ام برتتيب مع� ّ�ني اأو اإجنازها‬
‫يف املوعد النهائي اأقل تكلفة من عدم االلتزام باإجناز املهام ذات الوزن الكبر يف املوعد النهائي‪.‬‬ ‫يف املوعد النهائي املح َّدد‪ ،‬وهذه امل�صكالت جوهرية يف العديد من املجاالت املختلفة مبا فيها الت�صنيع والنقل والرعاية ال�صحية‬
‫الهدف‬ ‫واإدارة امل�صاريع‪� .‬صتتعمق يف هذا الدر�ص يف خوارزميات التح�صني عن طريق اإدخال تقنيات اإ�صافية حل ّل جدولة امل�صكالت‪.‬‬
‫اله��دف (‪ )Goal‬م��ن جدول��ة امله��ام بطريق��ة حم� َّددة ه��و تقلي��ل املجم��وع امل��وزون للتاأخ��ر (التباطُ �وؤ) ل��كل مُهِ َّم��ة‪ ،‬وهكذا‬
‫فاإن جمموع التباطُ وؤ املوزون يكون مبثابة الدالة املو�صوعية خلوارزميات التح�صني امل�ص َّممة حل ّل هذه امل�صكلة‪.‬‬
‫األت تلفة بحاجة اإىل حلول اجلدولة‬ ‫جدول  ‪ : .1‬تطبيقات من‬
‫ح�ساب التاأخري‬ ‫الو يفة‬ ‫التطبيق‬
‫ح�صب التاأخر (‪ )Lateness‬يف اأداء املُهِ مَّة على اأ�صا�ص الفرق بني زمن اإجنازها واملوعد املح َّدد لت�صليمها‪ ،‬ثم تُ�صتخدم‬ ‫ُي ُ‬ ‫تخ�صي�ص املوارد واملهام الأن�صطة امل�صروع؛ لتقليل مدة امل�صروع وتكاليفه‪.‬‬ ‫جدولة امل�صاريع‬
‫اأوزان امله�ام كعوام�ل �ص�رب (‪ )Multipliers‬الإكم�ال املجم�وع امل�وزون النهائ�ي‪ .‬عل�ى �ص�بيل املث�ال‪ :‬افرت��ص اأن هن�اك‬
‫�دوال ب�ه ث�الث مه�ام ه�ي‪ :‬م‪ 1‬وم‪ 2‬وم‪ ،3‬واأوزان ه�ذه امله�ام ه�ي‪ 2 :‬و‪ 1‬و‪ 2‬عل�ى الرتتي�ب‪ .‬وفقً�ا له�ذا اجلدول‪� ،‬ص�تُنجز‬ ‫ج ً‬ ‫حتديد خطة االإنتاج املُثلى؛ لتلبية الطلب مع تقليل املخزون والتكاليف‪.‬‬ ‫تخطيط االإنتاج‬
‫املُهِ َّم�ة رق�م ‪ 1‬يف املوع�د املح� َّدد‪ ،‬و�ص�يتاأخر اإجن�از املُهِ مَّ�ة رق�م ‪ 2‬ث�الث �ص�اعات ع�ن موع�د ت�ص�ليمها‪ ،‬أام�ا املُهِ مَّ�ة رق�م ‪3‬‬
‫ف�صيتاأخر اإجنازها �صاعة واحدة عن موعد ت�صليمها‪ ،‬ويعني ذلك اأن جمموع التباطُ ؤو املوزون ي�صاوي ‪.3×1 1×2=5‬‬ ‫جدول��ة اإق��الع الطائ��رات وف��رتات عم��ل الطاق��م؛ لتح�ص��ني ج��داول الرح��الت م��ع‬ ‫جدولة خطوط الطران‬
‫تقليل التاأخر والتكاليف‪.‬‬
‫تاأخير ثالث �صاعات‪.‬‬ ‫تاأخير �صاعة‪.‬‬ ‫تخ�صي���ص ف��رتات عم��ل للموظف��ني؛ ل�صم��ان التغطي��ة املنا�ص��بة لف��رتات العم��ل مع‬ ‫جدولة مركز االت�صاالت‬
‫‪23‬‬ ‫‪20‬‬ ‫‪15‬‬ ‫‪10‬‬ ‫‪5‬‬ ‫‪0‬‬ ‫تقليل التكاليف وااللتزام باتفاقيات م�صتوى اخلدمة‪.‬‬
‫تخ�صي�ص املوارد يف الت�صنيع؛ لتقليل زمن االإنتاج والتكاليف‪.‬‬ ‫جدولة االإنتاج ح�صب الطلب‬
‫ال ُم ِهمَّة ‪2‬‬ ‫ال ُم ِهمَّة ‪3‬‬ ‫ال ُم ِهمَّة ‪1‬‬
‫جدول��ة توقي��ت االإعالن��ات عل��ى التلف��از اأو االإذاع��ة؛ لزي��ادة الو�ص��ول اإىل اجلمهور‬ ‫جدولة و�صائل االإعالم‬
‫�صكل ‪ :5.4‬ر�صم تو�صيحي لت�صل�صل املهام‬ ‫واالإيرادات مع االلتزام بقيود امليزانية‪.‬‬
‫التباطُ وؤ املوز�ن‬ ‫التاأخر‬ ‫موعد ت�صليمها‬ ‫املوعد املح َّدد آلإ ازها‬ ‫امل ُ ِهمَّة‬ ‫تخ�صي���ص ف��رتات عم��ل للممر�ص��ات يف امل�صت�ص��فيات؛ ل�صم��ان التغطي��ة الكافي��ة‬ ‫جدولة املمر�صات‬
‫‪---------------‬‬ ‫‪---------‬‬ ‫‪--------------‬‬ ‫‪------------‬‬ ‫‪-------‬‬ ‫خالل فرتات العمل مع تقليل تكاليف العمالة‪.‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪11‬‬ ‫‪14‬‬ ‫م‪1‬‬
‫‪3‬‬ ‫‪3‬‬ ‫‪23‬‬ ‫‪20‬‬ ‫م‪2‬‬
‫‪2‬‬ ‫‪1‬‬ ‫‪18‬‬ ‫‪17‬‬ ‫م‪3‬‬
‫�صكل ‪ :5.5‬ح�صاب التباطُ ؤو املوزون‬

‫تُ�صتخدم خوارزميات التح�صني‬


‫توج��د �صعوب��ة يف ح� ّل م�ص��كلة التباطُ � ؤو امل��وزون لالآل��ة الواح��دة؛ الأن تعقُّدَ ها يتزايد‬
‫للح�صول على حلول �صبه‬ ‫تزايُدًا اأُ�صِّ يًّا مع عدد املهام‪ ،‬مما يجعل اإيجاد اأف�صل ح ّل ممكن الأحجام املُدخَ الت‬
‫مثالية مل�صكلة دَّدة يف مدة‬ ‫م�صتحيال‪.‬‬
‫ً‬ ‫الكبرة مكلفًا للغاية وعادة ما يكون‬
‫زمنية معقولة‪.‬‬
‫�صكل ‪ :5.3‬خُمطط قانت ّ‬
‫يبني جدول م�صروع‬
‫‪268‬‬ ‫‪267‬‬
‫تُ�ص��تخدم الدال��ة (‪ random.randint)x,y‬لتولي��د ع��دد �صحي��ح ع�ص��وائي ب��ني ‪ x‬و‪ ،y‬وهناك طريقة ُخُمتلفة ال�ص��تخدام‬ ‫م�سكلة جدولة األإنتاج ح�سب الطلب ‪Job Shop Scheduling )JSS( Problem‬‬
‫ه��ذه الدال��ة تتم ّث��ل يف توف��ر قائم��ة [‪ ]x,y‬اأو جمموع��ة (‪ ،)x,y‬ويف ه��ذه احلال��ة ال ب��د م��ن كتاب��ة الرم��ز * قب��ل القائم��ة‪،‬‬ ‫م�ص��كلة جد�ل��ة اآلإنت��اج ح�ص��ب الطل��ب (‪ )JSS‬ه��ي م�ص��كلة اعتيادي��ة اأخ��رى يف اجلدول��ة حَ ِظي��ت بدرا�ص��ات مُو�صَّ ��عة يف‬
‫مو�صح يف الدالة ال�صابقة‪ ،‬على �صبيل املثال‪:‬‬ ‫كما هو َّ‬ ‫جم��ال التح�ص��ني‪ ،‬وتت�صم��ن جدول��ة جمموع��ة م��ن امله��ام عل��ى ع��دة اآالت‪ ،‬حي��ث يج��ب معاجل��ة كل ُمهِ َّم��ة برتتي��ب ووق��ت‬
‫معيّنان لكل اآلة بالن�صبة للمهام االأخرى‪.‬‬
‫‪for i in range(5):# prints 5 random integers between 1 and 10‬‬ ‫‪6‬‬
‫))]‪print(random.randint(*[1, 10‬‬ ‫‪5‬‬ ‫الهدف‬
‫‪5‬‬
‫‪10‬‬
‫تقليل زمن االإجناز الكليّ (فرتة الت�صنيع) جلميع املهام‪.‬‬
‫‪1‬‬ ‫متغريات امل�سكلة‬
‫ِّ‬
‫املتغرات االأخرى من هذه امل�صكلة تفر�ص عدة قيود اإ�صافية مثل‪:‬‬ ‫ِّ‬
‫يَ�صتخدم املقطع الربجمي التايل دالة ()‪ create_problem_instance‬لتوليد ن�صخة مل�صكلة يتوفّر فيها ما يلي‪:‬‬
‫• وج��وب االلت��زام بتاري��خ اإ�ص��دار كل ُمهِ َّم��ة؛ حي��ث اإن لكل مُهِ مَّة تاريخه��ا اخلا�ص وال ميكن البدء بها قبل ذلك التاريخ‪،‬‬
‫• ت�صتمل ك ّل ن�صخة على ع�صرة مهام‪.‬‬ ‫باالإ�صافة اإىل مراعاة املوعد النهائي‪.‬‬
‫• ُميك��ن ل��كل مُهِ َّم��ة اأن ت�ص��تمر م��ا ب��ني ‪ 5‬وح��دات زمني��ة و‪ 20‬وح��دة زمني��ة‪ ،‬و�ص��يتم افرتا���ص اأن ال�ص��اعة ه��ي الوح��دة‬ ‫• وجوب جدولة بع�ص املهام قبل املهام االأخرى؛ ب�صبب �صوابط االأ�صبقية بينها‪.‬‬
‫امل�صتخدمة فيما تبقى من هذا الدر�ص‪.‬‬ ‫َ‬ ‫الزمنية‬
‫• وج��وب اإخ�ص��اع كل اآل��ة لل�صيان��ة الدوري��ة وف ًق��ا ل�صواب��ط ج��دول ال�صيان��ة‪ ،‬حي��ث ال ميك��ن ل�الآالت تاأدي��ة امله��ام اأثن��اء‬
‫• كل م ُِه َّم��ة له��ا موع��د نهائ��ي ي��رتاوح م��ا ب��ني ‪� 5‬ص��اعات و‪� 50‬ص��اعة‪ ،‬وتب��د أا �ص��اعة املوعد النهائ��ي من حلظة ب��دء املُ ِه َّمة‬ ‫ال�صيانة‪ ،‬كما ال ميكن اأن تتوقف املُهِ َّمة مبجرد بدئها‪.‬‬
‫االأوىل يف ا�ص��تخدام االآل��ة‪ ،‬عل��ى �ص��بيل املث��ال‪ :‬اإذا كان املوع��د النهائ��ي ملُهِ َّمة ما ي�ص��اوي ع�ص��ر �ص��اعات‪ ،‬فه��ذا يعني اأنه‬
‫ال بد من اإكمال املُهِ َّمة يف غ�صون ع�صر �صاعات من بداية املُهِ َّمة االأوىل يف اجلدول‪.‬‬ ‫ال ب��د اأن مت��ر كل آال��ة بف��رتة تو ُّق��ف ع��ن االإنت��اج بع��د اإكم��ال امل ُِه َّم��ة‪ ،‬وق��د يك��ون طول هذه الف��رتة ثابتًا‪ ،‬وقد يتف��اوت من اآلة‬
‫اإىل اأخرى‪ ،‬ومن املمكن اأن يعتمد على الوقت الذي ا�صتغرقته االآلة يف اإكمال املُهِ َّمة ال�صابقة‪.‬‬
‫• وزن كل مُهِ مَّة هو عدد �صحيح يرتاوح بني ‪ 1‬و‪.3‬‬
‫م��ا ورد اأع��اله لي���ص �ص��وى جمموع��ة فرعي��ة م��ن القي��ود املعق��دة واملتع��ددة‪ ،‬وم��ن متغ� ِّ�رات امل�ص��كلة املوج��ودة يف م�ص��كالت‬
‫نطاق مدة‬ ‫متغر خ�صائ�صه وتطبيقاته العملية الفريدة‪ ،‬وقد تكون خوارزميات‬ ‫اجلدولة التي نواجها يف واقع احلياة‪ ،‬حيث اأن لكل ِّ‬
‫عدد المهام المراد اإن�صاوؤها‪.‬‬ ‫المُهِ مَّة‪.‬‬ ‫متغرات امل�صكلة‪.‬‬
‫متغر من ِّ‬ ‫التح�صني املُختلفة اأكر مالءمة حل ّل كل ِّ‬
‫)]‪create_problem_instance(10, [5, 20], [5, 50], [1, 3‬‬ ‫ا�ستخدام البايثون والتح�س حللّ م�سكلة التباطُ وؤ املوزون لاللة الواحدة‬
‫‪Using Python and Optimization to Solve the SMWT Problem‬‬
‫نطاق الموعد النهائي‪.‬‬
‫‪{'durations': [18, 17, 17, 6, 9, 6, 20, 12, 9, 19],‬‬ ‫ُميكن ا�صتخدام املقطع الربجمي التايل الإن�صاء نُ�صَ خ ع�صوائية مل�صكلة التباطُ وؤ املوز�ن لالآلة الواحدة (‪:)SMWT‬‬
‫‪'deadlines': [39, 31, 6, 42, 48, 10, 39, 16, 34, 35],‬‬
‫}]‪'weights': [2, 2, 3, 2, 1, 3, 2, 1, 3, 1‬‬ ‫مدى اأهمية الوزن‪.‬‬ ‫‪import random‬‬

‫ُميك��ن ا�ص��تخدام الدال��ة التالي��ة لتقيي��م ج��ودة اأي جدول اأنتجته اإحدى اخلوارزميات لن�ص��خة م�ص��كلة حم� َّددة‪ ،‬حيث تَقبل‬ ‫‪# creates an instance of the Single-Machine Weighted Tardiness problem.‬‬
‫وجدوال ملهامها‪ ،‬ثم متر على كل املهام برتتيب جدولتها نف�صه حتى َحت�صب اأزمنة اإجنازها وجمموع‬ ‫ً‬ ‫الدالة ن�صخة امل�صكلة‬
‫‪def create_problem_instance(job_num, # number of jobs to create‬‬
‫التباطُ وؤ املوزون لكامل اجلدول‪ ،‬و ُيح�صب هذا التباطُ وؤ بح�صاب تباطوؤ كل مُهِ َّمة (مع مراعاة املوعد النهائي لها) و�صربه‬ ‫‪duration_range, # job duration range‬‬
‫يف وزن املُهِ َّمة واإ�صافة الناجت اإىل املجموع‪:‬‬ ‫‪deadline_range, # deadline range‬‬
‫‪weight_range):# importance weight range‬‬
‫‪# computes the total weighted tardiness of a given schedule for a given problem instance‬‬
‫‪# generates a random duration, deadline, and weight for each job‬‬
‫‪def compute_schedule_tardiness(problem, schedule):‬‬ ‫])‪durations = [random.randint(*duration_range) for i in range(job_num‬‬
‫])‪deadlines = [random.randint(*deadline_range) for i in range(job_num‬‬
‫‪# gets the information for this problem‬‬
‫])‪weights = [random.randint(*weight_range) for i in range(job_num‬‬
‫‪durations, weights, deadlines=problem['durations'], problem['weights'],‬‬
‫]'‪problem['deadlines‬‬
‫‪# returns the problem instance as a dictionary‬‬
‫‪job_num = len(schedule) # gets the number of jobs‬‬ ‫‪return {'durations':durations,‬‬
‫‪finish_times = [0] * job_num # stores the finish time for each job‬‬ ‫‪'deadlines':deadlines,‬‬
‫‪schedule_tardiness = 0 # initializes the weighted tardiness of the overall schedule to 0‬‬ ‫}‪'weights':weights‬‬
‫‪for pos in range(job_num): # goes over the jobs in scheduled order‬‬
‫‪270‬‬ ‫‪269‬‬
import itertools job_id=schedule[pos] # schedule[pos] is the id in the 'pos' position of the schedule

def brute_force_solver(problem): if pos == 0: # if this is the job that was scheduled first (position 0)

# gets the information for this problem # the finish time of the job that starts first is equal to its run time
durations, weights, deadlines=problem['durations'], problem['weights'], finish_times[pos] = durations[job_id]
problem['deadlines']
else: # for all jobs except the one that was scheduled first
job_num = len(durations) # number of jobs
# the finish time is equal to the finish time of the previous time plus the job's run time
finish_times[pos] = finish_times[pos-1] + durations[job_id]
# Generates all possible schedules
all_schedules = itertools.permutations(range(job_num))
# computes the weighted tardiness of this job and adds it to the schedule's overall tardiness
schedule_tardiness += weights[job_id] * max(finish_times[pos] -
# Initializes the best solution and its total weighted tardiness deadlines[job_id], 0)
best_schedule = None # initialized to None
return schedule_tardiness,finish_times
# 'inf' stands for 'infnity'. Python will evaluate all numbers as smaller than this value.
best_tardiness = float('inf')

# stores the finish time of each job in the best schedule


best_finish_times = None # initalized to None ‫ و�ص��تكون ه��ذه الدال��ة مبثاب��ة اأداة مفي��دة‬،‫ لتقيي��م اجل��داول‬compute_schedule_tardiness)( ‫�صتُ�ص��تخدم الدال��ة‬
.)SMWT( ‫لكل اخلوارزميات التي �صيتم تقدميها يف هذا الدر�ص حل ّل م�صكلة التباطُ وؤ املوز�ن لالآلة الواحدة‬
for schedule in all_schedules: # for every possible schedule

#evalutes the schedule


Itertools.Permutations)( Function ‫دالة التباديل‬
tardiness,finish_times=compute_schedule_tardiness(problem, schedule) ‫ الإن�ص�اء كل اجل�داول املُمكنة (جُتميعات‬itertools.permutations)( ‫�تخدم خوارزمي�ة ح� ّل الق�وة املُفرط�ة الدال�ة‬
ِ ‫ت�ص‬
if tardiness < best_tardiness: # this schedule is better than the best so far
.)‫ ثم َحت�صب تباط ؤو كل جدول ممكن وت�صتخرج اأف�صل جدول (اجلدول ذو التباطوؤ الكُليّ االأدنى‬،)‫املهام‬
best_tardiness = tardiness ،‫ قائمة) وتُن�صئ كل تبديل ممكن لقيم املُدخَ الت‬:‫ عن�صرًا واحدًا متكررًا (مثل‬itertools.permutations)( ‫تَقبل الدالة‬
best_schedule = schedule
best_finish_times = finish_times :‫ ويُظهِ ر التبديالت لكل عناوين املهام املُعطاة‬permutations)( ‫ويو�صح املثال الب�صيط التايل ا�صتخدام دالة‬
ِّ
# returns the results as a dictionary ‫تُ�صتخدم خوارزميات ح ّل القوة امل ُفرطة ب�صكل‬ job_ids = [0,1,2] # the ids of 3 jobs
return {'schedule':best_schedule,
‫ فالن�صخة‬،‫اأف�صل حل ّل امل�صكالت ال�صغرة‬ for schedule in itertools.permutations(job_ids):
'tardiness':best_tardiness,
‫اخلا�صة �صكلة التباطوؤ املوز�ن لالآلة‬ print(schedule)
'finish_times':best_finish_times}
N! ‫ لديها عدد‬،‫ من املهام‬N ‫الواحدة ذات عدد‬

‫ وزمن اإجن��از كل ُم ِه َّمة‬،‫ وزم��ن التباط�وؤ‬،‫خوارزمي��ة احل� ّل تعط��ي اجل��دول االأف�ص��ل‬ ،N = 5 ‫ فعندما يكون‬،‫من اجلدا�ل املمكنة‬ (0, 1, 2)
‫ �لكن هذا‬،‫جد�آل‬
ً 5! = 120 ‫�صيكون النا‬ (0, 2, 1)
،‫ اإذا كان اجل��دول يح��وي ث��الث مهام‬،‫ عل��ى �ص��بيل املث��ال‬.‫مُعط��اة يف ه��ذا اجل��دول‬ N = 10 ‫العدد يتزايد ب�صكل كبر عندما يكون‬ (1, 0, 2)
‫عدد المهام المراد‬ ‫نطاق الموعد‬ ‫ فذل��ك يعن��ي اأن املُهِ َّمة‬،]10، 14، 20[ ‫وكان��ت اأوق��ات اإجن��از جمي��ع امله��ام ت�ص��اوي‬ N = 11 ‫ �عندما يكون‬، 10! = 3,628,800‫اإىل‬ (1, 2, 0)
‫ واملُهِ َّم��ة الثاني��ة انته��ت بع��د ذل��ك باأرب��ع‬،‫ �ص��اعات‬10 ‫الت��ي ب��داأت ا ًأوال انته��ت بع��د‬ (2, 0, 1)
.‫اإن�صاوؤها‬ .‫النهائي‬ .11! = 39,916,800 ‫اإىل‬ (2, 1, 0)
.‫ واملُهِ َّمة االأخرة انتهت بعد �صت �صاعات من اكتمال املُهِ َّمة الثانية‬،‫�صاعات‬
Brute-Force Solver ‫القوة املُفرطة‬ ّ‫خوارزمية حل‬
sample_problem = create_problem_instance(5, [5, 20], [5, 30], [1, 3])
brute_force_solver(sample_problem) ‫ وعلى الرغم من‬،‫لقد تعلّمت يف الدر���ص ال�ص��ابق طريقة ا�ص��تخدام خوارزمية ح ّل القوة املُفرطة يف م�ص��كلة تكوين فريق‬
‫ اإال اأن قدرتها على اإيجاد احل ّل االأمثل (اأف�صل‬،‫اأن خوارزمية احل ّل هذه اأظهرت بطئًا �صديدً ا يف امل�صكالت االأكرب حجمًا‬
{'schedule': (0, 2, 1, 3, 4), .‫نطاق مدة المُهِ مَّة‬ .‫مدى اأهمية الوزن‬ ‫ح� ّل ممك��ن) لنُ�ص��خ امل�ص��كلة ذات احلج��م ال�صغ��ر كان��ت مفي��دة يف تقيي��م ج��ودة احلل��ول املُن َتج��ة بوا�ص��طة خوارزمي��ات‬
'tardiness': 164, ‫ ُميكن ا�ص��تخدام خوارزمية ح ّل القوة املُفرطة التالية حل ّل‬:‫ وباملثل‬.‫التح�ص��ني االأ�ص��رع التي ال ت�صمن اإيجاد احل ّل االأمثل‬
'finish_times': [5, 11, 21, 36, 51]}
.)SMWT( ‫م�صكلة التباطُ وؤ املوز�ن لالآلة الواحدة‬
272 271
‫األ�ستدأللية اجل�سعة ‪Greedy Heuristic Solver‬‬ ‫خوارزمية احللّ‬
‫)‪greedy_sol = greedy_solver(sample_problem, deadline_heuristic‬‬
‫‪greedy_sol‬‬ ‫ت�صتخدم خوارزمية احل ّل اجل�صعة اأ�صلوبًا ا�صتدالليًا ب�صيطً ا لفرز املهام واتخاذ قرار الرتتيب الذي يجب جدولتها وفقًا‬ ‫ِ‬
‫ل��ه‪ ،‬ث��م تُرت��ب امله��ام حل�ص��اب زم��ن اإكم��ال كل ُم ِه َّم��ة وجمم��وع التباطُ � ؤو امل��وزون لكام��ل اجل��دول‪ ،‬ويف ه��ذا املث��ال اخلا���ص‬
‫‪{'schedule': [3, 1, 4, 0, 2],‬‬ ‫تُظهر خوارزمية احل ّل اجل�صعة نوع املُخرَجات نف�صه الذي اأظهرته خوارزمية ح ّل القوة املُفرطة ‪.‬‬
‫‪'tardiness': 124,‬‬ ‫�تخدم (معيار فرز‬ ‫ُعامالن هما‪ :‬ن�ص��خة امل�ص��كلة املراد حلّها‪ ،‬ودالة اال�ص��تدالل التي �صت�ص� ِ‬ ‫تَقبل خوارزمية احل ّل اجل�ص��عة م ِ‬
‫}]‪'finish_times': [15, 26, 32, 48, 57‬‬
‫امله��ام)‪ ،‬مم��ا ي�ص��مح للم�ص� ِ‬
‫�تخدم ب�اأن ُيط ِّب��ق اأي دال��ة ا�ص��تدالل يختاره��ا كدال��ة بايث��ون‪ ،‬ث��م مي� ِّرره اإىل خوارزمي��ة احل� ّل‬
‫اجل�صعة باعتباره ُم ِ‬
‫عام ًال‪.‬‬
‫بديال ياأخذ يف اعتباره اأوزان املهام عند اتخاذ قرار ترتيبها يف اجلدول‪:‬‬
‫ا�صتدالال ً‬
‫ً‬ ‫تُطبِّق الدالة التالية‬
‫تُطبِّق الدالة التالية خوارزمية حت�صني ت�صتخدم دال ًة ا�صتداللي ًة ج�صع ًة حل ّل امل�صكلة‪:‬‬
‫‪# returns the weighted deadline of a given job‬‬
‫‪def weighted_deadline_heuristic(job,problem):‬‬ ‫‪def greedy_solver(problem, heuristic):‬‬

‫‪# accesses the deadlines for this problem and returns the deadline for the job‬‬ ‫‪# gets the information for this problem‬‬
‫]‪return problem['deadlines'][job] / problem['weights'][job‬‬ ‫‪durations, weights, deadlines = problem['durations'], problem['weights'],‬‬
‫)‪weighted_greedy_sol=greedy_solver(sample_problem, weighted_deadline_heuristic‬‬ ‫]'‪problem['deadlines‬‬
‫‪weighted_greedy_sol‬‬
‫‪job_num = len(durations)# gets the number of jobs‬‬

‫‪{'schedule': [3, 2, 1, 4, 0],‬‬ ‫‪# Creates a list of job indices sorted by their deadline in non-decreasing order‬‬
‫‪'tardiness': 89,‬‬ ‫))‪schedule = sorted(range(job_num), key = lambda j: heuristic(j, problem‬‬
‫}]‪'finish_times': [15, 24, 35, 41, 57‬‬

‫‪# evaluates the schedule‬‬


‫البحث املحلّي ‪Local Search‬‬ ‫)‪tardiness, finish_times = compute_schedule_tardiness(problem, schedule‬‬

‫عل��ى الرغ��م م��ن اأن خوارزمي��ة احل� ّل اجل�ص��عة اأ�ص��رع بكث��ر م��ن خوارزمي��ة الق��وة‬ ‫‪# returns the results as a dictionary‬‬
‫البحث املحلّي‬ ‫املُفرط��ة‪ ،‬اإال اأنه��ا متي��ل اإىل اإنت��اج حل��ول ذات ج��ودة اأقل بزمن تباط�وؤ اأعلى‪ ،‬ويُع ُّد‬ ‫‪return‬‬ ‫‪{'schedule':schedule,‬‬
‫(‪:)Local Search‬‬ ‫البح��ث املح ّل��ي طريق��ة لتح�ص��ني ح��ل مت ح�ص��ابه بوا�ص��طة اخلوارزمي��ة اجل�ص��عة اأو‬ ‫‪'tardiness':tardiness,‬‬
‫}‪'finish_times':finish_times‬‬
‫ه��و طريق��ة حت�ص��ني ا�ص��تداللية‬ ‫باأي طريقة اأخرى‪.‬‬
‫تر ِّك��ز على اكت�ص��اف حل��ول جماورة‬ ‫يف البح��ث املح ّل��ي‪ُ ،‬يع�دَّل احل� ّل ال��ذي مت التو�ص��ل اإلي��ه يف البداي��ة ب�ص��كلٍ متك��رر‬ ‫يُ�صتخدم بناء الجملة ‪ lambda‬مع‬ ‫يُ�صتخدم يف هذا املثال دالة ا�صتدآللية‬
‫ِحل ّل معني بهدف حت�صينه‪.‬‬ ‫من خالل فح�ص احللول املجاورة التي وُجِ دت عن طريق اإجراء تعديالت ب�صيطة‬ ‫دالة البايثون ()‪ sorted‬عندما‬
‫عل��ى احل � ّل احل��ايل‪ .‬بالن�ص��بة للعدي��د م��ن م�ص��كالت التح�ص��ني‪ ،‬فهن��اك طريق��ة‬ ‫ج�صعة لتحديد امل ُ ِه َّمة التالية التي‬
‫يتمثّل الهدف في فرز قائمة‬ ‫حتتاج اإىل جد�لة �هي امل ُ ِه َّمة التي‬
‫�ص��ائعة لتعدي��ل احل� ّل تتمث��ل يف تبدي��ل العنا�ص��ر ب�ص��كل متك��رر‪ .‬على �ص��بيل املثال‪،‬‬ ‫عنا�صر بنا ًء على قيمة يتم ح�صابها‬ ‫لها اأقرب موعد نهائي‪.‬‬
‫يف م�صكلة تكوين الفريق التي مت تو�صيحها يف الدر�ص ال�صابق‪� ،‬صيحاول اأ�صلوب البحث املحلّي اإن�صاء فريق اأف�صل وذلك‬ ‫بطريقة منف�صلة لكل عن�صر‪.‬‬
‫من خالل تبديل اأع�صاء الفريق بالعمّال الذين ال يُعدّون حاليًا جزءًا من الفريق‪.‬‬
‫اأن�ص �اأت خوارزمي��ة احل � ّل اآل�ص��تدآللية اجل�ص��عة (‪ )Greedy Heuristic Solver‬ح� ًّ�ال للم�ص��كلة خط��وة خط��وة حت��ى‬ ‫تُظهر الدالة التالية املوعد النهائي ملُهِ مَّة حمدَّدة يف ن�صخة م�صكلة مُعطاة‪:‬‬
‫ح�صل��ت يف النهاي��ة عل��ى ح� ّل كام��ل ونهائ��ي‪ ،‬وعل��ى العك���ص م��ن ذل��ك تب��داأ طرائ��ق البحث املح ّلي��ة بح ّل كامل ق��د يكون ذا‬
‫ج��ودة متو�ص��طة اأو �ص��يئة‪ ،‬وتعم��ل بطريق��ة تكراري��ة لتح�ص��ني جودت��ه‪ .‬يف كل خط��وة يك��ون هن��اك تغي��ر ب�ص��يط عل��ى احل� ّل‬ ‫‪# returns the deadline of a given job‬‬
‫‪def deadline_heuristic(job,problem):‬‬
‫احل��ايل‪ ،‬وتُق َّي��م ج��ودة احل� ّل الن��اجت (ي�ص�مّى احل��ل املُج��اور)‪ ،‬واإذا كان يتمت��ع بجودة اأف�ص��ل‪ ،‬فاإن ُه ي�ص��تبدل احل ّل احلايل‬
‫وي�ص��تمر يف البح��ث ‪ ،‬واإذا مَل يك��ن كذل��ك‪ ،‬يت��م جُتاه��ل احل��ل املُج��اور وتتك��رر العملي��ة لتولي��د ح��ل جم��اور اآخ��ر‪ ،‬ث��م ينتهي‬ ‫‪# accesses the deadlines for this problem and returns the deadline for the job‬‬
‫]‪return problem['deadlines'][job‬‬
‫البح��ث عندم��ا يتع��ذر العث��ور عل��ى ح� ّل ُجم��اور اآخ��ر يتمت��ع بج��ودة اأف�ص��ل م��ن احل� ّل احل��ايل‪ ،‬ويت��م حتدي��د اأف�ص��ل ح� ّل مت‬
‫العثور عليه‪.‬‬
‫متري��ر دال��ة ‪ deadline_heuristic‬ك ُمعَامِ ��ل اإىل خوارزمي��ة احل� ّل اجل�ص��عة (‪ )greedy_solver‬يعني اأن اخلوارزمية‬
‫�ص�تُجدوِل (تف��رز) امله��ام وف��ق ترتي��ب ت�صاع��دي ح�ص��ب املوعد النهائ��ي‪ ،‬مما يعني اأن املهام التي له��ا اأقرب موعد نهائي‬
‫‪274‬‬ ‫‪273‬‬ ‫�صتُجَ دوَل ا ًأوال‪.‬‬
Local_search_solver)( Function ‫البحث املحلّي‬ ّ‫دالة خوارزمية حل‬
# computes the new tardiness after the swap
new_tardiness, new_finish_times = compute_schedule_tardiness(problem, ‫ خوارزمي��ة ح� ّل البح��ث املح ّل��ي القائ��م عل��ى املبُادل��ة ملِ �ص��كلة التباطُ �وؤ‬local_search_solver)( ‫تطب��ق الدال��ة التالي��ة‬
new_schedule) :‫عامالت وهي‬ ِ ‫ حيث تَقبل هذه الدالة اأربعة ُم‬،)SMWT( ‫املوز�ن لالآلة الواحدة‬
# if the new schedule is better than the best one so far .‫• ن�صخة امل�صكلة‬
if new_tardiness < best_tardiness:
.‫ حل�صاب ح ّل اأوّيل‬greedy_solver( ) ‫• خوارزمية ا�صتداللية ج�صعة ت�صتخدمها دالة‬
‫جران احل ّل يف هذا املثال كلها‬ ‫ اإذا كان‬،‫ عل��ى �ص��بيل املث��ال‬.‫ امل�ص��تخدَ مة النتق��اء مُهِ َّمت��ني �ص��تتبادالن موقعيهم��ا يف اجل��دول‬swap_selector ‫• دال��ة‬
# the new_schedule becomes the best one ‫حلول يتم احل�صول عليها عن‬ ‫ اأن يح��دث مبادل��ة‬swap_selector ‫ وق�رَّرت دال��ة‬،]0، 2، 3، 1[ ‫احل� ّل احل��ايل للم�ص��كلة املُك َّون��ة م��ن اأرب��ع مه��ام ه��و‬
best_schedule = new_schedule ‫طريق انتقاء ُم ِهمَّتني داخل‬
best_tardiness = new_tardiness .]1، 2، 3، 0[ ‫ �صيكون احل ّل املر�صَّ ح هو‬،‫بني املُهِ َّمة االأوىل واملُهِ َّمة االأخرة‬
best_finish_times = new_finish_times
‫احل ّل �مبادلة موقعيهما يف‬
.‫اجلد�ل‬ ‫ ع��دد �صحي��ح ُيح� ِّ�دد ع��دد املب��ادالت التي يجب جُتربتها قب��ل اأن تتو�صل اخلوارزمية للح ّل االأف�صل‬max_iterations •
# returns the best solution .‫يف حينه‬
return {'schedule':best_schedule,
'tardiness':best_tardiness, ‫�صلوك خوارزميات التح�صني القائمة‬ ‫جدوال‬
ً ‫�ئ‬� ‫ص‬ �‫ُن‬
‫ت‬ ‫�م‬
� ‫ث‬ ،‫�ا‬
� ‫م‬‫بينه‬ ‫�ل‬
� ‫ي‬ ‫للتبد‬ ‫�ني‬
� ‫ت‬ ‫م‬
َّ ِ‫ُه‬
‫م‬ ‫�ة‬
� ‫ي‬ ‫اخلوارزم‬ ‫�ي‬
� ‫ق‬ ‫تنت‬ ،‫�رار‬�‫يف كل تك‬
'finish_times':best_finish_times} ‫على البحث املحلي يتاأثر ب�صكل كبر‬ ‫ وكل �ص��يء يف اجل��دول اجلدي��د بخ��الف ذلك‬،‫جدي��دً ا تت��م في��ه ه��ذه املبادل��ة‬
‫باآل�صراتيجية امل�صتخدَمة بطريقة‬ ‫ اإذا كان للج��دول اجلدي��د تباط�وؤ م��وزون‬.‫�ص��يكون ُمطاب ًق��ا للج��دول االأ�صل��ي‬
.ّ‫تكرارية لتعديل احلل‬ ‫ فاإن اجل��دول اجلديد‬،‫اأق��ل م��ن اجل��دول االأف�ص��ل ال��ذي مت اإيج��اده حت��ى االآن‬
:‫تُطبِّق الدالة التالية مبادلة ع�صوائية بانتقاء مُهِ مَّتني ع�صوائيتني يف اجلدول املُعطى الذي ي�صتوجب تبديل مكانيهما‬ ‫ خوارزمي��ة احل� ّل ه��ذه له��ا نف���ص ُخُم َرج��ات‬.‫�دال من��ه‬ ً �‫ُي�صب��ح ه��و االأف�ص��ل ب‬
.‫خوارزمية احل ّل اجل�صعة وخوارزمية ح ّل القوة املُفرطة‬
def random_swap(schedule):

job_num = len(schedule) # gets the number of scheduled jobs def local_search_solver(problem, greedy_heuristic, swap_selector, max_
iterations):
pos1 = random.randint(0, job_num - 1) # samples a random position
# gets the information for this problem
pos2 = pos1 durations, weights, deadlines=problem['durations'], problem['weights'],
problem['deadlines']
while pos2 == pos1: # keeps sampling until it finds a position other than pos1
pos2 = random.randint(0, job_num - 1) # samples another random position
job_num = len(durations) # gets the number of jobs
return pos1, pos2 # returns the two positions that should be swapped
# uses the greedy solver to get a first schedule
# this schedule will be then iteratively refined through local search
ِ �‫ت�ص‬ greedy_sol = greedy_solver(problem, greedy_heuristic) # the best schedule so far
‫�تخدم الدال��ة التالي��ة ا�ص��رتاتيجية ُخُمتلف��ة وذل��ك باختياره��ا الدائ��م مل ُِه َّمت��ني ع�ص��وائيتني متجاورت��ني يف اجل��دول‬
‫ ف�اإن‬،]0، 3، 1، 2[ ‫ اإذا كان اجل��دول احل��ايل لن�ص��خة م�ص��كلة ُمك َّون��ة م��ن اأرب��ع مه��ام ه��و‬،‫ عل��ى �ص��بيل املث��ال‬.‫لتبادلهم��ا‬ best_schedule, best_tardiness, best_finish_times = greedy_sol['schedule'],
.2><1‫ و‬1><3‫ و‬3><0 ‫املبادالت املُر�صحة �صتكون فقط‬ greedy_sol['tardiness'], greedy_sol['finish_times']

# local search
def adjacent_swap(schedule): for i in range(max_iterations): # for each of the given iterations

job_num = len(schedule) # gets the number of scheduled jobs # chooses which two positions to swap
pos1, pos2 = swap_selector(best_schedule)
pos1 = random.randint(0, job_num - 2) # samples a random position (excluding the last
one) new_schedule = best_schedule.copy() # create a copy of the schedule
pos2 = pos1 + 1 # gets the position after the sampled one
# swaps jobs at positions pos1 and pos2
return pos1,pos2 # returns the two positions that should be swapped new_schedule[pos1], new_schedule[pos2] = best_schedule[pos2],
best_schedule[pos1]

276 275
Compare)( Function ‫دالة املقارنة‬ ِ �‫ي�ص‬
‫�تخدم املقطع الربجمي التايل ا�ص��رتاتيجيتي املبادلة مع خوارزمية ح ّل البحث املحلّي حل ّل امل�ص��كلة التي مت اإن�ص��اوؤها‬
‫ ثم تُظهر‬،‫ كل خوارزمي��ات احل�لّ؛ حل� ّل كل امل�ص��كالت يف جمموع��ة بيان��ات معيّنة‬Compare)( ‫ت�ص��تخدِ م الدال��ة التالي��ة‬ :‫يف بداية هذا الدر�ص‬
‫ وتَقبل الدال��ة كذلك املُعامِ ل‬،‫متو�ص��ط التباطُ �وؤ ال��ذي حتقق��ه كل خوارزمي��ة ح� ّل عل��ى كل امل�ص��كالت يف جمموعة البيان��ات‬
print(local_search_solver(sample_problem, weighted_deadline_heuristic, random_
:‫ لتحديد اإمكانية ا�صتخدام خوارزمية احل ّل بالقوة املُفرطة اأم ال‬use_brute ‫املنطقي‬ swap, 1000))

print(local_search_solver(sample_problem, weighted_deadline_heuristic,
from collections import defaultdict adjacent_swap, 1000))
import numpy

def compare(problems,use_brute): {'schedule': [3, 4, 2, 1, 0], 'tardiness': 83, 'finish_times': [15, 21, 30,
# comparison on Dataset 1 41, 57]}
# maps each solver to a list of all tardiness values it achieves for the problems in the given dataset {'schedule': [3, 4, 2, 1, 0], 'tardiness': 83, 'finish_times': [15, 21, 30,
results = defaultdict(list) 41, 57]}
for problem in problems: # for each problem in this datset

#uses each of the solvers on this problem ‫ واأزمن��ة اإكم��ال امله��ام (�ص��تنتهي‬،83 ‫ واإجم��ايل التباطُ �وؤ‬،‫] له��ذا املث��ال‬3 ،4 ،2 ،1 ،0[ ‫تُظه��ر النتائ��ج اأف�ص��ل ج��دول‬
if use_brute == True: .)‫ وهكذا‬،‫ منه‬21 ‫ يف الوحدة‬4 ‫ وتنتهي املُهِ َّمة‬،‫ من الزمن‬15 ‫ يف الوحدة‬3 ‫املُهِ َّمة‬
results['brute-force'].append(brute_force_solver(problem)
['tardiness']) Comparing Solvers ّ‫مقارنة خوارزميات احلل‬
results['greedy-deadline'].append(greedy_solver(problem,deadline_
heuristic)['tardiness']) :‫ لتوليد جمموعتي بيانات‬create_problem_instance)( ‫ي�صتخدم املقطع الربجمي التايل الدالة‬ ِ
results['greedy-weighted_deadline'].append(greedy_
solver(problem,weighted_deadline_heuristic)['tardiness']) .‫ مهام‬7 ‫ ويف كل منها‬،‫ ن�صخة مل�صكلة التباطُ وؤ املوزون لالآلة الواحدة‬100 ‫• جمموعة بيانات من‬
results['ls-random-wdeadline'].append(local_search_solver(problem, .‫ مُهِ مَّة‬30 ‫ ويف كل منها‬،‫ ن�صخة مل�صكلة التباطُ وؤ املوزون لالآلة الواحدة‬100 ‫• جمموعة بيانات من‬
weighted_deadline_heuristic, random_swap, 1000)['tardiness'])
results['ls-random-deadline'].append(local_search_solver(problem, :‫املو�صحة يف هذا الدر�ص‬ َّ ‫�صيتم ا�صتخدام جمموعة البيانات االأوىل ملقارنة اأداء جميع خوارزميات احل ّل‬
deadline_heuristic, random_swap, 1000)['tardiness']) . ‫ خوارزمية ح ّل القوة املُفرطة‬.1
results['ls-adjacent-wdeadline'].append(local_search_solver(problem,
weighted_deadline_heuristic, adjacent_swap, 1000)['tardiness']) .‫ خوارزمية احل ّل اجل�صعة املُت�صمنة على ا�صتدالل خا�ص باملوعد النهائي‬.2
results['ls-adjacent-deadline'].append(local_search_solver(problem,
deadline_heuristic, adjacent_swap, 1000)['tardiness'])
.‫ خوارزمية احل ّل اجل�صعة املُت�صمنة على ا�صتدالل خا�ص باملوعد النهائي املوزون‬.3
‫ خوارزمية ح ّل البحث املحلّي املُت�صمنة على مبادالت ع�صوائية وخوارزمية احل ّل اجل�صعة ذات ا�صتدالل خا�ص باملوعد‬.4
for solver in results: # for each solver .‫النهائي الإيجاد احل ّل االأوّيل‬
# prints the solver's mean tardiness values
print(solver,numpy.mean(results[solver])) ‫ خوارزمية ح ّل البحث املحلّي املُت�صمنة على مبادالت ع�صوائية وخوارزمية احل ّل اجل�صعة ذات ا�صتدالل خا�ص باملوعد‬.5
.‫النهائي املوزون‬
:‫ كلتيهما‬problems_30 ‫ و‬problems_7 ‫ مع جمموعتي البيانات‬compare)( ‫ُميكن االآن ا�صتخدام دالة‬ ‫ خوارزمية ح ّل البحث املحلّي املُت�صمنة على مبادالت متجاورة وخوارزمية احل ّل اجل�صعة ذات ا�صتدالل خا�ص باملوعد‬.6
.‫النهائي‬
compare(problems_7,True) brute-force 211.49 ‫خوارزمية ح ّل البحث املحلّي املُت�صمنة على مبادالت متجاورة وخوارزمية احل ّل اجل�صعة ذات ا�صتدالل خا�ص باملوعد‬.7
greedy-deadline 308.14 .‫النهائي املوزون‬
greedy-weighted_deadline 255.61
ls-random-wdeadline 212.35 ‫�صيتم ا�صتخدام جمموعة البيانات الثانية ملقارنة جميع خوارزميات احل ّل با�صتثناء خوارزمية ح ّل القوة املُفرطة البطيئة‬
ls-random-deadline 212.43 .‫ مُهِ َّمة‬30 ‫جدً ا بالن�صبة للم�صكالت امل�صتملة على‬
ls-adjacent-wdeadline 220.62
ls-adjacent-deadline 224.36
#Dataset 1
problems_7 = []
for i in range(100):
compare(problems_30,False) greedy-deadline 10126.18 problems_7.append(create_problem_instance(7, [5, 20], [5, 50], [1, 3]))
greedy-weighted_deadline 8527.61
ls-random-wdeadline 6647.73 #Dataset 2
ls-random-deadline 6650.99 problems_30 = []
ls-adjacent-wdeadline 6666.47 for i in range(100):
ls-adjacent-deadline 6664.67 problems_30.append(create_problem_instance(30, [5,20], [5, 50], [1, 3]))

278 277
‫ م��ن خ��الل اإكم��ال املقط��ع الربجم��ي‬،‫ اأن�ص� خوارزمي��ة ح� ّل بالق��وة امل ُفرط��ة مل�ص��كلة التباط�وؤ امل��وز�ن لالآل��ة الواح��دة‬3
‫مترينات‬
.‫التايل بحيث ت�صتخدم الدال ُة القو َة امل ُفرطة آلإيجاد تبديل اجلد�لة اآلأمثل‬
‫ اإل ) آلأ�ص��لوب البحث املحلي ِحل ّل م�ص��كلة التباطوؤ املوز�ن‬،‫ حتويل‬،‫ انعكا���ش‬،‫ ِ�صف ا�ص��راتيجيتني ُخُمتلفتني (مبادلة‬1
def brute_force_solver(problem): .‫لالآلة الواحدة‬
# gets the information for this problem
durations, weights, deadlines=problem['durations'], problem['weights'],
problem['deadlines']

job_num = len( ) # number of jobs


# generates all possible schedules

all_schedules = itertools. (range(job_num))


# initializes the best solution and its total weighted tardiness

best_schedule = # initialized to None


# 'inf' stands for 'infnity'. Python will evaluate all numbers as smaller than this value.

best_tardiness = float(' ')


# stores the finish time of each job in the best schedule
‫ كم عدد اجلدا�ل امل ُمكنة (احللول) لن�صخة م�صكلة التباطوؤ املوز�ن لالآلة الواحدة �التي ت�صتمل على ت�صع مهام؟‬2
best_finish_times= # initalized to None

for schedule in all_schedules: # for every possible schedule


#evalute the schedule
tardiness,finish_times=compute_schedule_tardiness(problem, schedule)
if tardiness<best_tardiness: # this schedule is better than the best so far

best_tardiness=

best_schedule=

best_finish_times=

# return the results as a dictionary


return {'schedule':best_schedule,
'tardiness':best_tardiness,
'finish_times':best_finish_times}

280 279
.‫ ِ�صف طريقة عمل البحث املحلّي‬5 ‫ من خالل اإكمال املقطع الربجمي التايل‬،‫ اأن�ص خوارزمية ح ّل البحث املحلّي مل�صكلة التباطوؤ املوز�ن لالآلة الواحدة‬4
.‫بحيث ت�صتخدم الدال ُة البحث املحلّي آلإيجاد تبديل اجلد�لة اآلأمثل‬
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


‫ اكت��ب مالحظات��ك ع��ن نتائ��ج خوارزمي��ات احل� ّل اجل�ص��عة مقارن��ة بخوارزمي��ات ح� ّل البح��ث املح ّل��ي يف م�ص��كلة ت�ص��تمل‬6 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}

282 281
‫تت�م �صياغ�ة الدال�ة املو�صوعي�ة كتعب�ر ريا�ص�ي (‪ )Mathematical Expression‬لتح�ص�ينها (بزيادته�ا اأو تقليله�ا) بن�ا ًء عل�ى‬
‫املتغرات املنا�صبة‪ُ ،‬ومتثِّل هذه الدالة الهدف من م�صكلة التح�صني مثل‪ :‬زيادة الربح اأو تقليل التكاليف‪ُ ،‬وحت َّدد يف العادة بنا ًء على‬ ‫الدر�ص الثالث‬
‫ِّ‬
‫املتغرات واملتباينات الريا�صية‪.‬‬‫متغرات احلالة‪ ،‬وباملثل ُميكن �صياغة القيود با�صتخدام ِّ‬ ‫متغرات القرار‪ ،‬كما ُحت َّدد اأحيانًا بنا ًء على ِّ‬
‫ِّ‬ ‫م�سكلة حت�س امل�سار‬
‫توج��د ع��دة أان��واع م��ن الربجم��ة الريا�صي��ة‪ ،‬مث��ل‪ :‬الربجم��ة اخلطي��ة (‪ ،)Linear Programming - LP‬والربجم��ة الرباعي��ة‬
‫(‪ )Quadratic Programming - QP‬وبرجم��ة ا أآلع��داد ال�صحيح��ة املختلط��ة (‪.)Mixed Integer Programming - MIP‬‬
‫متغرات القرار باالأعداد‬ ‫يركِّز هذا الدر���ص على برجمة االأعداد ال�صحيحة املختلطة املُ�ص��تخدَ مة يف امل�ص��كالت التي تتقيّد فيها ِّ‬
‫ال�صحيحة مثل‪ :‬م�صكالت اجلدولة اأو اختيار الطريق‪.‬‬ ‫ة الريا سية يف م�سكالت التح�س‬ ‫ال‬
‫م�سكلة حقيبة ال هر ‪The Knapsack Problem‬‬ ‫‪Mathematical Programming in Optimization Problems‬‬
‫م�ص��كلة حقيب��ة الظه��ر ‪ 1/0‬ه��ي مث��ال ب�ص��يط عل��ى ا�ص��تخدام برجم��ة ا أالع��داد ال�صحيح��ة املختلط��ة ل�صياغ��ة الدال��ة املو�صوعية‬ ‫يف الدر�ص��ني ال�ص��ابقني مت تو�صي��ح كيفي��ة ا�ص��تخدام اخلوارزمي��ات‬
‫ة الريا سية‬ ‫ال‬ ‫اال�ص��تداللية حل� ّل اأن��واع ُخُمتلف��ة من م�ص��كالت التح�ص��ني‪ ،‬وبالرغم من اأن‬
‫والقي��ود‪ ،‬و ُتع� َّرف امل�ص��كلة عل��ى النح��و الت��ايل‪ :‬لدي��ك حقيب��ة ظهر ب�ص��عة ق�صوى تبلغ ‪ C‬وح��دة‪ ،‬وجمموعة م��ن العنا�صر ‪ ،I‬بحيث‬ ‫(‪:)Mathematical Programming‬‬
‫يك��ون ل��كل عن�ص��ر ‪ i‬متغ� ِّ�ران م��ن متغ� ِّ�رات احلال��ة هم��ا وزن العن�ص��ر ‪ wi‬وقيمت��ه ‪ ،vi‬واملطل��وب ه��و تعبئ��ة احلقيب��ة مبجموع��ة‬ ‫حلوال جيدة‪،‬‬‫اال�ص��تدالالت باإمكانها اأن تكون �ص��ريعة جدً ا وتُنتج يف العادة ً‬
‫متغر الق��رار ‪ xi‬لتتبع جُتميعات العنا�صر التي �ص�تُع َّب أا يف‬ ‫هي تقنية تُ�ص��تخدم حل ّل م�ص��كالت التح�صني‬ ‫اإال اأنه��ا ال ت�صم��ن دائم��ا اإيج��اد احل� ّل االأمث��ل‪ ،‬وق��د ال تك��ون منا�ص��بة ل��كل‬
‫العنا�ص��ر ذات اأق�ص��ى قيم��ة ممكن��ة يف ح��دود �ص��عة احلقيب��ة‪ُ .‬ي�ص��تخدم ِّ‬ ‫اأن��واع امل�ص��كالت‪ ،‬ويف ه��ذا الدر���ص �ص� ُ�رتكِّز عل��ى اأ�ص��لوب حت�ص��ني ُخُمتل��ف‬
‫حقيب��ة الظه��ر‪ ،‬حي��ث تك��ون ‪ xi = 1‬اإذا مت اختي��ار العن�ص��ر ‪ i‬لالإ�صاف��ة للحقيب��ة‪ ،‬بينم��ا تك��ون ‪ xi = 0‬خ��الف ذل��ك‪ ،‬ويتم ّث��ل‬ ‫ع��ن طري��ق �صياغته��ا عل��ى هيئ��ة من��اذج‬
‫الهدف يف انتقاء جمموعة فرعية من العنا�صر من ‪ I‬بحيث ت�صمل‪:‬‬ ‫ريا�صية‪.‬‬ ‫وهو الربجمة الريا�صية (‪.)Mathematical Programming‬‬
‫• القيد (‪ :)Constraint‬جمموع اأوزان العنا�صر املنتقاة بها ال يزيد عن ال�صعة الق�صوى ‪.C‬‬ ‫ُميك��ن للربجم��ة الريا�صي��ة اأن حت� ّل العدي��د م��ن م�ص��كالت التح�ص��ني مث��ل‪:‬‬
‫تخ�صي���ص امل��وارد‪ ،‬وتخطي��ط االإنت��اج‪ ،‬واخلدم��ات اللوج�ص��تية واجلدول��ة‪ ،‬وتتمي��ز ه��ذه التقني��ة باأنه��ا تُو ّف��ر ح� ًّ�ال مثال ًي��ا م�صمو ًن��ا‬
‫• الدالة املو�صوعية (‪ :)Objective Function‬جمموع قيم العنا�صر املنتقاة بها هي اأق�صى قيمة ُممكنة‪.‬‬ ‫ُوميكنها التعامل مع امل�صكالت املعقدة ذات القيود املتعددة‪.‬‬
‫املتغرات‪ ،‬حيث ُمتثِّل هذه‬ ‫يبداأ ح ّل الربجمة الريا�صية ب�صياغة م�صكلة التح�صني املُعطاة على �صكل منوذج ريا�صي با�صتخدام ِّ‬
‫‪v0=20‬‬ ‫املتغرات القيم التي يجب حت�صينها‪ ،‬ثم يتم ا�صتخدامها لتحديد الدالة املو�صوعية والقيود‪ ،‬وهما ي�صفان امل�صكلة معًا ُوميكِّنان‬ ‫ِّ‬
‫‪w0=5‬‬ ‫‪w3=8‬‬ ‫‪v3=15‬‬
‫من ا�صتخدام خوارزميات الربجمة الريا�صية‪.‬‬
‫�تخدم الربجم��ة الريا�صي��ة متغ� ِّ�رات الق��رار (‪ )Decision Variables‬الت��ي ت�ص��اعد ُمت َِّخ��ذ الق��رار يف اإيج��اد احلل املنا�ص��ب‬ ‫ت�ص� ِ‬
‫‪v1=10‬‬ ‫�تخدم متغ� ِّ�رات احلال��ة (‪ )State Variables‬الت��ي ال يتحك��م فيه��ا‬ ‫ع��ن طري��ق �صبطه��ا والتحك��م فيه��ا‪ ،‬كم��ا ميكنه��ا اأن ت�ص� ِ‬
‫‪w1=10‬‬ ‫‪v4=7‬‬
‫‪w4=11‬‬ ‫متغرات‬ ‫ُم َّت ِخ��ذ الق��رار وتفر�صه��ا البيئ��ة اخلارجي��ة‪ ،‬وبالت��ايل ال ميك��ن �صب��ط متغ� ِّ�رات احلالة‪ .‬تُو ِّف��ر القوائم التالية اأمثل��ة على ِّ‬
‫ومتغرات احلالة لبع�ص م�صكالت التح�صني ال�صائعة‪:‬‬ ‫القرار ِّ‬
‫‪v2=23‬‬
‫‪w2=19‬‬ ‫=‪w5=2 v5‬‬
‫‪7‬‬ ‫ومتغريات احلالة‬‫ِّ‬ ‫جدول  ‪ : .2‬اأمثلة على ِّ‬
‫متغريات القرار‬
‫�صكل ‪ :5.6‬م�صكلة حقيبة الظهر‬
‫متغرات احلالة‬‫ِّ‬ ‫متغرات القرار‬
‫ِّ‬
‫يو�ص��ح ال�ص��كل ‪ 5.6‬مث� ً�اال عل��ى م�ص�األة حقيب��ة ظه��ر مُك َّون��ة م��ن �ص��تة عنا�ص��ر ب�اأوزان و ِقي��م حم�دَّدة‪ ،‬وحقيب��ة ظه��ر ب�ص��عة‬
‫ِّ‬ ‫تخطيط اآلإنتاج الكمي��ة الت��ي يج��ب اإنتاجه��ا م��ن كل تَو ّف��ر امل��واد اخل��ام‪ ،‬و�ص��عة اآالت االإنت��اج‪ ،‬وتَو ّف��ر‬
‫ق�ص��وى ت�ص��اوي اأربع��ني وح��دة‪ .‬يق��وم املقط��ع الربجم��ي الت��ايل بتثبي��ت مكتب��ة البايث��ون املفتوح��ة امل�ص��در ‪ mip‬اخلا�ص��ة‬ ‫العمالة املطلوبة لالإنتاج‪.‬‬ ‫مُنتَج‪.‬‬
‫بربجمة االأعداد ال�صحيحة املختلطة حل ّل ن�صخة م�صكلة حقيبة الظهر ‪ ،1/0‬وي�صتورد الوحدات ال�صرورية‪:‬‬ ‫ع��دد ال�ص��لع الت��ي يج��ب نقله��ا م��ن امل�ص��افة ب��ني االأماك��ن الت��ي يج��ب زيارته��ا و�ص��عة‬
‫املركبات‪.‬‬ ‫مكان الآخر‪.‬‬ ‫نقل املوارد‬
‫‪!pip install mip # install the mip library‬‬
‫ترتي��ب كل ُمهِ َّم��ة وامل��دة الزمني��ة تَو ّف��ر الع ّم��ال واالآالت‪ ،‬واملواعي��د النهائي��ة‪ ،‬ووزن‬
‫اأهمية كل ُمهِ َّمة‪.‬‬ ‫الالزمة الإجرائها‪.‬‬ ‫جد�لة املهام‬
‫‪# imports useful tools from the mip library‬‬
‫‪from mip import Model, xsum, maximize, BINARY‬‬
‫‪values = [20, 10, 23, 15, 7, 7] # values of available items‬‬ ‫تكلي��ف الع ّم��ال وجدولته��م للقي��ام مه ��ارات كل عا م ��ل وتف�صيال ت ��ه‪ ،‬وجاهز ّيت ��ه‪،‬‬ ‫توزيع املو فني‬
‫‪weights = [5, 10, 19, 8, 11, 2] # weights of available items‬‬ ‫مبهام ُخُمتلفة يف اأوقات ُخُمتلفة‪ .‬وامله��ارات املطلوب��ة من��ه الإجناز كل ُمهِ َّمة‪.‬‬ ‫ح�صب املهام‬
‫‪284‬‬ ‫‪283‬‬
‫‪for i in I: # for each item‬‬
‫‪if x[i].x == 1: # if the item was selected‬‬ ‫‪C = 40 # knapsack capacity‬‬
‫)'‪print('item', i, 'was selected‬‬
‫‪# updates the total weight and value of the solution‬‬ ‫‪I = range(len(values)) # creates an index for each item: 0,1,2,3,...‬‬
‫]‪total_weight += weights[i‬‬
‫]‪total_value += values[i‬‬ ‫‪solver = Model("knapsack") # creates a knapsack solver‬‬
‫‪solver.verbose = 0 # setting this to 1 will print more information on the progress of the solver‬‬
‫)‪print('total weight', total_weight‬‬
‫)‪print('total value', total_value‬‬ ‫‪x = [] # represents the binary decision variables for each item.‬‬

‫‪# for each items creates and appends a binary decision variable‬‬
‫‪item 0 was selected‬‬ ‫‪for i in I:‬‬
‫‪item 2 was selected‬‬ ‫))‪x.append(solver.add_var(var_type = BINARY‬‬
‫‪item 3 was selected‬‬
‫‪item 5 was selected‬‬ ‫‪# creates the objective function‬‬
‫‪total weight 34‬‬ ‫))‪solver.objective = maximize(xsum(values[i] * x[i] for i in I‬‬
‫‪total value 65‬‬
‫‪# adds the capacity constraint to the solver‬‬
‫‪solver += xsum(weights[i] * x[i] for i in I) <= C‬‬
‫م�سكلة البائع املُتجوّل‬
‫‪# solves the problem‬‬
‫‪Traveling Salesman Problem‬‬ ‫)(‪solver.optimize‬‬
‫م�صكلة البائع امل ُتجوّل (‪ )Traveling Salesman Problem - TSP‬من امل�صكالت‬
‫اآلأمثلة الواردة يف خُمطط م�صكلة البائع‬ ‫االأخرى التي ُميكن حلّها بربجمة االأعداد ال�صحيحة املختلطة‪ ،‬وهي م�ص�كلة ماألوفة‬
‫ات�صاآل تاما فهناك‬
‫امل ُتجوّل مت�صلة ً‬ ‫>‪<OptimizationStatus.OPTIMAL: 0‬‬
‫حافة ت�صل كل ز�ج من العُقد باآلآخر‪.‬‬
‫تُعنى بتحديد اأق�صر م�صار ميكن اأن ي�صلكه بائع متجوِّل لزيارة مدنٍ معيّنة مرة واحدة‪،‬‬
‫دون اأن يك� ّرر زي�ارة اأيٍّ منه�ا‪ ،‬ث ّ�م يع�و َد للمدين�ة االأ�صلي�ة‪ ،‬وي�ص ِّور ال�ص�كل ‪ 5.7‬ن�ص�خ ًة‬
‫من هذه امل�صكلة‪.‬‬ ‫متغرات القرار الثنائية للعنا�صر‪ ،‬وتُوفِّر املكتبة ‪ mip‬يف البايثون ما يلي‪:‬‬ ‫يُن�صئ املقطع الربجمي القائمة ‪ x‬لتخزين ِّ‬
‫‪1‬‬ ‫ُمتثِّل كل دائرة (عقدة) مدينة اأو موقعًا يجب زيارته‪ ،‬وهناك حافة تربط بني موقعني‬ ‫املتغرات الثنائية واإ�صافتها اإىل خوارزمية احللّ‪.‬‬ ‫• اأداة (‪ add_var)var_type=BINARY‬الإن�صاء ِّ‬
‫اإذا كان من املمكن ال�صفر بينهما‪ُ ،‬وميثِّل الرقم املوجود على احلافة التكلفة (امل�صافة)‬ ‫• اأداة ()‪ maximize‬مل�ص��كالت التح�ص��ني الت��ي حتت��اج لزي��ادة دال��ة مو�صوعي��ة‪ ،‬أام��ا م�ص��كالت التح�ص��ني الت��ي تتطل��ب‬
‫‪20‬‬
‫بني املوقعني‪ .‬يف هذا املثال‪ ،‬مت ترقيم املواقع وفقًا لرتتيبها يف احل ّل االأمثل للم�صكلة‪،‬‬ ‫ت�صغر الدالة املو�صوعية‪ ،‬فت�صتخدم االأداة ()‪.minimize‬‬
‫‪10‬‬ ‫‪15‬‬
‫‪4‬‬
‫وتكونالتكلفةاالإجماليةللطريق ‪ 1 3 4 2 1‬ت�صاوي‪،10 25 30 15=80‬‬ ‫• اأداة ()‪ xsum‬الإن�ص��اء التعب��رات الريا�صي��ة الت��ي تت�صم��ن املجامي��ع(‪ ،)sums‬ويف املث��ال ال�ص��ابق مت ا�ص��تخدام ه��ذه‬
‫‪25‬‬ ‫‪30‬‬
‫وهو اأق�صر طريق ممكن لزيارة كل مدينة مرة واحدة فقط والعودة اإىل نقطة البداية‪.‬‬ ‫ال�صعة وحلّه‪.‬‬
‫االأداة حل�صاب جمموع الوزن االإجمايل للعنا�صر يف اإن�صاء قيد ّ‬
‫توجد تطبيقات عملية مل�صكلة البائع املُتجوّل يف اخلدمات اللوج�صتية‪ ،‬والنقل‪ ،‬واإدارة‬ ‫• اأداة ()‪ optimize‬الإيج��اد ح� ّل ِّ‬
‫يح�ص��ن الدال��ة املو�صوعي��ة يف ظ��ل االلت��زام بالقيود‪ ،‬وتَ�ص��تخدم االأداة برجم َة االأعداد‬
‫‪2‬‬ ‫‪35‬‬ ‫‪3‬‬
‫ا إالم�دادات واالت�ص�االت‪ ،‬فه�ي تنتم�ي اإىل عائل�ة اأو�ص�ع م�ن م�ص�كالت حتديد الطريق‬ ‫ملتغرات القرار والإيجاد التوليفة التي ُحت ِّ�صن الهدف‪.‬‬ ‫ال�صحيحة املختلطة للنظر بكفاءة يف توليفات القيم املُختلفة ِّ‬
‫�صكل ‪ :5.7‬ن�صخة على م�صكلة البائع املُتجوّل‬ ‫أي�صا م�صكالت �صهرة اأخرى مو�صحة فيما يلي‪:‬‬ ‫التي ت�صمل ا ً‬ ‫• املُعامِ ل = الإ�صافة قيود اإ�صافية اإىل خوارزمية احل ّل املوجودة‪.‬‬
‫• تت�صم��ن م�ص��كلة حتدي��د م�ص��ار املركب��ات (‪ )Vehicle Routing Problem‬اإيج��اد الطُ ��رق املُثل��ى الأ�ص��طول م��ن املركب��ات‬ ‫يف املقط��ع الربجم��ي اأدن��اه حتت��وي القائم��ة ‪ x‬عل��ى متغ� ِّ�ر ثنائ��ي واح��د ل��كل عن�صر‪ ،‬وبعد ح�ص��اب احل ّل �ص��يكون كل ِّ‬
‫متغر‬
‫لتو�صي��ل ال�ص��لع اأو اخلدم��ات ملجموع��ة م��ن العم��الء يف ظ��ل تقلي��ل امل�ص��افة االإجمالي��ة املقطوع��ة اإىل احل��د االأدن��ى‪ ،‬وت�ص��مل‬ ‫م�ص��اويًا للواح��د اإذا اأُدرج العن�ص��ر يف احل� ّل‪ ،‬و�ص ُي�ص��اوي �صف� ًرا بخ��الف ذل��ك‪ .‬تَ�ص��تخدم املكتب��ة ‪ِ mip‬بن��اء اجلمل��ة‬
‫تطبيقاتها اخلدمات اللوج�صتية وخدمات التو�صيل وجمع النفايات‪.‬‬ ‫‪ x]i[.x‬الإظه��ار القيم��ة الثنائي��ة للعن�ص��ر ذي الفهر���ص ‪َ ،i‬وحت�ص��ب خوارزمي��ة احل � ّل متغ� ِّ�ر الق��رار ‪ ،x‬ث��م جُت��د القيم��ة‬
‫• تت�صم��ن م�ص��كلة اآل�ص��تالم �الت�ص��ليم (‪ )Pickup and Delivery Problem‬اإيج��اد الطُ ��رق املُثل��ى للمركب��ات لك��ي ت�ص��تلم‬ ‫متغر القرار ‪َ ،x‬وجُتمع االأوزان والقيم لكل عن�صر‬ ‫االإجمالية والوزن االإجمايل للعنا�صر املنتقاة عن طريق التكرار على ِّ‬
‫ُو�صل) الب�صائع اأو االأ�ص��خا�ص اإىل مواقع ُخُمتلفة‪ ،‬وت�ص��مل تطبيقاتها خدمات �ص��يارات االأجرة‪،‬‬ ‫(حتمِّل اأو ُتر ِْكب) وت�ص�لِّم (ت ِ‬ ‫ُ‬ ‫مو�صح يف املقطع الربجمي التايل‪:‬‬ ‫منتقى ‪ ،i‬ا�صتنادًا اإىل [‪ ،x]i‬وتَعر�صها كما هو َّ‬
‫واخلدمات الطبية الطارئة‪ ،‬وخدمات النقل اجلماعي‪.‬‬
‫• تت�صم��ن م�ص��كلة جد�ل��ة مواعي��د القط��ارات (‪ )Train Timetabling Problem‬اإيج��اد ج��داول زمني��ة مثالي��ة للقط��ارات‬ ‫‪total_weight = 0 # stores the total weight of the items in the solution‬‬
‫يف �ص��بكة �ص��كك احلديد يف ظل تقليل ن�ص��بة التاأخر اإىل احلد االأدنى و�صمان اال�ص��تخدام الف ّعال للموارد‪ ،‬وت�ص��مل تطبيقاتها‬ ‫‪total_value = 0 # stores the total value of the items in the solution‬‬

‫النقل بال�صكك احلديدية واجلدولة‪.‬‬


‫‪286‬‬ ‫‪285‬‬
‫اإن�ساء خوارزمية حلّ القوة املُفرطة مل�سكلة البائع املُتجوّل‬ ‫ وتَقب��ل الدال��ة ع��دد املواق��ع امل��راد‬،‫ُميك��ن ا�ص��تخدام املقط��ع الربجم��ي الت��ايل الإن�ص��اء ن�ص��خة م��ن م�ص��كلة البائ��ع املُتج�وّل‬
Creating a Brute-Force Solver for the Traveling Salesman Problem :‫ ثم تُظهر‬،‫ ونطاق امل�صافة ُميثِّل الفرق بني امل�صافة االأق�صر وامل�صافة االأطول بني موقعني‬،‫زيارتها‬
‫ وتَقبل هذه الدالة‬،‫ت�صتخدِ م الدالة التالية خوارزمية ح ّل القوة املُفرطة لتعداد جميع الطُ رق املُمكنة (التباديل) واإظهار اأق�صر م�صار‬ .‫• م�صفوفة امل�صافة التي ت�صمل امل�صافة املُ�صندة بني كل زوج ممكن من املواقع‬
‫ الحظ اأن احلل املمكن لن�صخة‬.create_problem_instance)( ‫م�صفوفة امل�صافة وموقع االنطالق والتوقف الذي ُتظهره الدالة‬ .)‫• جمموعة عناوين املواقع العددية (عنوان لكل موقع‬
.‫ (االنطالق والتوقف) ثم ينتهي اإليها‬startstop ‫ يبداأ من مدينة‬،‫) هي تبديل مدن‬TSP(‫م�صكلة البائع امل ُتجوّل‬ .)‫ (االنطالق والتوقف‬startstop ‫ و ُي�صار اإليه با�صم موقع‬،‫• املوقع الذي يكون مبثابة بداية الطريق ونهايته‬
from itertools import permutations import random
import numpy
def brute_force_solver(dist_matrix, location_ids, startstop): from itertools import combinations
# excludes the starstop location
location_ids = location_ids - {startstop}
def create_problem_instance(num_locations, distance_range):
# generate all possible routes (location permutations)
# initializes the distance matrix to be full of zeros
all_routes = permutations(location_ids)
dist_matrix = numpy.zeros((num_locations, num_locations))
best_distance = float('inf') # initializes to the highest possible number
# creates location ids: 0,1,2,3,4,...
best_route = None # best route so far, initialized to None
location_ids = set(range(num_locations))
# creates all possible location pairs
for route in all_routes: # for each route
location_pairs = combinations(location_ids, 2)
distance = 0 # total distance in this route
curr_loc = startstop # current location for i,j in location_pairs: # for each pair
distance = random.randint(*distance_range) # samples a distance within range
for next_loc in route: # the distance from i to j is the same as the distance from j to i
distance += dist_matrix[curr_loc,next_loc] # adds the distance of this step dist_matrix[j,i] = distance
curr_loc = next_loc # goes to the next location dist_matrix[i,j] = distance
distance += dist_matrix[curr_loc,startstop] # goes to the starstop location
if distance < best_distance: # if this route has lower distance than the best route # returns the distance matrix, location ids and the startstop vertix
best_distance = distance return dist_matrix, location_ids, random.randint(0, num_locations - 1)
best_route = route

# adds the startstop location at the beginning and end of the best route and returns
8 ‫ بحي��ث يت�صم��ن‬،‫ي�ص��تخدِ م املقط��ع الربجم��ي الت��ايل الدال��ة ال��واردة �ص��ابقًا الإن�ص��اء ن�ص��خة م��ن م�ص��كلة البائ��ع املُتج�وّل‬
return [startstop] + list(best_route) + [startstop], best_distance :20‫ و‬5 ‫ وم�صافات ثنائية ترتاوح بني‬،‫مواقع‬

ِ
startstop ‫ الحظ اأن موقع‬.‫ الإن�صاء كل الطُ رق املُمكنة‬permutations)( ‫ت�صتخدم خوارزمية ح ّل القوة املُفرطة اأداة‬ dist_matrix, location_ids, startstop = create_problem_instance(8, (5, 20))
print(dist_matrix)
،‫ فعلى �ص��بيل املثال‬،‫(االنط��الق والتوق��ف) ُي�ص��تبعد م��ن التبادي��ل؛ الأن��ه يج��ب اأن يظه��ر دائ ًم��ا يف بداية ك ّل طري��ق ونهايته‬ print(startstop)
‫ �ص��تكون‬،)‫ (االنط��الق والتوق��ف‬startstop ‫ ه��و موق��ع‬0 ‫ وكان املوق��ع‬،3‫ و‬،2‫ و‬،1‫ و‬،0 ‫اإذا كان��ت لدي��ك اأربع��ة مواق��ع‬
:‫قائمة التباديل املُمكنة كما يلي‬
[[ 0. 19. 17. 15. 18. 17. 7. 15.]
[19. 0. 15. 18. 11. 6. 20. 5.]
for route in permutations({1,2,3}): [17. 15. 0. 17. 15. 7. 5. 11.]
print(route) [15. 18. 17. 0. 19. 7. 7. 16.]
[18. 11. 15. 19. 0. 17. 20. 17.]
[17. 6. 7. 7. 17. 0. 15. 14.]
(1, 2, 3) [ 7. 20. 5. 7. 20. 15. 0. 14.] ‫الحظ اأن الخط القُطري يُمثَّل الم�صافات‬
(1, 3, 2) [15. 5. 11. 16. 17. 14. 14. 0.]] ،)dist_ matrix]i،i[( ‫من العُقد اإلى نف�صها‬
(2, 1, 3) 3
(2, 3, 1)
.‫وبالتالي فاإن الم�صافات ت�صاوي اأ�صفارًا‬
(3, 1, 2)
(3, 2, 1)

288 287
‫ي�ص��تخدِ م املقط��ع الربجم��ي الت��ايل مكتب��ة البايث��ون ‪ mip‬الإن�ص��اء خوارزمي��ة ح� ّل برجم��ة ا أالع��داد ال�صحيح��ة املختلط��ة‪،‬‬ ‫َحت�ص��ب خوارزمي��ة ح� ّل الق��وة املُفرط��ة امل�ص��افة االإجمالي��ة ل��كل طري��ق‪ ،‬وتُظه��ر يف النهاي��ة الطري��ق ذا امل�ص��افة االأق�ص��ر‪.‬‬
‫متغر قرار ثُنائي لكل انتقال ممكن يف ن�صخة م�صكلة البائع املُتجوّل التي مت اإن�صاوؤها �صابقًا‪:‬‬ ‫ثم ي�صيف ِّ‬ ‫ُيط ِّبق املقطع الربجمي التايل خوارزمية احل ّل على ن�صخة م�صكلة البائع املُتجوّل التي مت اإن�صاوؤها �صابقًا‪:‬‬
‫‪from itertools import product # used to generate all possible transition‬‬ ‫)‪brute_force_solver(dist_matrix, location_ids, startstop‬‬
‫‪from mip import BINARY‬‬
‫‪from mip import Model,INTEGER‬‬
‫)‪([3, 5, 2, 7, 1, 4, 0, 6, 3], 73.0‬‬
‫‪solver = Model() # creates a solver‬‬
‫‪solver.verbose = 0 # setting this to 1 will print info on the progress of the solver‬‬
‫عل��ى غ��رار خوارزمي��ات ح� ّل الق��وة املُفرط��ة الت��ي مت تو�صيحه��ا يف الدرو���ص ال�ص��ابقة‪ ،‬ال تُط َّب��ق ه��ذه اخلوارزمي��ة اإال عل��ى‬
‫‪# 'product' creates every transition from every location to every other location‬‬ ‫نُ�ص��خ م�ص��كلة البائ��ع املُتج�وّل ال�صغ��رة؛ الأن ع��دد الطُ ��رق املُمكن��ة يتزاي��د اأ�صعا ًف��ا م�صاعف��ة كلم��ا زاد العدد ‪ ، N‬وي�ص��اوي‬
‫))‪transitions = list(product(location_ids, location_ids‬‬
‫!(‪ ، )N−1‬وعلى �صبيل املثال‪ ،‬عندما يكون ‪ ،N = 15‬فاإن عدد الطُ رق املُمكنة ي�صاوي ‪.14! = 87,178,291,200‬‬
‫‪N = len(location_ids) # number of locations‬‬
‫ا�ستخدام بر ة األأعداد ال�سحيحة املختلطة حللّ م�سكلة البائع املُتجوّل‬
‫‪# creates a square numpy array full of 'None' values‬‬
‫)‪x = numpy.full((N, N), None‬‬
‫‪Using MIP to Solve the Traveling Salesman Problem‬‬
‫ال�ص��تخدام برجم��ة اآلأع��داد ال�صحيح��ة املختلط��ة (‪ )MIP‬حل� ّل م�ص��كلة البائ��ع امل ُتج�وّل (‪ ،)TSP‬يج��ب اإن�ص��اء �صيغ��ة‬
‫‪# adds binary variables indicating if transition (i->j) is included in the route‬‬
‫‪for i, j in transitions:‬‬
‫كال من الدالة املو�صوعية وقيود م�صكلة البائع املُتجوّل‪.‬‬ ‫ريا�صية تُغطي ً‬
‫)‪x[i, j] = solver.add_var(var_type = BINARY‬‬ ‫تتطل��ب ال�صيغ��ة متغ� ِّ�ر ق��رار ثنائ��ي ‪ xij‬ل��كل انتق��ال حمتم��ل ‪ i→j‬م��ن موق��ع ‪ i‬اإىل موق��ع اآخ��ر ‪ ،j‬واذا كان��ت امل�ص��كلة‬
‫به��ا ع��دد ‪ N‬م��ن املواق��ع‪ ،‬ف�اإن ع��دد االنتق��االت املُمكن��ة ي�ص��اوي (‪ .N×)N−1‬اإذا كان��ت ‪ xij‬ت�ص��اوي ‪ ،1‬ف�اإن احل� ّل يت�صم��ن‬
‫ي�ص�تخدِ م املقط�ع الربجم�ي ال�ص�ابق اأداة ()‪ numpy.full‬الإن�ص�اء م�صفوف�ة ‪ numpy‬بحج�م ‪ NxN‬لتخزي�ن املتغ ِّ�رات‬ ‫االنتقال من املوقع ‪ i‬اإىل املوقع ‪ ،j‬وخالف ذلك اإذا كانت ‪ xij‬ت�صاوي ‪ ،0‬فلن يُدرج هذا االنتقال يف احللّ‪.‬‬
‫الثنائية ‪.x‬‬
‫ُميك��ن الو�ص��ول ب�ص��هولة اإىل العنا�ص��ر يف م�صفوف��ة ‪ numpy‬ثنائي��ة االأبع��اد ع��رب ال�صيغ��ة الربجمي��ة [‪ ]i,j‬فعل��ى �ص��بيل‬
‫بع�د اإ�صاف�ة متغ ِّ�رات الق�رار ‪ُ ،x‬ميك�ن ا�ص�تخدام املقط�ع الربجم�ي الت�ايل ل�صياغ�ة وح�ص�اب الدال�ة املو�صوعي�ة مل�ص�كلة‬ ‫املثال‪:‬‬
‫البائع املُتجوّل‪ ،‬حيث تقوم الدالة بالتكرار على كل انتقال ممكن ‪ j i‬وتُ�صرب م�صافتها [‪ dist_matrix]i,j‬مع ِّ‬
‫متغر‬
‫قراره�ا [‪ ،x]i,j‬واإذا مت اإدراج االنتق�ال يف احل� ّل �ص�يوؤخذ ‪ x]i,j[=1‬و [‪ dist_matrix]i,j‬بع�ني االعتب�ار‪ ،‬وبخ�الف ذل�ك‬ ‫‪arr = numpy.full((4,4), 0) # creates a 4x4 array full of zeros‬‬ ‫‪[[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫�صتُ�صرب [‪ dist_matrix]i,j‬يف �صفر ليتم جُتاهُ لُها‪:‬‬ ‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫)‪print(arr‬‬ ‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]]‪0‬‬
‫‪# the minimize tool is used then the objective function has to be minimized‬‬
‫‪from mip import xsum, minimize‬‬ ‫‪arr[0, 0] = 1‬‬
‫‪arr[3, 3] = 1‬‬ ‫‪[[1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫‪# objective function: minimizes the distance‬‬
‫)(‪print‬‬ ‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫‪solver.objective = minimize(xsum(dist_matrix[i,j]*x[i][j] for i,j in‬‬
‫)‪print(arr‬‬ ‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]]‪1‬‬
‫))‪transitions‬‬

‫ته��دف اخلط��وة التالي��ة اإىل التاأك��د ب�اأن اخلوارزمي��ة تُظه��ر احلل��ول الت��ي ت�صم��ن زي��ارة كل املواق��ع مل�رَّة واح��دة فق��ط‪،‬‬ ‫ي�ص� ِ‬
‫�تخدم املقط��ع الربجم��ي االأداة ()‪ product‬م��ن املكتب��ة ‪ itertools‬حل�ص��اب جمي��ع انتق��االت املواق��ع املحتمل��ة‪ ،‬فعل��ى‬
‫با�ص ��تثناء موق ��ع ‪( startstop‬االنط ��الق والتوقف)ح�ص ��ب م ��ا تتطلب ��ه م�ص ��كلة البائ ��ع املُتج �وّل‪ ،‬وزي ��ارة كل موق ��ع م ��رة‬ ‫�صبيل املثال‪:‬‬
‫واحدة تعني اأن الطريق ال�صحيح ُميكن اأن‪:‬‬
‫• ي�صل اإىل كل موقع مرة واحدة فقط‪.‬‬ ‫}‪ids = {0, 1, 2‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪for i, j in list(product(ids, ids)):‬‬ ‫‪0‬‬ ‫‪1‬‬
‫• يغادر من كل موقع مرة واحدة فقط‪.‬‬ ‫)‪print(i, j‬‬ ‫‪0‬‬ ‫‪2‬‬
‫ُوميكن اإ�صافة قيود الو�صول واملغادرة هذه ب�صهولة كما يلي‪:‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪2‬‬
‫‪# for each location id‬‬ ‫‪2‬‬ ‫‪0‬‬
‫‪for i in location_ids:‬‬ ‫‪2‬‬ ‫‪1‬‬
‫‪solver += xsum(x[i,j] for j in location_ids - {i}) == 1 # exactly 1 arrival‬‬ ‫‪2‬‬ ‫‪2‬‬
‫‪solver += xsum(x[j,i] for j in location_ids - {i}) == 1 # exactly 1 departure‬‬
‫‪290‬‬ ‫‪289‬‬
‫ ال��وارد يف احل� ّل املُك�وَّن م��ن طريق��ني لن�ص��خة م�ص��كلة البائ��ع املُتج�وّل‬1 2 1 ‫ ف ِّك��ر يف الطري��ق‬،‫عل��ى �ص��بيل املث��ال‬ ‫ ففي ن�ص��خة‬،‫ت�ص��مل ال�صيغة الكاملة مل�ص��كلة البائع املُتجوّل نوعً ا اإ�صافيًا اآخرًا من القيود ل�صمان ح�ص��اب الطُ رق املت�صلة‬
،‫ وه��ذا م�ص��تحيل‬،y1 y2 1 ‫ واأن تك��ون‬y2 y1 1 ‫ حي��ث يتطل��ب قي��د االت�ص��ال اأن تك��ون‬،‫املو�صح��ة يف ال�ص��كل ال�ص��ابق‬ .‫ هو موقع االنطالق والتوقف‬0 ‫ ُيفرت�ص اأن املوقع‬5.8 ‫م�صكلة البائع املُتجوّل الواردة يف ال�صكل‬
.ّ‫فلذلك �صيتم ا�صتبعاد احلل‬ ،2 1 4 3 0 ‫ اأق�ص�ر طري�ق ممك�ن ه�و‬،‫يف ه�ذا املث�ال‬
،y1 y4 1 ‫ واأن تك��ون‬y4 y3 1 ‫ اأن تك��ون‬0 2 1 4 3 0 ‫ يتطل��ب احل � ّل ال�صحي��ح‬،‫يف املقاب��ل‬ 2 ‫ ولك�ن عند عدم وج�ود قيد ات�صال‬،24 ‫مب�ص�افة �ص�فر اإجمالي�ة قدره�ا‬
‫ وال تنطب��ق‬،y2=3 ‫ و‬y1=2 ‫ و‬y4=1 ‫ و‬y3=0 :‫ كم��ا ياأت��ي‬y ‫ ُوميك��ن حتقي��ق ذل��ك ب�صب��ط قي��م‬،y2 y1 1 ‫واأن تك��ون‬ 5
:‫�ص�يكون هن�اك ح� ّل �صحي�ح اآخ�ر ي�ص�مل طريق�ني غ�ر مت�صل�ني هم�ا‬
.)‫ (االنطالق والتوقف‬startstop ‫قيود االت�صال على االنتقاالت التي ت�صمل موقع‬ ‫ وهذا احل ّل املتمثل يف وجود طريقني‬،1 2 1 ‫ و‬0 4 3 0
1 ‫ميتث�ل لقي�ود الو�ص�ول واملغ�ادرة الت�ي مت تعريفه�ا يف املقط�ع الربجم�ي‬
:‫َجُتمع الدالة التالية كل االأ�صياء معًا الإن�صاء خوارزمية ح ّل برجمة االأعداد ال�صحيحة املختلطة مل�صكلة البائع املُتجوّل‬ 5 6
4 ‫ ولكن‬،‫ال�ص�ابق؛ الأن كل موق�ع يدخ�ل ل�ه ويخ�رج من�ه م�رة واح�دة فق�ط‬
from itertools import product 7 5 .‫هذا احل ّل غر مقبول مل�صكلة البائع املُتجوّل‬
from mip import BINARY,INTEGER
from mip import Model 0 3 3 ‫ُميك�ن فر��ص ح� ّل ي�ص�مل طريقً�ا واح�دً ا مت�ص ً�ال باإ�صافة متغ ِّ�ر القرار‬
from mip import xsum, minimize ‫ و�ص�تحافظ ه�ذه املتغ ِّ�رات عل�ى ترتيب زي�ارة كل موقع‬،i ‫ ل�كل موق�ع‬yi
‫ ن�صخة م�صكلة البائع املُتجوّل‬:5.8 ‫�صكل‬ .ّ‫يف احلل‬
def MIP_solver(dist_matrix, location_ids, startstop):
solver = Model()# creates a solver
solver.verbose = 0 # setting this to 1 will print info on the progress of the solver # adds a decision variable for each location
# creates every transition from every location to every other location y = [solver.add_var(var_type = INTEGER) for i in location_ids]
transitions = list(product(location_ids,location_ids))
N = len(location_ids) # number of locations
# create an empty square matrix full of 'None' values y3=0، y4=1، y1=2، :‫ كم��ا يل��ي‬y ‫ ف�ص��تكون قي��م‬،0 2 1 4 3 0 :‫ اإذا كان احل� ّل ه��و‬،‫عل��ى �ص��بيل املث��ال‬
x = numpy.full((N, N), None) .‫ اخلا�صة به بعني االعتبار‬y ‫ ولذلك ال توؤخذ قيمة‬،‫ هو موقع االنطالق والتوقف‬0 ‫ واملوقع‬،y2=3
# adds binary decision variables indicating if transition (i->j) is included in the route
for i, j in transitions: ‫ ال‬j i ‫ُميك��ن ا�ص��تخدام متغ� ِّ�رات الق��رار اجلدي��دة ه��ذه ل�صم��ان االت�ص��ال م��ن خ��الل اإ�صاف��ة قي��د جدي��د ل��كل انتق��ال‬
x[i, j]=solver.add_var(var_type = BINARY) .)‫ (االنطالق والتوقف‬startstop ‫ي�صمل موقع‬
# objective function: minimizes the distance
solver.objective = minimize(xsum(dist_matrix[i,j]*x[i][j] for i,j in transitions))
# Arrive/Depart Constraints # adds a connectivity constraint for every transition that does not include the startstop
for i in location_ids: for (i, j) in product(location_ids - {startstop}, location_ids - {startstop}):
solver += xsum(x[i,j] for j in location_ids - {i}) == 1 # exactly 1 arrival # ignores transitions from a location to itself
solver += xsum(x[j,i] for j in location_ids - {i}) == 1 # exactly 1 departure if i != j:
# adds a binary decision variable for each location solver += y[j] - y[i] >= (N+1) * x[i, j] - N
y = [solver.add_var(var_type=INTEGER) for i in location_ids]
# adds connectivity constraints for transitions that do not include the startstop
for (i, j) in product(location_ids - {startstop}, location_ids - {startstop}): ‫ ف �اإن املتباين��ة ال��واردة يف االأعل��ى ت�صب��ح‬،‫ ومت اإدراج ه��ذا االنتق��ال يف احل � ّل‬j i ‫ النتق��ال‬xij=1 ‫اإذا كان��ت‬
if i != j: # ignores transitions from a location to itself
solver += y[j] - y[i] >=(N+1)*x[i,j] - N
‫ باالإ�صاف��ة اإىل‬،‫ اخلا�ص��ة به��ا اأعل��ى‬y ‫ ومعن��ى ذل��ك اأن املواق��ع الت��ي �ص�تُزا ُر الح ًق��ا ال ب��د اأن تك��ون قيم��ة‬،y]j[ <= y]i[ 1
solver.optimize() #solves the problem :‫ و�صيكون الطريق الذي ال ي�صمل موقع االنطالق والتوقف �صحيحً ا فقط اإذا‬،‫قيود الو�صول واملغادرة‬
# prints the solution .‫• بداأ وانتهى باملوقع نف�صه؛ ل�صمان اأن يكون لكل موقع و�صو ٌل واح ٌد ومغادرة واحدة فقط‬
if solver.num_solutions: # if a solution was found
best_route = [startstop] # stores the best route ‫ ل��كل االنتق��االت الت��ي‬y]i[ ‫ يج��ب اأن تك��ون اأك��رب م��ن‬y]j[ ‫ اأعل��ى ل��كل املواق��ع الت��ي �ص�تُزا ُر الح ًق��ا؛ الأن‬y ‫• خُ �ص�ص��ت قي��م‬
curr_loc = startstop # the currently visited location :‫ عل��ى �ص��بيل املث��ال‬،‫أي�ص��ا اإىل جُتن��ب اإ�صاف��ة احلاف��ة نف�ص��ها م��ن اجُت��اه ُخُمتل��ف‬ً ‫ وي�وؤدي ه��ذا ا‬،‫مت اإدراجه��ا يف الطري��ق‬
while True:
for next_loc in location_ids:# for every possible next location
i j‫ و‬j i
if x[curr_loc,next_loc].x == 1: # if x value for the curr_loc->next_loc transition is 1 ‫ اخلا�ص��ة ب��ه ه��ي اأك��رب واأ�صغ��ر م��ن قي��م كل‬y ‫ ف��ال ب� ّد اأن تك��ون قيم��ة‬،‫ولك��ن اإذا كان املوق��ع ميث��ل بداي��ة الطري��ق ونهايت��ه‬
best_route.append(next_loc) # appends the next location to the route
curr_loc=next_loc # visits the next location
‫ ف�ص� ُتوؤدي اإ�صافة قيد االت�صال اإىل ا�ص��تبعاد اأية حلول بها طُ رق‬،‫ ونظرًا ال�ص��تحالة هذا االأمر‬،‫املواقع الباقية يف الطريق‬
break .‫ال ت�صمل موقع االنطالق والتوقف‬
if next_loc == startstop: # exits if route returns to the startstop
break
return best_route, solver.objective_value # returns the route and its total distance
292 291
‫مترينات‬ ‫يولِّد املقطع الربجمي التايل ‪ 100‬ن�ص��خة من م�ص��كلة البائع املُتجوّل ت�ص��مل ‪ 8‬مواقع وترتاوح امل�ص��افات فيها بني ‪ 5‬و‪،20‬‬
‫كم��ا اأن��ه ي�ص� ِ‬
‫�تخدم خوارزمي��ة ح� ّل الق��وة املُفرط��ة‪ ،‬وخوارزمي��ة ح� ّل برجم��ة االأع��داد ال�صحيح��ة املختلط��ة حل� ّل كل حالة‪،‬‬
‫و ُيظهِ ر الن�صبة املئوية لالأ�صلوبني اللذين اأظهرا طريقني لهما امل�صافة نف�صها‪:‬‬
‫‪ 1‬ا�صرح طريقة ا�صتخدام الربجمة الريا�صية حل ّل م�صكالت التح�صني املعقدة‪.‬‬ ‫‪same_count = 0‬‬
‫‪for i in range(100):‬‬
‫)]‪dist_matrix, location_ids, startstop=create_problem_instance(8, [5,20‬‬
‫)‪route1, dist1 = brute_force_solver(dist_matrix, location_ids, startstop‬‬
‫)‪route2, dist2 = MIP_solver(dist_matrix, location_ids, startstop‬‬
‫‪# counts how many times the two solvers produce the same total distance‬‬
‫‪if dist1 == dist2:‬‬
‫‪same_count += 1‬‬
‫)‪print(same_count / 100‬‬

‫‪1.0‬‬

‫توؤك��د النتائ��ج اأن خوارزمي��ة ح � ّل برجم��ة االأع��داد ال�صحيح��ة املختلط��ة تُظهِ ��ر احل � ّل االأمث��ل بن�ص��بة ‪ 100%‬ل��كل نُ�ص��خ‬
‫ويو�صح املقطع الربجمي التايل �صرعة خوارزمية ح ّل برجمة االأعداد ال�صحيحة املختلطة من خالل ا�صتخدامها‬ ‫امل�صكلة‪ِّ ،‬‬
‫حل ّل ‪ 100‬ن�صخة كبرة تت�صمن ك ٌّل منها ‪ 20‬موقعًا‪:‬‬

‫‪import time‬‬

‫‪start = time.time() # starts timer‬‬


‫‪for i in range(100):‬‬
‫‪ 2‬ما مزايا �عيوب اأ�صلوب برجمة اآلأعداد ال�صحيحة املختلطة يف ح ّل م�صكالت التح�صني؟‬ ‫)]‪dist_matrix, location_ids, startstop = create_problem_instance(20, [5,20‬‬
‫)‪route, dist = MIP_solver(dist_matrix, location_ids, startstop‬‬

‫‪stop=time.time() # stops timer‬‬


‫‪print(stop - start) # prints the elapsed time in seconds‬‬

‫‪188.90074133872986‬‬

‫عل��ى الرغ��م م��ن اأن وق��ت التنفي��ذ الدقي��ق �ص��يعتمد عل��ى ق��وة معاجلة اجلهاز ال��ذي ت�ص��تخدِ مه لتنفيذ مفكرة جوبي��رت‪ ،‬اإال اأنه من‬
‫املفرت�ص اأن ي�صتغرق التنفيذ ب�صع دقائق حل�صاب احل ّل جلميع جمموعات البيانات املئة‪.‬‬
‫و ه ��ذا ب ��دوره مذ ه ��ل اإذا مت ا الأ خ ��ذ يف االعتب ��ار اأن ع ��دد الطُ ��رق ا ملُمكن ��ة ل ��كل ن�ص ��خة م ��ن النُ�ص ��خ املئ ��ة ه ��ي‪:‬‬
‫‪ 19 = 121,645,100,000,000,000‬طري ًق��ا ُخُمتل ًف��ا‪ ،‬ومث��ل ه��ذا الع��دد الكب��ر من الطُ رق يفوق بكثر قدرات اأ�ص��لوب القوة‬
‫املُفرط��ة‪ ،‬وم��ع ذل��ك فاإن��ه ع��ن طري��ق البح��ث الف ّع��ال يف ه��ذه امل�ص��احة الهائل��ة اخلا�ص��ة بجميع احلل��ول املُمكنة ُميك��ن خلوارزمية‬
‫ح ّل برجمة االأعداد ال�صحيحة املختلطة اأن جُتد الطريق االأمثل ب�صرعة‪.‬‬
‫أي�ص��ا‪ ،‬فهي تتطلب فه ًم��ا قويًا للنمذج��ة الريا�صية وقد‬ ‫وعل��ى الرغ��م م��ن مزاي��ا الربجم��ة الريا�صي��ة اإال اأنه��ا متل��ك قي��ودًا خا�صة ا ً‬
‫ال تك��ون منا�ص��بة للم�ص��كالت املعق��دة الت��ي ي�صع��ب فيه��ا التعبر عن الدالة املو�صوعية والقيود بوا�ص��طة ال�صي��غ الريا�صية‪ ،‬وعلى‬
‫الرغم من اأن الربجمة الريا�صية اأ�صرع بكثر من اأ�صلوب القوة املُفرطة اإال اأنها قد تظل بطيئة جدً ا بالن�صبة ملجموعات البيانات‬
‫بديال اأكر �صرعة‪.‬‬‫املو�صح يف الدر�صني ال�صابقني ً‬ ‫يقدم االأ�صلوب اال�صتداليل َّ‬ ‫الكبرة‪ ،‬ويف مثل هذه احلاالت ِّ‬

‫‪294‬‬ ‫‪293‬‬
‫ م��ن خ��الل اإكم��ال املقط��ع الربجم��ي الت��ايل بحي��ث‬،‫ اأن�ص� دال��ة خوارزمي��ة ح� ّل الق��وة امل ُفرط��ة مل�ص��كلة البائ��ع امل ُتج�وّل‬5 ِّ ‫ ثم حدِّد‬،‫ قم بتحليل م�ص��كلتني من م�ص��كالت التح�ص��ني ُميكن حلهما با�ص��تخدام الربجمة الريا�صية‬3
‫متغرات احلالة‬
:‫تُظهر الدالة امل�صار اآلأف�صل �امل�صافة اآلإجمالية امل ُثلى‬ .‫�متغرات القرار اخلا�صة بهما‬
ِّ

from itertools import permutations

def brute_force_solver(dist_matrix, location_ids, startstop):

# excludes the startstop location

location_ids = - { }

# generates all possible routes (location permutations)

all_routes = ( )

best_distance = float('inf') # initializes to the highest possible number

best_route = None # best route so far, initialized to None

for route in all_routes: # for each route

distance = 0 # total distance in this route

curr_loc = # current location


.‫ اذكر ثال م�صكالت حت�صني ُخُمتلفة من عائلة م�صكالت حتديد امل�صار‬4
for next_loc in route:

distance += [curr_loc, next_loc] # adds the distance of this step

curr_loc = # goes the next location

distance += [curr_loc, ] # goes to


back to the startstop location

if distance < best_distance: # if this route has lower distance than the best route

best_distance = distance

best_route = route

# adds the startstop location at the beginning and end of the best route and returns
return [startstop] + list(best_route) + [startstop], best_distance

296 295
‫الم�سروع‬ ‫ من خالل اإكمال املقطع الربجمي‬،‫ اأن�ص خوارزمية ح ّل برجمة اآلأعداد ال�صحيحة املختلطة مل�صكلة البائع امل ُتجوّل‬6
:‫متغرات القرار �قيود اآلت�صال انتقا ًء �صحيحً ا‬
ِّ ‫ بحيث تنتقي‬،‫التايل‬

def MIP_solver(dist_matrix, location_ids, startstop):

solver = () # creates a solver


solver.verbose = 0 # setting this to 1 will print info on the progress of the solver
‫ وطل��ب من��ك مدي��رك اأن جُت��د امل�ص��ار االأك��ر‬،‫افرت���ص اأن��ك تعم��ل يف �ص��ركة تو�صي��ل‬ # creates every transition from every location to every other location
.‫كفاءة لتو�صيل الطرود اإىل مواقع متعددة يف املدينة‬ transitions = list( (location_ids, location_ids))
‫يتم ّث��ل اله��دف يف اإيج��اد اأق�ص��ر م�ص��ار ممك��ن لزيارة كل موقع م��رة واحدة فقط ومن‬ N = len(location_ids) # number of locations
.)TSP( ‫ هذه امل�صكلة مثال على م�صكلة البائع امل ُتجوّل‬.‫ثمَّ العودة اإىل موقع البدء‬ # creates an empty square matrix full of 'None' values
x = numpy.full((N, N), None)
# adds binary decision variables indicating if transition (i->j) is included in the route
for i, j in transitions:
1
3 ‫�ص��تقوم باإن�ص��اء اأمثل��ة متع��ددة على م�ص��كلة البائع املُتجوّل ت�ص��مل مواق��ع عددها من‬
x[i, j] = solver. (var_type= )
.‫ وحدة‬20 ‫ وحدات اإىل‬5 ‫ و�صترتاوح امل�صافة يف كل مثال من‬،12 ‫اإىل‬
# objective function: minimizes the distance

solver.objective = (xsum(dist_matrix[i, j] * x[i][j] for


2
‫ تر�ص��م اأف�ص��ل م�ص��ار تُنتج��ه‬matplotlib ‫اأن�ص��ئ دال��ة ر�ص��م نق��اط با�ص��تخدام مكتب��ة‬ i, j in transitions))
20 ‫ ميكن��ك ا�ص��تخدام ه��ذه الدال��ة فق��ط م��ع الن�ص��خة الت��ي ت�ص��مل‬،ّ‫خوارزمي��ة احل�ل‬
.‫موقعًا‬ # Arrive/Depart Constraints
for i in location_ids:

solver += xsum( for j in location_ids - {i}) == 1


3
‫ تر�ص��م نق��اط اأداء كل م��ن‬matplotlib ‫اأن�ص��ئ دال��ة ر�ص��م نق��اط با�ص��تخدام مكتب��ة‬ solver += xsum( for j in location_ids - {i}) == 1
‫خوارزمي��ة ح� ّل الق��وة املُفرط��ة وخوارزمي��ة ح� ّل برجم��ة ا أالع��داد ال�صحيح��ة املختلطة‬
.‫باملقارنة بينهما‬ # Adds a binary decision variable for each location

y = [solver. (var_type= ) for i in


location_ids]
4
‫اكت��ب تقري�رًا موج��زً ا تناق���ص في��ه النتائ��ج الت��ي تو�صل��ت اإليه��ا بخ�صو���ص كف��اءة اأداء‬
.‫ ومزايا وعيوب كل منهما‬،ّ‫خوارزميتي احلل‬ # Adds connectivity constraints for transitions that do not include the startstop
for (i, j) in product(location_ids - {startstop}, location_ids -
{startstop}):
if i != j: # ignores transitions from a location to itself
solver += y[j] - y[i] >= (N + 1) * x[i, j] - N

solver. () # solves the problem

298 297
‫‪ .6‬ال��ذكاء األ�سطناعي واملجتمع‬ ‫ماذا تع ّلمت‬
‫�سيتعرّ ف الطالب يف هذه الوحدة على اأخالقيات الذكاء األ�سطناعي وتاأ ريها على تطوير‬
‫اأن مته املتقدمة وحتديد توجهاتها‪ ،‬و�سيُقيِّم مدى تاأ ري اأن مة الذكاء األ�سطناعي وا�سعة‬
‫النطا على املجتمعات والبي ة‪ ،‬وكيفية تن يم مثل هذه األأن مة لال�س�تخدام األأخالقي‬
‫ حتديد اأ�ساليب التح�س املالئمة حللّ امل�سكالت املعقدة‪.‬‬
‫ُ�س�رية على‬
‫ة طائرة م َّ‬ ‫املُ�س�تدام‪ ،‬و�سي�س�تخدِ م بعد ذل ُحماكي ويبوت��ص (‪ )Webots‬ل‬
‫احلركة الذاتية وا�ستك�ساف منطقة ما من خالل حتليل ال�سور‪.‬‬ ‫ ح ��لّ م�س ��كالت تخ�سي� ��ص امل ��وارد ع ��ن طري ��ق تطبي ��ق مقط ��ع بر ��ي بلغ ��ة‬
‫البايثون‪.‬‬
‫ حلّ م�سكالت اجلدولة عن طريق تطبيق مقطع بر ي بلغة البايثون‪.‬‬
‫اأهداف التعلُّم‬ ‫ حلّ م�سكلة حقيبة ال هر با�ستخدام خوارزميات التح�س املختلفة‪.‬‬
‫بنهاية هذه الوحدة �سيكون الطالب قادرًا على اأن‪:‬‬ ‫ حلّ م�سكلة البائع املُتجوّل با�ستخدام خوارزميات التح�س املختلفة‪.‬‬
‫ يُعرِّ ف اأخالقيات الذكاء األ�سطناعي‪.‬‬
‫ يُف�سِّ ��ر م��دى تاأ ��ري التح ُّي��ز واألإن�س��اف عل��ى األ�س��تخدام األأخالقي ألأن م��ة الذكاء‬
‫األ�سطناعي‪.‬‬ ‫امل�سطلحات الرئي�سة‬
‫ يُقيِّم كيفية حل م�س��كلة ال�س��فافية وقابلية التف�س��ري يف الذكاء األ�سطناعي‪.‬‬
‫‪Brute-Force‬‬ ‫خوارزمية ح ّل القوة‬ ‫‪Mat ematical‬‬
‫ يُح ِّل ��ل كيفي ��ة تاأ ��ري اأن م ��ة ال ��ذكاء األ�سطناع ��ي وا�س ��عة النط ��ا عل ��ى املجتم ��ع‬ ‫‪Solver‬‬ ‫امل ُفرطة‬ ‫‪Programming‬‬
‫الربجمة الريا�صية‬
‫وكيفية و سع قوان لتن يمها‪.‬‬ ‫‪Constraint‬‬
‫‪Mixed Integer‬‬ ‫برجمة اآلأعداد ال�صحيحة‬
‫‪Programming‬‬
‫الربجمة القيدية‬ ‫‪Programming‬‬ ‫املختلطة‬
‫ُ�سرية على احلركة الذاتية‪.‬‬ ‫ ُي مج جهاز الطائرة امل َّ‬ ‫‪Greed euristic‬‬ ‫خوارزمية ا�صتدآللية‬ ‫‪ptimi ation‬‬
‫م�صكلة التح�صني‬
‫‪Problem‬‬
‫ُ�سرية تُ�ستخدم يف ا�ستطالع منطقة معينة ‪.‬‬ ‫ يُطوِّر ن ام حتليل ال�سور لطائرة م َّ‬ ‫‪Algorithm‬‬ ‫ج�صعة‬ ‫‪uadratic‬‬
‫‪Programing‬‬
‫الربجمة الرباعية‬
‫‪Greedy Solver‬‬ ‫خوارزمية ح ّل ج�صعة‬
‫‪Scheduling‬‬
‫‪Problem Team‬‬
‫جد�لة م�صكلة تكوين‬
‫‪Integer‬‬ ‫فريق‬
‫‪Programming‬‬
‫برجمة اآلأعداد ال�صحيحة‬ ‫‪Formation‬‬
‫‪Traveling‬‬
‫األأدوات‬ ‫‪Knapsack‬‬
‫‪Problem Solver‬‬
‫خوارزمية ح ّل م�صكلة‬
‫حقيبة الظهر‬
‫‪Salesman‬‬
‫‪Problem‬‬
‫م�صكلة البائع امل ُتجوّل‬

‫ ويبوت�ص (‪)Webots‬‬
‫ مكتبة اأوبن �سي يف (‪)OpenCV‬‬

‫‪300‬‬ ‫‪299‬‬
‫التح ُّيز واألإن�ساف يف الذكاء األ�سطناعي ‪Bias and Fairness in AI‬‬ ‫الدر�ص األأول‬
‫ُميكن اأن يظهر التحيُّز (‪ )Bias‬يف اأنظمة الذكاء اال�صطناعي عندما تكون البيانات‬
‫حتيُّز الذكاء األ�سطناعي (‪:)AI Bias‬‬
‫يف جم��ال ال��ذكاء اال�صطناع��ي‪ ،‬ي��دل التح ُّيز‬
‫�تخدمة لتدري�ب اخلوارزم ّي�ة ناق�ص�ة التمثي�ل اأو حتت�وي على حت ُّيزات اأ�صا�ص�ية‪،‬‬ ‫امل�ص َ‬ ‫مقدمة يف اأخالقيات الذكاء األ�سطناعي‬
‫ُوميكن اأن يظهر يف اأية بيانات ُمتثِّلها ُخُم َرجات النظام‪ ،‬فعلى �صبيل املثال ال احل�صر‪:‬‬
‫عل��ى مي��ل خوارزميات التعلُّم االآيل اإىل اإنتاج‬ ‫املُنتَجات واالآراء واملجتمعات واالجُتاهات كلها ميكن اأن يظهر فيها التح ُّيز‪.‬‬
‫نتائ��ج حتاب��ي بدائ��ل‪ ،‬اأو فئ��ات مع ّين��ة‪ ،‬اأو‬ ‫�تخدم ال�ذكاء اال�صطناع�ي لفح��ص املر�ص�حني‬ ‫ُيع� ُّد نظ�ام التوظي�ف االآيل ال�ذي ي�ص ِ‬ ‫ن رة عامة على اأخالقيات الذكاء األ�سطناعي‬
‫تظلمه��ا باأ�ص��لوب منهج��ي؛ مم��ا ي �وؤدي اإىل‬
‫القي��ام بتنب �وؤات خاطئ��ة واإىل احتمالي��ة‬
‫للوظائف من اأبرز االأمثلة على اخلوارزم ّية املُتح ِّيزة‪ .‬افرت�ص اأن اخلوارزم ّية مُدرَّبة‬
‫اأخالقيات الذكاء األ�سطناعي‬ ‫‪Overview of AI Ethics‬‬
‫ُف�ص�ل جمموع�ات‬ ‫عل�ى بيان�ات ُمتح ِّي�زة‪ ،‬مث�ل اأمن�اط التوظي�ف التاريخي�ة الت�ي ت ِّ‬ ‫مع ا�ص�تمرار تق ُّدم الذكاء اال�صطناعي تزايدت اأهمية التفكر يف االآثار االأخالقية املرتتبة‬
‫التميي��ز �ص��د مُنتَجات معيّنة اأو فئات ب�ص��رية‬ ‫دميوغرافية معيّنة‪ ،‬ففي هذه احلالة قد يعمل الذكاء اال�صطناعي على ا�صتمرار تلك‬ ‫(‪:)AI Ethics‬‬
‫حم َّددة‪.‬‬ ‫ت�ص��ر اأخالقيات ال��ذكاء اال�صطناعي‬ ‫عل�ى ا�ص�تخدام ه�ذه التقني�ة‪ ،‬وم�ن امله�م اأن يفه�م املواط�ن يف عَ املَ ن�ا احلدي�ث ال�دور اله�ام‬
‫متجاهال‬
‫ً‬ ‫التح ُّيزات وي�صتبعد املر�صّ حني املو ّؤهلني ب�صكل غر عادل من بني املجموعات‬ ‫الأخالقيات الذكاء اال�صطناعي اإذا اأردنا تطوير اأنظمة ذكاء ا�صطناعي م�صوؤولة وا�صتخدامها‪.‬‬
‫الفئات غر املمثَّلة جيدًا يف جمموعة البيانات‪ .‬على �صبيل املثال‪ ،‬افرت�ص اأن اخلوارزم ّية تُف�صل املر�صحني الذين التحقوا بجامعات النخبة‪،‬‬ ‫اإىل املب��اد ‪ ،‬والقي��م‪ ،‬واملعا ي��ر‬
‫االأخالقي��ة الت��ي تُنظّ ��م تطوي��ر اأنظم��ة‬ ‫اإن أاح�د االأ�ص�باب الرئي�ص�ة للتاأكي�د عل�ى اأهمي�ة اأخالقي�ات ال�ذكاء اال�صطناع�ي ه�و التاأثر‬
‫اأو عملوا يف �صركات مرموقة‪ ،‬ففي هذه احلالة قد يلحق ذلك ال�صرر باملر�صحني الذين مَل يحظوا بتلك الفُر�ص‪ ،‬اأو الذين ينتمون اإىل بيئات‬ ‫الكبر الأنظمة الذكاء اال�صطناعي على حياة االن�ص�ان‪ .‬على �ص�بيل املثال‪ُ ،‬ميكن ا�ص�تخدام‬
‫أاق�ل حظًّ �ا‪ُ ،‬وميك�ن اأن ُي�وؤدي ذل�ك اإىل نق��ص التن�وع يف م�كان العم�ل واإىل ا�ص�تمرارية ع�دم امل�ص�اواة‪ ،‬ولذل�ك م�ن امله�م تطوي�ر وا�ص�تخدام‬ ‫ا ل��ذكاء اال�صطنا ع��ي وانت�ص��ارها‬
‫وا�صتخدامها‪.‬‬ ‫خوارزمي�ات ال�ذكاء اال�صطناعي التخ�اذ قرارات التوظيف والعالج الطبي‪ ،‬واإذا كانت هذه‬
‫خوارزميات توظيف للذكاء اال�صطناعي تَ�صت ِند على معاير عادلة و�صفافة‪ ،‬وغر مُتح ِّيزة‪.‬‬ ‫اخلوارزميات ُمتح ِّيزة اأو متييزية‪ ،‬فقد ُتوؤدي اإىل نتائج غر عادلة تُ�صر باالأفراد واملجتمعات‪.‬‬
‫ي�صر اآلإن�صاف (‪ )Fairness‬يف الذكاء اال�صطناعي اإىل كيفية تقدمي اأنظمة الذكاء اال�صطناعي لنتائج غر ُمتح ِّيزة وعلى معاملتها جلميع‬
‫ُن�صفة‪ ،‬ولتحقيق االإن�صاف يف الذكاء اال�صطناعي يتطلب ذلك حتديد التح ُّيزات يف البيانات واخلوارزميات‬ ‫عاملة م ِ‬
‫االأفراد واملجموعات ُم َ‬ ‫ال الذكاء األ�سطناعي‬ ‫اأمثلة من العا الواقعي على املخاوف األأخالقية يف‬
‫وعملي�ات اتخ�اذ الق�رار ومعاجلته�ا‪ .‬عل�ى �ص�بيل املثال‪ ،‬تتمثّ�ل اإحدى طرائق حتقيق االإن�ص�اف يف الذكاء اال�صطناعي يف ا�ص�تخدام عملية‬ ‫‪Real-World Examples of Ethical Concerns in AI‬‬
‫تُ�صمى اإلغاء اآلنحياز (‪ ،)Debiasing‬حيث يتم حتديد البيانات املُتحيِّزة واإزالتها اأو تعديلها مبا ي�صمن و�صول اخلوارزم ّية اإىل نتائج اأكر‬ ‫اخلوارزميات التمييزية‬
‫دقة دون حت ُّيز‪.‬‬ ‫هناك مواقف تدل على اأن اأنظمة الذكاء اال�صطناعي متيل اإىل التح ُّيز والتمييز �صد فئات معيّنة من الب�ص�ر‪ .‬على �ص�بيل املثال‪،‬‬
‫وج�دت درا�ص�ة اأجراه�ا املعه�د الوطن�ي للمعاي�ر �التقني�ة (‪ )National Institute of Standards and Technology‬اأن‬
‫جدول  ‪ : .1‬العوامل التي ُحتدِّ د حت ُّيز اأن مة الذكاء األ�سطناعي‬ ‫ِن�صب اخلطاأ يف تقنية التع ُّرف على الوجه تكون اأعلى عند التع ُّرف على وجوه االأ�صخا�ص ذوي الب�صرة الداكنة؛ مما قد ُيوؤدي اإىل‬
‫حتدي�د هوي�ات خاطئ�ة واعتق�االت خاطئ�ة‪ .‬وم�ن االأمثل�ة االأخ�رى عل�ى ذلك ا�ص�تخدام خوارزميات ال�ذكاء اال�صطناع�ي يف نظام‬
‫تتع ّل��م خوارزمي��ات ال��ذكاء اال�صطناع��ي م��ن البيانات التي تُدرَّب عليها؛ ف�اإذا كانت البيانات‬ ‫العدالة اجلنائية‪ ،‬اإذ اأظهرت الدرا�صات اأن هذه اخلوارزميات ُميكن اأن تكون ُمتح ِّيزة �صد االأقليات مما ُيوؤدي اإىل عقوبات اأق�صى‪.‬‬
‫ُمتح ِّي��زة اأو ناق�ص��ة التمثي��ل‪ ،‬فق��د ت�ص��ل اخلوارزم ّي��ة اإىل نتائ��ج ُمتح ِّي��زة‪ .‬عل��ى �ص��بيل املثال ‪،‬‬ ‫بيانات التدريب‬ ‫اخل�سو�سية‬
‫ُ‬ ‫انتها‬
‫اإذا مت تدري��ب خوارزم ّي��ة التع� ُّرف عل��ى ال�ص��ور عل��ى جمموع��ة بيانات حتت��وي يف الغالب على‬ ‫املُتح ِّيزة‬
‫اأف��راد ذوي ب�ص��رة فاحت��ة‪ ،‬فرمب��ا تُواج��ه �صعوب��ة يف التع� ُّرف بدق��ة عل��ى االأفراد ذوي الب�ص��رة‬ ‫للخ�صو�صية ال�ص��خ�صية‪ .‬على‬ ‫ُميكن اأن تكون اأنظمة الذكاء اال�صطناعي التي جُتمع البيانات ُوحتلِّلها م�صدر تهديد ُ‬
‫�تخدمي في�ص��بوك‬ ‫�ص��بيل املث��ال‪ :‬جمع��ت �ص��ركة ا�صت�ص��ارات �صيا�ص��ية يف ع��ام ‪ 2018‬م بيان��ات املالي��ني م��ن م�ص� ِ‬
‫الداكنة‪.‬‬
‫(‪ )Facebook‬دون موافقته��م وا�ص��تخدمتها للتاأث��ر عل��ى احلم��الت ال�صيا�ص��ية‪ ،‬و أاث��ار ه��ذا احل��ادث املخ��ا ِوف ب�ص�اأن‬
‫اإذا مَل يك��ن فري��ق التطوي��ر متنوعً ��ا وال ُمي ِّث��ل نطاقًا وا�ص�عًا من الفئ��ات الثقافية والتقنية‪ ،‬فقد‬ ‫ا�صتخدام الذكاء اال�صطناعي وحتليالت البيانات يف التالعب بالراأي العام‪ ،‬وانتهاك حقوق خ�صو�صية االأفراد‪.‬‬
‫ال يتع�رَّف عل��ى التح ُّي��زات املوج��ودة يف البيان��ات اأو اخلوارزم ّي��ة‪ ،‬وي�وؤدي الفري��ق ال��ذي يتكون‬ ‫االفتق��ار اإىل التن �وُّع‬
‫األأ�سلحة ذاتية التحكم‬
‫من اأفراد من منطقة جغرافية اأو ثقافة معيّنة اإىل عدم مراعاة املناطق اأو الثقافات االأخرى‬ ‫يف فِرق التطوير‬
‫التي قد تكون ُممثَّلة يف البيانات املُ�صتخدَ مة لتدريب منوذج الذكاء اال�صطناعي‪.‬‬ ‫تطوي��ر االأ�ص��لحة ذاتي��ة التحك��م الت��ي ُميك��ن اأن تعم��ل دون تدخ��ل ب�ص��ري ل��ه خُم��اوف اأخالقية ب�ص�اأن ا�ص��تخدام الذكاء‬
‫اال�صطناع��ي يف احل��روب‪ ،‬حي��ث ي��رى فري��ق م��ن املنتقدي��ن اأن ه��ذه االأ�ص��لحة ُميك��ن اأن تتخ��ذ ق��رارات م�صري��ة دون‬
‫ُميكن اأن ُيوؤدي االفتقار اإىل الرقابة وامل�صوؤولية يف تطوير اأنظمة الذكاء اال�صطناعي ون�صرها‬ ‫اإ�ص��راف ب�ص��ري ُوميكن برجمتها ال�ص��تهداف جمموعات معيّنة من النا���ص‪ ،‬مما قد ينتهك القانون االإن�ص��اين الدويل‪،‬‬
‫اإىل ظهور التح ُّيز‪ ،‬فاإذا مَل تُطبِّق ال�ص��ركات واحلكومات اآليات رقابة و ُم�ص��اءلة منا�ص��بة‪ ،‬فاإنّ‬ ‫االفتق��ار اإىل الرقاب��ة‬ ‫و ُيوؤدي اإىل وقوع اإ�صابات يف �صفوف املدنيني‪.‬‬
‫ذل��ك ق��د ي�وؤدي اإىل ع��دم تنفي��ذ اختب��ار التح ُّيز يف اأنظم��ة الذكاء اال�صطناع��ي ورمبا ال يكون‬ ‫وامل�صوؤولية‬ ‫الت�سريح من الوظائف‬
‫هناك جمال الإن�صاف االأفراد اأو املجتمعات املت�صررة من النتائج املُتح ِّيزة‪.‬‬ ‫اأثاراال�ص��تخدام املتزاي��د لل��ذكاء اال�صطناع��ي واآلأ ت��ة (‪ )Automation‬يف خُمتل��ف ال�صناع��ات املخ��ا ِوف ب�ص�اأن‬
‫ق��د ال ُحت� ِّ�دد ِف��رق التطوي��ر الت��ي تفتق��ر اإىل اخل��ربة موؤ�ص��رات التح ُّي��ز يف بيان��ات التدري��ب اأو‬ ‫االفتق��ار اإىل اخل��ربة‬ ‫ت�ص��ريح الب�ص��ر م��ن وظائفه��م وتاأث��ره عل��ى ُ�ص��بل عي���ص العامل��ني‪ ،‬فعل��ى الرغ��م م��ن اأن ال��ذكاء اال�صطناع��ي ُميكن��ه اأن‬
‫املعرف��ة يف ت�صمي��م من��اذج ال��ذكاء اال�صطناع��ي واختبا ِره��ا‬ ‫تُعاجله��ا‪ ،‬كم��ا اأن االفتق��ار اإىل ِ‬ ‫واملعرف��ة ل��دى فري��ق‬ ‫أي�صا اإىل فقدان الب�صر لوظائفهم وتزايد عدم امل�صاواة‬ ‫ُيوؤدي اإىل حت�صني الكفاءة واالإنتاجية‪ ،‬اإال اأنه ُميكن اأن ُيوؤدي ا ً‬
‫التحيزات القائمة‪.‬‬ ‫لتحقيق العدالة رمبا ُيوؤدي اإىل ا�صتمرارية ُّ‬ ‫التطوير‬ ‫يف الدخل؛ مما قد يكون له عواقب اجتماعية واقت�صادية �صلبية‪.‬‬
‫‪302‬‬ ‫‪301‬‬
‫م�سكلة امل�سوؤولية األأخالقية يف الذكاء األ�سطناعي‬ ‫احلدّ من التحيُّز وتعزيز األإن�ساف يف اأن مة الذكاء األ�سطناعي‬
‫‪The Problem of Moral Responsibility in AI‬‬ ‫‪Reducing Bias and Promoting Fairness in AI Systems‬‬
‫ُتع ُّد م�ص�كلة امل�ص�وؤولية االأخالقية عند ا�ص�تخدام اأنظمة الذكاء اال�صطناعي املتقدمة ق�صية مُعقَّدة‬ ‫البيانات املتنوعة واملُمثَّلة‬
‫ومتعددة اجلوانب‪ ،‬وقد حظيت باهتمام كبر يف ال�صنوات االأخرة‪.‬‬ ‫يُق�ص��د بذل��ك ا�ص��تخدام البيان��ات التي تعك���ص تن��وع املجموعة التي يت��م متثيلها‪ ،‬كما‬
‫تتمثّ�ل اإح�دى التحدي�ات الرئي�ص�ة الأنظم�ة ال�ذكاء اال�صطناع�ي املتقدم�ة يف قدرته�ا عل�ى اتخ�اذ‬ ‫زيادة العينات (‪:)Oversampling‬‬ ‫اأن��ه م��ن امله��م مراجع��ة وحتدي��ث البيان��ات املُ�ص��تخدَ مة لتدري��ب اأنظم��ة ال��ذكاء‬
‫الق�رارات والقي�ام باإج�راءات ُميك�ن اأن يك�ون له�ا عواق�ب اإيجابي�ة اأو �ص�لبية كب�رة عل�ى االأف�راد‬ ‫تُ�صر زيادة العينة يف تعلُّم االآلة اإىل زيادة‬ ‫اال�صطناعي بانتظام؛ للتاأكد من اأنها ما زالت مالئمة وغر ُمتح ِّيزة‪.‬‬
‫واملجتم�ع‪ ،‬ورغ�م ذل�ك‪ ،‬ال يك�ون الط�رف ال�ذي يج�ب حتميله امل�ص�وؤولية االأخالقية عن ه�ذه النتائج‬ ‫عدد عيّنات فئة ما داخل جمموعة بيانات‬ ‫تقنيات اإلغاء األنحياز‬
‫حم ّددًا دائمًا‪.‬‬ ‫لتح�ص��ني دق��ة النم��وذج‪ ،‬ويك��ون ذل��ك‬ ‫تت�صم��ن اأ�ص��اليب اإلغ��اء االنحي��از حتديد واإزال��ة البيانات املُتحيِّزة م��ن اأنظمة الذكاء‬
‫بوا�ص��طة امل�صاعف��ة الع�ص��وائية للع ّين��ات‬ ‫مثال‪ :‬زيادة‬‫اال�صطناعي؛ لتح�ص��ني معاير الدقة واالإن�صاف‪ ،‬فت�ص��مل هذه التقنيات ً‬
‫هناك راأي يقول‪ :‬اإن مطوِّري وم�صمِّمي اأنظمة الذكاء اال�صطناعي يجب اأن يتحملوا امل�صوؤولية عن‬ ‫املوج��ودة يف الفئ��ة اأو تولي��د عيّنات جديدة‬
‫اأي نتائ�ج �ص�لبية تَنتُ�ج ع�ن ا�ص�تخدامها‪ ،‬و ُي ؤوكِّ�د هذا ال�راأي على اأهمية �صمان ت�صمي�م اأنظمة ذكاء‬ ‫العين��ات (‪ )Oversampling‬اأو تقلي��ل العين��ات (‪ )Undersampling‬اأو زي��ادة‬
‫من الفئة نف�صها‪.‬‬ ‫البيان��ات (‪ )Data Augmentation‬ل�صم��ان تع ُّر���ص نظ��ام ال��ذكاء اال�صطناع��ي‬
‫ا�صطناع�ي تُراع�ي االعتب�ارات االأخالقي�ة ُوحت ِّم�ل املط ِّوري�ن امل�ص�وؤولية ع�ن اأي �ص�رر ق�د ت�ص�ببه‬
‫اخرتاعاتهم‪.‬‬ ‫لنقاط بيانات خُمتلفة‪.‬‬
‫وي��رى آاخ��رون اأن امل�ص�وؤولية ع��ن نتائ��ج ال��ذكاء اال�صطناع��ي ه��ي م�ص�وؤولية م�ص��رتكة بني‬ ‫القابلية للتف�سري وال�سفافية‬
‫�تخدمي التقني��ة‪،‬‬ ‫اأ�صح��اب امل�صلح��ة مب��ا فيه��م ُ�ص ّن��اع ال�صيا�ص��ات‪ ،‬واملنظم��ني و ُم�ص� ِ‬ ‫اإنّ جع��ل اأنظم��ة ال��ذكاء اال�صطناع��ي اأك��ر �ص��فافية واأك��ر قابلي��ة للتف�ص��ر ميكن��ه اأن‬
‫وي�ص��لط هذا الراأي ال�صوء على اأهمية �صمان ا�ص��تخدام اأنظمة الذكاء اال�صطناعي‬ ‫ي�ص��اعد يف تقلي���ص م�ص��توى التح ُّي��ز م��ن خ��الل ال�ص��ماح لل ُم�ص� ِ‬
‫�تخدمني بفه��م كيفي��ة‬
‫بطرائ��ق تتما�ص��ى م��ع املب��اد االأخالقي��ة‪ ،‬وتقيي��م املخاط��ر املرتبطة با�ص��تخدامها‬ ‫اتخ��اذ النظ��ام للق��رارات‪ ،‬ويت�صم��ن ذل��ك تو�صي��ح عملي��ة اتخ��اذ الق��رار وال�ص��ماح‬
‫واإدارتها بعناية‪.‬‬ ‫تقليل العينات (‪:)Undersampling‬‬ ‫�صتخدمني با�صتك�صاف ُخُم َرجات النظام واختبارها‪.‬‬ ‫لل ُم ِ‬
‫تقليل العينة هو عملية تقليل حجم جمموعة‬ ‫الت�سميم املعتمد على اإ�سرا األإن�سان‬
‫وهن��اك راأي ثال��ث يق��ول‪ :‬اإن اأنظم��ة ال��ذكاء اال�صطناع��ي ه��ي"ذاتٌ م�ص �وؤولة"‬
‫البيانات بحذف جمموعة فرعية من بيانات‬ ‫ُميك��ن اأن ي�ص��اهم اإ�ص��راك العن�ص��ر الب�ص��ري يف حلق��ة ت�صمي��م اأنظم��ة ال��ذكاء‬
‫لديه��ا ح�� ٌّ�ص اأخالق��ي وم�ص�وؤولة ع��ن اأفعاله��ا‪ ،‬وتق��ول ه��ذه النظري��ة‪ :‬اإنّ اأنظم��ة‬ ‫الفئ�ة االأك�رب للرتكي�ز عل�ى الع ّين�ات االأك�ر‬
‫ُتقدم��ة ُميك��ن اأن تتمت��ع بالفاعلي��ة واال�ص��تقاللية؛ مم��ا‬
‫ال��ذكاء اال�صطناع��ي امل ِّ‬ ‫اال�صطناع��ي يف التقلي��ل م��ن التح ُّي��ز‪ ،‬وذل��ك بال�ص��ماح للب�ص��ر بالتدخ��ل وت�صحي��ح‬
‫اأهمية‪ .‬ويكون ذلك مفيدًا ب�صكلٍ خا�ص اإذا‬ ‫ُخُم َرج��ات النظ��ام عن��د ال�ص��رورة‪ ،‬وي�ص��مل ذل��ك ت�صمي��م اأنظم��ة ذكاء ا�صطناع��ي‬
‫يجعلها اأكر من جمرد اأدوات‪ ،‬كما تتطلب منها اأن تكون م�صوؤولة عن اأفعالها‪،‬‬ ‫كانت جمموعة البيانات تفتقر اإىل التوازن‬
‫اإال اأن لهذه النظرية عدة م�صكالت‪.‬‬ ‫به��ا مرحل��ة للتغذي��ة الراجع��ة ُمت ِّك��ن الب�ص��ر م��ن مراجع��ة ق��رارات النظ��ام واملوافق��ة‬
‫بني الفئات اأو بني جمموعاتها املختلفة‪.‬‬ ‫عليها‪.‬‬
‫ت�ص��تطيع اأنظم��ة ال��ذكاء اال�صطناع��ي اأن ت ُْ�ص��دِ ر اأحكامً ��ا واأن تت�ص��رف‬
‫ح�ص اأخالقي‬ ‫من تلقاء نف�صها‪ ،‬ولكنها لي�صت "ذاتًا م�صوؤولة" لديها ٌّ‬ ‫املباد األأخالقية‬
‫وذلك لالأ�صباب التالية‪:‬‬ ‫تعن��ي دم��ج املب��اد االأخالقي��ة مث��ل‪ :‬االإن�ص��اف وال�ص��فافية وامل�ص��اءلة‪ ،‬يف ت�صمي��م‬
‫ا ًأوال‪ :‬اأن اأنظمة الذكاء اال�صطناعي تفتقر اإىل الوعي واخلربات‬ ‫وتنفيذ اأنظمة الذكاء اال�صطناعي‪ ،‬من اأجل �صمان تطوير تلك االأنظمة وا�صتخدامها‬
‫الذاتية؛ مما ُيع ُّد �ص�مة اأ�صا�ص�ية من �ص�مات "الذات امل�ص�وؤولة"‬ ‫ب�ص��كل اأخالقي وم�ص�وؤول‪ ،‬وذلك بو�صع اإر�ص��ادات اأخالقية وا�صحة ال�صتخدام اأنظمة‬
‫ح�ص اأخالقي‪ ،‬ويف العادة تت�صمن الفاعلية االأخالقية‬ ‫التي لديها ٌّ‬ ‫زيادة البيانات‬ ‫الذكاء اال�صطناعي ومراجعة هذه االإر�صادات بانتظام وحتديثها عند ال�صرورة‪.‬‬
‫القدرة على التفكر يف املُثُل العليا للفرد واأفعاله‪.‬‬ ‫(‪:)Data ugmentation‬‬ ‫املراقبة والتقييم بانت ام‬
‫ثان ًي��ا‪ :‬يقوم االأ�ص��خا�ص بتدري��ب اأنظمة الذكاء اال�صطناعي على‬ ‫زي��ادة البيان��ات ه��ي عملي��ة تولي��د بيان��ات‬ ‫ُتع ُّد املراقبة والتقييم ب�صكل دوري الأنظمة الذكاء اال�صطناعي اأمرًا �صروريًا لتحديد‬
‫اتب��اع قواع��د واأهداف حم َّددة؛ مما يح ُّد من حكمها االأخالقي‪،‬‬ ‫تدري ��ب جدي ��دة م ��ن البيان ��ات املوج ��ودة‬ ‫التح ُّيز وت�صحيحه‪ ،‬ويت�صمن ذلك اختبار ُخُم َرجات النظام واإجراء عمليات تدقيق‬
‫ُوميك��ن الأنظم��ة ال��ذكاء اال�صطناع��ي تك��رار اتخ��اذ الق��رارات‬ ‫لتعزي ��ز اأداء من ��اذج تعلُّ ��م االآل ��ة‪ ،‬وم ��ن‬ ‫منتظمة؛ للتاأكد من اأن النظام يعمل ب�صكل عادل ودقيق‪.‬‬
‫حل��رة واال�ص��تقاللية‬ ‫االأخالقي��ة‪ ،‬م��ع افتقاره��ا ل �الإرادة ا ُ‬ ‫ا الأمثل ��ة عل ��ى ذ ل ��ك‪ :‬قل ��ب ال�ص ��ور‬ ‫تقييم تغذية املُ�ستخدِ م الراجعة‬
‫ال�صخ�صية‪.‬‬ ‫( ‪ )I m a ge F l i p p i n g‬وتدوير ه ��ا‬ ‫ُميك��ن اأن ت�ص��اعد التغذي��ة الراجع��ة الت��ي يقدمه��ا املُ�ص� ِ‬
‫�تخدم يف حتدي��د التح ُّي��ز يف‬
‫ُن�ص��ئي اأنظم��ة ال��ذكاء اال�صطناع��ي والقائم��ني‬ ‫واأخ�رًا‪ ،‬ف�اإن م ِ‬ ‫حتويال‬
‫ً‬ ‫وق�صه��ا وتغي��ر األوانه��ا وحتويله��ا‬ ‫النظ��ام؛ الأن املُ�ص� ِ‬
‫�تخدمني غال ًب��ا م��ا يكون��ون اأك��ر وع ًي��ا بتجاربه��م‪ُ ،‬وميكنه��م تق��دمي‬
‫على ن�صرها هم امل�صوؤولون عن اأفعالهم‪ُ ،‬وميكن الأنظمة الذكاء‬ ‫تاآلفي ��ا ( ‪)Affine Transformation‬‬ ‫روؤى عن التح ُّيز املحتمل اأف�صل مما ُميكن اأن تقدمه خوارزميات الذكاء اال�صطناعي‪.‬‬
‫اال�صطناع��ي اأن تُ�ص��اعد يف اتخ��اذ الق��رارات االأخالقي��ة‪ ،‬عل��ى‬ ‫والت�صوي�ص عليها‪.‬‬ ‫�تخدمون تغذية راجعة عن روؤيتهم الأداء نظام‬ ‫يقدم املُ�ص� ِ‬ ‫على �ص��بيل املثال‪ُ ،‬ميكن اأن ِّ‬
‫ح�ص اأخالقي‪.‬‬ ‫الرغم من اأنها لي�صت "ذاتًا م�صوؤولة" لديها ٌّ‬ ‫الذكاء اال�صطناعي اأو تقدمي اقرتاحات مفيدة لتح�صني النظام وجعله اأقل حت ُّيزً ا‪.‬‬
‫‪304‬‬ ‫‪303‬‬
‫تبني اأهميّة اخل�صائ�ص‪،‬‬ ‫تف�صرات يف �صكل درجات ّ‬ ‫ٍ‬ ‫م�صاهمة يف التنبوؤ‪ُ .‬ميكن ا�صتخدام الطريقة مع اأي منوذج‪ ،‬كما تقدم‬ ‫صخة‪،‬‬ ‫ال�سفافية وقابلية التف�سري يف الذكاء األ�سطناعي وم�سكلة ال�سندو األأ�سود‬
‫مما ُميكن اأن ي�صاعد يف حتديد اخل�صائ�ص االأكر تاأثرًا يف ُخُم َرجات النموذج‪.‬‬ ‫إج��راء‬
‫ميكن‬ ‫‪Transparency and Explainability in AI and the Black-Box Problem‬‬
‫وهن��اك تقني��ة اأخ��رى لتح�ص��ني قابلي��ة تف�ص��ر الذكاء اال�صطناعي مثل‪ :‬اأ�ص��جار القرار وقواعد الق��رار‪ ،‬وهي مناذج قابلة‬ ‫ن ام ال�سندو األأ�سود‬
‫للتف�ص��ر ُميك��ن ت�صويره��ا ب�ص��هولة‪ ،‬حي��ث تق��وم اأ�ص��جار الق��رار بتق�ص��يم ف�ص��اء اخل�صائ���ش (‪ )Feature Space‬بن��ا ًء‬ ‫صعه��ا‬ ‫تكم��ن م�ص��كلة ال�صن��دوق االأ�ص��ود يف ال��ذكاء اال�صطناع��ي يف التح��دي املُتم ِّث��ل يف فه��م كيفي��ة‬
‫(‪:)Black-Box System‬‬ ‫عم��ل نظ��ام قائ��م عل��ى ال��ذكاء اآل�صطناع��ي (‪ )AI-Based System‬باتخ��اذ الق��رارات اأو‬
‫عل��ى اخلا�صي��ة االأك��ر دالل��ة‪ ،‬وتق� ِّ�دم قواع��د وا�صح��ة التخ��اذ القرارات‪ ،‬وتُع ُّد اأ�ص��جار الق��رار مفيدة ب�ص��كل خا�ص عندما‬ ‫�صطناعي يف الرعاية ال�صحية‬
‫الآث��ار‬ ‫هو نظام ال يك�صف عن طرائق عمله‬ ‫اإنت ��اج املُخ َرج ��ات؛ مم ��ا ق ��د ُي�ص ِّع ��ب الوث ��وق بالنظ ��ام اأو تف�ص ��ره اأو حت�ص ��ينه‪ ،‬ورمب ��ا يوؤث ��ر‬
‫أي�صا؛ الأن قابلية‬
‫تتخذ البيانات �صكل اجلداول ويكون هناك عدد حمدود من اخل�صائ�ص‪ .‬ولكن هذه النماذج حمدودة ا ً‬
‫تف�ص��ر �ص��جرة القرار التي مت اإن�ص��اوؤها تتنا�ص��ب تنا�ص� ًبا عك�ص� ًّيا مع حجم ال�ص��جرة‪ .‬على �ص��بيل املثال‪ ،‬من ال�صعب فهم‬ ‫عل��ى جودة احلياة‪ ،‬وم��ن ثمّ تتخذ‬ ‫الداخلي�ة للب�ص�ر؛ اإذ تت�م التغذي�ة‬ ‫االفتق ��ار اإىل االنفت ��اح واإىل قابلي ��ة التف�ص ��ر عل ��ى ثق ��ة النا� ��ص يف النم ��وذج‪ .‬تتزاي ��د ه ��ذه‬
‫ي�صتخدم تقنيات مثل‪� :‬كالء الذكاء‬ ‫ِ‬ ‫االأ�صجار التي تتكون من اآالف العقد ومئات امل�صتويات‪ .‬واأخرًا‪ ،‬هناك اأ�صلوب اآخر‬ ‫��تخدَ مة يف التموي��ل‬ ‫ُدخ�الت‪ ،‬ليتم اإنتاج املُخرَجات‬‫بامل َ‬ ‫التحدي��ات بوج��ه خا���ص يف جم��ال الت�ص��خي�ص الطب��ي‪ ،‬واالأح��كام الت��ي ت�صدره��ا املركب��ات‬
‫اآل�صطناع��ي (‪ )Artificial Intelligence Agents‬اأو حتلي��ل احل�صا�ص��ية (‪ )Sensitivity Analysis‬للم�ص��اعدة‬ ‫دون معرِ فة طريقة عملها‪ ،‬كما هو‬ ‫ذاتي��ة القي��ادة‪ُ .‬تع� ُّد التح ُّي��زات يف من��اذج تعلُّم االآلة اإحدى املخ��اوف االأخرى املتعلقة بنماذج‬
‫يف فه��م كيفي��ة تاأث��ر تغي��ر املُدخَ ��الت اأو االفرتا�ص��ات عل��ى ُخُم َرج��ات النم��وذج‪ُ ،‬وميك��ن اأن يك��ون ه��ذا االأ�ص��لوب مفي��دً ا‬ ‫صوؤول‬ ‫مو�صح يف ال�صكل ‪.6.1‬‬ ‫َّ‬ ‫ال�صن��دوق االأ�ص��ود‪ ،‬كم��ا اأن التح ُّي��زات املوج��ودة يف البيان��ات الت��ي يت��م تدري��ب ه��ذه النماذج‬
‫ب�صكل خا�ص يف حتديد م�صادر الغمو�ص يف النموذج ويف فهم حدوده‪.‬‬ ‫عليه��ا ُميك��ن اأن ُت�وؤدي اإىل نتائ��ج غ��ر عادل��ة اأو عن�صري��ة‪ .‬باالإ�صاف��ة اإىل ذل��ك‪ ،‬رمب��ا يك��ون‬
‫م��ن ال�صع��ب حتدي��د امل�ص�وؤولية ع��ن الق��رارات التي يتخذها من��وذج ال�صندوق االأ�ص��ود؛ حيث‬
‫األ�ستدألل القائم على ال ِقيم يف اأن مة الذكاء األ�سطناعي‬ ‫امل ُدخَ الت‬ ‫ي�صع��ب حتمي��ل اأي �ص��خ�ص امل�ص�وؤولية ع��ن تل��ك الق��رارات ال �ص��يما م��ع وج��ود احلاج��ة اإىل‬
‫‪Value-Based Reasoning in AI Systems‬‬ ‫الرقابة الب�صرية‪ ،‬كما هو احلال يف اأنظمة االأ�صلحة ذاتية التحكم‪ .‬اإن االفتقار اإىل ال�صفافية‬
‫األ�ستدألل القائم على ال ِقيم‬ ‫يف عملي��ة اتخ��اذ القراربا�ص��تخدام ال��ذكاء اال�صطناع��ي ُي�ص ِّع��ب حتدي��د م�ص��كالت النم��وذج‬
‫(‪:)Value-Based Reasoning‬‬ ‫يتمثّل الهدف من ذلك يف اإن�صاء اأنظمة ذكاء ا�صطناعي اأكر ات�صاقًا مع القيم‬
‫وح ّله��ا‪ ،‬كم��ا اأن ع��دم معرف��ة الطريق��ة الت��ي يتخ��ذ به��ا النم��وذج قرارات��ه جُتع��ل م��ن ال�صع��ب‬

‫?‬
‫واالأخالقي��ات الب�ص��رية؛ بحي��ث تتعام��ل ه��ذه االأنظم��ة بطرائ��ق مفي��دة ومن�صف��ة‬
‫اال�ص�تدالل القا ئ�م عل�ى ال ِقي�م يف‬ ‫إاج��راء التح�ص��ينات والتاأك��د م��ن اأنه��ا تعمل بطريق��ة �صحيحة‪ ،‬وهناك ا�ص��رتاتيجيات عديدة‬
‫وم�صوؤولة‪ .‬تت�صمن اخلطوة االأوىل يف اال�صتدالل القائم على ال ِقيم‪َ ،‬‬
‫فهم ومتثيل‬ ‫‪Box‬‬
‫اأنظم�ة ال�ذكاء اال�صطناع�ي ي�ص�ر اإىل‬ ‫‪ck-‬‬ ‫ملعاجلة م�صكلة ال�صندوق االأ�صود يف الذكاء اال�صطناعي‪ .‬تتمثّل اإحدى تلك اال�صرتاتيجيات‬
‫�تخدمها وكالء الذكاء‬ ‫العملي�ة التي ي�ص ِ‬
‫اال�صطنا ع�ي التخ�اذ ق�رارات اأو‬
‫ال ِقي��م االأخالقي��ة داخ��ل اأنظم��ة ال��ذكاء اال�صطناع��ي‪ ،‬حي��ث يج��ب اأن تك��ون هذه‬
‫االأنظم��ة ق��ادرة على تف�ص��ر وتوطني القي��م اأو املباد التوجيهية االأخالقية التي‬ ‫?‬ ‫‪Bla‬‬
‫يف ا�ص��تخدام تقني��ات ذكاء ا�صطناع��ي قابل��ة للتف�ص��ر جلع��ل من��اذج تعلُّ��م االآلة اأكر �ص��فافية‬
‫واأك ��ر قابلي ��ة للتف�ص ��ر‪ ،‬وق ��د ت�ص ��مل ه ��ذه التقني ��ات‪ :‬مُف�ص ��رات اللغ ��ات الطبيعي ��ة‬
‫يُقدمه��ا من�ص�وؤها الب�ص��ريون اأو اأ�صح��اب امل�صلح��ة‪ ،‬وق��د تت�صم��ن ه��ذه العملي��ة‬
‫ا�ص�تخال�ص نتائ�ج بن�ا ًء عل�ى جمموع�ة‬ ‫التعلُّ��م م��ن االأمثل��ة اأو التغذي��ة الراجع��ة الب�ص��رية اأو القواع��د الوا�صحة‪ ،‬وعندما‬ ‫)‬ ‫(‪ )Natural Language Explanation‬اأو ت�صوي ��ر البيان ��ات للم�ص ��اعدة يف فه ��م عملي ��ة‬
‫حم� َّددة م�ص�بقًا م�ن القي�م اأو املب�اد‬ ‫تفه��م اأنظم��ة ال��ذكاء اال�صطناعي هذه القيم بو�ص��وح‪ُ ،‬ميكنها اأن تقوم مبواءمة‬ ‫اتخاذ القرار‪ ،‬وهناك اأ�صلوب اآخر يتمثل يف ا�صتخدام مناذج تعلُّم االآلة االأكر قابلية للتف�صر‬
‫اأو االعتب�ارات االأخالقية‪.‬‬ ‫اأفعالها بطريقة اأف�صل مع املباد االأخالقية املن�صودة‪.‬‬ ‫امل ُخرَجات‬ ‫مث ��ل‪ :‬اأ�ص ��جار الق ��رار (‪ )Decision Trees‬اأو اآلنح ��دار اخلط ��ي (‪،)Linear Regression‬‬
‫�صكل ‪ :6.1‬نظام ال�صندوق االأ�صود‬ ‫ورمب��ا تك��ون ه��ذه النم��اذج اأق��ل تعقي��دًا واأ�ص��هل يف الفهم‪ ،‬ولكنها قد ال تكون قوي��ة اأو دقيقة مثل‬
‫الق‬ ‫النم��اذج االأك��ر تعقي��دًا‪ .‬تعترب معاجلة م�ص��كلة ال�صندوق االأ�ص��ود يف ال��ذكاء اال�صطناعي اأم ًرا‬
‫امل ُخرَجات‬ ‫يم امل‬ ‫منوذج الذكاء اآل�صطناعي‬ ‫امل ُدخَ الت‬
‫م‬ ‫ح َّددة‬ ‫مه ًّما لبناء الثقة يف مناذج تعلُّم االآلة و�صمان ا�صتخدامها باأ�صلوب اأخالقي وعادل‪.‬‬
‫�صب ًقا‬
‫طرائق تعزيز �سفافية مناذج الذكاء األ�سطناعي وقابليتها للتف�سري‬
‫‪Methods for Enhancing the Transparency and Explainability of AI Models‬‬
‫�صكل ‪ :6.2‬متثيل لال�صتدالل القائم على القيمة‬
‫النموذج املحايد املحلي القابل للتف�سري وال�سر‬
‫يُركز اجلانب الثاين من جوانب اال�صتدالل القائم على ال ِقيم على تقييم القرارات اأو االأفعال بنا ًء على ال ِقيم التي �ُطنّت‬ ‫النم��وذج املحاي��د املحل��ي القاب��ل للتف�ص��ر �ال�ص��رح (‪ )Local Interpretable Model-Agnostic Explanations -LIME‬مت‬
‫(‪ ،)Internalized Values‬ويج�ب اأن تق�وم اأنظم�ة ال�ذكاء اال�صطناع�ي بتقيي�م النتائ�ج املحتملة للق�رارات اأو االإجراءات‬ ‫ا�صتخدامه م�صبقًا يف مهام معاجلة اللغات الطبيعية(‪ ،)NLP‬وتقوم هذه التقنية بتوليد تف�صرات حملية لتنبوؤات مفردة يتم اإجراوؤها‬
‫املختلفة بالنظر يف عواقب كل خيار وخُماطره وفوائده‪ ،‬كما يجب اأن تاأخذ عملية التقييم هذه يف االعتبار القيم االأ�صا�صية‬ ‫وقابال للتف�ص��ر يقارب منوذج ال�صندوق االأ�ص��ود املُعقَّد حول تنبوؤ حم َّدد‪ ،‬ثم‬
‫بوا�ص��طة منوذج‪ ،‬و ُتن�ص��ئ هذه التف�ص��رات منوذجً ا اأب�ص��ط ً‬
‫التي مت ت�صميم نظام الذكاء اال�صطناعي لدعمها‪ ،‬مما ي�صمن اأن يتخذ النظام خيارات م�صتنرة ومتوافقة مع القيم‪.‬‬ ‫تو�صل اإىل قراره ب�ص�اأن هذا التنبوؤ املحدَّد‪ .‬تتمثّل ميزة هذه التقنية يف اأنها ُتوفر تف�ص��رات‬
‫ُي�ص��تخدم هذا النموذج الب�ص��يط ل�ص��رح كيف ّ‬
‫ُميك��ن لالإن�ص��ان قراءته��ا‪ ،‬وبالت��ايل ُميك��ن الأ�صحاب امل�صلحة غر املتخ�ص�صني فهمها ب�ص��هولة؛ حتى فيم��ا يتعلق بالنماذج املُع َّقدة مثل‪:‬‬
‫واأخرًا‪ ،‬يتطلب اال�ص�تدالل القائم على ال ِقيم من اأنظمة الذكاء اال�صطناعي اتخاذ قرارات تتما�ص�ى مع القيم الرا�ص�خة‪،‬‬ ‫ال�صبكات الع�صبية العميقة (‪.)Deep Neural Networks‬‬
‫فبع�د تقيي�م اخلي�ارات املختلف�ة ونتائجها املحتمل�ة‪ ،‬يجب على نظام الذكاء اال�صطناعي اأن ينتقي الق�رار اأو االإجراء الذي‬
‫ُميثِّل املباد واالأهداف االأخالقية التي ُ�ص ِّمم التباعها‪ ،‬فمن خالل اتخاذ قرارات متوافقة مع القيم‪ ،‬ميكن لوكالء الذكاء‬ ‫تف�سيرات �سابلي األإ سافية‬
‫اآل�صطناع�ي (‪ )AI Agents‬الت�ص�رف بطرائ�ق تتف�ق م�ع املب�اد التوجيهي�ة االأخالقي�ة الت�ي و�صعها ُمن�ص�وؤها؛ مما ِّ‬
‫يعزز‬ ‫تف�ص��رات �ص��ابلي اآلإ�صافي��ة (‪ )SHapley Additive exPlanations - SHAP‬ه��ي طريق��ة أاخ��رى لتف�ص��ر ُخُم َرج��ات من��اذج تعلُّ��م‬
‫ال�صلوك امل�صوؤول واملفيد‪ .‬على �صبيل املثال‪ :‬تُ�صتخدم اأنظمة الذكاء اال�صطناعي يف الرعاية ال�صحية للم�صاعدة يف اتخاذ‬ ‫االآل��ة‪ ،‬وتعتم��د عل��ى املفه��وم اخلا���ص بقي��م �ص��ابلي م��ن نظري��ة اآلألع��اب (‪ )Game Theory‬وت ِّ‬
‫ُخ�ص���ص قيم��ة (اأو وَز ًن��ا) ل��كل خا�صي��ة‬
‫‪306‬‬ ‫‪305‬‬
‫األأُطر التن يمية ومعايري ال�سناعة‬ ‫قرارات الت�صخي�ص والعالج‪ ،‬حيث يجب اأن تكون هذه االأنظمة قادرة على التفكر يف االآثار االأخالقية املرتتبة على العالجات‬
‫املختلفة مثل‪ :‬االآثار اجلانبية املحتملة اأو التاأثر على جودة احلياة‪ ،‬ومن ثمّ تتخذ قرارات تُعطي االأولوية ل�صالمة املري�ص‪،‬‬
‫‪Regulatory Frameworks and Industry Standards‬‬ ‫ومن االأمثلة االأخرى‪ :‬اأنظمة الذكاء اال�صطناعي املُ�ص�تخدَمة يف التمويل للم�ص�اعدة يف اتخاذ قرارات اال�ص�تثمار‪ .‬يجب اأن‬
‫تلعب االأُطر التنظيمية ومعاير ال�صناعة دورًا مهمًّا يف تعزيز تطبيقات الذكاء اال�صطناعي االأخالقية‪ ،‬فباإمكان التنظيمات امل ِ‬
‫ُ�صاعدة‬ ‫تكون هذه االأنظمة قادرة على اأن تُفكر يف االآثار االأخالقية املرتتبة على اال�صتثمارات املختلفة‪ ،‬كالتاأثر على البيئة اأو على‬
‫اأن ت�صم��ن َحت ُّم��ل املنظم��ات الت��ي تق��وم بتطوي��ر وا�ص��تخدام اأنظم��ة الذكاء اال�صطناعي امل�ص�وؤولية عن اأفعالها عن طري��ق حتديد توقُّعات‬ ‫الرعاية االجتماعية‪ ،‬وبالتايل تتخذ القرارات التي تتما�صى مع قيم امل�صتثمر‪.‬‬
‫وعواق��ب وا�صح��ة لع��دم االمتث��ال‪ ،‬وباإم��كان التنظيم��ات واملعاي��ر اأن ُحتف��ز املنظم��ات عل��ى اإعط��اء االأولوي��ة لالعتب��ارات االأخالقي��ة عن��د‬ ‫يج�ب اأن ن�درك اأن امل�ص�وؤولية ال تق�ع باأكمله�ا عل�ى عات�ق نظ�ام ال�ذكاء اال�صطناع�ي‪ ،‬ب�ل اإنها م�ص�وؤولية م�ص�رتكة ب�ني الذكاء‬
‫تطوير وا�صتخدام اأنظمة الذكاء اال�صطناعي‪.‬‬ ‫ُلخ�ص احلالة ويقدِّم اخليارات‬ ‫اال�صطناعي واخلرباء الب�صريني‪ ،‬فنظام الذكاء اال�صطناعي ي�صاعد يف اتخاذ القرار باأن ي ِّ‬
‫ال�سفافية‬ ‫�صتخدم اخلبر الذي يتخذ القرار النهائي؛ مما يوؤكد اأن اخلبر الب�صري هو املتحكم وامل�صوؤول عن النتيجة‬ ‫اأو العرو�ص لل ُم ِ‬
‫ُميكن اأن تعزِّ ز التنظيمات واملعاير ال�صفافية يف اأنظمة الذكاء اال�صطناعي مبطالبة املوؤ�ص�صات بالك�صف عن كيفية عمل اأنظمتها وعن‬ ‫النهائية‪ ،‬يف ظل اال�صتفادة من االأفكار والتحليالت التي ُيوفرها نظام الذكاء اال�صطناعي‪.‬‬
‫ِ‬
‫ت�صتخدمها‪ُ ،‬وميكن اأن ي�صاعد ذلك يف بِناء الثقة مع اأ�صحاب امل�صلحة وتقليل املخاوف من التح ُّيزات املحتملة اأو التمييز‬ ‫البيانات التي‬
‫املحتمل يف اأنظمة الذكاء اال�صطناعي‪.‬‬
‫الذكاء األ�سطناعي وتاأ ريه على البي ة ‪AI and Environmental Impact‬‬
‫تقييم املخاطر‬
‫ُميكن تقليل خُماطر العواقب غر املق�صودة اأو النتائج ال�ص��لبية الناجُتة عن ا�ص��تخدام الذكاء اال�صطناعي بو�صع التنظيمات واملعاير‬ ‫اإن تاأثر الذكاء اال�صطناعي على البيئة وعلى عالقتنا بها مُعقَّد ومتعدد االأوجه‪.‬‬
‫املنا�صبة‪ ،‬وذلك مبطالبة املنظمات باإجراء تقييمات للمخاطر‪ ،‬وهذا يعني حتديد املخاطر واالأخطار املحتملة وتنفيذ �صمانات منا�صبة‪،‬‬ ‫فوائده املحتملة‬
‫مما ُميكِّن التنظيمات واملعاير من امل�صاعدة يف تقليل االأ�صرار املحتملة على االأفراد واملجتمع‪.‬‬ ‫ُميك��ن لل��ذكاء اال�صطناع��ي اأن ي�ص��اعد يف فه��م التحدي��ات البيئي��ة والتعام��ل معه��ا ب�ص��كل‬
‫تطوير ون�سر اأُطر عمل وا سحة للذكاء األ�سطناعي‬
‫اأف�ص��ل مث��ل‪ :‬تغ��ر املن��ا ‪ ،‬والتل��وث‪ ،‬وفق��دان التن��وع البيولوج��ي‪ُ ،‬وميكن��ه اأن ي�ص��اعد يف‬
‫ُميكن اأن ت�صجِّ ع التنظيمات واملعاير االبتكار بتوفر اإطار عمل وا�صح لتطوير اأنظمة الذكاء اال�صطناعي وا�صتخدامها؛ اإذ اأن ا�صتخدام‬ ‫حتلي��ل كمي��ات هائل��ة من البيانات والتنبوؤ بتاأثر االأن�ص��طة الب�ص��رية املختلفة على البيئة‪،‬‬
‫التنظيم��ات واملعاي��ر لتاأ�صي���ص فر���ص متكافئ��ة وتقدمي التوجيه بخ�صو�ص االعتبارات االأخالقية ُميكن اأن ي�ص��اعد املنظمات على تطوير‬ ‫ُوميكنه كذلك اأن ي�صاعد يف ت�صميم اأنظمة اأكر كفاءة وا�صتدامة‪ ،‬مثل اأنظمة‪� :‬صبكات‬
‫اأنظم��ة ال��ذكاء اال�صطناع��ي ون�ص��رها بطرائ��ق تتف��ق م��ع القي��م االأخالقي��ة واالجتماعي��ة‪ .‬تلع��ب االأُطر التنظيمي��ة ومعاي��ر ال�صناعة دو ًرا‬
‫�صكل ‪ :6.3‬حتليل الذكاء اال�صطناعي‬ ‫الطاقة‪ ،‬والزراعة‪ ،‬والنقل‪ ،‬واملباين‪.‬‬
‫لكميات �صخمة من البيانات‬
‫مه ًّم��ا يف تعزي��ز تطبيق��ات ال��ذكاء اال�صطناع��ي االأخالقي��ة‪ ،‬وذل��ك بتوف��ر اإر�ص��ادات وحواف��ز وا�صح��ة للموؤ�ص�ص��ات حت��ى تُعط��ي االأولوي��ة‬ ‫اأخطاره اأو أا سراره املُحتملة‬
‫لالعتب��ارات االأخالقي��ة والتنظيم��ات واملعاي��ر؛ مم��ا ي�صم��ن تطوير اأنظمة الذكاء اال�صطناعي وا�ص��تخدامها بطرائق تتما�ص��ى مع القيم‬ ‫هناك خُماوف من تاأثر الذكاء اال�صطناعي نف�صه على البيئة؛ اإذ يتطلب تطوير اأنظمة‬
‫االجتماعية واالأخالقية‪.‬‬ ‫ال��ذكاء اال�صطناع��ي وا�ص��تخدامها ق��درًا كب�رًا م��ن الطاق��ة وامل��وارد؛ مم��ا ق��د يُ�ص�هِّم يف‬
‫انبع��اث غ��ازات تُفا ِق��م م��ن م�ص��كلة االحتبا���ص احل��راري وغرها م��ن االآث��ار البيئية‪ .‬على‬
‫التنمية امل�ستدامة للذكاء األ�سطناعي يف اململكة العربية ال�سعودية‬ ‫�صبيل املثال‪ ،‬قد يتطلب تدريب منوذج واحد للذكاء اال�صطناعي قدرًا من الطاقة يعادل‬
‫‪Sustainable AI Development in the Kingdom of Saudi Arabia‬‬ ‫ما ت�ص��تهلكه العديد من ال�ص��يارات طِ وال حياتها‪ .‬باالإ�صافة اإىل ذلك‪ ،‬ميكن اأن ي�ص��اهم‬
‫م��ن املتو َّق��ع اأن ت�صب��ح تقني��ات ال��ذكاء اال�صطناع��ي واأنظمت��ه اأح��د العوامل الرئي�ص��ة‬ ‫�تخدمة يف ت�صني��ع اأنظم��ة ال��ذكاء اال�صطناع��ي يف تلوث‬ ‫اإنت��اج املُك ِّون��ات االإلكرتوني��ة املُ�ص� َ‬
‫الت��ي ُت�وؤدي اإىل اإح��داث خل��ل يف القطاع��ات املالي��ة يف العدي��د من البل��دان‪ ،‬وقد توؤثر‬ ‫البيئة مثل‪ :‬ا�صتخدام املواد الكيميائية ال�صامة وتوليد النفايات االإلكرتونية‪.‬‬
‫ب�ص��كل كب��ر عل��ى �ص��وق العم��ل‪ ،‬وم��ن املتو َّق��ع يف ال�ص��نوات القادم��ة اأن ي�صب��ح ح��وايل‬ ‫ع��الوة عل��ى ذل��ك‪ُ ،‬ميك��ن اأن يغ��ر ال��ذكاء اال�صطناع��ي عالقتن��ا بالبيئ��ة بطرائ��ق لي�ص��ت‬
‫‪ 70 %‬م��ن االأعم��ال الروتيني��ة الت��ي يق��وم به��ا العم��ال موؤمتت��ة بالكام��ل‪ .‬كم��ا أان��ه م��ن‬ ‫اإيجابي��ة دائ ًم��ا‪ ،‬فق��د ُي�وؤدي ا�ص��تخدام ال��ذكاء اال�صطناع��ي يف الزراع��ة اإىل ممار�ص��ات‬
‫املتو َّق��ع اأن تخل��ق �صناع��ة ال��ذكاء اال�صطناع��ي �ص��بعة وت�ص��عني ملي��ون وظيف��ة جدي��دة‬ ‫�صكل ‪ :6.4‬تتطلب اأنظمة الذكاء‬
‫اال�صطناعي كميات هائلة من‬ ‫زراعي��ة مك َّثف��ة ومر ِّك��زة عل��ى ال�صناع��ة؛ مم��ا يوؤث��ر �ص��لبًا عل��ى �صح��ة الرتب��ة والتن��وع‬
‫وت�صيف �صتة ع�صر تريليون دوالر اأمريكي اإىل الناجت املحلي االإجمايل العَاملَ ي‪.‬‬ ‫الطاقة واملوارد‬ ‫البيولوجي‪ .‬باملثل‪ ،‬رمبا ُيوؤدي ا�صتخدام الذكاء اال�صطناعي يف النقل اإىل زيادة االعتماد‬
‫لقد طوَّرت الهيئة ال�صعودية للبيانات �الذكاء اآل�صطناعي (‪)Saudi Data and Artificial Intelligence Authority - SDAIA‬‬ ‫عل��ى ال�ص��يارات واأ�ص��اليب النق��ل االأخ��رى؛ مم��ا ُي�ص� ِّهم يف تل��وث اله��واء وتدم��ر البيئ��ات‬
‫اأهدافًا ا�صرتاتيجية للمملكة ال�صتخدام تقنيات الذكاء اال�صطناعي املُ�صتدامة يف تنمية اململكة‪ ،‬و�صتكون اململكة العربية ال�صعودية‬ ‫الطبيعية التي ت�صكنها الكائنات احلية‪.‬‬
‫مركزً ا عامليًا للبيانات والذكاء اال�صطناعي‪ ،‬كما اأن اململكة ا�صت�صافت اأول قمة عاملية لهُ‪ ،‬حيث ُميكن للقادة واملبتكرين مناق�صة‬ ‫اخلامتة‬
‫م�ص�تقبل الذكاء اال�صطناعي وت�ص�كيله ل�صالح املجتمع‪ .‬اأما الهدف االآخر فيتمثل يف حتويل القوى العاملة يف اململكة من خالل‬ ‫بوجه عام‪ ،‬يعتمد تاأثر الذكاء اال�صطناعي على البيئة وعالقتنا بها على كيفية تطوير اأنظمة الذكاء اال�صطناعي وا�ص��تخدامها‪ ،‬ومن‬
‫تطوي�ر البيان�ات املحلي�ة ودع�م املواه�ب يف ال�ذكاء اال�صطناع�ي‪ .‬ومبا اأن الذكاء اال�صطناعي يقوم بتحويل اأ�ص�واق العمل عامليًا‪،‬‬ ‫املهم النظر يف التاأثرات البيئية املحتملة للذكاء اال�صطناعي وتطوير اأنظمته وا�صتخدامها بطرائق تُعطي االأولوية لال�صتدامة والكفاءة‬
‫ف�اإن معظ�م القطاع�ات حتت�اج اإىل تكيي�ف البيان�ات وال�ذكاء اال�صطناعي ودجمه�ا يف التعليم والتدريب املهن�ي واملعرِ فة العامة‪،‬‬ ‫و�صالمة كوكب االأر�ص‪.‬‬
‫وبذلك ُميكن اأن تكت�صب اململكة العربية ال�صعودية ميزة تناف�صية من حيث التوظيف واالإنتاجية واالبتكار‪.‬‬

‫‪308‬‬ ‫‪307‬‬
‫مترينات‬ ‫اأم��ا اله��دف النهائ��ي فيتم ّث��ل يف ج��ذب ال�ص��ركات وامل�ص��تثمرين ع��ن طري��ق اأُط��ر عم��ل وحواف��ز تنظيمي��ة مرن��ة وم�ص��تقرة‪،‬‬
‫حيث �ص��رتكز االأنظمة على تطوير �صيا�ص��ات ومعاير للذكاء اال�صطناعي‪ ،‬مبا فيها ا�ص��تخدامه ب�ص��كل اأخالقي‪ .‬و�ص��يعمل‬
‫اإط��ار العم��ل عل��ى تعزي��ز التطوي��ر االأخالق��ي الأبح��اث وحلول ال��ذكاء اال�صطناعي ودعمه يف ظل توفر اإر�ص��ادات ومعاير‬
‫‪1‬‬ ‫حلماية البيانات واخل�صو�صية؛ مما �ص ُيوفر اال�صتقرار والتوجيه الأ�صحاب امل�صلحة العاملني يف اململكة‪.‬‬
‫خاطئة‬ ‫�صحيحة‬ ‫حَ دِّد اجلملة ال�صحيحة �اجلملة اخلاطئة فيما يلي‪:‬‬ ‫مثال‬

‫‪ .1‬تهتم اأخالقيات الذكاء اال�صطناعي بتطوير اأنظمة الذكاء اال�صطناعي فقط‪.‬‬ ‫تُخط��ط المملك��ة العربي��ة ال�ص��عودية آل�ص��تخدام اأنظم��ة �تقني��ات ال��ذكاء اآل�صطناع��ي كاأ�صا���ش‬
‫لم�ص��ر�عي المدينتين العمالقتين نيوم (‪� )NEOM‬ذا آلين (‪ .)THE LINE‬م�ص��ر�ع نيوم هو‬
‫مدينة م�صتقبلية �صيتم ت�صغيلها بالطاقة النظيفة‪� ،‬بها اأنظمة نقل متطورة‪� ،‬تقدِّم خدمات ذات‬
‫‪ .2‬من املحتمل اأن ُيوؤدي الذكاء اال�صطناعي واالأمتتة اإىل ت�صريح الب�صر من الوظائف‪.‬‬ ‫ِ‬
‫��صت�صتخدم‬ ‫تقنية عالية‪�� ،‬صتكون من�صة للتقنيات المتطورة‪ ،‬بما في ذلك الذكاء اآل�صطناعي‪،‬‬
‫حل��ول الم��دن الذكي��ة لتح�ص��ين ا�ص��تهالك الطاق��ة �اإدارة حرك��ة الم��ر�ر �الخدم��ات المتقدم��ة‬
‫‪ُ .3‬ميكن اأن ُيوؤدي االفتقار اإىل التنوع يف فِرق تطوير الذكاء اال�صطناعي اإىل عدم روؤية‬ ‫اآلأخ��رى‪�� .‬ص��يتم ا�ص��تخدام اأنظم��ة ال��ذكاء اآل�صطناع��ي فيه��ا لتح�ص��ين ج��ودة الحي��اة لل�ص��كان‬
‫التح ُّيزات اأو عدم معاجلتها‪.‬‬ ‫�لتعزيز اآل�ص��تدامة‪.‬‬
‫‪ُ .4‬ميكن اأن ي�صاعد دمج املباد االأخالقية يف اأنظمة الذكاء اال�صطناعي يف �صمان‬ ‫�بالمث��ل‪� ،‬ص��تكون مدين��ة ذا آلي��ن مدين��ة خطي��ة خالي��ة م��ن الكرب��ون مبني��ة بتقني��ات ال��ذكاء‬
‫اآل�صطناع��ي‪�� ،‬صت�ص� ِ‬
‫�تخدم اأنظم��ة ال��ذكاء اآل�صطناع��ي آلأتمت��ة بنيته��ا التحتي��ة �اأنظم��ة النق��ل‬
‫تطويرها وا�صتخدامها بطريقة م�صوؤولة‪.‬‬ ‫فيها مما يجعل حياة المقيمين فيها تت�ص��م بال�صال�ص��ة �الكفاءة‪�� ،‬ص��تكون الطاقة التي �صتُ�ص�غِّل‬
‫‪ .5‬يتطلب الت�صميم املعتمد على اإ�صراك االإن�صان اأن تعمل اأنظمة الذكاء اال�صطناعي دون‬ ‫المدينة طاقة نظيفة‪ ،‬كما اأن اآلأ�لوية �ص��تكون للمعي�ص��ة الم�ص��تدامة‪�� ،‬ص��يتم ا�ص��تخدام اآلأنظمة‬
‫اأي تدخل ب�صري‪.‬‬ ‫الت��ي تعم��ل بال��ذكاء اآل�صطناع��ي لمراقب��ة ا�ص��تخدام الطاقة �تح�ص��ينه �ان�ص��يابية حركة المر�ر‬
‫�الخدم��ات المتقدم��ة اآلأخ��رى‪.‬‬
‫‪ .6‬تدل م�صكلة ال�صندوق االأ�صود يف الذكاء اال�صطناعي على �صعوبة فهم كيفية و�صول‬ ‫�بوجه عام‪� ،‬صتلعب اأنظمة الذكاء اآل�صطناعي �تقنياته د�رًا حا�صمًا في تطوير م�صر�عي هاتين‬
‫خوارزميات الذكاء اال�صطناعي اإىل قراراتها اأو تنبوؤاتها‪.‬‬ ‫المدينتي��ن العمالقتي��ن‪� ،‬تمكينهم��ا م��ن اأن ت�صبح��ا مدينتي��ن م�ص��تدامتين م��ن م��دن الم�ص��تقبل‬
‫تت�صمان بالكفاءة �اآلبتكار‪.‬‬
‫‪ُ .7‬ميكن ت�صميم مناذج الذكاء اال�صطناعي لتكييف قراراتها اأو نتائجها وفقًا للقيم‬
‫االأخالقية الرا�صخة‪.‬‬ ‫األإر�سادات العاملية ألأخالقيات الذكاء األ�سطناعي ‪International AI Ethics Guidelines‬‬
‫‪ .8‬ا�صتخدام الذكاء اال�صطناعي على نطاق وا�صع له اآثار اإيجابية فقط على البيئة‪.‬‬ ‫مو�ص��ح يف اجل��دول الت��ايل‪ ،‬ط� َّورت منظم��ة اليون�ص��كو (‪ )UNESCO‬وثيق��ة اإر�ص��ادية تو�ص��ح بالتف�صي��ل القي��م‬
‫كم��ا ه��و َّ‬
‫واملباد التي يجب االلتزام بها عند تطوير اأنظمة وتقنيات الذكاء اال�صطناعي اجلديدة‪.‬‬

‫جدول  ‪ : .2‬قيم ومباد اأخالقيات الذكاء األ�سطناعي‬


‫‪�ِ 2‬صف كيف يوؤدي الذكاء اآل�صطناعي �اآلأ تة اإىل ت�صريح الب�صر من � ائفهم‪.‬‬ ‫املباد‬ ‫القيم‬
‫• احرتام كرامة االإن�ص��ان وحمايتها وتعزيزها‪ • ،‬التنا�صب وعدم االإ�صرار‪.‬‬
‫• ال�صالمة واالأمن‪.‬‬ ‫وحفظ حريته وحقوقه االأ�صا�صية‪.‬‬
‫• االإن�صاف وعدم التمييز‪.‬‬ ‫• ازدهار البيئة والنظام البيئي‪.‬‬
‫• اال�صتدامة‪.‬‬ ‫• �صمان التنوع وال�صمولية‪.‬‬
‫• اخل�صو�صية‪.‬‬ ‫• العي�ص يف ان�صجام و�صالم‪.‬‬
‫• الرقابة الب�صرية والعزمية‪.‬‬
‫• ال�صفافية وقابلية التف�صر‪.‬‬
‫• امل�صوؤولية وامل�صاءلة‪.‬‬
‫• الوعي والتثقيف‪.‬‬
‫• احلوكمة والتعاون القائمان على تع ُّدد اأ�صحاب امل�صلحة‪.‬‬
‫‪310‬‬ ‫‪309‬‬
‫الدر�ص الثاين‬ ‫‪ 3‬ا�صرح كيف ميكن اأن ت�صاهم بيانات التدريب امل ُتحيِّزة يف حتقيق نتائج ذكاء ا�صطناعي مُتحيِّزة‪.‬‬
‫التطبيقات الروبوتية ‪1‬‬
‫ورة يف العا با�ستخدام الروبوتية‬ ‫اإحدا‬
‫‪Revolutioni ing the World with Robotics‬‬
‫الروبوتي��ة ه��ي جم��ال �ص��ريع النم��و اأح��دث ث��ورة يف طريق��ة عم��ل النا���ص ويف عي�ص��هم‬
‫الروبوتية (‪:)Robotics‬‬ ‫وتفاعله��م م��ع بيئته��م وتطبيقاته��ا‪ ،‬وت�ص��مل جمموع��ة وا�ص��عة م��ن املج��االت‪ :‬بداي��ة من‬
‫تهتم الروبوتية بدرا�ص��ة الروبوتات‪ ،‬وهي‬ ‫الت�صني��ع وحت��ى ا�صتك�ص��اف الف�ص��اء‪ ،‬وم��ن االإج��راءات الطبي��ة اإىل تنظي��ف املن��زل‪،‬‬
‫اآالت ميكنه��ا اأداء جمموع��ة متنوع��ة م��ن‬ ‫وم��ن الرتفي��ه اإىل امله��ام الع�ص��كرية‪ .‬وتتم ّث��ل امليزة الرئي�ص��ة للروبوتي��ة يف قدرتها على‬
‫امله��ام بطريق��ة م�ص��تقلة اأو �ص��به م�ص��تقلة‬ ‫اأداء املهام املتكررة بدرجة عالية من الدقة واالإتقان‪ ،‬حيث ُميكن اأن تعمل الروبوتات‬
‫اأو حتت ت�ص ُّرف الب�صر‪.‬‬ ‫ب��ال تع��ب وب��دون اأخط��اء؛ مم��ا يجعله��ا مثالي��ة للقي��ام باملهام اخلط��رة اأو الت��ي ي�صعب‬
‫على الب�ص��ر القيام بها‪ .‬على �ص��بيل املثال‪ ،‬يف العمليات امل�صنعية ُت�ص��تخدم الروبوتات‬
‫الأداء بع�ص املهام مثل‪ :‬اللحام والطالء وجُتميع املُنتَجات‪ ،‬ويف املجال الطبي ُت�صتخدم‬ ‫‪ 4‬عرِّف م�صكلة ال�صند�ق اآلأ�صود يف اأنظمة الذكاء اآل�صطناعي‪.‬‬
‫الروبوت��ات الإج��راء العملي��ات اجلراحية بدقة اأكرب‪ ،‬ويف ا�صتك�ص��اف الف�صاء ُت�ص��تخدم‬
‫الروبوتات ال�صتك�صاف ودرا�صة الكواكب البعيدة‪.‬‬
‫الروبوتية واملُحاكِيات ‪Robotics and Simulators‬‬
‫هناك حتديان مهمان يف جمال الروبوتية هما‪ :‬التكلفة والوقت الالزمان لبناء‬
‫املُحاكي (‪:)Simulator‬‬ ‫اأجهزة الروبوت املاد ّية واختبارها‪ ،‬وهنا ياأتي دور امل ُحا ِكيات (‪)Simulators‬‬
‫برنام ��ج ي�ص ��مح للمطوِّري ��ن باختب ��ار‬ ‫التي تُ�صتخدم على نطاق وا�صع يف اأبحاث الروبوتية وتعليمها و�صناعتها؛ الأنها‬
‫ت�صميماته ��م وخوارزمياته ��م الروبوتي ��ة‬ ‫توف�ر طريق�ة فعّال�ة م�ن حي�ث التكلف�ة‪ ،‬كم�ا اأنه�ا اآمن�ة الختب�ار الروبوت�ات‬
‫وحت�ص��ينها يف ع��امَل افرتا�ص��ي قب��ل ِبن��اء‬ ‫وجُتربته�ا‪ ،‬حي�ث تتي�ح امل ِ‬
‫ُحاكي�ات للمط ِّوري�ن اإن�ص�اء بيئ�ات افرتا�صي�ة ُحتاك�ي‬
‫الروبوتات املاديّة‪.‬‬ ‫َ�امَل احلقيق�ي؛ مم�ا ي�ص�مح له�م باختب�ار ق�درات الروبوت�ات‬ ‫�ص�يناريوهات الع َ‬
‫واأدائه�ا يف جمموع�ة متنوع�ة م�ن املواقف‪ُ ،‬وميكنها حم�اكاة خُمتلف الظروف‬
‫اجلوية والت�صاري�ص والعقبات التي قد تواجهها الروبوتات يف الع ََامَل احلقيقي‪.‬‬
‫حاكي�ات اأن ُحتاك�ي التفاع�الت ب�ني الروبوت�ات املتع�ددة وب�ني‬‫كم�ا ُميك�ن لل ُم ِ‬
‫‪ 5‬قارن بني اآلآثار اآلإيجابية �ال�صلبية آلأنظمة الذكاء اآل�صطناعي على البيئة‪.‬‬
‫الروبوت�ات والب�ص�ر؛ مم�ا ي�ص�مح للمط ِّوري�ن بدرا�ص�ة وحت�ص�ني الطرائ�ق الت�ي‬
‫تتفاعل بها الروبوتات مع بيئتها‪.‬‬

‫�صكل ‪ :6.5‬حماكاة لالأذرع ال�صناعية‬


‫‪312‬‬ ‫‪311‬‬
‫مراقبة املنطقة ‪Area Surveillance‬‬ ‫وهن��اك مي��زة اأخ��رى للم ِ‬
‫ُحاكي��ات تتم ّث��ل يف اأنه��ا ت�ص��مح للمط ِّوري��ن بتعدي��ل ت�صامي��م وخوارزمي��ات الروبوت��ات املختلف��ة‪،‬‬
‫�تخدم اأداة ويبوت��ص لعم�ل ُحم�اكاة لطائ�رة‬‫يف ه�ذا الدر��ص والدر��ص الت�ايل �صت�ص ِ‬ ‫واختباره��ا ب�ص��هولة دون احلاج��ة اإىل ُمك ِّون��ات ماد ّي��ة حا�ص��وبية باهظ��ة الثم��ن؛ حي��ث ت�ص��مح بالتك��رار والتجريب بطريقة‬
‫نقطة الطريق (‪:)Waypoint‬‬ ‫ُم�ص َّ�رة ُحتل�ق ف�وق اأح�د املن�ازل ث�م �ص�تقوم برتقيته�ا لتكت�ص�ف احل�دود الب�ص�رية‬ ‫اأ�صرع‪ ،‬مما ُيوؤدي اإىل دورات تطوير اأكر �صرعة وت�صميمات اأكر كفاءة‪.‬‬
‫نقط��ة الطري��ق ه��ي موق��ع جغ��رايف‬ ‫ك ُمرا ِقب�ة‪ ،‬حي�ث تتك�ون املُح�اكاة م�ن طائ�رة ُم�ص َّ�رة تُقل�ع م�ن و�صع ال�ص�كون على‬ ‫جماال �صريع النمو يت�صمن جمموعة وا�صعة من التطبيقات وامل ِ‬
‫ُحاكيات التي تلعب دورًا مهمًّا‬ ‫وبوجه عام‪ُ ،‬تع ُّد الروبوتية ً‬
‫حم �دَّد يف ف�ص��اء ثالث��ي االأبع��اد تت��م‬ ‫االأر��ص وتب�داأ يف ال�دوران ح�ول املن�زل‪ .‬ويف الدر��ص الت�ايل‪� ،‬ص�تُ�صيف مي�زة روؤية‬ ‫يف تطوير الروبوتات عن طريق ال�صماح للمط ِّورين باختبار ت�صاميم الروبوتات وخوارزمياتها‪ ،‬وحت�صينها بطريقة اآمنة‬
‫برجم��ة الطائ��رة املُ�ص� َّ�رة لتط��ر اإليه��ا‬ ‫ُ�صرة با�صتخدام الكامرا اخلا�صة بها با�صتخدام مكتبة اأ�بن‬ ‫احلا�صب للطائرة امل َّ‬ ‫وغ��ر ُمكلف��ة‪ ،‬وم��ع ا�ص��تمرار تق� ُّدم التقني��ة‪ ،‬فم��ن املتو َّق��ع اأن تنم��و تطبيق��ات الروبوتية وا�ص��تخدام امل ِ‬
‫ُحاكي��ات‪ ،‬مما ميهّد‬
‫اأو مت��ر م��ن خالله��ا‪ .‬وتُ�ص��تخدم نق��اط‬ ‫�صي يف (‪ ،)OpenCV‬وهذا �صيمكنك من حتليل ال�صور التي التقطتها الكامرا‪.‬‬ ‫الطريق لع ََامَل اأكر اأمتت ًة وترابطً ا‪.‬‬
‫الطر ي��ق الإن�ص��اء م�ص��ارات ط��ران‬ ‫ن�ص برجمي بلغة البايثون وهو م�صوؤول‬ ‫ُ�صرة بوا�صطة ٍّ‬
‫مع َّر ف��ة م�ص��بقًا لتتبعه��ا الطا ئ��رات‬ ‫يتم التحكم يف الطائرة امل َّ‬
‫ُ�صرة مبا فيها ُحمركات املراوح والكامرا ونظام‬ ‫عن التحكم يف جميع االأجهزة امل َّ‬ ‫ويبوت�ص ‪Webots‬‬
‫املُ�ص� َّ�رة‪ ،‬وميك��ن �صبطه��ا با�ص��تخدام‬ ‫حتدي�د املواق�ع العامل�ي (‪ )Global Positioning System - GPS‬وم�ا اإىل‬
‫اإحداثي��ات نظ��ام حتدي��د املواقع العاملي‬ ‫ويبوت���ص اأداة برجمي��ة قوي��ة ُميكن ا�ص��تخدامها يف حماكاة الروبوت��ات وبيئاتها‪ ،‬وهي من�صة ممتازة‬
‫ذلك‪ ،‬كما اأنه يحتوي على مقطع برجمي ملزامنة جميع املُحركات لتحريك الطائرة‬ ‫ت�ص��تحق اإدخاله��ا يف عَ � َ�امَل الروبوت��ات وال��ذكاء اال�صطناعي‪ ،‬حيث ي�ص��تطيع الطلب��ة ت�صميم االأنظمة‬
‫اأو اأنظمة اأخرى قائمة على املواقع‪.‬‬ ‫ُ�صرة اإىل نقا الطريق (‪ )Waypoints‬املتنوعة وجعلها م�صتقرة يف الهواء‪.‬‬ ‫امل َّ‬ ‫واخلوارزمي��ات الروبوتي��ة وحماكاته��ا واختباره��ا با�ص��تخدام ه��ذه االأداة‪ ،‬دون احلاج��ة اإىل مع��دات‬
‫حا�صوبية باهظة الثمن‪.‬‬
‫البدء مع ويبوت�ص ‪Starting with Webots‬‬ ‫ُيع� ُّد ا�ص��تخدام اأداة ويبوت���ص يف ال��ذكاء اال�صطناع��ي مفي��دً ا ب�ص��كل خا���ص؛ الأنها تتي��ح للطلبة جُتربة‬
‫�صتتعرَّف يف هذا الدر�ص على اأداة ويبوت�ص وبيئتها‪ ،‬حيث تتكون حماكاة ويبوت�ص من عن�صرين‪:‬‬ ‫خوارزمي��ات تعلُّ��م االآل��ة واختب��ار اأدائه��ا يف بيئ��ة تعتم��د عل��ى املُح��اكاة‪ ،‬فم��ن خ��الل اإن�ص��اء روبوت��ات‬
‫• التعريف بروبوت واحد اأو اأكر وبيئاتها يف ملف عَا َ �يبوت�ش (‪.)Webots World‬‬ ‫وبيئات افرتا�صية ي�ص��تطيع الطلبة اأن ي�صتك�ص��فوا اإمكانيات وقيود الذكاء اال�صطناعي‪ ،‬واأن يتعلَّموا‬
‫كيفية برجمة االأنظمة الذكية التي ُميكِ نها اتخاذ القرارات بنا ًء على بيانات الزمن الواقعي‪.‬‬
‫• برنامج مُتحكِّم واحد اأو اأكر للروبوتات املذكورة‪.‬‬
‫ُميكنك تنزيل اأداة ويبوت�ص من الرابط التايل‪:‬‬
‫َع��ا َ �يبوت���ش (‪ )Webots World‬ه��و و�ص��ف ثالث��ي االأبع��اد خل�صائ���ص الروب��وت‪ ،‬حي��ث يت��م تعري��ف كل كائ��ن مب��ا يف ذل��ك‬
‫موقع��ه‪ ،‬واجُتاه��ه‪ ،‬وهند�ص��ته‪ ،‬ومظه��ره مث��ل‪ :‬لون��ه اأو �ص��طوعه ‪ ،‬وخ�صائ�ص��ه املادي��ة‪ ،‬ونوع��ه وم��ا اإىل ذلك‪ ،‬كما ُميك��ن اأن حتتوي‬ ‫‪https://github.com/cyberbotics/webots/releases/download/R2023a/webots-R2023a_setup.exe‬‬
‫الكائن��ات عل��ى كائن��ات اأخ��رى يف االأنظم��ة الهرمي��ة الت��ي تُ�ص��كل الع��وامَل‪ .‬عل��ى �ص��بيل املث��ال‪ ،‬ق��د يحت��وي الروب��وت عل��ى عجلت��ني‪،‬‬
‫وم�صت�ص��عر م�ص��افة‪ ،‬ومف�ص��ل يحت��وي عل��ى كام��را‪ ،‬ونحوه��ا‪ .‬يح� ِّ�دد مل��ف ال َع��ا (‪ )World File‬فق��ط ا�ص��م املُتح ِّك��م ال��الزم‬
‫�وامَل يف ملف��ات بتن�ص��يق‬ ‫ل��كل روب��وت‪ ،‬وال يحت��وي عل��ى املقط��ع الربجم��ي للمُتح ِّك��م (‪ )Controller‬يف الروبوت��ات‪ُ ،‬وحتف��ظ ال َع� ِ‬
‫َوامَل) تُخ َّزن فيه امللفات بتن�صيق "‪.".wbt‬‬ ‫"‪ ،".wbt‬ويحتوي كل م�صروع ويبوت�ص على جملد فرعي بعنوان ‪( worlds‬الع ِ‬
‫مُتحكِّم �يبوت���ش (‪ )Webots Controller‬هو برنامج حا�ص��ب يتحكم يف روبوت حمدَّد يف ملف الع ََامَل‪ُ ،‬وميكن ا�ص��تخدام اأي‬
‫لغ��ة م��ن لغ��ات الربجم��ة الت��ي يدعمه��ا ويبوت���ص لتطوي��ر املُتح ِّك��م مث��ل‪ :‬لغ��ة �ص��ي بل���ش بل���ش( ‪ )C‬ولغ��ة جاف��ا (‪ ،)Java‬ولكن��ك‬
‫�صت�ص��تخدِ م يف ه��ذا امل�ص��روع لغ��ة البايث��ون‪ .‬يُط ِل��ق ويبوت���ص كل برنام��ج م��ن برام��ج املُتح ِّك��م املُعط��اة كعملية منف�صل��ة عندما تبداأ‬
‫املُح��اكاة‪ ،‬ويق��وم برب��ط عملي��ات املُتح ِّك��م بالروبوت��ات الت��ي مت��ت حماكاته��ا‪ ،‬وعل��ى الرغ��م م��ن اأن العدي��د من الروبوت��ات ُميكنها‬
‫م�ص��اركة املقط��ع الربجم��ي نف�ص��ه لربنام��ج املُتح ِّك��م‪ ،‬اإال اأن كل روب��وت �صي�ص�غِّل العملي��ة اخلا�ص��ة ب��ه‪ُ .‬يخ�زَّن مَ �ص��در كل برنام��ج‬
‫مُتح ِّك��م وملفات��ه الثنائي��ة م ًع��ا يف جمل��د امل ُتح ِّك��م (‪ ،)Controller Directory‬حي��ث يحت��وي كل م�ص��روع ويبوت���ص عل��ى جمل��د‬
‫مُتحكِّم داخل املجلد الفرعي الذي يتخذ ا�صم ‪( controllers‬املُتحكِّمات)‪.‬‬
‫بي ة الويبوت�ص ‪The Webots Environment‬‬
‫عندما تفتح الربنامج‪� ،‬صتالحظ عدة حقول ونوافذ‪ ،‬حيث ت�صمل املُكوِّنات الرئي�صة لواجهة ويبوت�ص ما يلي‪:‬‬
‫�ص��ريط القائم��ة (‪:)Menu Bar‬يق��ع يف اجل��زء العل��وي م��ن الواجه��ة‪ ،‬ويُوف��ر �ص��ريط القوائ��م اإمكاني��ة الو�ص��ول اإىل اأوام��ر وخي��ارات‬
‫متنوعة للعمل على املُحاكاة مثل‪ :‬اإن�صاء منوذج روبوت اأو ا�صتراده‪ ،‬وتهيئة بيئة املُحاكاة‪ ،‬وت�صغيل عمليات املُحاكاة‪.‬‬
‫�صريط اآلأد�ات (‪:)Toolbar‬هو جمموعة من االأزرار املوجودة اأ�صفل �صريط القائمة ويُوفر الو�صول ال�صريع اإىل الوظائف املُ�صتخدَ مة‬
‫ب�صكل متكرر مثل‪ :‬اإ�صافة كائنات اإىل امل�صهد‪ ،‬وبدء املُحاكاة واإيقافها‪ ،‬وتغير عر�ص الكامرا‪.‬‬
‫�صكل ‪ :6.6‬م�صروع طائرة م َّ‬
‫ُ�صرة با�صتخدام اأداة ويبوت�ص‬
‫‪314‬‬ ‫‪313‬‬
‫اأوال‪ :‬علي��ك اأن تق��وم بتثبي��ت املكتب��ات الالزم��ة الت��ي �صت�ص� ِ‬
‫�تخدمها يف م�ص��روعك‪ .‬ميكن��ك تثبي��ت مكتب��ة اأ�ب��ن �ص��ي يف‬ ‫�صجرة امل�صهد (‪ :)Scene Tree‬هي متثيل هرمي للكائنات يف بيئة املُحاكاة‪ ،‬حيث تتيح للم ِ‬
‫ُ�صتخدمني التنقل يف امل�صهد‬
‫(‪ )OpenCV‬عن طريق باي ت�صارم (‪:)PyCharm‬‬ ‫والتعامل معه مثل‪ :‬اإ�صافة اأو حذف الكائنات‪ ،‬وتغير خ�صائ�ص الكائن‪ ،‬وجُتميع الكائنات واإدارتها ب�صكل اأ�صهل‪.‬‬
‫لتن�سيب مكتبة اأوبن �سي يف (‪:)OpenCV‬‬ ‫ُ �رِّر احلق�ل (‪ :)Field Editor‬ه�و واجه�ة ر�ص�ومات لتحري�ر خ�صائ��ص الكائن�ات يف بيئ�ة املُح�اكاة‪ ،‬حي�ث ُميك�ن‬
‫عامالت الكائن مثل‪ :‬مو�صعه‪ ،‬واجُتاهه‪ ،‬وحجمه‪ ،‬ومادته‪ ،‬وخ�صائ�صه الفيزيائية‪.‬‬ ‫للمُ�صتخدِ مني ا�صتخدامه ل�صبط ُم ِ‬
‫‪1‬‬ ‫ يف نافذة ‪( PyCharm‬باي ت�صارم)‪ ،‬ا�صغط على ‪( Packages‬حِ زم)‪.‬‬ ‫ناف�ذة ثالثي�ة اآلأبع�اد (‪ :)3D Window‬ه�ي ناف�دة العر��ص الرئي��ص لبيئ�ة املُحاكاة‪ ،‬وتعر��ص الكائنات وتفاعالتها يف‬
‫ اكتب "‪( "opencv‬اأوبن �صي يف) يف �صريط البحث‪2 .‬‬
‫�تخدمني التنق�ل يف الناف�ذة الثالثية االأبعاد با�ص�تخدام عنا�ص�ر حتكم الكامرا‬‫ف�ص�اء ثالث�ي االأبع�اد‪ ،‬حي�ث ُميك�ن للمُ�ص ِ‬
‫‪4‬‬ ‫ اخرت ‪( opencv-python‬اأوبن �صي يف‪ -‬بايثون)‪ 3 ،‬ثم ا�صغط على ‪( install‬تثبيت)‪.‬‬ ‫املختلفة مثل‪ :‬التحريك‪ ،‬والتكبر اأو الت�صغر‪ ،‬والتدوير‪.‬‬
‫ �صتظهر لك ر�صالة تخربك باكتمال التن�صيب‪5 .‬‬
‫ُ �رِّر الن� ّ�ش (‪ :)Text Editor‬ه�و اأداة لتحري�ر م�ص�در املقط�ع الربجم�ي اأو امللف�ات ّ‬
‫الن�صي�ة االأخ�رى املُ�ص�تخدَ مة يف‬
‫املُح�اكاة‪ ،‬ويق ِّ�دم يي�زًا ل ِبن�اء اجلم�ل (‪ )Syntax Highlighting‬وخ�صائ��ص مفي�دة أاخ�رى لكتابة املقاطع الربجمية‬
‫�ت�صحيحها (‪ ،)Debugging‬مثل‪ :‬اآلإكمال التلقائي (‪ )Auto-Completion‬واإبراز اآلأخطاء (‪.)Error Highlighting‬‬
‫�ح�دة التحك�م (‪ :)Console‬ه�ي ناف�ذة تعر��ص ُخُم َرج�ات قائم�ة عل�ى الن� ّ�ص من املُحاكاة‪ ،‬مبا يف ذلك ر�ص�ائل اخلطاأ‬
‫ومعلومات الت�صحيح‪ ،‬وهي مفيدة يف ا�صتك�صاف االأخطاء التي حتدث اأثناء املُحاكاة واإ�صالحها‪.‬‬
‫�صريط القائمة (‪.)Menu bar‬‬ ‫�صريط االأدوات (‪.)Toolbar‬‬ ‫الن�ص (‪.)Text editor‬‬
‫مُحرِّر ّ‬

‫‪5‬‬

‫�صجرة الم�صهد (‪.)Scene tree‬‬


‫‪2‬‬ ‫‪4‬‬

‫‪3‬‬

‫مُحرِّر الحقل (‪.)Field editor‬‬

‫نافذة ثالثية االأبعاد‬


‫‪1‬‬
‫(‪.)3D window‬‬

‫�صكل ‪ :6.8‬تثبيت مكتبة اأوبن �صي يف‬

‫باملثل‪ ،‬ميكنك تثبيت مكتبة بيلو (‪)Pillow‬‬


‫من خالل البحث عن كلمة "‪."pillow‬‬ ‫�صكل ‪ :6.7‬نافذة ويبوت�ص‬
‫وحدة التحكم (‪.)Console‬‬

‫‪316‬‬ ‫‪315‬‬
‫ُ�صرة‪.‬‬
‫الن�ص الربجمي بلغة البايثون الذي �صيُ�صتخدم يف التحكم يف الطائرة امل َّ‬
‫بعدها افتح ملف ّ‬ ‫دعونا نُلقي نظرة على امل�صروع‪ .‬اأوال‪ :‬عليك اأن تبحث عن ملف عَ َامَل ويبوت�ص وتقوم بتحميله‪.‬‬
‫ي للمُ تحكِّم‪:‬‬ ‫الن�ص ال‬
‫لفتح ّ‬ ‫لفتح عا ويبوت�ص‪:‬‬
‫‪1‬‬
‫ن�صي) من �صريط القائمة‪.‬‬‫ ا�صغط على ‪( File‬ملف)‪ ،‬ثم ‪( Open Text File‬افتح ملف ّ‬ ‫‪1‬‬ ‫ من ‪�( Menu bar‬صريط القائمة)‪ ،‬ا�صغط على ‪( File‬ملف)‪ ،‬ثم على ‪( Open World‬افتح عَ َامَل)‪.‬‬
‫ ابحث عن ملف ‪( drone_controller.py‬مُتحكِّم_الطائرة امل َّ‬
‫ُ�صرة)يف جملد ‪( controllers‬املُتحكِّمات) ثم جملد‬ ‫‪3‬‬ ‫َوامَل)‪ 2 ،‬ثم افتحه‪.‬‬‫ُ�صرة_ الع ََامَل) يف جملد ‪( worlds‬الع ِ‬
‫ ابحث عن ملف ‪( drone_world.wbt‬الطائرة امل َّ‬
‫ُ�صرة)‪ 2 ،‬ثم افتحه‪3 .‬‬ ‫‪( drone_controller‬مُتحكِّم_الطائرة امل َّ‬

‫‪1‬‬

‫‪1‬‬

‫‪2‬‬

‫‪2‬‬

‫‪3‬‬

‫�صكل ‪ :6.10‬فتح ّ‬
‫الن�ص الربجمي ملُتحكِّم ويبوت�ص‬

‫سع الكائن ودورانه ‪Object Position and Rotation‬‬ ‫مو‬


‫تُ�ص��تخدم االإحداثي��ات ثالثي��ة االأبع��اد ‪ X‬و‪ Y‬و‪ Z‬لتمثي��ل مو�ص��ع كائ��ن يف الف�ص��اء‪ ،‬حي��ث ُمي ِّث��ل ‪ X‬املح��ور االأفق��ي‪ ،‬و‪ Y‬املح��ور الراأ�ص��ي‪،‬‬
‫وخط الطول واالرتفاعات املُ�صتخدَمة لو�صف املواقع على االأر�ص‪.‬‬ ‫خلط العر�ص ّ‬ ‫و‪ Z‬حمور العمق‪ ،‬وتُ�صبه اإحداثيات الع ََامَل احلقيقي ّ‬
‫اآلنح��دار (‪ )Pitch‬واآللتف��اف (‪ )Roll‬واآلنع��راج (‪ )Yaw‬توجيه��ات دوراني��ة ُميك��ن ا�ص��تخدامُها لو�ص��ف حرك��ة كائ��ن ما بالن�ص��بة‬
‫لالإط��ار املرجع��ي كم��ا يظه��ر يف ال�ص��كل ‪ ،6.11‬فاآلنح��دار (‪ )Pitch‬ه��و دوران الكائ��ن ح��ول حم��وره ‪X‬؛ مم��ا يجعل��ه ميي��ل الأعل��ى اأو‬
‫الأ�ص��فل بالن�ص��بة للم�ص��توى االأفق��ي‪ ،‬اأم��ا اآللتف��اف (‪ )Roll‬فه��و دوران الكائ��ن ح��ول حموره ‪Y‬؛ مما يجعل اجل�ص��م ميي��ل جانبًا اأو من‬ ‫‪3‬‬
‫جان��ب اإىل آاخ��ر‪ ،‬واآلنع��راج (‪ )Yaw‬ه��و دوران الكائ��ن ح��ول حم��وره ‪Z‬؛ مم��ا يجع��ل اجل�ص��م يلت��ف اإىل الي�ص��ار اأو اليم��ني بالن�ص��بة‬
‫لالإطار املرجعي‪.‬‬
‫�صكل ‪ :6.9‬فتح عَ َامَل ويبوت�ص‬
‫ُميك�ن ا�ص�تخدام ه�ذه القي�م ال�ص�ت معً�ا (‪ ،X، Y، Z‬االنحدار‪،‬االلتف�اف‪ ،‬االنع�راج) لو�ص�ف مو�ص�ع كائ�ن يف الف�ص�اء ثالث�ي االأبع�اد‬
‫واجُتاهه‪ ،‬حيث ُت�صتخدم ب�صكل �صائع يف الروبوتات‪ ،‬واأنظمة املالحة‪ ،‬والتطبيقات االأخرى التي تتطلب حتديد املواقع والتحكم بدقة‪.‬‬ ‫ّ‬
‫‪318‬‬ ‫‪317‬‬
‫معني‪ ،‬و ُيع ُّد اجلرو�ص��كوب مفيدً ا‬ ‫اجلر��ص��كوب (‪ )Gyroscope‬ه��و م�صت�ص��عر يقي���ص ال�ص��رعة الزاو َّي��ة‪ ،‬اأو مع��دل ال��دوران ح��ول حم��ور ّ‬ ‫حمور االنحدار‬ ‫ُ�سرية ‪Drone Devices‬‬
‫اأجهزة الطائرة امل َّ‬
‫ب�ص��كل خا���ص يف اكت�ص��اف التغ��رات ال�صغ��رة يف اجُت��اه الطائرة املُ�ص� َّ�رة وت�صحيحه��ا‪ ،‬وهو اأمر مهم للحفاظ على اال�ص��تقرار والتحكم‬ ‫ُ�صرة (‪ )Drone‬بعدة مُ�صت�صعرات‬ ‫مت جُتهيز الطائرة امل َّ‬
‫اأثناء الطران‪.‬‬ ‫(‪ )Sensors‬تتيح لها اأن جُتمع املُدخَ الت من بيئتها‪ ،‬ويوفّر‬
‫كام��را الطائ��رة امل ُ�ص� َّ�رة (‪ )Drone's Camera‬تُ�ص��تخدم اللتق��اط ال�ص��ور اأثن��اء الط��ران‪ُ ،‬وميك��ن تثبيته��ا عل��ى الطائ��رة املُ�ص� َّ�رة‪،‬‬ ‫املُحاكي الدّالتني()‪ getDevice‬و()‪ enable‬للتفاعل مع‬
‫بحي��ث تتم ّك��ن م��ن التق��اط �ص��و ٍر م��ن جه��ات وزواي��ا خُمتلف��ة ع��ن طري��ق �صب��ط زاوي��ة انح��دار الكام��را (‪ )Camera Pitch‬با�ص��تخدام‬ ‫املُ�صت�صعرات وامل ُ�صغِّالت (‪ )Actuators‬املختلفة لروبوت‬
‫الدالة ()‪ .setPosition‬ويف هذا امل�صروع‪�ُ ،‬صبط املو�صع على ‪ ،0.7‬اأي حوايل ‪ 45‬درجة بالنظر اإىل االأ�صفل‪.‬‬ ‫املُحاكاة‪.‬‬
‫تُ�صتخدم دالة ()‪ getDevice‬للح�صول على قراءات جهاز‬
‫المروحيات‬ ‫اأجهزة املر�حيات اآلأربعة (‪ )Four Propeller‬يف الطائرة امل َّ‬
‫ُ�صرة هي مُ�صغِّالت تتحكم‬
‫مثل‪ :‬املُ�صت�ص�عر اأواملُ�ص�غِّل من منوذج روبوت ويبوت�ص‪ ،‬وتاأخذ‬
‫(‪.)Propellers‬‬ ‫يف �صرعة دوران املر�حية الرباعية (‪ )Quadcopter‬واجُتاهها‪ ،‬وهي طائرات ُم َّ‬
‫�صرة‬
‫وحتدد ا�صم اجلهاز املراد الو�صول اإليه‪.‬‬
‫ن�صيًّا ِّ‬ ‫ُم ِ‬
‫عام ًال ّ‬
‫ُجمهزة باأربعة د�َّارات (‪ ،)Rotors‬اثنان منهما يدوران يف اجُتاه عقارب ال�صاعة واالثنان‬
‫االآخران يدوران عك�ص اجُتاهها‪ ،‬حيث يولِّد دوَران هذه الد َّوارات قوة رفع (‪ )Lift‬وي�صمح‬ ‫تُ�ص�تخدم الدال�ة ()‪ enable‬لتن�ص�يط جه�از‪ ،‬بحي�ث ُميكن�ه‬
‫للطائرة املُ�ص َّ�رة باالإقالع واملناورة يف الهواء‪ .‬وكما هو احلال مع باقي االأجهزة‪ ،‬تُ�ص�رتد‬ ‫حمور االلتفاف‬ ‫حمور االنعراج‬ ‫البدء يف تقدمي البيانات اأو تنفيذ اإجراء حم َّدد‪.‬‬
‫املح�رِّكات وتو�ص�ع يف مو�صعه�ا‪ ،‬ولك�ن الدال�ة ()‪ُ setVelocity‬ت�ص�تخدم كذل�ك ل�صب�ط‬ ‫�صكل ‪ :6.11‬حماور الدوران‬
‫ال�صرعة االأولية لالأجهزة املروحية‪.‬‬
‫�صكل ‪ :6.13‬طائرة م َّ‬
‫ُ�صرة باأربع مروحيات‬
‫ُميكن لوحدة القيا�ش بالق�صور الذاتي (‪)Inertial Measurement Unit - IMU‬‬ ‫وحدة القيا�ص بالق�صور‬
‫نحو الهدف ‪Moving to a Target‬‬ ‫التحرُّ‬ ‫الكاميرا‬
‫قيا���ص الت�ص��ارع اخلط��يّ للطائ��رة املُ�ص� َّ�رة و�ص��رعتها الزاو ّي��ة‪ ،‬وقيا���ص الق��وى مث��ل‬ ‫(‪.)Camera‬‬ ‫الذاتي (‪.)IMU‬‬
‫لالنتق��ال م��ن موق��ع اإىل اآخ��ر‪ ،‬ت�ص��تخدِ م الطائرة املُ�ص� َّ�رة دالة ()‪ move_to_target‬التي حتت��وي على منطق التحكم‬ ‫اجلاذبي��ة‪ ،‬باالإ�صاف��ة اإىل ق��وى ال��دوران املوؤث��رة على الطائرة املُ�ص� َّ�رة‪ ،‬كما ُميكنها اأن‬
‫عامل‪ ،‬يف �صكل اأزواج [‪ ]X، Y‬؛ ال�صتخدامها كنقاط طريق‪.‬‬ ‫(‪ ،)Control Logic‬حيث تاأخذ قائمة االإحداثيات ك ُم ِ‬ ‫توف��ر معلوم��ات ع��ن و�ص��ع الطائ��رة املُ�ص� َّ�رة (االنح��دار‪ ،‬وااللتفاف‪ ،‬واالنع��راج)‪ ،‬وهو‬
‫يف البداي��ة‪ ،‬تتحق��ق الدال��ة ممّ ��ا اإذا ّمت��ت تهيئ��ة (‪ )Initialized‬مو�ص��ع امل�ص��تهدَف (‪ )Target Position‬اأم ال‪ ،‬ويف‬ ‫اأمر بالغ االأهمية لتحقيق اال�صتقرار والتحكم‪.‬‬
‫تل��ك احلال��ة ت�صبط��ه عل��ى نقط��ة الطري��ق االأوىل‪ ،‬ث��م تتحق��ق مم��ا اإذا كان��ت الطائ��رة املُ�ص� َّ�رة ق��د و�صل��ت اإىل املو�ص��ع‬ ‫نظ��ام حتدي��د املواق��ع العَا َمل��ي (‪ )Global Positioning System - GPS‬ه��و نظ��ام‬
‫امل�ص��تهدف بالدق��ة املُح� َّددة يف املُتغ� ِّ�ر ‪ .target_precision‬واإذا كان االأم��ر كذل��ك‪ ،‬تنتق��ل الدال��ة اإىل نقط��ة الطري��ق‬ ‫مالح��ة يعتم��د عل��ى القم��ر ال�صناع��ي ويُوف��ر للطائ��رة املُ�ص� َّ�رة معلوم��ات دقيق��ة ع��ن‬
‫امل�صتهدفة التالية‪.‬‬ ‫املواق��ع‪ ،‬ومي ِّك��ن نظ��ام حتدي��د املواق��ع العَاملَ ��ي الطائ��رة املُ�ص� َّ�رة م��ن معرف��ة موقعه��ا‬
‫ويج��ب ح�ص��اب الزاوي��ة ب��ني املو�ص��ع احل��ايل للطائ��رة املُ�ص� َّ�رة ومو�صعها امل�ص��تهدف؛ ملعرفة مدى قوة ال��دوران التي يجب‬ ‫احل��ايل وارتفاعه��ا و�ص��رعتها بالن�ص��بة اإىل االأر���ص‪ ،‬وه��ذه املعلوم��ات مهم��ة؛ للتنق��ل‬
‫اأن تكون عليه يف اخلطوة التالية‪ ،‬حيث متت معايرة هذه القيمة و�صبطها على النطاق [ ‪.]-‬‬ ‫ُ�صرة‪.‬‬
‫والتحكم يف الطائرة امل َّ‬
‫وبع��د ذل��ك‪ ،‬تق��وم الدال��ة بح�ص��اب ا�صطراب��ات االنع��راج واالنحدار املطلوبة لتوجيه الطائرة املُ�ص� َّ�رة نح��و نقطة الطريق‬
‫امل�صت�صعرات (‪ )Sensors‬هي اأجهزة تك�صف الكميات الفيزيائية اأ� اآلأحوال البيئية‬
‫ُ�صرة على التوايل‪.‬‬
‫امل�صتهدفة و�صبط زاوية انحدار الطائرة امل َّ‬ ‫�تقي�صها‪� ،‬حتوّلها اإىل اإ�صارة كهربائية للمراقبة اأ� التحكم‪.‬‬
‫ح�سابات املحرِّ كات ‪Motor Calculations‬‬
‫اأخرًا‪ ،‬يجب ح�ص��اب ال�ص��رعة التي ت�صبط بها املحرِّكات (‪ ،)Motors‬وذلك بقراءة القيم املبدئية لل ُم�صت�ص��عرات ‪ ،‬اأي‬
‫ق��راءة‪ :‬قي��م االلتف��اف واالنح��دار‪ ،‬واالنع��راج م��ن وح��دة القيا���ص بالق�ص��ور الذاتي‪ ،‬ويت��م احل�صول على قي��م موا�صع ‪ X‬و‬ ‫امل�صغِّالت (‪ )Actuators‬هي اأجهزة حتوِّل اآلإ�صارات الكهربائية اإىل حركة ميكانيكية‬
‫معني اأ� ُم ِهمَّة معيّنة‪.‬‬
‫آلأداء عمل ّ‬
‫‪ Y‬و‪ Z‬من نظام حتديد املواقع العَاملَ ي‪ ،‬بينما يتم احل�صول على قيم ت�صارع االلتفاف واالنحدار من اجلرو�صكوب‪.‬‬
‫ويت��م ا�ص��تخدام الثواب��ت (‪ )Constants‬املختلف��ة الت��ي مت تعريفه��ا يف املقط��ع الربجم��ي م�ص��بقًا إالج��راء احل�ص��ابات‬
‫دخالت املُ�صت�صعرات‪ ،‬ويف النهاية يتم �صبط الدفع (‪ )Thrust‬ال�صحيح‪.‬‬ ‫والتعديالت بالتزامن مع ُم َ‬ ‫بينما تقي�ش ال�صرعة اخلطية امل�صافة التي يقطعها اجل�صم خالل الثانية‪ ،‬فاإ َّن �صرعة‬ ‫نظام تحديد‬
‫الزا�ية تقي�ش �صرعة د�ران اجل�صم حول نقطة مركزية اأ� ور‪ ،‬حيث تقي�ش مقدار‬ ‫المواقع العالمي‬ ‫الجيرو�صكوب‬
‫معلومة‬ ‫التغر يف الزا�ية املركزية جل�صم خالل �حدة الزمن‪� ،‬عاد ًة ما تُقا�ش بالراديان يف‬ ‫(‪.)GPS‬‬ ‫(‪.)Gyroscope‬‬
‫ميكن للمر�حية اأن تتحرك يف اأي اجتاه �اأن ُحتاف على طرانها مُ�صتقرًا من خالل التحكّم يف �صرعة‬ ‫الثانية (‪ )rad/s‬اأ� الدرجات يف الثانية (‪.)° /s‬‬
‫�اجتاهها‪ ،‬فعلى �صبيل املثال‪ ،‬عند زيادة �صرعة الد�َّارين املوجودين على جانب �احد‬‫املر�حيات اآلأربع ّ‬ ‫�صكل ‪:6.12‬طائرة م َّ‬
‫ُ�صرة مبُ�صت�صعرات وكامرا‬
‫معني‪.‬‬
‫ُ�صرة با�صتطاعتها امليالن �التحرك يف اجتاه ّ‬
‫�تقليل �صرعة الد�َّارين اآلآخرين‪ ،‬فاإن الطائرة امل َّ‬

‫‪320‬‬ ‫‪319‬‬
from controller import Robot
self.current_pose = 6 * [0] # X, Y, Z, yaw, pitch, roll import numpy as np # used for mathematic operations
self.target_position = [0, 0, 0] ‫) ودورانه‬x، y، z( ‫تهيئة مو�صع المُ�صيَّرة‬ import os # used for folder creation
self.target_index = 0 import cv2 # used for image manipulation and human detection ‫تحتوي مكتبة برنامج المُتحكِّم على‬
.)‫ االنعراج‬،‫ االنحدار‬،‫(االلتفاف‬ from PIL import Image # used for image object creation ‫ (روبوت) التي �صتُ�صتخدم‬Robot ‫فئة‬
self.target_altitude = 0
from datetime import datetime # used for date and time .‫طرائقها للتحكم في الطائرة المُ�صيَّرة‬
def move_to_target(self, waypoints):
# auxiliary function used for calculations
def clamp(value, value_min, value_max):
# Moves the drone to the given coordinates
return min(max(value, value_min), value_max)
# Parameters:
# waypoints (list): list of X,Y coordinates class Mavic (Robot):
‫ا�صتيراد المكتبات المطلوبة‬
# Returns: .‫للح�صابات والمعالجة‬
# yaw_disturbance (float): yaw disturbance (negative value to go on the right) # constants of the drone used for flight
# pitch_disturbance (float): pitch disturbance (negative value to go forward) # thrust for the drone to lift
K_VERTICAL_THRUST = 68.5
if self.target_position[0:2] == [0, 0]: # initialization # vertical offset the drone uses as targets for stabilization
self.target_position[0:2] = waypoints[0] K_VERTICAL_OFFSET = 0.6
K_VERTICAL_P = 3.0 # P constant of the vertical PID )Constants( ‫تُ�صتخدم الثوابت‬
# if the drone is at the position with a precision of target_precision K_ROLL_P = 50.0 # P constant of the roll PID
K_PITCH_P = 30.0 # P constant of the pitch PID ‫الموجودة ب�صكل تجريبي لح�صاب‬
if all([abs(x1 - x2) < self.target_precision for (x1, x2)
in zip(self.target_position, self.current_pose[0:2])]):
.‫الطيران واال�صتقرار‬
MAX_YAW_DISTURBANCE = 0.4
self.target_index += 1 MAX_PITCH_DISTURBANCE = -1
# precision between the target position and the drone position in meters
if self.target_index > len(waypoints) - 1:
target_precision = 0.5
self.target_index = 0
self.target_position[0:2] = waypoints[self.target_index] def __init__(self):
# initializes the drone and sets the time interval between updates of the simulation
# computes the angle between the current position of the drone and its target position Robot.__init__(self)
# and normalizes the resulting angle to be within the range of [-pi, pi] self.time_step = int(self.getBasicTimeStep())
self.target_position[2] = np.arctan2(
self.target_position[1] - self.current_pose[1], # gets and enables devices
self.target_position[0] - self.current_pose[0]) self.camera = self.getDevice("camera")
angle_left = self.target_position[2] - self.current_pose[5] self.camera.enable(self.time_step)
angle_left = (angle_left + 2 * np.pi) % (2 * np.pi)
if (angle_left > np.pi): self.imu = self.getDevice("inertial unit")
angle_left -= 2 * np.pi self.imu.enable(self.time_step)

# turns the drone to the left or to the right according to the value self.gps = self.getDevice("gps")
self.gps.enable(self.time_step)
# and the sign of angle_left and adjusts pitch_disturbance
yaw_disturbance = self.MAX_YAW_DISTURBANCE * angle_left / (2 * np.pi)
self.gyro = self.getDevice("gyro")
pitch_disturbance = clamp(
self.gyro.enable(self.time_step)
np.log10(abs(angle_left)), self.MAX_PITCH_DISTURBANCE, 0.1)
self.camera_pitch_motor = self.getDevice("camera pitch")
return yaw_disturbance, pitch_disturbance self.camera_pitch_motor.setPosition(0.7)

def run(self): self.front_left_motor = self.getDevice("front left propeller")


self.front_right_motor = self.getDevice("front right propeller")
# time intevals used for adjustments in order to reach the target altitude self.rear_left_motor = self.getDevice("rear left propeller")
t1 = self.getTime() self.rear_right_motor = self.getDevice("rear right propeller")
motors = [self.front_left_motor, self.front_right_motor,
roll_disturbance = 0 self.rear_left_motor, self.rear_right_motor]
pitch_disturbance = 0 for motor in motors: # mass initialization of the four motors
yaw_disturbance = 0 motor.setPosition(float('inf'))
motor.setVelocity(1)

322 321
:‫ُ�صرة وت�صغيل املُحاكاة‬
َّ ‫الن�ص الربجمي يف الطائرة امل‬
ّ ‫حان الوقت االآن الإدراج‬
# specifies the patrol coordinates
:‫ألإدراج برنامج املُتحكِّم وت�سغيل املُحاكاة‬ waypoints = [[-30, 20], [-60, 30], [-75, 0], [-40, -10]]
# target altitude of the drone in meters
‫ثم ا�صغط‬ 1،Mavic2Pro "Mavic 2 Pro" ‫ ا�صغط على‬،)‫ (�صجرة امل�صهد‬Scene tree ‫ من‬ self.target_altitude = 8
2 .controller "mavic2pro" ‫على‬ )‫ (نقاط الطريق‬waypoints
while self.step(self.time_step) != -1: ‫الخا�صة بالم�صار الذي �صتطير‬
‫عند اإجراء تغيرات‬ 3 .)‫ (اختيار‬Select ... ‫ ا�صغط على‬،)‫(حمرِّر احلقل‬ ُ Field editor ‫ من‬
‫على الن�صو�ش‬ # reads sensors .‫فيه الطائرة المُ�صيَّرة‬
5 .)‫ (موافق‬OK ‫ ثم ا�صغط على‬4 ،)‫ُ�صرة‬َّ ‫ (مُتحكِّم_الطائرة امل‬drone_controller ‫ حدِّ د‬
‫تن�ش اأن‬
َ ‫ آل‬،‫الربجمية‬ roll, pitch, yaw = self.imu.getRollPitchYaw()
‫ (�صغّل‬Run the simulation in real-time ‫ ا�صغط على‬،)‫ (�صريط االأدوات‬Toolbar ‫ من‬ x_pos, y_pos, altitude = self.gps.getValues()
.Ctrl S ‫ت�صغط على‬ roll_acceleration, pitch_acceleration, _ = self.gyro.getValues()
6 .)‫املحاكاة ب�صكل فوري‬
self.current_pose = [x_pos, y_pos, altitude, roll, pitch, yaw]

if altitude > self.target_altitude - 1:


# as soon as it reaches the target altitude,
# computes the disturbances to go to the given waypoints
if self.getTime() - t1 > 0.1:
yaw_disturbance, pitch_disturbance = self.move_to_target(
6 waypoints)
t1 = self.getTime()

# calculates the desired input values for roll, pitch, yaw,


# and altitude using various constants and disturbance values
roll_input = self.K_ROLL_P * clamp(roll, -1, 1) +
roll_acceleration + roll_disturbance
pitch_input = self.K_PITCH_P * clamp(pitch, -1, 1) +
pitch_acceleration + pitch_disturbance
yaw_input = yaw_disturbance
clamped_difference_altitude = clamp(self.target_altitude -
altitude + self.K_VERTICAL_OFFSET, -1, 1)
4 vertical_input = self.K_VERTICAL_P *
pow(clamped_difference_altitude, 3.0)

5 # calculates the motors' input values based on the


1 # desired roll, pitch, yaw, and altitude values
front_left_motor_input = self.K_VERTICAL_THRUST + vertical_input
- yaw_input + pitch_input - roll_input
front_right_motor_input = self.K_VERTICAL_THRUST + vertical_input
2 + yaw_input + pitch_input + roll_input
rear_left_motor_input = self.K_VERTICAL_THRUST + vertical_input
+ yaw_input - pitch_input - roll_input
rear_right_motor_input = self.K_VERTICAL_THRUST + vertical_input
- yaw_input - pitch_input + roll_input

# sets the velocity of each motor based on the motors' input values calculated above
self.front_left_motor.setVelocity(front_left_motor_input)
self.front_right_motor.setVelocity(-front_right_motor_input)
self.rear_left_motor.setVelocity(-rear_left_motor_input)
self.rear_right_motor.setVelocity(rear_right_motor_input)

robot = Mavic()
3 robot.run()

ّ ‫ اإدراج‬:6.14 ‫�صكل‬
‫الن�ص الربجمي لربنامج املُتحكِّم وت�صغيل املُحاكاة‬
324 323
‫مترينات‬ ‫عندما تبداأ املُحاكاة‪� ،‬ص��تعمل حمركات الطائرة املُ�ص� َّ�رة و�ص�تُقلع‪ ،‬ثم �ص��تتبع الطريق املحدَّدة م�ص��بقًا حول املنزل‪ ،‬ومتر‬
‫عرب نقاط الطريق‪.‬‬

‫‪ 1‬ح ِّل��ل الدال��ة ( )‪� move_to_target‬ا�ص��رح كيفي��ة قي��ام الطائ��رة امل ُ�ص� َّ�رة بح�ص��اب مو�صعه��ا الت��ايل يف قائم��ة نق��ا‬
‫ُ�صرة لتقليل زمن الطران بني نقا الطريق؟‬ ‫الطريق‪ .‬كيف ميكن حت�صني م�صار الطائرة امل َّ‬

‫تم و�صع ال�صّ خو�ص الب�صرية ب�صكل م�صبق‬


‫في بيئة ويبوت�ص لتكون بمثابة الهدف الذي‬
‫ت�صعى للك�صف عنه‪.‬‬

‫‪ 2‬ق ِّي��م عي��وب خوارزم ّي��ة التح ُّك��م احلالي��ة يف الطائ��رة امل ُ�ص� َّ�رة عن��د مواجه��ة عوام��ل خارجي��ة مث��ل‪ :‬الري��اح اأ� العوائ��ق اأ�‬
‫عدم دقة نظام حتديد املواقع العاملي‪ ،‬ثم اقرح �ناق�ش التح�صينات التي ميكن القيام بها يف خوارزم ّية التحكم جلعل‬
‫ُ�صرة اأك �صمودًا يف �جه هذه التحديات‪.‬‬ ‫الطائرة امل َّ‬

‫�صكل ‪ :6.15‬اإقالع الطائرة امل َّ‬


‫ُ�صرة‬

‫‪326‬‬ ‫‪325‬‬
‫الدر�ص الثالث‬ ‫‪ 3‬ا�صتك�ص��ف اآلآث��ار اآلأخالقي��ة للطائ��رات امل ُ�ص� َّ�رة الهوائي��ة يف التطبيق��ات الواقعي��ة مث��ل‪ :‬املراقب��ة �تو�صي��ل الط��ر�د‬
‫التطبيقات الروبوتية ‪2‬‬ ‫�عملي��ات البح��ث �اآلإنق��اذ‪ ،‬ث��م اكت��ب ع��ن املخ��ا�ف املحتمل��ة اخلا�ص��ة باخل�صو�صي��ة‪� ،‬ق�صاي��ا ال�ص��المة‪� ،‬احتم��اآلت‬
‫اإ�صاءة ا�صتخدام هذه التقنية‪.‬‬

‫الروبوتية وروؤية احلا�سب والذكاء األ�سطناعي‬


‫‪Robotics Computer Vision and AI‬‬
‫ر�ؤي��ة احلا�ص��ب (‪ )Computer Vision‬والر�بوتي��ة (‪ )Robotics‬جم��االن متط��وران م��ن جم��االت التقني��ة يعم��الن م ًع��ا عل��ى متابع��ة‬
‫ال تة (‪)Automation‬‬ ‫التغير ال�صريع لطريقة حياة النا�ص وعملهم‪ ،‬وعندما ُيدجمان فاإنهما يفتحان جمموعة وا�صعة من االإمكانيات ل أ‬
‫والت�صنيع وتطوير التطبيقات االأخرى‪.‬‬
‫ُيع� ُّد ال��ذكاء اال�صطناع��ي مُك ِّو ًن��ا رئي�صً ��ا م��ن مُك ِّون��ات روؤية احلا�ص��ب والروبوتية على ح ّد �ص��واء؛ مما ُميكِّن االآالت م��ن التعلُّم والتكيُّف مع‬
‫بيئته��ا مب��رور الوق��ت‪ ،‬حي��ث ت�ص��تطيع الروبوتات با�ص��تخدام خوارزميات الذكاء اال�صطناعي اأن ُحتلِّل وتُف�صِّ ��ر كمي��ات هائلة من البيانات‬
‫املرئي��ة؛ مم��ا ي�ص��مح له��ا باتخ��اذ ق��رارات والقي��ام باإج��راءات يف الوق��ت الفعل��ي‪ .‬كم��ا ُمي ِّك��ن ال��ذكاء اال�صطناع��ي الروبوتات من حت�ص��ني‬ ‫‪ 4‬اأ�ص��ف خا�صي��ة تُ�ص��جِّ ل مو�ص��ع الطائ��رة امل ُ�ص� َّ�رة �ارتفاعه��ا �اجتاهه��ا عل��ى ف��رات منتظم��ة اأثن��اء الط��ران‪ ،‬ث��م اكت��ب‬
‫اأدائه��ا ودقته��ا مب��رور الوق��ت‪ ،‬اإذ اأنه��ا تتع ّل��م م��ن جُتاربه��ا و ُتع��دِّ ل �ص��لوكها وفقًا لذل��ك‪ ،‬وهذا يعن��ي اأن الروبوتات املزودة بروؤية احلا�ص��ب‬ ‫كل اآلأمنا التي قد جتدها يف بيانات ال�صجل‪.‬‬
‫وقدرات الذكاء اال�صطناعي ُميكنها اأداء مهام �صديدة التعقيد ب�صكل اأكر دقّة وكفاءة‪.‬‬
‫ُ�صرة الذي مت تو�صيحه يف الدر�ص ال�صابق‪ ،‬وذلك با�صتخدام روؤية احلا�صب‬ ‫يل للطائرة امل َّ‬
‫يف هذا الدر�ص �صتعمل على ترقية امل�صروع االأو ّ‬
‫الكت�ص��اف وحتدي��د ال�صّ ��خو�ص الب�ص��رية القريب��ة م��ن املن��زل‪ ،‬حي��ث ُميك��ن النظ��ر اإليه��م عل��ى اأنه��م اأع��داء يف �ص��يناريو ال َع� َ�امَل الواقع��ي‪،‬‬
‫�تخدم الطائرة املُ�ص� َّ�رة الكامرا املزود بها؛ لتكون مبثابة نظام مراقبة‪ ،‬كما ُميكن تطبيق هذا املثال وتنفيذه ب�ص��هولة على العديد‬ ‫وتَ�ص� ِ‬
‫من املباين االأخرى والبنية التحتية واملمتلكات اخلا�صة وال�صركات مثل‪ :‬امل�صانع وحمطات توليد الطاقة‪.‬‬
‫�ص��يتم ا�ص��تخدام مكتب��ة اأ�ب��ن �ص��ي يف (‪ )OpenCV‬م��ن لغ��ة البايث��ون الكت�ص��اف‬
‫ال�صّ ��خو�ص الب�ص��رية‪ ،‬وه��ي مكتب��ة روؤي��ة حا�ص��وبية مفتوح��ة امل�صدر توف��ر جمموعة من‬
‫خوارزمي��ات روؤي��ة احلا�ص��ب ومعاجل��ة ال�ص��ور باالإ�صاف��ة اإىل جمموع��ة م��ن اأدوات‬
‫الربجمة؛ لتطوير التطبيقات يف هذه املجاالت‪.‬‬
‫ُميك��ن ا�ص��تخدام مكتب��ة اأ�ب��ن �ص��ي يف (‪ )OpenCV‬يف الروبوتي��ة للقي��ام مبه��ام مث��ل‪ :‬اكت�ص��اف الكائن��ات وتت ُّبعه��ا‪ ،‬و إاع��ادة البن��اء ثالث��ي‬
‫االأبع��اد‪ ،‬واملالح��ة‪ ،‬وت�ص��مل ميزاته��ا كذل��ك اكت�ص��اف الكائن��ات والتع��رف عليه��ا‪ ،‬واكت�ص��اف الوج��وه والتع��رف عليه��ا‪ ،‬ومعاجل��ة ال�ص��ور‬
‫ومقاطع الفيديو‪ ،‬ومعايرة الكامرا (‪ ،)Camera Calibration‬وتعلُّم االآلة‪ ،‬وغرها‪.‬‬ ‫‪ 5‬ج �رِّب ا�ص��تخدام قي��م خُمتلف��ة لثواب��ت ‪ PID‬يف برنام��ج امل ُتح ِّك��م (‪.)K_VERTICAL_P، K_ROLL_P، K_PITCH_P‬‬
‫�آلح� كيفي��ة تاأث��ر ه��ذا التغ��رات عل��ى ا�ص��تقرار الطائ��رة امل ُ�ص� َّ�رة �ا�ص��تجابتها‪ ،‬ث��م ناق���ش املوازن��ات ب��ني اآل�ص��تقرار‬
‫تُ�ص��تخدم مكتب��ة اأ�ب��ن �ص��ي يف (‪ )OpenCV‬عل��ى نط��اق وا�ص��ع يف م�ص��اريع البح��وث والتطوي��ر يف جم��االت متع��ددة ت�ص��مل‪ :‬الروبوتي��ة‬ ‫�اآل�صتجابة‪.‬‬
‫واالأمتت��ة واملراقب��ة والت�صوي��ر الطب��ي (‪ ،)Medical Imaging‬كم��ا اأنه��ا تُ�ص��تخدم يف التطبيق��ات التجاري��ة اخلا�ص��ة بالتع��رف عل��ى‬
‫الوجوه واملراقبة بالفيديو والواقع املعزَّز (‪.)Augmented Reality‬‬

‫�صكل ‪ :6.16‬اكت�صاف الب�صر يف الوقت الفعلي‬

‫‪328‬‬ ‫‪327‬‬
‫بعد التحقق من ا�صرتداد ال�صورة بنجاح‪ ،‬تنتقل اخلوارزم ّية اإىل تعديل بع�ص خ�صائ�صها‪ ،‬بحيث تكون ال�صورة ثالثية‬ ‫ُ�صرة‪.‬‬
‫لن�صتعر�ص التغيرات التي �صتُجريها الإ�صافة وظائف روؤية احلا�صب للطائرة امل َّ‬
‫االأبعاد‪ ،‬ولها اأبعاد طول وعر�ص وقنوات األوان‪ ،‬حيث تلتقط كامرا الطائرة املُ�ص َّ�رة �صورًا بارتفاع ‪ 240‬بك�ص�ل وعر�ص‬ ‫سافة املوؤقِّ ت ‪Adding a Timer‬‬ ‫اإ‬
‫ت�صتخدم ‪ 3‬قنوات األوان حلفظ معلومات ال�صورة وهي‪ :‬االأحمر واالأخ�صر واالأزرق‪.‬‬ ‫ِ‬ ‫‪ 400‬بك�صل‪ ،‬كما اأنها‬
‫ُميك��ن اأن يك��ون التق��اط �ص��ورة ومعاجلته��ا وحفظه��ا مكل ًف��ا م��ن الناحي��ة احلا�ص��وبية اإذا ُح�ص��ب ل��كل اإط��ار م��ن اإط��ارات‬
‫يج�ب معاجل�ة ال�ص�ورة ا ًأوال حت�ى يت�م ا�ص�تخدامها يف الك�ص�ف‪ ،‬ولك�ي يت�م تطبيق الدوال ب�ص�كل �صحي�ح يف وقت الحق‪ ،‬ال‬ ‫خم�ص ثوانٍ فقط‪.‬‬ ‫املُحاكاة‪ ،‬ولذلك �صت�صيف موؤ ِّقتًا زمنيًا ال�صتخدامه؛ لتنفيذ هذه االإجراءات كل ِ‬
‫ُب ّد اأن حتقق ال�صورة تركي ًبا مع ّينًا‪ .‬يف هذا املثال‪ ،‬يجب اأن يتغر ت�صل�صل االأبعاد من (الطول‪ ،‬والعر�ص‪ ،‬وقنوات االألوان)‬
‫اإىل (قنوات االألوان‪ ،‬والطول‪ ،‬والعر�ص) با�صتخدام الدالة ()‪ ،transpose‬حيث تُقدَّم �صورة الكامرا (‪،)CameraImg‬‬ ‫‪# time intervals used for adjustments in order to reach the target altitude‬‬
‫عامالت لهذه الدالة‪ ،‬بافرتا�ص اأن الرتتيب االأ�صلي كان (‪.)0 ،1 ،2‬‬ ‫والت�صل�صل اجلديد (‪ )2 ،0 ،1‬ك ُم ِ‬ ‫)(‪t1 = self.getTime‬‬
‫‪# time intervals between each detection for human figures‬‬
‫كم��ا يج��ب تعدي��ل اأحج��ام االأبع��اد بع��د تغي��ر الت�صل�ص��ل‪ ،‬حي��ث تُ�ص��تخدم الدال��ة ()‪ reshape‬بالطريق��ة نف�ص��ها‪ ،‬ولك��ن‬ ‫)(‪t2 = self.getTime‬‬
‫عامل الثاين منها تكون (‪.)3 ،240 ،400‬‬ ‫اأحجام االأبعاد املعنيّة كاملُ ِ‬
‫لد ‪Creating a Folder‬‬ ‫اإن�ساء‬
‫‪# reshapes image array to (channels, height, width) format‬‬
‫))‪cameraImg = np.transpose(cameraImg, (2, 0, 1‬‬ ‫�ص��يتم حفظ ال�صور املُلتَقطة التي يتم فيها اكت�ص��اف ال�صّ ��خو�ص الب�ص��رية يف جملد‪ ،‬حيث يُع ّد جزءًا من اأر�ص��يف املراقبة‬
‫))‪cameraImg = np.reshape(cameraImg, (3, 240, 400‬‬ ‫االأمنية الذي �صي�صاعد على فح�ص ال�صور يف امل�صتقبل‪.‬‬
‫ا ًأوال‪ :‬علي��ك اأن ت�ص� ِ‬
‫�تخدم الدال��ة ) (‪ getcwd‬لت�ص��رتد م�ص��ار دلي��ل العم��ل احل��ايل لربنام��ج املُتح ِّك��م (وه��و املجل��د ال��ذي‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫يت�ص ّم��ن برنام��ج املُتح ِّك��م) حت��ى يتع��رف الربنام��ج عل��ى امل��كان ال��ذي ي�ص��ع في��ه املجل��د اجلدي��د با�ص��م‪( detected :‬مت‬
‫االكت�ص��اف)‪ ،‬بحي��ث تُ�ص��تخدم الدال��ة ) (‪ path.join‬لرب��ط ا�ص��م امل�ص��ار ب�صل�ص��لة ا�ص��م املجل��د ّ‬
‫الن�صي��ة‪ ،‬وتتم ّث��ل اخلط��وة‬
‫الطول ‪240‬‬ ‫العر�ش ‪400‬‬ ‫قنوات اآلألوان ‪3‬‬ ‫االأخرة يف التحقق مما اإذا كان املجلد موجودًا بالفعل اأم ال‪ ،‬ويف تلك احلالة يتم اإن�صاء جملد جديد‪.‬‬
‫‪# gets the current working directory‬‬
‫)(‪cwd = os.getcwd‬‬
‫‪# sets the name of the folder where the images‬‬
‫‪# with detected humans will be stored‬‬
‫قنوات اآلألوان ‪3‬‬ ‫الطول ‪240‬‬ ‫العر�ش ‪400‬‬ ‫"‪folder_name = "detected‬‬
‫‪# joins the current working directory and the new folder name‬‬
‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫)‪folder_path = os.path.join(cwd, folder_name‬‬

‫�صكل ‪ :6.17‬تغير ت�صل�صل االأبعاد‬ ‫‪if not os.path.exists(folder_path):‬‬


‫‪# creates the folder if it doesn't exist already‬‬
‫)‪os.makedirs(folder_path‬‬
‫م�صفوفة ‪RGB‬‬ ‫�صورة ملونة اأ�صلية‬ ‫)"!‪print(f"Folder \"detected\" created‬‬
‫‪else:‬‬
‫)"!‪print(f"Folder \"detected\" already exists‬‬

‫معاجلة ال�سورة ‪Image Processing‬‬


‫يف ه��ذا التوقي��ت ميكن��ك االآن ا�ص��رتداد (ق��راءة) ال�ص��ورة م��ن اجله��از ملعاجلته��ا قب��ل حماول��ة الك�ص��ف‪ .‬الح��ظ اأن كل‬
‫‪240‬‬

‫�وال اإىل حفظه ��ا يح ��دث كل خم� � ِ�ص ث ��وانٍ فق ��ط‪ ،‬كم ��ا ه ��و مب � َّ�ني يف ال�ص ��رط‬
‫م ��ا يتعل ��ق مبعاجل ��ة ال�ص ��ورة و�ص � ً‬
‫‪240‬‬

‫"‪."self.getTime)( - t2> 5.0‬‬


‫الطول‬ ‫‪# initiates the image processing and detection routine every 5 seconds‬‬
‫‪if self.getTime() - t2 > 5.0:‬‬
‫‪400‬‬
‫‪3‬‬

‫‪# retrieves image array from camera‬‬


‫‪400‬‬ ‫)(‪cameraImg = self.camera.getImageArray‬‬
‫قنوات اآلألوان‬ ‫العر�ش‬
‫�صكل ‪ :6.18‬اأبعاد ال�صورة‬
‫‪330‬‬ ‫‪329‬‬
‫ُ�صرية وحفظ ال�صور املُكت�صَ فة‬
‫تقرير الطائرة امل َّ‬ ‫بعد ذلك‪ ،‬يجب تغيري ال�صورة اإىل التدرج الرمادي حيث اأن األكت�ص��اف ي�ص��تلزم ذلك‪ ،‬مع وجوب تخزينها ا ًأوأل يف كائن‬
‫(‪)x, y‬‬ ‫‪Drone Report and Saving of the Detected Images‬‬ ‫�صورة ووجوب اجلمع بن قنوات األوانها الثالثة‪ ،‬وهنا يجب دمج قنوات األألوان وتخزينها با�صتخدام الدالة ()‪merge‬‬
‫األإ�صاف��ة النهائي��ة لرنام��ج املُتح ِّك��م اخلا���ص ب��ك ه��و نظ��ام تقري��ر‬ ‫�دأل م��ن (اأحم��ر‪ ،‬اأخ�ص��ر‪ ،‬اأزرق)‪ ،‬واأن يك��ون‬
‫يف ت�صل�ص��ل عك�ص��ي‪ :‬اأي اأن يك��ون ت�صل�ص��ل األأل��وان (اأزرق‪ ،‬اأخ�ص��ر‪ ،‬اأحم��ر) ب� ً‬
‫ب�ص��يط تُقدِّ مه الطائرة املُ�ص� َّ�رية عن طريق طباعة ر�ص��الة على وحدة‬ ‫بدأل من (‪ )0 ،1 ،2‬على الرتتيب‪.‬‬ ‫ت�صل�صلها الرقمي (‪ً )2 ،1 ،0‬‬
‫التحك��م (‪ )Console‬عن��د اكت�ص��اف �ص��كل ب�ص��ري‪ ،‬وحف��ظ ال�ص��ورة‬ ‫‪# creates RGB image from merged channels‬‬
‫يف املجلد الذي اأن�صاأتَه من قبل‪.‬‬ ‫))‪img = Image.new('RGB', (400, 240‬‬
‫))]‪img = cv2.merge((cameraImg[2], cameraImg[1], cameraImg[0‬‬
‫يق��وم املُتغ� ِّ�ري ‪( humans‬الب�ص��ر) بحم��ل امل�ص��تطيالت األإطاري��ة‬
‫التي ُيكت�صف الب�صر بداخلها يف حال ُعرث عليهم‪ُ .‬تع َّرف امل�صتطيالت‬
‫‪h‬‬

‫واأخ �ريًا‪ ،‬يت��م حتوي��ل ال�ص��ورة اإىل الت��درج الرم��ادي با�ص��تخدام الدال��ة ()‪ cvtColor‬الت��ي ت�ص� ِ‬
‫�تخدم ُم ِ‬
‫عام��ل‬
‫تغريات‪ :‬وهي الزوج ‪ x‬و ‪ y‬اللذان مُيثِّالن األإحداثين‬ ‫بوا�صطة اأربعة ُم ِّ‬ ‫‪ COLOR_BGR2GRAY‬لتغيري األألوان من األأزرق واألأخ�صر واألأحمر اإىل التدرج الرمادي‪.‬‬
‫اللذي��ن يف ال�ص��ورة وذل��ك يف الزاوي��ة العُلي��ا م��ن اجله��ة اليُ�ص��رى‬
‫للم�ص��تطيل‪ ،‬وكذل��ك ال��زوج ‪ w‬و ‪ ،h‬ال��ذي مُي ِّث��ل عر���ص امل�ص��تطيل‬ ‫‪# converts image to grayscale‬‬
‫وارتفاع��ه‪ .‬يف جمي��ع األكت�ص��افات املوج��ودة يف ال�ص��ورة ُحت��دِّ د الدال��ة‬ ‫)‪gray = cv2.cvtColor(np.uint8(img), cv2.COLOR_BGR2GRAY‬‬
‫()‪ rectangle‬الب�ص��ر مب�ص��تطيل اأزرق‪ ،‬حي��ث تنظ��ر الدال��ة اإىل‬
‫مُتغ� ِّ�ريات ال�ص��ورة عل��ى اأنه��ا تتم ّث��ل يف الزاوي��ة الي�ص��رى العُلوي��ة‬ ‫‪Human Silhouette Detection‬‬ ‫اكت�صاف �صور احلدود الب�صرية‬
‫(‪)x+w, y+h‬‬ ‫ال�ص��فلية (‪ )x+w، y+h‬م��ن امل�ص��تطيل‪،‬‬ ‫(‪ )x، y‬والزاوي��ة اليمن��ى ُ‬ ‫لك�ي تكت�ص�ف ال�ص�ورة‪ ،‬علي�ك اأن ت�ص�تخدِ م م�س ِّن�ف ه�ار كا�س�كيد (‪ ،)Haar Cascade Classifier‬وه�و خوارزم ّي�ة‬
‫‪w‬‬ ‫املو�صح��ة تالح��ظ اأن ل��ون‬ ‫ول��ون امل�ص��تطيل وعر�ص��ه‪ ،‬ويف ال�ص��ورة َّ‬ ‫ألكت�ص�اف الكائن�ات تعتم�د عل�ى تعلُّ�م األآل�ة‪ ،‬وتُ�ص�تخدم لتحديد الكائن�ات يف ال�صور اأو مقاطع الفيديو‪ .‬وأل�ص�تخدام هذا‬
‫امل�صتطيل اأزرق (‪ )B=255، G=0، R=0‬وعر�صه ‪.2‬‬ ‫املُ�صنِّف حتتاج اأن تُدرِّب منوذج تعلُّم األآلة على جمموعة من ال�صور التي حتتوي على الكائن الذي تريد البحث عنه‪،‬‬
‫�صكل ‪ :6.20‬م ِّ‬
‫ُتغريات امل�صتطيل‬ ‫�صيقوم نظام التقرير با�صرتجاع التاريخ والوقت احلالين با�صتخدام‬ ‫وعل�ى �ص�ور اأخ�رى أل حتت�وي عل�ى ه�ذا الكائ�ن‪ ،‬حي�ث تق�وم اخلوارزم ّي�ة بالبح�ث ع�ن اأمناط مع ّين�ة يف ال�ص�ور لتحديد‬
‫الدال��ة ) (‪ datetime.now‬وطباعته��ا عل��ى وح��دة التحك��م‪ ،‬باألإ�صاف��ة اإىل اإحداثي��ات الطائ��رة املُ�ص� َّ�رية يف وق��ت التقري��ر‪ ،‬ويت��م‬ ‫م�كان الكائ�ن‪ .‬ويف الع�ادة تُ�ص�تخدم ه�ذه اخلوارزم ّي�ة للعث�ور على اأ�ص�ياء حم َّددة مثل‪ :‬الوجوه‪ ،‬اأو اأ�ص�خا�ص ي�ص�ريون يف‬
‫ال�ص��فلية (_) أل�ص��تخدامها‬ ‫تعديل تن�ص��يق التاريخ والوقت بطريقة ب�ص��يطة عن طريق اإدراج ال�ص��رطات العُلوية (‪ )-‬وال�ص��رطات ُ‬ ‫مقط�ع فيدي�و‪ .‬وم�ع ذل�ك ق�د أل تعم�ل ه�ذه اخلوارزم ّي�ة ب�ص�كل جي�د يف بع��ص املواق�ف الت�ي يك�ون فيه�ا الكائ�ن حمجوبً�ا‬
‫كج��زء م��ن ا�ص��م املل��ف املحف��وظ‪ ،‬ث��م يت��م حفظه��ا يف املجلد با�ص��تخدام الدال��ة ) (‪ ،imwrite‬وعند اكتمال كل �ص��يء تقوم الدالة‬ ‫خا�ص�ا عل�ى اكت�ص�اف الب�ص�ر‪،‬‬ ‫معر�ص�ا ألإ�ص�اءة منخف�ص�ة‪ .‬مت تدري�ب امل�صنِّ�ف يف م�ص�روعك تدريبً�ا ًّ‬
‫جزئيًّ�ا اأو كليًّ�ا اأو ً‬
‫) (‪ getTime‬باإعادة �صبط املوؤقِّت‪.‬‬ ‫وعلي�ك اأن ت�ص�تخدِ م مل�ف ‪ haarcascade_fullbody.xml‬ال�ذي �ص�تُزود ب�ه‪ ،‬وه�و من�وذج تعلُّ�م اآل�ة مُ�درَّب م�ص�بقًا‬
‫وي�ص�كِّل ج�زءًا م�ن مكتب�ة اأوب�ن �س�ي يف (‪ ،)OpenCV‬و ُيق� َّدم كمُعامِ �ل لكائ�ن ()‪ ،CascadeClassifier‬ث�م تَ�ص�تخدم‬
‫‪# loop, through detected human images, annotates them with a bounding box‬‬ ‫الدالة ()‪ detectMultiScale‬للقيام بعملية األكت�ص�اف‪.‬‬
‫‪# and prints a timestamp and an info message on the console‬‬
‫‪for (x, y, w, h) in humans:‬‬
‫‪# loads and applies the Haar cascade classifier to detect humans in image‬‬
‫)'‪human_cascade = cv2.CascadeClassifier('haarcascade_fullbody.xml‬‬
‫‪# the image, the top left corner, the bottom right corner, color and width of the rectangle‬‬ ‫)‪humans = human_cascade.detectMultiScale(gray‬‬
‫)‪cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2‬‬
‫)(‪current_time = datetime.now‬‬
‫)‪print(current_time‬‬
‫"]}‪print("Found a person in coordinates [{:.2f}, {:.2f‬‬
‫�سورة احلدود امل�ستخرجة‬ ‫ال�سورة األأ�سلية‬
‫))‪.format(x_pos, y_pos‬‬

‫‪# saves annotated image to file with timestamp‬‬


‫)"‪current_time = current_time.strftime("%Y-%m-%d_%H-%M-%S‬‬
‫"‪filename = f"detected/IMAGE_{current_time}.png‬‬
‫)‪cv2.imwrite(filename, img‬‬

‫)(‪t2 = self.getTime‬‬ ‫الن�صية‪ ،‬يتم ا�صتخدام الترميز {‪ }:.2f‬كاخت�صار لعدد حقيقي‬


‫في ال�صل�صلة ّ‬
‫(‪ )floating number‬ذي خانتين ع�صريتين‪ ،‬وهنا يتم ا�صتخدام األخت�صارين‬
‫للمُتغيِّرين ‪ x_pos‬و‪.y_pos‬‬
‫‪332‬‬ ‫‪331‬‬ ‫�صكل ‪ :6.19‬مثال على اإكت�صاف �صور احلدود الب�صرية‬
:‫ اخلا�صة برنامج املُتحكِّم كما يلي‬run)( ‫بعد اإ�صافة كل هذه الوظائف يجب اأن تظهر الدالة‬
# reshapes image array to (channels, height, width) format
cameraImg = np.transpose(cameraImg, (2, 0, 1))
cameraImg = np.reshape(cameraImg, (3, 240, 400)) def run(self):

# creates RGB image from merged channels # time intervals used for adjustments in order to reach the target altitude
img = Image.new('RGB', (400, 240)) t1 = self.getTime()
img = cv2.merge((cameraImg[2], cameraImg[1], cameraImg[0])) # time intervals between each detection for human figures
t2 = self.getTime()
# converts image to grayscale
gray = cv2.cvtColor(np.uint8(img), cv2.COLOR_BGR2GRAY)
roll_disturbance = 0
pitch_disturbance = 0
# loads and applies the Haar cascade classifier to detect humans in image
yaw_disturbance = 0
human_cascade = cv2.CascadeClassifier('haarcascade_fullbody.xml')
humans = human_cascade.detectMultiScale(gray)
# specifies the patrol coordinates
# loop, through detected human images, annotates them with a bounding box waypoints = [[-30, 20], [-60, 30], [-75, 0], [-40, -10]]
# and prints a timestamp and an info message on the console # target altitude of the drone in meters
for (x, y, w, h) in humans: self.target_altitude = 8

cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # gets the current working directory
current_time = datetime.now() cwd = os.getcwd()
print(current_time) # sets the name of the folder where the images
print("Found a person in coordinates [{:.2f}, {:.2f}]" # with detected humans will be stored
.format(x_pos, y_pos)) folder_name = "detected"
# joins the current working directory and the new folder name
# saves annotated image to file with timestamp folder_path = os.path.join(cwd, folder_name)
current_time = current_time.strftime("%Y-%m-%d_%H-%M-%S")
filename = f"detected/IMAGE_{current_time}.png" if not os.path.exists(folder_path):
cv2.imwrite(filename, img) # creates the folder if it doesn't exist already
os.makedirs(folder_path)
t2 = self.getTime() print(f"Folder \"detected\" created!")
else:
# calculates the desired input values for roll, pitch, yaw, print(f"Folder \"detected\" already exists!")
# and altitude using various constants and disturbance values
roll_input = self.K_ROLL_P * clamp(roll, -1, 1) while self.step(self.time_step) != -1:
+ roll_acceleration + roll_disturbance
pitch_input = self.K_PITCH_P * clamp(pitch, -1, 1) # reads sensors
+ pitch_acceleration + pitch_disturbance roll, pitch, yaw = self.imu.getRollPitchYaw()
yaw_input = yaw_disturbance x_pos, y_pos, altitude = self.gps.getValues()
clamped_difference_altitude = clamp(self.target_altitude roll_acceleration, pitch_acceleration, _ = self.gyro.getValues()
- altitude + self.K_VERTICAL_OFFSET, -1, 1) self.current_pose = [x_pos, y_pos, altitude, roll, pitch, yaw]
vertical_input = self.K_VERTICAL_P * pow(clamped_difference_altitude, 3.0)
if altitude > self.target_altitude - 1:
# calculates the motors' input values based on the desired roll, pitch, yaw, and altitude values # as soon as it reaches the target altitude,
front_left_motor_input = self.K_VERTICAL_THRUST
# computes the disturbances to go to the given waypoints
+ vertical_input - yaw_input + pitch_input - roll_input
if self.getTime() - t1 > 0.1:
front_right_motor_input = self.K_VERTICAL_THRUST
yaw_disturbance, pitch_disturbance = self.move_to_target(
+ vertical_input + yaw_input + pitch_input + roll_input
waypoints)
rear_left_motor_input = self.K_VERTICAL_THRUST + vertical_input
t1 = self.getTime()
+ yaw_input - pitch_input - roll_input
rear_right_motor_input = self.K_VERTICAL_THRUST + vertical_input
- yaw_input - pitch_input + roll_input # initiates the image processing and detection routine every 5 seconds
if self.getTime() - t2 > 5.0:
# sets the velocity of each motor based on the motors' input values calculated above
self.front_left_motor.setVelocity(front_left_motor_input) # retrieves image array from camera
self.front_right_motor.setVelocity(-front_right_motor_input) cameraImg = self.camera.getImageArray()
self.rear_left_motor.setVelocity(-rear_left_motor_input)
self.rear_right_motor.setVelocity(rear_right_motor_input) # checks if image is successfully retrieved
if cameraImg:

334 333
‫مترينات‬ ‫األآن �ص�غِّل املُح��اكاة ل��رتى الطائ��رة املُ�ص� َّ�رية وه��ي تُقل��ع ُوحت ِّل��ق ح��ول املن��زل‪ .‬ألح� ْ�ظ ُخم َرج��ات وح��دة التحك��م اجلدي��دة‬
‫وال�صور التي مت اإن�صاوؤها يف املجلد‪.‬‬

‫‪ 1‬عدِّل برنامج امل ُتحكِّم اخلا�ص بك بحيث أل يتحقق من وجود املجلد بالفعل يف امل�سار‪ .‬هل يت�سبب ذلك يف اأية تعقيدات‬
‫يف تنفيذ امل ُحاكاة؟‬

‫�صكل ‪:6.21‬‬

‫‪ 2‬ع�دِّل برنام��ج امل ُتح ِّك��م بحي��ث يق��وم باألكت�س��اف كل ‪ 10‬ث��وانٍ ‪ .‬ه��ل تاًلح��ظ اأي َف��رق يف تك��رار م��ا تطبع��ه وح��دة التحك��م‬
‫ويف ال�سور املحفوظة؟‬
‫تم اإن�صاء المجلد‪.‬‬

‫�صكل ‪ :6.22‬اإن�صاء املجلد وال�صور املحفوظة التي حتتوي على األكت�صافات‬

‫‪336‬‬ ‫‪335‬‬
‫الم�صروع‬ ‫‪ 3‬م��اذا �س��يحدث مل ُخ َرج��ات ال�س��ورة اإذا قم��ت بدم��ج اأبع��اد األأل��وان ح�س��ب الت�سل�س��ل املعت��اد ب� ً‬
‫�دأل م��ن الت�سل�س��ل املعكو���ص؟‬
‫دوِّن ماًلحظاتك وفقًا لذلك‪.‬‬

‫يف الوق��ت احلا�ص��ر‪ ،‬هن��اك العدي��د م��ن م�ص��اريع تكام��ل ال��ذكاء األ�صطناع��ي كبرية‬
‫احلج��م الت��ي يت��م تطويره��ا ملختل��ف ال�صناع��ات والقطاع��ات املختلف��ة يف البل��دان‪،‬‬
‫و ُيع ُّد القطاع ال�صحي من اأهم القطاعات التي تتبنى تقنيات الذكاء األ�صطناعي‪،‬‬
‫وه��ذا يعن��ي اأن تطوي��ر امل�ص��اريع يف ه��ذا القط��اع أل ُب� ّد اأن ياأخ��ذ اأخالقي��ات ال��ذكاء‬
‫األ�صطناعي بعن األعتبار‪.‬‬ ‫‪ 4‬اأج ِر جتارب على امل ُعامِ لني الرابع واخلام�ص يف الدالة ()‪ .rectangle‬دوِّن ماًلحظاتك وفقًا لذلك‪.‬‬

‫اأجرِ بحثًا عن اأنظمة الرعاية ال�صحية التي تعمل بالذكاء األ�صطناعي وعن اآثارها‬ ‫‪1‬‬
‫األأخالقي��ة‪ ،‬وح� ِّ�دد املناف��ع واملخاط��ر املحتمل��ة لتطبي��ق نظ��ام تقني��ة معلوم��ات يعم��ل‬
‫بالذكاء األ�صطناعي يف موؤ�ص�صة �صحية‪.‬‬

‫‪2‬‬
‫ح ِّل��ل املخ��اوف األأخالقي��ة الت��ي تن�ص�اأ عند ا�ص��تخدام ال��ذكاء األ�صطناع��ي يف اتخاذ‬
‫قرارات توؤثر على �صحة املري�ص‪ ،‬و�ص ْع جمموعة من املبادئ األأخالقية أل�ص��تخدام‬
‫الذكاء األ�صطناعي يف الرعاية ال�صحية تعطي األأولوية ل�صالمة املري�ص و�صحته‪.‬‬

‫ع�دِّل برنام��ج امل ُتح ِّك��م اخلا���ص ب��ك بحي��ث يطب��ع قي��م األلتف��اف واألنح��دار واألنع��راج للطائ��رة امل ُ�س� َّ�رة عن��د اكت�س��اف‬ ‫‪5‬‬
‫‪3‬‬ ‫اأي �سخ�ص‪.‬‬
‫عر�ص��ا تقدمُي ًي��ا يح��دِّ د املبادئ األأخالقية املقرتحة واألأ�ص��باب التي تدعو اإىل‬
‫اأن�ص��ئ ً‬
‫األلت��زام به��ا‪ ،‬واعر���ص املب��ادئ عل��ى زمالئ��ك يف الف�ص��ل‪ ،‬ث��م ناق���ص معه��م مزاي��ا‬
‫وحتديات املبادئ املقرتحة‪.‬‬

‫‪338‬‬ ‫‪337‬‬
‫ماذا تع ّلمت‬

‫ معرفة ملحة عامة عن اأخالقيات الذكاء اال�صطناعي‪.‬‬


‫للتحي ��ز واالفتق ��ار اإىل االإن�ص ��اف اأن ُيوؤدي ��ا اإىل اإ�ص ��اءة‬
‫ُّ‬ ‫ فح� ��س كي ��ف ُمُيك ��ن‬
‫ا�صتخدام اأنظمة الذكاء اال�صطناعي‪.‬‬
‫ حتدي��د طرائ��ق التخفي��ف من م�ص��كلة ال�ص��فافية لقابلية التف�ص��ري يف الذكاء‬
‫اال�صطناعي‪.‬‬
‫ تقييم كيفية توجيه التنظيمات واملعايري احلكومية لال�ص��تخدام االأخالقي‬
‫وامل�صتدام الأنظمة الذكاء اال�صطناعي‪.‬‬
‫ُ�صرية للتنقل يف بيئة ما دون تدخل ب�صري‪.‬‬ ‫ برجمة الطائرة امل َّ‬
‫ تعدي��ل نظ��ام الطائ��رة املُ�ص� َّ�رية لت�ص��مل ق��درات املراقب��ة م��ن خ��الل حتلي��ل‬
‫ال�صور‪.‬‬

‫امل�صطلحات الرئي�صة‬

‫اأخاًلقيات الذكاء‬ ‫‪Inertial Measurement‬‬ ‫وحدة قيا�ص‬


‫‪AI Ethics‬‬ ‫‪Unit - IMU‬‬ ‫بالق�سور الذاتي‬
‫األ�سطناعي‬
‫‪Motor‬‬ ‫حُمرِّك‬
‫‪Area Surveillance‬‬ ‫مراقبة املنطقة‬
‫‪OpenCV Library‬‬ ‫مكتبة اأوبن �سي يف‬
‫‪Bias‬‬ ‫التح ُّيز‬ ‫‪Pitch‬‬ ‫األنحدار‬
‫‪Black-Box Problem‬‬
‫م�سكلة ال�سندوق‬ ‫‪Propeller‬‬ ‫مروحية‬
‫األأ�سود‬
‫‪Robotics‬‬ ‫الروبوتية‬
‫‪Debiasing‬‬ ‫اإلغاء األنحياز‬ ‫‪Roll‬‬ ‫األلتفاف‬
‫‪Global Positioning‬‬ ‫نظام حتديد املواقع‬ ‫‪Simulator‬‬ ‫ُحُماكي‬
‫‪System - GPS‬‬ ‫العَاملَي‬ ‫‪Value-Based‬‬ ‫األ�ستدألل القائم‬
‫‪Gyroscope‬‬ ‫اجلرو�سكوب‬ ‫‪Reasoning‬‬ ‫على ال ِقيم‬
‫‪Human Detection‬‬ ‫اكت�ساف الب�سر‬ ‫‪Yaw‬‬ ‫األنعراج‬

‫‪339‬‬

You might also like