You are on page 1of 337

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

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


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

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

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

‫رقم األإيداع ‪:‬‬


‫‪-‬‬ ‫‪-‬‬ ‫ردم ‪- - :‬‬
2022/0003

2023

Binary
‫مقدمة‬
‫اإن تق��دم ال��دول وتطوره��ا يقا���ص مب��دى قدرته��ا عل��ى اال�س��تثمار يف التعلي��م‪ ،‬وم��دى ا�س��تجابة نظامه��ا التعليم��ي ملتطلب��ات الع�س��ر‬
‫وحر�سا من وزارة التعليم على دمُيومة تطوير اأنظمتها التعليمية‪ ،‬وا�س��تجابة لروؤية اململكة العربية ال�س��عودية ‪ 2030‬فقد‬ ‫ً‬ ‫ومتغراته‪.‬‬
‫بادرت الوزارة اإىل اعتماد نظام م�س��ارات التعليم الثانوي بهدف اإحداث تغير فاعل و�س��امل يف املرحلة الثانوية‪.‬‬
‫أمنوذج��ا تعليم ًي��ا متمي��زًا وحدي ًث��ا للتعلي��م الثان��وي باململك��ة العربي��ة ال�س��عودية ي�س��هم‬
‫اإن نظ��ام م�س��ارات التعلي��م الثان��وي يق��دم ا ً‬
‫بكف��اءة يف‪:‬‬
‫ تعزي��ز قي��م االنتم��اء لوطنن��ا اململك��ة العربي��ة ال�س��عودية‪ ،‬وال��والء لقيادت��ه الر�س��يدة حفظه��م ا ‪ ،‬انطال ًق��ا م��ن عقي��دة �سافي��ة‬
‫م�س��تندة عل��ى التعالي��م االإ�س��المية ال�س��محة‪.‬‬
‫ تعزي��ز قي��م املواطن��ة م��ن خ��الل الرتكي��ز عليه��ا يف امل��واد الدرا�س��ية واالأن�س��طة‪ ،‬ات�س��ا ًقا م��ع مطال��ب التنمي��ة امل�س��تدامة‪ ،‬واخلط��ط‬
‫التنموي��ة يف اململك��ة العربي��ة ال�س��عودية الت��ي توؤك��د عل��ى تر�س��يخ ثنائي��ة القيم والهوية‪ ،‬والقائمة على تعاليم االإ�س��الم والو�س��طية‪.‬‬
‫ تاأهيل الطلبة مبا يتوافق مع التخ�س�سات امل�ستقبلية يف اجَلامعات والكليات اأو املهن املطلوبة؛ ل�سمان ات�ساق خُمرجات التعليم‬
‫مع متطلبات �سوق العمل‪.‬‬
‫ متكني الطلبة من متابعة التعليم يف امل�سار املف�سل لديهم يف مراحل مبكرة‪ ،‬وفق ميولهم وقدراتهم‪.‬‬
‫ متكني الطلبة من االلتحاق بالتخ�س�سات العلمية واالإدارية النوعية املرتبطة ب�سوق العمل‪ ،‬ووظائف امل�ستقبل‪.‬‬
‫ دم��ج الطلب��ة يف بيئ��ة تعليمي��ة ممتع��ة وحمف��زة داخل املدر�س��ة قائمة على فل�س��فة بنائية‪ ،‬وممار�س��ات تطبيقي��ة �سمن منا تعليمي‬
‫ن�سط‪.‬‬
‫ نق��ل الطلب��ة ع��رب رحل��ة تعليمي��ة متكامل��ة ب��د ًءا م��ن املرحل��ة االبتدائي��ة حت��ى نهاي��ة املرحل��ة الثانوي��ة‪ ،‬وتُ�س�هِّل عملي��ة انتقاله��م اإىل‬
‫مرحل��ة م��ا بعد التعلي��م العام‪.‬‬
‫ تزويد الطلبة باملهارات التقنية وال�سخ�سية التي ت�ساعدهم على التعامل مع احلياة‪ ،‬والتجاوب مع متطلبات املرحلة‪.‬‬
‫ تو�سيع الفر�ص اأمام الطلبة اخلريجني عرب خيارات متنوعة اإ�سافة اإىل اجَلامعات مثل‪ :‬احل�سول على �سهادات مهنية‪ ،‬وااللتحاق‬
‫بالكليات التطبيقية‪ ،‬واحل�سول على دبلومات وظيفية‪.‬‬
‫ويتكون نظام امل�سارات من ت�سعة ف�سول درا�سية تُد ّر�ص يف ثالث �سنوات‪ ،‬تت�سمن �سنة اأوىل م�سرتكة يتلقى فيها الطلبة الدرو�ص‬
‫يف جماالت علمية واإن�سانية متنوعة‪ ،‬تليها �سنتان تخ�س�سيتان‪ُ ،‬ي�س ّكن الطلبة بها يف م�سار عام واأربعة م�سارات تخ�س�سية تت�سق مع‬
‫ميولهم وقدراتهم‪ ،‬وهي‪ :‬امل�سار ال�سرعي‪ ،‬م�سار اإدارة االأعمال‪ ،‬م�سار علوم احلا�سب والهند�سة‪ ،‬م�سار ال�سحة واحلياة‪ ،‬وهو ما يجعل‬
‫هذا النظام هو االأف�سل للطلبة من حيث‪:‬‬
‫ وج��ود م��واد درا�س��ية جدي��دة تتواف��ق م��ع متطلب��ات الث��ورة ال�سناعي��ة الرابع��ة واخلط��ط التنموي��ة‪ ،‬وروؤي��ة اململك��ة ‪ ،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‬‬
‫ ُيعَدِّ د اأمثلة لتطبيقات الذكاء األ�سطناعي (‪.)AI‬‬
‫ ي َِ�سف عمليات هيكل بيانات املُكدّ �ص‪.‬‬
‫ ي َِ�سف عمليات هيكل بيانات الطابور‪.‬‬
‫ يُحدِّ د األختال ات بني هيكل بيانات املُكدّ �ص وهيكل بيانات الطابور‪.‬‬
‫ ي َِ�سف العمليات الرئي�سة املُطبقة على البيانات يف القائمة املرتابطة‪.‬‬
‫ يَ�سر ا�ستخدام هيكل بيانات ال�سجرة‪.‬‬
‫ يُحدِّ د األختال ات بني هيكل بيانات ال�سجرة وهيكل بيانات املُخطط‪.‬‬
‫ يَ�ستخدِ م لغة برجمة البايثون (‪ )Python‬أل�ستك�ساف هياكل البيانات املُعقدة‪.‬‬

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

‫‪10‬‬
‫الدر�ص األأول‬
‫مقدمة يف الذكاء األ�سطناعي‬

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


‫(‪:)AI a ents‬‬ ‫‪hat is‬‬ ‫(‪rti cial ntelli ence )AI‬‬
‫وكي��ل ال��ذكاء اال�سطناع��ي ه��و‬ ‫ال��ذكاء اإل�ضطناع��ي (‪ )AI‬ه��و اأح��د جم��االت عل��وم احلا�س��ب االآيل الت��ي تُعن��ى‬
‫برنام��ج يعم��ل نياب� ًة ع��ن املُ�س��تخدِ م‬ ‫بت�سمي��م وتطبي��ق الربام��ج القادرة على حماكاة القدرات املعرفية الب�س��رية‪ .‬تُظهِ ر‬
‫اأو النظ��ام يف اإدراك بيئت��ه‪ ،‬و�سن��ع‬ ‫هذه الربامج اخل�سائ�ص التي ت َِ�سف ال�س��لوك الب�س��ري عادةً‪ ،‬مثل حل امل�س��كالت‪،‬‬
‫الق��رارات‪ ،‬واتخ��اذ االإجراءات وفقًا‬ ‫والتعلُّم‪ ،‬و�سنع القرارات‪ ،‬واال�ستدالل‪ ،‬والتخطيط‪ ،‬واتخاذ القرارات‪ ،‬اإلخ‪.‬‬
‫له��ا‪ ،‬وق��د يك��ون الوكي��ل ب�س��يطً ا اأو‬
‫ُمعق� ً�دا‪ ،‬ذات��ي التح ّك��م اأو �س��به ذاتي‬
‫التح ّك��م‪ ،‬اأو يعم��ل يف بيئات متنوعة‪،‬‬
‫مثل املُ�س��تندة اإىل الويب‪ ،‬اأو املاديّة‪،‬‬
‫اأو االفرتا�س ّية‪.‬‬
‫وكاًلء الذكاء‬
‫اإل�ضطناعي‬
‫ال�سبكات الع�سبية‬ ‫التعلُّم‬ ‫ال�ضبكات‬
‫(‪:) eural net or s‬‬ ‫العميق‬ ‫الع�ضبية‬
‫ال�س��بكات الع�سبي��ة ه��ي ن��وع م��ن‬
‫برام��ج احلا�س��ب املُ�س َّمم��ة ملح��اكاة‬
‫طريق��ة عم��ل الدم��ا الب�س��ري‪ .‬وهي‬ ‫الذكاء‬
‫مكون��ة م��ن خالي��ا وطبق��ات ع�سبية‬
‫مُيكنها معاجَلة املعلومات ونقلها‪.‬‬ ‫معاجلة اللغات‬
‫اإل�ضطناعي‬ ‫روؤية‬
‫الطبيعية‬ ‫احلا�ضب‬

‫تعلُّم‬ ‫الروبوتية‬
‫اإلآلة‬

‫�سكل ‪ :1.1‬بع�ص جماالت الذكاء اال�سطناعي‬

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

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

‫احلا�ضب امل ُجيب‬

‫اإلإن�ضان امل ُجيب‬

‫امل ُوجِّ ه الب�ضري‬

‫امل ُجيب اإلأول‬


‫امل ُجيب الثاين‬

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


‫‪13‬‬
‫جدول  ‪ :1.1‬اإمكانات احلا�سب ألجتياز اختبار تورن‬

‫معاجَلة اللغات الطبيعية؛ لتمكني احلا�سب من فهم االأ�سئلة والرد عليها‪.‬‬ ‫‪1‬‬

‫متثيل املعرفة لتنظيم املعلومات وتخزينها وا�سرتجاعها خالل اأداء االختبار‪.‬‬ ‫‪2‬‬

‫اال�ستدالل املُوؤمتت؛ ال�ستخدام املعلومات املُخزَّنة لالإجابة عن االأ�سئلة‪.‬‬ ‫‪3‬‬

‫تعلُّ��م االآل��ة للتك ّي��ف م��ع هي��اكل اللغ��ات اجَلدي��دة مث��ل‪ :‬بن��اء جُ م��ل خُمتلف��ة‪ ،‬اأو اإيجاد مف��ردات لغوي��ة خُمتلفة‪،‬‬ ‫‪4‬‬
‫مل يرها من قبل‪ ،‬اأو لي�ست خُمزّنة �سمن املعلومات‪.‬‬

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

‫الروبوتية؛ حتّى يتمكّن من ا�ستقبال االأ�سياء التي يتلقّاها من املُوجِّ ه عرب املنفذ ويعاجَلها‪.‬‬ ‫‪6‬‬

‫تغط ���ي االإمكان ���ات املو�سح ���ة باالأعل ���ى ج ���زءًا كب ��رًا م ���ن جم ���ال ال ���ذكاء اال�سطناع ���ي الوا�س ���ع‪� .‬سن�س ���تعر�ص ه ���ذه‬
‫االإمكانات فيما يلي‪:‬‬
‫معاجل��ة اللغ��ات الطبيعي��ة (‪ )NLP‬ه��و اأح��د ف��روع ال��ذكاء اال�سطناع��ي ال��ذي َمُين��ح اأجه��زة احلا�س��ب الق��درة عل��ى فهم‬
‫االإن�سان واللغة الطبيعية‪.‬‬
‫ثي��ل املع ِرف��ة (‪ )Knowledge Representation‬يف ال��ذكاء اال�سطناع��ي ي�س��ر اإىل عملي��ة ترمي��ز املعرفة الب�س��رية‬
‫يف �س��كل مق��روء اآل ًي��ا لتتمك��ن االأنظم��ة املُ�س��تنِدة اإىل ال��ذكاء اال�سطناع��ي م��ن معاجَلتها وا�س��تخدامها‪ .‬تاأتي ه��ذه املعرِ فة‬
‫يف �سو ٍر عدة ت�سمل‪ :‬احلقائق‪ ،‬والقواعد‪ ،‬واملفاهيم‪ ،‬والعالقات‪ ،‬والعمليات‪.‬‬
‫اإل�ض��تدإلل املُوؤ ��ت (‪ )Automated Reasoning‬يُ�س��ر اإىل ق��درة االأنظم��ة املُ�س��ت ِندة اإىل ال��ذكاء اال�سطناع��ي عل��ى‬
‫ا�ستنتاج املعرفة اجَلديدة وتقدمي اال�ستنتاجات املنطقية وفقًا ملجموعة من القواعد والفر�سيات املُقدَ مة‪.‬‬
‫روؤية احلا�ضب (‪ )Computer Vision‬هي جمال الذكاء اال�سطناعي الذي ُمُيكِّن احلا�سب من تف�سر وفهم املعلومات‬
‫املرئية من العامل احلقيقي‪ ،‬مثل ال�سور ومقاطع الفيديو‪.‬‬
‫الروبوتي��ة (‪ )Robotics‬ه��ي ف��رع ال��ذكاء اال�سطناع��ي ال��ذي ُيعن��ى بت�سمي��م الروب��وت‪ ،‬وبنائه‪ ،‬وا�س��تخدامه‪ .‬ويت�سمن‬
‫اجَلم��ع ب��ني التقني��ات املتنوع��ة مث��ل‪ :‬تعلُّ��م االآل��ة‪ ،‬وروؤي��ة احلا�س��ب‪ ،‬واأنظم��ة التح ّك��م البت��كار اآالت ذكي��ة ذاتي��ة التح ُّك��م اأو‬
‫تتطلب احلد االأدنى من التوجيه الب�سري‪.‬‬

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

‫‪ :1987-1993‬تُعرف هذه الفرتة با�س��م ثاين �س��تاء للذكاء اال�سطناعي‪.‬‬ ‫اإلأربعينيات‪ :‬البداية واأول خلية ع�ضبية ا�ضطناعية‬
‫‪ُ :1943‬اق��رتح النم��وذج االأول املبن��ي عل��ى اخلالي��ا الع�سبي��ة اال�سطناعي��ة فطبيع��ة اأنظم��ة ال��ذكاء اال�سطناع��ي يف املراحل املُبكرة كانت م�س��تندة على‬
‫بحي��ث مُيك��ن ل��كل خلي��ة ع�سبي��ة اأن تك��ون يف حال��ة ن�س��طة (ت�س��غيل) اأو غ��ر القواع��د‪ ،‬والت��ي بدوره��ا قي��دت م��ن قابليته��ا للتطبي��ق وجعلته��ا غ��ر ق��ادرة‬
‫ن�س��طة (اإيق��اف) وذل��ك وف��ق املح��اكاة الت��ي تتلقاه��ا م��ن اخلالي��ا الع�سبي��ة على حل م�ساكل احلياة الواقعية الرئي�سة‪.‬‬
‫االأخرى املجاورة واملت�سلة بها‪.‬‬
‫‪ :1997‬حتق��ق الف��وز االأول لربنام��ج ال��ذكاء اال�سطناع��ي عل��ى بط��ل العامل‬
‫‪ :1948‬يف ه��ذا الع��ام ظه��ر روبوت��ان‪ :‬اإمل��ر واإل�ض��ي (‪ )Elmer and Elsie‬يف ال�س��طر ‪ ،‬حيث جنح احلا�س��ب العمالق ديب بلو (‪ )Deep Blue‬يف‬
‫وهم��ا روبوت��ان ذاتي��ا التح ُّك��م‪ ،‬مُيكنهم��ا التنق��ل ح��ول العقب��ات با�س��تخدام هزمُية بطل العامل يف ال�سطر جاري كا�ضبارو (‪.)Gary Kasparov‬‬
‫اإلألفيني��ات‪ :‬ف��رتة اإلنت�ض��ار وا�ض��ع ال ّنط��اق‪ ,‬والدع��م الكب��ري للمك ّون��ات‬ ‫ال�سوء واللم�ص‪.‬‬
‫املادية والربجمية‪ ,‬وتطورها‬ ‫خم�ضينات القرن املا�ضي‪ :‬ن�ضاأة الذكاء اإل�ضطناعي‬
‫‪ :1950‬ظهر اختبار تورنغ وهو اختبار يحدِّ د قدرة االآلة على اإظهار �سلوك ‪ :2005‬ط � َّورت جامع��ة �ض��تانفورد (‪ )Stanford University‬ال�س��يارة‬
‫ذكي مكافئ ل�سلوك االإن�سان اأو َي�س ُعب متييزه عنه‪ .‬اإىل جانب ظهور العديد ذاتية القيادة �ض��تانلي (‪ )STANLEY‬التي فازت يف حتدي ال�س��يارات ذاتية‬
‫م��ن مفاهي��م ال��ذكاء اال�سطناع��ي الرئي�س��ة مث��ل تعلُّ��م ا آالل��ة‪ ،‬واخلوارزميات القيادة‪ .‬كما بداأ اجَلي�ص االأمريكي اال�ستثمار يف الروبوتات ذاتية التحكّم‪.‬‬
‫اجَلينية‪ ،‬والتعلُّم املع َّزز‪.‬‬
‫‪ :2009‬ا�ستُخدمت وحدات معاجلة الر�ضومات‬
‫‪�ُ :1951‬سم��م حا�ض��ب التعزي��ز التناظ��ري الع�ضب��ي الع�ض��وائي ( ‪ )Graphics Processing Units - GPUs‬لتدري��ب ال�س��بكات‬
‫(‪ )Stochastic Neural Analog Reinforcement Computer-SNARC‬الع�سبي��ة للتعلُّ��م العمي��ق للم��رة االأوىل‪ .‬اأدى ا�س��تخدام املكون��ات املادي��ة‬
‫املتخ�س�س��ة اإىل ت�س��ارع وت��رة تدري��ب ال�س��بكات املُع َّق��دة عل��ى جمموع��ات‬ ‫كاأول حا�سب يعمل بال�سبكات الع�سبية‪.‬‬
‫خ�سي�س��ا كب��رة ج��دً ا م��ن البيان��ات‪ ،‬مم��ا اأدى ب��دوره اإىل ع�س��رٍ جدي��د م��ن التعلُّ��م‬
‫ً‬ ‫‪ :1958‬طُ ��ورت لغ��ة لي�ض��ب (‪ ،)Lisp‬وه��ي لغ��ة برجم��ة ُم�س َّمم��ة‬
‫لل��ذكاء اال�سطناع��ي‪ .‬ويف الع��ام نف�س��ه‪ُ ،‬ن�س��رت ورق��ة بحثي��ة ح��ول متلق��ي العميق والذكاء اال�سطناعي‪.‬‬
‫امل�ض��ورة اإلفرتا�ض��ي (‪ ،)Hypothetical Advice Taker‬وه��و نظ��ام العِقدي��ن الث��اين والثال��ث م��ن الق��رن احل��ادي والع�ض��رين‪ :‬الع�ض��ر‬
‫الذهبي‬ ‫الذكاء اال�سطناعي القادر على التعلُّم من التجربة متامً ا مثل الب�سر‪.‬‬
‫ال�ض��تينيات وال�ض��بعينيات م��ن الق��رن املا�ض��ي‪ :‬اأول �ض��تاء لل��ذكاء ‪ :2011‬ه��زم نظ��ام االإجاب��ة عل��ى االأ�س��ئلة املع��روف با�س��م وات�ض��ون‬
‫(‪ )Watson‬اأف�س��ل العب��ني يف الع��امل يف برنام��ج امل�س��ابقات االأمرك��ي‬ ‫اإل�ضطناعي‬
‫‪ :1964‬ظه��ر برنام��ج اإلي��زا (‪ )ELIZA‬وه��و اأول برنام��ج ملعاجَل��ة اللغ��ات جيوباردي (‪ ،)Jeopardy‬حيث متكّن وات�س��ون من فهم االأ�س��ئلة واالإجابة‬
‫عليه��ا بنج��اح‪ ،‬مم��ا �س �كّل طف��رة يف ا�س��تخدام ال��ذكاء اال�سطناع��ي ِلفه��م‬ ‫تفرع منه جميع روبوتات الدرد�سة اليوم‪.‬‬ ‫الطبيعية وهي االأ�سل الذي ّ‬
‫اللغة الطبيعية‪.‬‬
‫‪ُ :1974-1980‬تع�رف ه�ذه الف�رتة با�س�م اأول �س�تاء لل�ذكاء اال�سطناع�ي‪.‬‬
‫حي�ث انخف��ص متوي�ل م�س�روعات ال�ذكاء اال�سطناع�ي يف ه�ذه الف�رتة نظ ًرا ‪ :2012‬ظه��ر نظ��ام ال��ذكاء اال�سطناع��ي ال��ذي ُيرتجِ ��م فور ًي��ا اللغ��ة‬
‫لقل�ة التق�دم املُح�رز يف ه�ذا املج�ال‪ ،‬وانخفا��ص ت أاث�ره يف تطبيق�ات احلي�اة االإجنليزية املنطوقة اإىل اللغة ال�سينية املنطوقة‪.‬‬
‫اليومية‪ .‬اأحد االنتقادات الرئي�سة كانت عدم قدرة تقنيات الذكاء اال�سطناعي ‪ :2021‬ظه��ر نظ��ام القي��ادة الذاتي��ة الكام��ل ال��ذي يَ�س��تخدِ م ال�س��بكات‬
‫على معاجَلة م�س�كلة االنفجار التوافقي التي جعلت قابلية تطبيقها حمدودة الع�سبية املُدرَّبة على �سلوك مئات االآالف من ال�سائقني‪.‬‬
‫على بع�ص امل�سكالت وجمموعات البيانات ال�سغرة للغاية‪.‬‬
‫الثمانيني��ات والت�ض��عينيات م��ن الق��رن املا�ض��ي وث��اين �ض��تاء لل��ذكاء ‪ :2022‬ظه��ر روب��وت درد�ض��ة (املُح �وِّل التولي��دي مُ�ض��بق التدري��ب)‬
‫(‪ )Generative Pre-trained Transformer - ChatGPT‬وه��و‬ ‫اإل�ضطناعي‬
‫روب��وت الدرد�س��ة املبن��ي عل��ى جمموع��ة كب��رة م��ن النم��اذج اللغوي��ة‪ .‬ه��ذه‬
‫‪ :1980‬اُطل��ق اأول نظ��ام خب��ر جت��اري ناج��ح ُم�س َّم��م ملح��اكاة الق��درة على النماذج ُمهيئَّة بدقة با�ستخدام كلٍ من تقنيات التعلّم املُوجّ ه واملُعزّز ملحاكاة‬
‫املحادثات الب�سرية‪.‬‬ ‫ُ�سنع القرار مثل االإن�سان‪.‬‬
‫‪15‬‬
‫تطبيقات الذكاء األ�سطناعي ‪pplications of AI‬‬
‫ال��ذكاء اال�سطناع��ي ه��و تقني��ة �س��ريعة التط��ور لديه��ا الق��درة عل��ى حت� ُّول جمموع��ة وا�س��عة من القطاع��ات وال�سناع��ات‪ .‬يف هذه‬
‫الوح��دة �ست�ستك�س��ف تطبيق��ات ال��ذكاء اال�سطناع��ي املتنوع��ة‪ ،‬وكيفي��ة ا�س��تخدامها يف إاج��راء حت�س��ينات وابت��كارات يف جمموع��ة‬
‫متنوعة من القطاعات وال�سناعات‪.‬‬
‫رتا�سيني ‪irtual ssistants‬‬ ‫امل�ساعدين األ‬
‫واحدة من اأ�س��هر تطبيقات الذكاء اال�سطناعي هي تطبيقات امل�س��اعدين االفرتا�سيني الذين‬
‫ُ�ستخدمني عرب التفاعالت الن�سيّة اأو ال�سوتية‪ ،‬ومُيكن الو�سول اإليهم‬ ‫مُيكنهم التوا�سل مع امل ِ‬
‫ع��رب االأجه��زة املادي��ة مث��ل‪ :‬الهوات��ف الذكي��ة‪ ،‬واالأجهزة اللوحي��ة‪ ،‬اأو مكربات ال�س��وت الذكية‪،‬‬
‫ومُيك��ن ا�س��تخدامهم الأداء جمموع��ة وا�س��عة م��ن امله��ام مث��ل‪ :‬اإعداد التذك��رات‪ ،‬واالإجابة على‬
‫االأ�س��ئلة‪ ،‬وت�س��غيل الو�س��ائط ال�سوتية‪ ،‬وطلب املنتجات اأو اخلدمات‪ .‬اأحد االأمثلة االأكرث �سهرة‬
‫على تطبيقات الذكاء اال�سطناعي يف هذا املجال هو �ضريي (‪)Siri‬من �سركة اآبل (‪.)Apple‬‬
‫وهن��اك �س��ركات اأخ��رى ط�وّرت م�س��اعدين افرتا�سي��ني‪ :‬مث��ل األيك�ض��ا (‪ )Alexa‬التاب��ع ل�س��ركة‬
‫اأم��ازون (‪ ،)Amazon‬وامل�ض��اعد اإلفرتا�ض��ي لقوق��ل (‪ ،)Google's Assistant‬وكورتان��ا‬
‫(‪ )Cortana‬التاب��ع ل�س��ركة مايكرو�ض��وفت (‪ .)Microsoft‬ومب��رور الوق��ت تط � َّورت ق��درة‬
‫هذه التطبيقات على الفهم واال�ستجابة لعدد متزايد من االأوامر واال�ستف�سارات والرد عليها‪.‬‬
‫عل��ى �س��بيل املث��ال‪ ،‬مُيك��ن ا�س��تخدام امل�س��اعد االفرتا�س��ي للتحك��م يف االأجهزة املنزلي��ة الذكية‬
‫مث��ل‪ :‬التحك��م يف درج��ة احل��رارة‪ ،‬واالإ�س��اءة‪ ،‬واالأجه��زة الكهربائي��ة‪ .‬وق��د يتمث��ل امل�س��اعد‬
‫االفرتا�سي يف �سورة روبوتات الدرد�سة املتخ�س�سة املُ�س َّممة عاد ًة لتقدمي املعلومات واالإجابة‬
‫�ستخدم روبوتات‬
‫على االأ�سئلة يف جمال حم َّدد‪ ،‬على �سبيل املثال‪ ،‬يف تطبيقات خدمة العمالء ُت َ‬
‫الدرد�سة املبنية على تقنية الذكاء اال�سطناعي يف االإجابة على اأ�سئلة العمالء حول املنتجات‬
‫�سكل ‪ :1.3‬املحادثة مع روبوت الدرد�سة‬
‫اأو اخلدم��ات‪ ،‬وحتدي��د امل�س��كالت وعالجه��ا‪ ،‬وتق��دمي املعلوم��ات ح��ول طلباته��م وح�س��اباتهم‪.‬‬
‫مُيك��ن الو�س��ول اإىل روبوت��ات الدرد�س��ة ع��رب جمموع��ة وا�س��عة من القن��وات مثل‪ :‬مواق��ع الويب‪،‬‬
‫وتطبيق��ات املرا�س��لة‪ ،‬وو�س��ائل التوا�س��ل االجتماع��ي‪ ،‬ومُيكنه��ا تق��دمي خدم��ات امل�س��اعدة عل��ى‬
‫مدار ال�س��اعة طوال اأيام االأ�س��بوع‪ .‬مُيكنك االطالع على مثال الأحد تطبيقات روبوت الدرد�س��ة‬
‫يف ال�سكل ‪.1.3‬‬
‫الروبوتية ‪o otics‬‬
‫ارتب��ط ال��ذكاء اال�سطناع��ي من��ذ بدايات��ه بالروبوتي��ة‪ ،‬ف�اإذا كان الروب��وت ه��و الت�سوي��ر املادي للكائ��ن اال�سطناعي‪ ،‬ف�اإنّ الذّكاء‬
‫اال�سطناع��ي مُيث��ل دم��ا الروب��وت‪َ ،‬ومُينح��ه الق��درة عل��ى ال�س��عور بالبيئ��ة م��ن حول��ه‪ ،‬واتخ��اذ الق��رارات‪ ،‬والتكي��ف م��ع الظ��روف‬
‫املتغرة‪ .‬كما مُيكن للروبوتات الذكية تطبيق هذه االإمكانات والقدرات الأداء جمموعة وا�س��عة من املهام دون التدخل الب�س��ري‪،‬‬
‫مث��ل‪ :‬مه��ام الت�سني��ع‪ ،‬واال�ستك�س��اف‪ ،‬والبح��ث واالإنق��اذ‪ ،‬والعدي��د من املهام االأخرى‪ .‬ال�س��كل ‪ 1.4‬يو�سح خ��ط جتميع روبوتي يف‬
‫م�سنع �سيارات‪.‬‬

‫�سكل ‪ :1.4‬خط جتميع روبوتي يف م�سنع �سيارات‬


‫‪16‬‬
‫اإنّ أاح��د اأق��دم االأمثل��ة عل��ى تطبي��ق ال��ذكاء اال�سطناع��ي يف الروبوتية هو تطوير روبوتات امل�سانع املُ�س��تخدَ مة يف اأداء املهام‬
‫مث��ل‪ :‬اللح��ام‪ ،‬والدهان��ات‪ ،‬والتجمي��ع‪ .‬من��ذ ذل��ك احل��ني‪ ،‬تط� َّور ا�س��تخدام ال��ذكاء اال�سطناع��ي يف الروبوتي��ة اإىل حد كبر‪،‬‬
‫مع تطور اخلوارزميات املتقدمة وا�ستخدام تعلُّم االآلة لتح�سني اأداء الروبوت‪ .‬وكانت اإحدى االإجنازات البارزة يف ا�ستخدام‬
‫ال��ذكاء اال�سطناع��ي يف الروبوتي��ة تطوي��ر الروبوت��ات الب�س��رية‪ ،‬مث��ل‪ :‬روب��وت هون��دا اأ�ض��يمو (‪ )Honda's ASIMO‬وق��د‬
‫ُ�س� ّمي بذل��ك اخت�س��ارًا ملفه��وم اخلط��وة املتقدم��ة يف النق��ل اإلإبداع��ي (‪)Advanced Step in Innovative Mobility‬‬
‫والذي ُق ِّدم للمرة االأوىل يف عام ‪ 2000‬وكان قاد ًرا على ال�سر واأداء املهام االأ�سا�سية‪.‬‬
‫الروبوتات ال�سبيهة بالب�سر ‪Humanli e o ots‬‬
‫ط � ّورت �س��ركة الدب��ران روبوتك���س (‪ )Aldebaran Robotics‬الروبوت��ان ال�س��بيهان‬
‫بالب�س��ر بي��رب (‪ )Pepper‬ون��او (‪ ،)Nao‬ال ّل��ذانِ ُ�س ّمم��ا الأغرا���ص البح��ث والتطوي��ر يف‬
‫جمال التفاعل بني االإن�سان والروبوت‪ ،‬وقد ا�ستخدما على نطاق وا�سع يف جماالت البحث‪،‬‬
‫والتعلي��م‪ ،‬والرتفي��ه‪ .‬أا ّم��ا بي��رب (‪ )Pepper‬فه��و روب��وت اجتماع��ي ُم�س َّم��م للتفاع��ل م��ع‬
‫االأ�سخا�ص ب�سورة طبيعية با�ستخدام كامرا‪ ،‬وميكروفونات‪ ،‬وم�ست�سعرات اللم�ص الإدراك‬
‫البيئة من حوله‪ ،‬واال�ستجابة لت�سرفات وعواطف االأ�سخا�ص من حوله‪ .‬يتمتع هذا الروبوت‬
‫بالعديد من اخل�سائ�ص التي ت�س��مح له بالتع ّرف على الوجوه‪ ،‬وفهم الكالم‪ ،‬واال�س��تجابة‬
‫المُي��اءات‪ .‬ال�س��كل ‪ 1.5‬يعر���ص �س��ورة للروب��وت بي��رب‪ .‬أا ّما ناو (‪ )Nao‬فه��و روبوت ُمدمج‬ ‫ل إ‬
‫اأ�سغر حجمًا ُم�س َّمم للتفاعل مع الب�سر‪ .‬ويحتوي هذا الروبوت مثل ال�سابق على جمموعة‬
‫م��ن امل�ست�س��عرات الت��ي ت�س��مح ل��ه ب �اإدراك البيئ��ة م��ن حول��ه‪ ،‬اإىل جان��ب الكام��رات‪،‬‬
‫وامليكروفون��ات للتع� ّرف عل��ى ال��كالم والوجوه‪ .‬ومُيتاز هذا الروب��وت ب أانّه قابل للتخ�سي�ص‬
‫والربجم��ة بدرج��ة توافقي��ة عالي��ة‪ ،‬مم��ا يجعل��ه اخلي��ار االأمثل للباحث��ني والدار�س��ني الذين‬
‫يرغبون يف درا�سة وتطوير تطبيقات جديدة للروبوتات ال�سبيهة بالب�سر‪.‬‬

‫يف عام ‪ 2017‬كانت الروبوت �ضوفيا (‪ ) ophia‬اأول روبوت يح�ضل على‬ ‫�سكل ‪ :1.5‬الروبوت بيرب‬
‫اجلن�ضية ال�ضعودية‪ ,‬ويف عام ‪ 2023‬طورت اململكة العربية ال�ضعودية‬
‫�ضارة (‪ ,) arah‬وهي الروبوت التفاعلي اإلأول من نوعه‪.‬‬

‫‪el - ri in‬‬ ‫ال�سيارات ذاتية القيادة ‪ars‬‬


‫كان االإجناز املهم االآخر هو تطوير ال�سيارات ذاتية القيادة كما يف ال�سكل ‪1.6‬‬
‫وه�ي �س�يارات تَ�س�تخدِ م ال�ذكاء اال�سطناع�ي لالنتق�ال عرب الط�رق واتخاذ‬
‫القرارات حول كيفية التفاعل االآمن مع املركبات االأخرى ومع املُ�ساة‪ .‬اأحد‬
‫املتطلبات الرئي�سة لهذه التطبيقات هو القدرة على معاجَلة البيانات املرئية‬
‫مث�ل ال�س�ور ومقاط�ع الفيدي�و وفهمه�ا‪ ،‬وي�س�ار اإىل ذل�ك ع�ادة با�س�م روؤي�ة‬
‫احلا�ض�ب (‪ ،)Computer Vision‬و مُيك�ن ا�س�تخدام خوارزمي�ات روؤي�ة‬
‫احلا�س�ب للتع� ُّرف عل�ى الكائن�ات‪ ،‬واالأ�س�خا�ص‪ ،‬واخل�سائ��ص االأخ�رى يف‬
‫ال�س�ور ومقاط�ع الفيدي�و‪ ،‬اإىل جان�ب فه�م �س�ياق املحت�وى ومعن�اه‪ .‬وله�ذا‬
‫املج�ال العدي�د م�ن التطبيق�ات غ�ر الروبوتي�ة مث�ل‪ :‬التع� ُّرف عل�ى الوج�ه‪،‬‬
‫واإدارة املحت�وى‪ ،‬وحتلي�ل الو�س�ائط‪ .‬وكان اأح�د ا إالجن�ازات الب�ارزة يف‬
‫ا�س�تخدام ال�ذكاء اال�سطناع�ي يف حتلي�ل ال�س�ور ومقاط�ع الفيدي�و تطوي�ر‬
‫خوارزمي�ات التعلُّ�م العمي�ق‪ ،‬الت�ي ُمُيكنها حتليل كمي�ات كبرة من البيانات‬
‫وحتديد االأمناط املُع َّقدة يف ال�سور ومقاطع الفيديو‪.‬‬
‫�سكل ‪� :1.6‬سيارة ذاتية القيادة‬
‫‪17‬‬
‫‪ndustries‬‬ ‫رّ ت بالذكاء األ�سطناعي ‪ected by AI‬‬ ‫املجاألت التي ت أا‬
‫التعليم ‪ducation‬‬
‫على مدى العقود القليلة املا�سية‪ ،‬كانت هناك العديد من االإجنازات الرئي�سة‬
‫مزايا الذكاء اإل�ضطناعي يف التعليم‬ ‫ال�س��تخدام ال��ذكاء اال�سطناع��ي يف التعلي��م‪ .‬مب��ا يف ذل��ك تطوي��ر اأنظم��ة‬
‫‪AI ene its in education‬‬ ‫التدري���ص القائم��ة عل��ى ال��ذكاء اال�سطناع��ي الت��ي ت�س��تخدم تقني��ات معاجَل��ة‬
‫يو ّف ��ر وق ��ت املُع ِّلم ��ني واالأ�س ��اتذة‬ ‫•‬
‫اللغ��ات الطبيعي��ة للتفاع��ل م��ع الطلب��ة وتق��دمي املالحظ��ات ح��ول اأعمالهم‪ .‬ثم‬
‫اجَلامعيني‪.‬‬ ‫من�س��ات التعلُّ��م التك ُّيف��ي الت��ي تَ�س��تخدِ م خوارزمي��ات تعلُّ��م االآل��ة‬
‫ظه��رت ّ‬
‫لتخ�سي���ص العملي��ة التعليمي��ة ل��كل طال��ب ا�س��تنادًا اإىل نق��اط قوت��ه و�سعف��ه‪.‬‬
‫ُمُيك��ن مل ُع ِّلم��ي ال��ذكاء اإل�ضطناع��ي‬ ‫•‬ ‫بعده��ا‪ ،‬طُ �وِّرت اأنظم��ة الت�سحي��ح القائم��ة عل��ى ال��ذكاء اال�سطناع��ي الت��ي‬
‫(‪ )AI tutors‬م�ساعدة الطلبة‪.‬‬ ‫تَ�س��تخدِ م خوارزمي��ات معاجَل��ة اللغ��ات الطبيعي��ة وتعلُّ��م االآل��ة لت�سحي��ح‬
‫ي�س��اعد املُع ِّل��م عل��ىاأن ي�سب��ح مع ّل ًم��ا‬ ‫•‬ ‫الواجب��ات املكتوب��ة وتق��دمي املالحظ��ات‪ .‬ويف االآون��ة ا أالخ��رة‪ ،‬ح��دث دم��ج بني‬
‫حمفّزً ا‪.‬‬ ‫امل�ساعدين االفرتا�سيني وروبوتات الدرد�سة يف جمال التعليم لتقدمي الدعم‬
‫ُتق ��دِّ م الوظائ ��ف املُ�س ��ت ِندة عل ��ى‬ ‫•‬ ‫املخ�س���ص للطلب��ة واالإجاب��ة عل��ى اأ�س��ئلتهم ب�س��كل ف��وري‪ .‬مُيك��ن ا�س��تخدام‬
‫ال ��ذكاء اال�سطناع ��ي املالحظ ��ات‬ ‫ال��ذكاء اال�سطناع��ي لتحلي��ل البيان��ات حول اأداء الطلب��ة‪ ،‬وخياراتهم املف�سلة‬
‫لكل من الطلبة واملُعلِّمني‪.‬‬ ‫يف التعلي��م‪ ،‬وغره��ا م��ن العوام��ل االأخ��رى الالزم��ة لو�س��ع خط��ط تعليمي��ة‬
‫خُم�س�س��ة للطلب��ة‪ ،‬وتق��دمي التو�سي��ات ب�س �اأن امل��واد اأو االأن�س��طة الت��ي م��ن‬
‫املرجح اأن تفيدهم بفعالية‪.‬‬
‫الرعاية ال�سحية ‪Healthcare‬‬
‫الرعاي��ة ال�سحي��ة ه��ي جم��ال اآخ��ر ح َّق��ق تقدمً ��ا كب�رًا بف�س��ل ال��ذكاء اال�سطناع��ي‪ .‬كان��ت االبت��كارات االأوىل يف �س��ورة‬
‫االأنظم��ة الت�س��خي�سية القائم��ة عل��ى ال��ذكاء اال�سطناع��ي وا�س��تخدامه يف اكت�س��اف االأدوي��ة‪ .‬ث��م دجم��ه م��ع ال�س��جالت‬
‫ال�سحي��ة االإلكرتوني��ة ال�س��تخراج املعلوم��ات ذات ال�سل��ة‪ ،‬ويف ال ِعقد الثاين من القرن احلادي والع�س��رين‪ُ ،‬ط ِّورت اأنظمة‬
‫التطبي��ب ع��ن ُبع��د القائم��ة عل��ى ال��ذكاء اال�سطناع��ي‪ .‬والي��وم‪ُ ،‬ي�س��اعد ال��ذكاء اال�سطناع��ي احلدي��ث يف اإن�س��اء خط��ط‬
‫عالجي��ة ُخُم�س�س��ة للمري���ص‪ ،‬وا�س��تخدام اأجه��زة تقني��ة يرتديه��ا ملتابع��ة حالت��ة ال�سحي��ة‪ .‬ويلع��ب ال��ذكاء اال�سطناع��ي‬
‫دورًا كب�رًا يف جم��ال الرعاي��ة ال�سحي��ة‪ ،‬فه��و ُمُي ِّك��ن االأطب��اء ومق ّدم��ي خدم��ات الرعاي��ة ال�سحي��ة االآخري��ن م��ن حتلي��ل‬
‫كميات كبرة من البيانات واتخاذ القرارات حول رعاية املر�سى‪ .‬قد تاأتي البيانات من م�سادر متنوعة مثل‪ :‬ال�سجالت‬
‫�ستخدم خوارزميات روؤية‬‫الطبية‪ ،‬والفحو�سات املعملية‪ ،‬وكذلك ال�سور مثل‪ :‬االأ�سعة ال�سينية اأو االأ�سعة املقطعية‪ ،‬كما ُت َ‬
‫احلا�سب احلديثة ب�سورة متكررة للك�سف عن الت�سوهات وامل�ساعدة يف الت�سخي�ص الطبي‪.‬‬

‫�سكل ‪ :1.7‬حتليل البيانات ال�سحية‬


‫‪18‬‬
‫‪riculture and limate Modelin‬‬ ‫ال راعة والنمذجة املناخية‬
‫ُي�س��تخدَ م الذكاء اال�سطناعي يف الزراعة لتح�س��ني اإنتاج املحا�سيل الزراعية ورفع كفاءة املمار�س��ات الزراعية‪ .‬ويتحقق‬
‫ذل��ك بالتحلي��ل امل�س��تمر للبيان��ات ح��ول حال��ة الرتب��ة‪ ،‬واأمن��اط الطق���ص‪ ،‬والعوام��ل االأخ��رى للتنب�وؤ باأف�س��ل وق��ت لزراع��ة‬
‫�تخدم ال��ذكاء اال�سطناع��ي يف مراقب��ة املحا�سي��ل ط��وال الوق��ت وحتديد‬ ‫املحا�سي��ل الزراعي��ة ور َّيه��ا وح�ساده��ا‪ .‬كم��ا ُي�س� َ‬
‫امل�سكالت التي قد ت�سيبها مثل‪ :‬االآفات اأو االأمرا�ص‪ ،‬مما ي�سمح للمزارعني باتخاذ الالزم قَبل اأن توؤثر تلك امل�سكالت‬
‫عل��ى ج��ودة املحا�سي��ل الزراعي��ة‪ ،‬واأح��د االأمثل��ة املُبتك��رة عل��ى تطبيق��ات ال��ذكاء اال�سطناع��ي يف الزراع��ة ه��و ا�س��تخدام‬
‫خوارزمي��ة ُ�سن��ع الق��رارات الب�س��يطة لتح�س��ني مواعي��د ال��ري‪ .‬وم��ن االإجن��ازات الرئي�س��ة االأخ��رى ا�س��تخدام �س��بكات‬
‫امل�ست�س��عرات ملراقب��ة املحا�سي��ل الزراعي��ة‪ ،‬ومعاي��رة التطبيق��ات العالجي��ة الرئي�س��ة مثل االأ�س��مدة واملبي��دات‪ .‬ويف االآونة‬
‫ُخدمت ال�س��ور املُلتقط��ة بالطائ��رات املُ�س� َّ�رة واالأقم��ار ال�سناعي��ة لتحلي��ل املحا�سي��ل الزراعي��ة على نطاق‬ ‫االأخ��رة‪ ،‬ا�س�ت ِ‬
‫�ستخدم لت�سميد اأحد احلقول‪.‬‬‫�سرة ُت َ‬ ‫وا�سع‪ ،‬كما يف ال�سكل ‪ 1.8‬الذي يعر�ص طائرة ُم َّ‬

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

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

‫�سكل ‪ :1.9‬الطاقة الكهربائية النظيفة من االألواح الكهرو�سوئية ال�سم�سية‬


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

‫‪ 2‬ما الذكاء اإل�ضطناعي (‪)AI‬؟‬

‫‪ 3‬ا�ضرح باإيجاز بع�س تطبيقات الذكاء اإل�ضطناعي امل ُ�ضتخدَمة يف احلياة اليومية‪.‬‬

‫‪21‬‬
‫و�ض� بع���س اإلأح��داث التاريخي��ة الرئي�ض��ة الت��ي أا ّث��رت يف تط��ور الذكاء اإل�ضطناعي يف اإلأربعينيات واخلم�ض��ينيات من‬
‫ِّ‬ ‫‪4‬‬
‫القرن املا�ضي‪.‬‬

‫‪ 5‬ا�ض��رح كي��ف ا�ض��تخدمت التطبيق��ات التجاري��ة تقني��ات ال��ذكاء اإل�ضطناع��ي للم��رة اإلأوىل يف ال ِعق��د الث��اين م��ن الق��رن‬
‫احلادي والع�ضرين‪.‬‬

‫‪ 6‬خلِّ�س كيفية ا�ض��تخدام تطبيقات الذكاء اإل�ضطناعي يف الت�ضدي لتغريات امل ُنا عرب النمذجة امل ُناخية والتح�ض��ينات‬
‫يف جمال الطاقة‪.‬‬

‫‪22‬‬
‫الدر�ص الثاين‬
‫هياكل البيانات يف الذكاء األ�سطناعي‬

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


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

‫هياكل البيانات غري اإلأوليّة‬ ‫هياكل البيانات اإلأوليّة‬


‫)‪(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‬‬
‫هياكل البيانات األأوليّة ‪rimiti e ata tructures‬‬
‫يُ�س��ار اإىل هي��اكل البيان��ات االأول ّي��ة با�س��م هي��اكل البيان��ات االأ�سا�س��ية يف لغ��ة البايث��ون‪ ،‬ويحت��وي ه��ذا‬
‫ُرتجم بن��وع البيانات‬
‫الن��وع م��ن الهي��اكل عل��ى قي��م ب�س��يطة للبيانات‪ُ .‬تخ��رب اأنواع البيانات الب�س��يطة امل ِّ‬
‫خزنها‪ .‬هياكل البيانات االأولية يف لغة البايثون هي‪:‬‬ ‫التي ُي ِّ‬
‫تُ�ضتخدَم اأنوا خمتلفة من‬ ‫اإلأرقام (‪ :)Numbers‬تُ�ستخدَ م االأرقام لتمثيل البيانات الرقمية وهي‪:‬‬ ‫•‬
‫هياكل البيانات لتطبيقات‬
‫احلا�ضب ومهامّه املختلفة‬ ‫‪ -‬االأعداد ال�سحيحة‬
‫بنا ًء على ما يتطلبه‬ ‫‪ -‬االأرقام الع�سرية‬
‫امل�ضرو والقيود املفرو�ضة‬
‫على الذاكرة‪.‬‬ ‫ال�ضاًل�ضل الن�ضيّة (‪ :)Strings‬ال�سال�سل الن�سيّة هي جمموعات من االأحرف والكلمات‪.‬‬ ‫•‬
‫البيانات املنطقية (‪ :)Boolean‬تكون قيم البيانات املنطقية اإما �سحيحة اأو خاطئة‪.‬‬ ‫•‬

‫هياكل البيانات ري األأوليّة ‪Non- rimiti e ata tructures‬‬


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

‫هي��اكل البيان��ات اخلط ّي��ة اأو امل ُت�ضل�ض��لة (‪:)Linear or sequential data structures‬‬ ‫•‬
‫معني‪.‬‬
‫تُخزِّ ن هياكل البيانات اخلطيّة عنا�سر البيانات يف ت�سل�سل ّ‬
‫هي��اكل البيان��ات غ��ري اخلط َّي��ة (‪ :)Non-linear data structures‬ال حتت��وي هي��اكل‬ ‫•‬
‫البيان��ات غ��ر اخلط َّي��ة عل��ى ارتباط ت�سل�س��لي بني عنا�س��ر البيانات‪ُ ،‬ومُيكن رب��ط اأي زوج اأو‬
‫جمموعة من عنا�سر البيانات معًا‪ ،‬والو�سول اإليها دون ت�سل�سل ُحم َّدد‪.‬‬

‫هياكل البيانات اخلطية ‪inear ata tructures‬‬


‫ُتخ��زِّ ن هي��اكل البيان��ات اخلط َّي��ة عنا�س��ر البيان��ات يف ت�سل�س��ل مع� ّ�ني‪ .‬يف هذا الدر���ص �س��تتعلّم‬
‫بع���ص هي��اكل البيان��ات اخلط ّي��ة مث��ل امل ُك ّد���س (‪ )Stack‬والطاب��ور (‪ ،)Queue‬وهم��ا نوع��ان‬
‫من هياكل البيانات االأكرث ا�ستخدامً ا يف احلياة اليومية‪.‬‬
‫�سكل ‪ :1.12‬كومة من الكتب كمثال‬ ‫املُكدّ �ص ‪tac‬‬
‫واقعي على املُكدّ�ص‬
‫مُيك��ن متثي��ل املُك ّد���ص يف الواق��ع مبجموع��ة م��ن الكت��ب ُر َّ�س��ت ف��وق بع�سه��ا البع���ص‪ ،‬كم��ا ه��و‬
‫مو�س��ح يف ال�س��كل ‪ .1.12‬فالإن�س��اء تل��ك املجموع��ة‪ ،‬علي��ك اأن ت�س��ع الكت��ب بع�سها فوق بع�ص‪،‬‬ ‫ّ‬
‫قاعدة املُ ساف اآخرً ا‬ ‫وعندم��ا تري��د ا�س��تخدام اأح��د الكت��ب‪ ،‬علي��ك اأخ��ذ الكت��اب من اأعل��ى املجموع��ة‪ .‬وللو�سول اإىل‬
‫أوأل‬
‫َخرج ا ً‬
‫ي ُ‬ ‫الكتب االأخرى عليك اإنزال الكتب من اأعلى املجموعة‪.‬‬
‫(‪:) ast In First Out-LIFO‬‬
‫اآخر عن�سر ُم�ساف مُيكن‬ ‫متغريًا ديناميكيًا‪.‬‬
‫قد يكون حجم امل ُكدّ�س ثابتًا اأو ّ‬
‫الو�سول اإليه ا ًأوال‪.‬‬ ‫تُطبِّق لغة البايثون امل ُكدّ�ضات با�ضتخدام القوائم‪.‬‬

‫‪24‬‬
‫العمليات يف املُكدّ �ص ‪Operations on the stac‬‬
‫هناك عمليتان رئي�ستان يف املُكدّ�ص‪:‬‬
‫• اإ�ضافة عن�ضر (‪ :)Push‬تُ�ستخدَ م العملية الإ�سافة عن�سر يف قمة املُكدّ�ص‪.‬‬
‫• حذف عن�ضر (‪ :)Pop‬تُ�ستخدَ م العملية حلذف عن�سر من قمة املُكدّ�ص‪.‬‬

‫عملية اإ�ضافة عن�ضر ‪ush operation‬‬

‫اإ�ضافة عن�ضر‬
‫يُط َل��ق عل��ى عملي��ة اإ�ساف��ة عن�س��ر جدي��د اإىل املُك ّد���ص ا�س��م اإ�ضاف��ة عن�ض��ر‬
‫اإىل امل ُكدّ�س‬ ‫العن�ضر‬ ‫(‪.)Push‬‬
‫عند القمة‬
‫العن�ضر‬
‫يَ�س��تخدِ م املُك ّد���ص موؤ�سّ �رًا ُيطل��ق علي��ه موؤ�س��ر اإلأعل��ى (‪ ،)Top‬ويُ�س��ر اإىل‬
‫عند القمة‬ ‫العن�سر املوجود يف قمة املُكدّ�ص‪ ،‬وعند اإ�سافة عن�سر جديد اإىل املُكدّ�ص‪:‬‬
‫‪E‬‬ ‫‪E‬‬ ‫• ت��زداد قيم��ة موؤ�س��ر االأعل��ى بقيم��ة واح��دة الإظه��ار املوق��ع اجَلدي��د ال��ذي‬
‫‪D‬‬ ‫‪D‬‬ ‫‪D‬‬ ‫�س ُي�ساف العن�سر فيه‪.‬‬
‫• يُ�ساف العن�سر اجَلديد اإىل قمة املُكدّ�ص‪.‬‬
‫‪C‬‬ ‫‪C‬‬ ‫‪C‬‬

‫‪B‬‬ ‫‪B‬‬ ‫‪B‬‬ ‫‪tac O er lo‬‬‫َفيْ�س امل ُكدّ�س‬


‫‪A‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫يتميز املُكدّ�ص ب�سعة تخزينية ُحمدَّدة تعتمد على ذاكرة احلا�سب‪ .‬اإذا‬
‫كانت الذاكرة ممتلئة‪ ،‬فاإن اإ�سافة عن�سر جديد �سينتج عنها م�سكلة‬
‫املُكدّ�ص ا أال ّويل‬ ‫املُكدّ�ص النهائي‬ ‫َفيْ�س امل ُكدّ�س (‪ .)Stack Overflow‬ويق�سد بها جتاوز ال�سعة؛ لذا‬
‫�سكل ‪ :1.13‬عملية اإ�سافة عن�سر اإىل املُكدّ�ص‬
‫يجب التحقق من امتالء ذاكرة املُكدّ�ص قبل اإ�سافة اأي عن�سر جديد‪.‬‬

‫حذف عن�ضر‬ ‫عملية حذف عن�ضر ‪Pop operation‬‬


‫من امل ُكدّ�س‬
‫العن�ضر‬
‫عند القمة‬ ‫يُطلق على عملية حذف عن�سر من املُكدّ�ص ا�سم حذف عن�ضر (‪.)Pop‬‬
‫العن�ضر‬ ‫عند حذف عن�سر من املُكدّ�ص‪:‬‬
‫عند القمة‬
‫‪E‬‬ ‫‪E‬‬ ‫• يُحذَ ف العن�سر من قمة املُكدّ�ص‪.‬‬
‫‪D‬‬ ‫‪D‬‬ ‫‪D‬‬
‫• تنخف�ص قيمة موؤ�س��ر االأعلى بقيمة واحد الإظهار العن�سر التايل عند قمة‬
‫املُكدّ�ص‪.‬‬
‫‪C‬‬ ‫‪C‬‬ ‫‪C‬‬
‫‪tac‬‬ ‫‪nder lo‬‬ ‫َغيْ�س امل ُكدّ�س‬
‫‪B‬‬ ‫‪B‬‬ ‫‪B‬‬
‫اإذا كن�ت ترغ�ب يف ح�ذف عن�س�ر من املُك ّد��ص‪ ،‬عليك التّحقّ�ق ا ًأوال من‬
‫‪A‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫اأن املُك ّد��ص يحت�وي عل�ى عن�س�ر واح�د عل�ى االأق�ل؛ ف�اإذا كان املُك ّد��ص‬
‫املُكدّ�ص االأ ّويل‬ ‫املُكدّ�ص النهائي‬ ‫فارغًا‪� ،‬سوف ينتج عن ذلك م�سكلة َغيْ�س امل ُكدّ�س (‪)StackUnderflow‬‬
‫ويق�سد بها االنخفا�ص عن احلد االأدنى لل�سعة‪.‬‬
‫�سكل ‪ :1.14‬عملية حذف عن�سر من املُكدّ�ص‬

‫‪25‬‬
‫املُكدّ �س يف لغة البايثون ‪Stack in Python‬‬
‫ُمتثَّل املُكدّ�صات يف لغة البايثون با�صتخدام القوائم التي بدورها تُقدِّ م بع�ص العمليات التي ُميكن تطبيقها مبا�صر ًة على املُكدّ�صات‪.‬‬

‫كد�س‬‫جدول  ‪ :1.2‬عمليات املُ ّ‬


‫الو�صف‬ ‫العملية‬
‫تُطبَّق عملية اإ�صافة عن�صر‬
‫للمُكدّ�س يف لغة البايثون‬ ‫اإ�صافة العن�صر ‪ x‬اإىل نهاية القائمة‪.‬‬ ‫(‪listName.append)x‬‬
‫با�صتخدام دالة ‪.append‬‬ ‫حذف العن�صر االأخر من القائمة‪.‬‬ ‫()‪listName.pop‬‬

‫مثاال على تطبيق املُكدّ�ص يف لغة البايثون‪:‬‬


‫�صت�صاهد ً‬
‫‪ 1‬اأن�صئ املُكدّ�ص لتخزين جمموعة من االأرقام (‪.)45 ،32 ،21 ،1‬‬
‫ا�صتخدم عملية حذف عن�صر (‪ )Pop‬من املُكدّ�ص مرتن حلذف العن�صرين االأخرين (‪ )45 ،32‬من املُكدّ�ص‪.‬‬ ‫ِ‬ ‫‪2‬‬

‫ِ‬
‫ا�صتخدم عملية اإ�صافة عن�صر (‪ )Push‬اإىل املُكدّ�ص الإ�صافة عن�صر جديد (‪ )78‬اإىل املُكدّ�ص‪.‬‬ ‫‪3‬‬

‫اإ�صافة عن�صر‬
‫اإىل امل ُكدّ�س‬
‫اإ�صافة عن�صر‬ ‫العن�صر عند‬
‫اإىل امل ُكدّ�س‬
‫‪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.15‬مثال على املُكدّ�ص‬


‫‪26‬‬
‫مفكرة جوبيرت ‪Jupyter Notebook‬‬
‫يف ه��ذه الوح��دة �س��تكتب مقط ًع��ا برجم ًّي��ا بلغ��ة البايث��ون با�س��تخدام مفك��رة جوبي��رت‬
‫�تخدم الإن�س��اء املُ�س��تندات احلا�س��وبية‬
‫(‪ .)Jupyter Notebook‬وه��ي تطبي��ق الوي��ب املُ�س� َ‬
‫وم�س��اركتها‪ .‬كل ُم�س��تند ُي�س��مى مفك��رة‪ ،‬ويحت��وي عل��ى املقط��ع الربجم��ي ال��ذي كتب َت��ه‪،‬‬
‫والتعليق��ات‪ ،‬والبيان��ات االأول ّي��ة واملُعاجَل��ة‪ ،‬وت�س�وّرات البيان��ات‪� .‬ستَ�س��تخدِ م االإ�س��دار غ��ري‬
‫امل ُت�ض��ل باإلإنرتن��ت (‪ )Offline‬م��ن مفك��رة جوبي��رت‪ ،‬واأ�س��هل طريقة لتثبيت��ه حمليًا هي من‬
‫خ��الل اأناكون��دا (‪ )Anaconda‬وه��ي من�س��ة توزي��ع مفتوح��ة امل�س��در للطلب��ة واله��واة‪،‬‬
‫ومُيكنك تنزيلها وتثبيتها من الرابط التايل‪:‬‬ ‫َ‬
‫‪https://www.anaconda.com/products/distribution‬‬
‫‪2‬‬
‫و�سيتم تثبيت لغة البايثون ومفكرة جوبيرت تلقائيًا‪.‬‬

‫‪3‬‬ ‫لفت مفكرة جوبيرت (‪:)Jupyter Notebook‬‬


‫‪2‬‬ ‫ ا�سغط على ‪( Start‬بدء)‪ 1 ،‬ثم ا�سغط على ‪( Anaconda3‬اأناكوندا ‪.)3‬‬
‫ اخرت ‪( Jupyter Notebook‬مفكرة جوبيرت)‪3 .‬‬

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


‫‪1‬‬

‫ال�سفحة الرئي�سة‬
‫لمفكرة جوبيتر‪.‬‬

‫�سكل ‪ :1.16‬ال�سفحة الرئي�سة ملفكرة جوبيرت‬


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

‫ حدِّ د (‪( Python 3 )ipykernel‬بايثون ‪2 .)3‬‬

‫‪3‬‬ ‫ �صيتم فتح املفكرة اخلا�صة بك يف عالمة تبويب جديدة يف املت�صفح اخلا�ص بك‪.‬‬

‫‪1‬‬
‫يمكنك تحميل مفكرتك من‬
‫جهاز الحا�صب الخا�ص بك‪.‬‬
‫‪2‬‬

‫‪3‬‬

‫خلية المقطع البرمجي‪ .‬يمكنك كتابة ن�ص‪ ،‬اأو‬ ‫�صريط اأدوات‬ ‫اال�صم االفترا�صي‬
‫معادلة ريا�صية اأو اأمر بلغة البايثون‪.‬‬ ‫المفكرة‪.‬‬ ‫للمفكرة هو "بدون عنوان"‪.‬‬
‫�صكل ‪ :1.17‬اإن�صاء مفكرة جوبيرت جديدة‬
‫‪28‬‬
‫ألإن�صاء برنامج يف مفكرة جوبيرت‪:‬‬ ‫االآن وبع��د اأن اأ�صبح��ت مُفكرت��ك جاه��زة‪ ،‬ح��ان الوق��ت لكتاب��ة‬
‫برناجمك االأول وت�صغيله فيها‪.‬‬
‫‪1‬‬ ‫ اأكتب االأوامر داخل خلية املقطع الربجمي‪.‬‬
‫ ا�صغط على ‪( Run‬ت�صغيل)‪2 .‬‬
‫مُيكنك احل�صول على العديد من اخلاليا املختلفة التي‬
‫حتتاجها يف نف�س املفكرة حيث حتتوي كل خلية على مقطعها‬
‫ �صيتم عر�ص النتيجة حتت االأوامر‪3 .‬‬
‫الربجمي اخلا�س‪.‬‬

‫‪2‬‬

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

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

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

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

‫‪2‬‬

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


‫‪3‬‬
‫‪4‬‬ ‫تلقائيًا اأثناء عملك‪.‬‬ ‫المفكرة‪.‬‬

‫�صكل ‪ :1.19‬حفظ املفكرة اخلا�صة بك‬


‫‪29‬‬
:‫ يف مفكرة جوبيرت‬1.15 ‫لت�صاهد املثال يف ال�صكل‬
.)45 ،32 ،21 ،1( ‫ اأن�صئ املُكدّ�ص لتخزين جمموعة من االأرقام‬.1
.‫) من املُكدّ�ص مرتن حلذف العن�صرين االأخرين منه‬Pop( ‫ا�صتخدم عملية حذف عن�صر‬ ِ .2
ِ
.‫) اإىل املُكدّ�ص الإ�صافة عن�صر جديد اإليه‬Push( ‫ا�صتخدم عملية اإ�صافة عن�صر‬ .3
myStack=[1,21,32,45]
print("Initial stack: ", myStack)
print(myStack.pop()) ‫ لعر�ص‬print)myStack.pop)(( ‫تُ�صتخدَ م الدالة‬
print(myStack.pop())
print("The new stack after pop: ", myStack)
.myStack.Pop)( ‫ُ�صترجعة من دالة‬
َ ‫القيم الم‬
myStack.append(78)
print("The new stack after push: ", myStack)

Initial stack: [1, 21, 32, 45]


45
32
The new stack after pop: [1, 21]
The new stack after push: [1, 21, 78]

myStack=[1,21,32,45]
print("Initial stack:", myStack)
a=len(myStack)
print("size of stack",a)
.‫ لعر�ص طول المُكدّ�ص‬len ‫تُ�صتخدَ م الدالة‬
# empty the stack
for i in range(a): ‫يُ�صتخدَ م هذا االأمر لحذف‬
myStack.pop()
print(myStack)
.‫كل العنا�صر من المُكدّ�ص‬
myStack.pop()

Initial stack: [1, 21, 32, 45]


size of stack 4
[]
--------------------------------------------------------------------
IndexError Traceback (most recent call last)
Input In [3], in <cell line: 9>()
7 myStack.pop() ‫يظهر الخطاأ الأن المُكدّ�ص‬
8 print(myStack) ‫فارغ واأنت كتبت اأمر حذف‬
----> 9 myStack.pop() .‫عن�صر منه‬
IndexError: pop from empty list

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


‫�ص�تالحظ ظه�ور خط� أا عندم�ا كتب�تَ اأم�ر ح�ذف عن�ص�ر م�ن املُك ّد��ص الف�ارغ وت�ص�بب ه�ذا يف َغ ْي��س امل ُك ّد��س‬
.‫ عليك دومً ا التحقق من وجود عنا�صر يف املُكدّ�ص قبل حماولة حذف عن�صر منه‬.)Stack Underflow(
30
‫ �ص��يظهر بالربنام��ج قائم��ة تطل��ب من��ك‬،‫ اأو حتذفه��ا من��ه‬،‫يف الربنام��ج الت��ايل �صتن�ص��ئ مُكدّ� ًص��ا جدي��دً ا وت�صي��ف العنا�ص��ر اإلي��ه‬
.‫حتديد االإجراء الذي تود القيام به يف كل مرة‬
.‫ من قائمة الربنامج‬1 ‫ ا�صغط على الرقم‬،‫• الإ�صافة عن�صر اإىل املُكدّ�ص‬
.‫ من قائمة الربنامج‬2 ‫ ا�صغط على الرقم‬،‫• حلذف عن�صر من املُكدّ�ص‬
.‫ من قائمة الربنامج‬3 ‫ ا�صغط على الرقم‬،‫• للخروج من الربنامج‬

def push(stack,element):
stack.append(element)
def pop(stack):
return stack.pop()
def isEmpty(stack):
return len(stack)==0
def createStack():
return []

newStack=createStack()
while True:
print("The stack so far is:",newStack)
print("-----------------------------")
print("Choose 1 for push")
print("Choose 2 for pop")
print("Choose 3 for end")
print("-----------------------------")
choice=int(input("Enter your choice: "))
while choice!=1 and choice!=2 and choice!=3:
print ("Error")
choice=int(input("Enter your choice: "))
if choice==1:
x=int(input("Enter element for push: "))
push(newStack,x)
elif choice==2:
if not isEmpty(newStack):
print("The pop element is:",pop(newStack))
else:
print("The stack is empty")
else:
print("End of program")
break;

31
:‫َنفِّذ الربنامج ال�صابق كما يلي‬
The stack so far is: []
----------------------------- .‫• اأن�صئ مُكدّ�صً ا من ثالثة اأرقام‬
Choose 1 for push
Choose 2 for pop
.‫• اأ�صف العنا�صر اإىل املُكدّ�ص‬
Choose 3 for end
-----------------------------
Enter your choice: 1
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 ‫اأ�صف العن�صر‬
Choose 2 for pop
‫اإىل امل ُكدّ�س‬ 18
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]
-----------------------------
‫ اإ�صافة العنا�صر‬:1.20 ‫�صكل‬
‫ ثم‬،‫ميكن��ك االآن ح��ذف عن�صري��ن م��ن املُك ّد���ص‬
Choose 1 for push
Choose 2 for pop
.‫اخلروج من الربنامج‬
Choose 3 for end
-----------------------------
Enter your choice: 2
The pop element is: 23
The stack so far is: [26, 18]
----------------------------- ‫حذف العن�صر‬
Choose 1 for push ‫من امل ُكدّ�س‬
Choose 2 for pop
Choose 3 for end
‫حذف العن�صر‬
‫من امل ُكدّ�س‬
-----------------------------
23
Enter your choice: 2
The pop element is: 18 23
The stack so far is: [26] 18
-----------------------------
Choose 1 for push 18 18
Choose 2 for pop
Choose 3 for end
----------------------------- 26 26 26
Enter your choice: 3
End of program

‫ حذف العنا�صر‬:1.21 ‫�صكل‬


32
‫الطابور ‪Queue‬‬
‫أوأل‬
‫أوأل يَخرُ ج ا ً‬
‫قاعدة املُ�صاف ا ً‬ ‫هي��كل البيان��ات الت��ايل ال��ذي �صت�ص��تعر�صه ه��و الطاب��ور‪ .‬تُ�ص��ا ِدف ع��اد ًة طواب��ر يف‬
‫(‪:)First In First Out )FIFO( rule‬‬ ‫حيات��ك اليومي��ة‪ .‬الطاب��ور االأك��ر �ص��يوعً ا ه��و طاب��ور انتظ��ار ال�ص��يارات عن��د اإ�ص��ارة‬
‫العن�ص��ر االأول املُ�ص��اف اإىل القائمة ُيعالَج‬ ‫املرور‪ .‬عندما تتحول اإ�ص��ارة املرور اإىل اللون االأخ�صر‪� ،‬ص��تكون ال�ص��يارة التي دخلت‬
‫ا ًأوال‪ ،‬والعن�صر االأحدث ُيعالَج اآخرًا‪.‬‬ ‫اإىل الطاب��ور ا ًأوال ه��ي نف�ص��ها الت��ي تخ��رج من��ه ا ًأوال‪ .‬الطابور هو هي��كل البيانات الذي‬
‫أوال (‪ ، )First In First Out - FIFO‬مم��ا يعن��ي‬ ‫َيتب��ع قاع��دة امل ُ�ص��اف ا ً‬
‫أوال َيخ�رُج ا ً‬
‫اأن كل عن�صر يف الطابور ُيق َّدم بالرتتيب نف�صه الذي و�صل به اإىل الطابور‪.‬‬
‫الفرق بني امل ُكدّ�س والطابور هو اأنه يف امل ُكدّ�س‬
‫تتم اإ�صافة وحذف العن�صر من نف�س اجلانب‪،‬‬
‫ويف الطابور تتم االإ�صافة من جانب‪ ،‬بينما‬
‫يتم احلذف من اجلانب االآخر‪ .‬وهكذا‪ ،‬عند‬
‫احلذف يف امل ُكدّ�س‪ ،‬يُحذف العن�صر امل ُ�صاف‬ ‫قاعدة المُ�صاف ا ًأوال يَخرُج ا ًأوال‬
‫اآخرًا‪ ،‬بينما يف الطابور‪ ،‬يُحذف العن�صر‬
‫أوال‪.‬‬
‫امل ُ�صاف ا ً‬

‫املوؤ�صر (‪:)Pointer‬‬ ‫العمليات يف الطابور ‪:Operations on the Queue‬‬


‫املوؤ�ص��ر ه��و ُمتغر يُخزِّ ن اأو يُ�ص��ر‬ ‫هناك عمليتان رئي�صتان يف الطابور‪:‬‬
‫اإىل عن��وان ُمتغ��ر اآخ��ر‪ .‬املوؤ�ص��ر‬
‫ي�ص��به رق��م ال�صفح��ة يف فهر���ص‬ ‫• اإ�صافة عن�صر للطابور (‪ :)Enqueue‬تُ�صتخدَ م العملية الإ�صافة عن�صر يف اآخر الطابور‪.‬‬
‫الكت��اب الذي ُي�ص� ِّهل عل��ى القارئ‬ ‫• ح��ذف عن�ص��ر م��ن الطاب��ور (‪ :)Dequeue‬تُ�ص��تخدَ م العملي��ة حل��ذف عن�ص��ر من مقدمة‬
‫الو�صول اإىل املحتوى املطلوب‪.‬‬ ‫الطابور‪.‬‬

‫موؤ�صرات الطابور ‪Queue Pointers‬‬


‫الفهر�س (‪:)Index‬‬ ‫يحتوي الطابور على موؤ�صرين‪:‬‬
‫الفهر���ص ه��و رق��م ُيح� ِّ�دد مو�ص��ع‬
‫العن�صر يف هيكل البيانات‪.‬‬ ‫• املوؤ�صر االأمامي (‪ :)Front Pointer‬يُ�صر اإىل العن�صر االأول يف الطابور‪.‬‬
‫• املوؤ�صر االأخر (‪ُ :)Rear Pointer‬ي�صر اإىل العن�صر االأخر يف الطابور‪.‬‬

‫املوؤ�صر االأمامي‬ ‫‪Q u e u e‬‬


‫املوؤ�صر اخللفي‬
‫حذف عن�صر‬ ‫اإ�صافة عن�صر‬
‫من الطابور‬ ‫للطابور‬

‫‪9‬‬ ‫‪17‬‬ ‫‪43‬‬ ‫‪21‬‬ ‫‪7‬‬ ‫‪12‬‬ ‫‪56‬‬ ‫‪23‬‬ ‫‪4‬‬ ‫‪14‬‬ ‫‪31‬‬
‫الفهر�س‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪8‬‬ ‫‪9‬‬ ‫‪10‬‬
‫�صكل ‪ :1.22‬العمليات يف الطابور‬
‫‪33‬‬
‫عملية اإ�صافة عن�صر للطابور ‪Enqueue Operation‬‬

‫ال مُيكنك اإ�صافة عن�صر اأو‬ ‫يُطل��ق عل��ى عملي��ة اإ�صاف��ة عن�ص��ر جدي��د اإىل الطاب��ور ا�ص��م اإ�صاف��ة عن�ص��ر للطاب��ور‬
‫حذفه من و�صط الطابور‪.‬‬ ‫(‪ .)Enqueue‬الإ�صافة عن�صر جديد اإىل الطابور‪:‬‬
‫• تت��م زي��ادة قيم��ة املوؤ�ص��ر اخللف��ي بقيم��ة واح��د بحي��ث ي�ص��ر اإىل مو�ص��ع العن�ص��ر اجلدي��د‬
‫الذي �صيُ�صاف‪.‬‬
‫• تتمّ اإ�صافة العن�صر‪.‬‬

‫االأمامي‬ ‫اخللفي‬ ‫االأمامي‬ ‫اخللفي‬ ‫االأمامي‬ ‫اخللفي‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬

‫بعد‬ ‫اإ�صافة عن�صر للطابور‬ ‫قبل‬


‫�صكل ‪ :1.23‬عملية اإ�صافة عن�صر للطابور‬

‫قبل اأي اإجراء عليك‬ ‫عملية حذف عن�صر من الطابور ‪Dequeue Operation‬‬
‫التحقق مما اإذا كانت هناك‬
‫م�صاحة فارغة يف الطابور‬ ‫يُطلق على عملية حذف عن�صر من الطابور ا�صم حذف عن�صر من الطابور (‪.)Dequeue‬‬
‫الإ�صافة عن�صر جديد‪،‬‬ ‫حلذف عن�صر من الطابور‪:‬‬
‫وتوافر عن�صر واحد على‬ ‫• يُحذف العن�صر املُ�صار اإليه باملوؤ�صر االأمامي‪.‬‬
‫االأقل لت�صديره‪.‬‬
‫• تتم زيادة قيمة املوؤ�ص��ر االأمامي بقيمة واحد بحيث ي�ص��ر اإىل العن�صر اجلديد التايل يف‬
‫الطابور‪.‬‬

‫االأمامي‬ ‫اخللفي‬ ‫االأمامي‬ ‫اخللفي‬ ‫االأمامي‬ ‫اخللفي‬

‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪D‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬

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

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

‫‪34‬‬
‫الطابور يف لغة البايثون ‪Queue in Python‬‬
‫ميك��ن متثي��ل الطاب��ور بع��دة ط��رق متنوع��ة يف لغ��ة البايث��ون منه��ا القوائ��م (‪ .)Lists‬ويرج��ع ذل��ك اإىل حقيق��ة اأن القائم��ة متث��ل‬
‫جمموعة من العنا�صر اخلطيّة‪ ،‬كما ميكن اإ�صافة عن�صر يف نهاية القائمة وحذف عن�صر من بداية القائمة‪.‬‬
‫�صتتعلم فيما يلي ال�صيغ العامة لبع�ص العمليات التي ميكن تنفيذها على الطابور‪:‬‬

‫جدول  ‪ُ :1.3‬ط ُرق الطابور‬


‫الو�صف‬ ‫الطريقة‬
‫(‪ listName.append)x‬ت�صيف العن�صر ‪ x‬اإىل القائمة التي متثل الطابور‪.‬‬
‫حتذف العن�صر االأول من القائمة‪.‬‬ ‫(‪listName.pop)0‬‬

‫تُ�ص��تخدَ م طريق��ة ()‪ listName.pop‬ل� ٍ‬


‫�كل م��ن هي��اكل بيان��ات املُك ّد���ص والطاب��ور‪ .‬عندم��ا تُ�ص��تخدَ م م��ع املُك ّد���ص‪ ،‬ال‬
‫تتطل��ب الطريق��ة اأي مُعام��ل‪ .‬بينم��ا تتطل��ب الطريق��ة اإ�صاف��ة �صف��ر اإىل املُعام��ل عندم��ا تُ�ص��تخدم م��ع الطاب��ور‪:‬‬
‫ُو�صح يف اجلدول ‪ 1.4‬اأدناه‪.‬‬ ‫(‪ .listName.pop)0‬الفرق بن الدالتن م ّ‬

‫جدول  ‪ :1.4‬طريقة ()‪ listName.pop‬مقابل طريقة (‪listName.pop)0‬‬


‫الو�صف‬ ‫الطريقة‬
‫اإذا كان ُم ِ‬
‫عامل الدالة فارغً ا‪ُ ،‬يحذف العن�صر االأخر من نهاية القائمة التي متثل املُكدّ�ص‪.‬‬ ‫()‪listName.pop‬‬
‫اإذا كان ُم ِ‬
‫عامل الدالة �صف ًرا‪ُ ،‬يحذف العن�صر االأول من القائمة التي متثل الطابور‪.‬‬ ‫(‪listName.pop)0‬‬

‫مثاال على تطبيق الطابور يف لغة البايثون‪:‬‬


‫�صن�صتعر�ص لك ً‬
‫• اأن�صئ طابورًا لتخزين جمموعة من االأرقام (‪.)45 ،32 ،21 ،1‬‬
‫• ا�صتخدم عملية حذف عن�صر من الطابور مرتن حلذف العن�صرين االأ َّولَن منه‪.‬‬
‫• ا�صتخدم عملية اإ�صافة عن�صر اإىل الطابور الإ�صافة عن�صر جديد اإليه‪.‬‬
‫االأمامي‬ ‫اخللفي‬ ‫االأمامي‬ ‫اخللفي‬ ‫اخللفي االأمامي‬

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

‫اخللفي االأمامي‬ ‫االأمامي‬ ‫اخللفي‬

‫‪32‬‬ ‫‪45‬‬ ‫‪78‬‬ ‫‪32‬‬ ‫‪45‬‬ ‫‪78‬‬ ‫الطابور االأخير‬


‫‪0‬‬ ‫‪1‬‬ ‫اإ�صافة عن�صر‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬
‫للطابور‬
‫�صكل ‪ :1.25‬مثال تو�صيحي ملفهوم الطابور‬
‫‪35‬‬
‫ كم��ا فعل��ت يف‬،‫ �صتَ�ص��تخدِ م قائم��ة البايث��ون لتنفي��ذ هي��كل الطاب��ور‬،‫لربجم��ة اخلط��وات املو�صح��ة باالأعل��ى بلغ��ة البايث��ون‬
.‫املُكدّ�ص‬
myQueue=[1,21,32,45]
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)

Initial queue: [1, 21, 32, 45]


The new queue after pop: [32, 45]
The new queue after push: [32, 45, 78]

.‫عليك ا ًأوال اأن تُفرِ غ الطابور من العنا�صر‬


َ ،‫لكي ت�صاهد ما قد يحدث عندما حتاول حذف عن�صر من طابور فارغ‬
myQueue=[1,21,32,45]
print("Initial queue: ", myQueue)
a=len(myQueue)
print("size of queue ",a)
# empty the queue
for i in range(a):
myQueue.pop(0)
print(myQueue)
myQueue.pop(0)

Initial queue: [1, 21, 32, 45]


size of queue 4
[]
--------------------------------------------------------------------
IndexError Traceback (most recent call last)
Input In [6], in <cell line: 9>()
7 myQueue.pop()
8 print(myQueue)
----> 9 myQueue.pop()

IndexError: pop from empty list

‫عليك اأن تتحقق دومًا من وجود عنا�صر يف‬ ‫ظهر الخطاأ الأنك حاولت‬
.‫الطابور قبل حماولة حذف عن�صر منه‬ .‫حذف عن�صر من طابور فارغ‬

36
‫تطبيقات على الطابور ‪Queue Applications‬‬
‫أاح��د االأمثل��ة عل��ى تطبيق��ات الطاب��ور يف عل��وم احلا�ص��ب هو طابور الطباعة‪ .‬على �ص��بيل املثال‪ ،‬لديك معمل حا�ص��ب به ‪ 30‬جهاز حا�ص��ب‬
‫مت�صل��ن بطابع��ة واح��دة‪ .‬عندم��ا يرغ��ب الطلب��ة يف طباع��ة املُ�ص��تندات‪� ،‬صت�ص�كّل مه��ا ّم الطّ باع� ِة طاب��ورًا ملعاجلته��ا وف��ق قاع��دة امل ُ�ص��اف‬
‫أوال (‪ ،)FIFO‬اأي اأنّ تل��ك امله��ام �ص�تُنج ُز بالرتتي��ب الزمن��ي ال��ذي اأُر�ص�لَت ب��ه اإىل الطابع��ة‪ .‬املهم��ة املُر�ص��لة ا ًأوال �ص��وف ُتطب��ع‬
‫أوال َيخ�رُج ا ً‬
‫ا ً‬
‫قبل املهمة املُر�ص��لة بعدها ولن ُتطبع املهمة يف نهاية الطابور قبل طباعة كل املهام التي قبلها‪ .‬عندما تنتهي الطابعة من اأحد االأوامر‪،‬‬
‫�صوف تبحث يف الطابور ملعرِ فة ما اإن كانت هناك اأوامر اأخرى ملعاجلتها‪.‬‬
‫املُكدّ �س والطابور با�صتخدام وحدة الطابور النمطية‬
‫‪Stack and Queue Using Queue Module‬‬
‫ميكن اعتبار القائمة يف لغة البايثون مبثابة طابور وكذلك مُكدّ�ص‪ .‬تُقدِّ م لغة البايثون الوحدة النمطية للطابور (‪)Queue Module‬‬
‫وهي طريقة اأخرى لتنفيذ هيكلَيّ البيانات املو�صحن‪ .‬تت�صمن الوحدة النمطية للطابور بع�ص الدوال اجلاهزة لال�صتخدام التي ميكن‬
‫تطبيقها على كل من املُكدّ�ص والطابور‪.‬‬

‫جدول  ‪ :1.5‬وظائف وحدة الطابور النمطية‬


‫الو�صف‬ ‫الوظيفة‬
‫()‪ queueName=queue.Queue‬تن�صئ طابورًا جديدً ا ا�صمه ‪.queueName‬‬
‫ت�صيف العن�صر ‪ x‬اإىل الطابور‪.‬‬ ‫(‪queueName.put)x‬‬
‫تعود بقيمة حجم الطابور‪.‬‬ ‫()‪queueName.qsize‬‬
‫تعر�ص وحتذف العن�صر االأول من الطابور والعن�صر االأخر من املُكدّ�ص‪.‬‬ ‫()‪queueName.get‬‬
‫تع��ود بقيم��ة ‪�( True‬صحي��ح) اإن كان الطاب��ور ممتل ًئ��ا‪ ،‬وقيم��ة ‪( False‬خط�اأ)‬ ‫()‪queueName.full‬‬
‫اإن كان الطابور فارغً ا‪ ،‬وميكن تطبيقها على املُكدّ�ص كذلك‪.‬‬
‫تع��ود بقيم��ة ‪�( True‬صحي��ح) اإن كان الطاب��ور فارغً ��ا والقيم��ة ‪( False‬خط�اأ)‬ ‫()‪queueName.empty‬‬
‫اإن كان الطابور ممتلئًا‪ ،‬ميكن تطبيقها على املُكدّ�ص كذلك‪.‬‬
‫* ‪from queue import‬‬ ‫تُ�صتخدَم وظائف مكتبة الطابور مع كلٍ من امل ُكدّ�س والطابور‪.‬‬
‫)(‪myQueue = Queue‬‬
‫‪# add the elements in the queue‬‬ ‫�صت ِ‬
‫َ�صتخدم وحدة الطابور النمطية الإن�صاء طابور‪.‬‬
‫)"‪myQueue.put("a‬‬
‫)"‪myQueue.put("b‬‬ ‫يف هذا املثال عليك‪:‬‬
‫)"‪myQueue.put("c‬‬
‫)"‪myQueue.put("d‬‬ ‫• ا�ص��تراد مكتب��ة الطاب��ور (‪ )Queue‬ال�ص��تخدام‬
‫)"‪myQueue.put("e‬‬ ‫طُ رُق الطابور‪.‬‬
‫‪# 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‬‬
‫ ويف النهاية‬،‫ ثم اطبع هذه القي��م‬،‫اأن�ص��ئ طاب��ورًا مُك َّو ًن��ا م��ن خم���ص قي��م يق��وم املُ�ص��تخدِ م باإدخالها اأثن��اء تنفيذ الربنام��ج‬
.‫اطبع حجم الطابور‬
from queue import *

myQueue = Queue()

# the user enters the elements of the queue for i in range(5):


for i in range(5):
element=input("enter queue element: ")
myQueue.put(element)

# print the elements of the queue


for element in list(myQueue.queue):
print(element)

print ("Queue size is: ",myQueue.qsize())

enter queue element: 5


enter queue element: f
enter queue element: 12
enter queue element: b
enter queue element: 23
5
f
12
b
23
Queue size is: 5

.‫اأن�صئ برناجمً ا للتحقق مما اإذا كان الطابور فارغً ا اأم ممتلئًا‬
from queue import *

myQueue = Queue()

myQueue.put("a")
myQueue.put("b")
myQueue.put("c")
myQueue.put("d")
myQueue.put("e")

checkFull=myQueue.full()
print("Is the queue full? ", checkFull)
checkEmpty= myQueue.empty()
print("Is the queue empty? ", checkEmpty)

Is the queue full? False


Is the queue empty? False

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

‫كد�س‬ ‫جدول  ‪ :1.6‬وظائف الوحدة املُ�صتخدمة ُ‬


‫للم ّ‬
‫الو�صف‬ ‫الوظيفة‬
‫()‪ stackName=queue.LifoQueue‬تن�صئ مُكدّ�صً ا جديدً ا ا�صمه ‪.stackName‬‬
‫حتذف العن�صر االأخر من املُكدّ�ص‪.‬‬ ‫()‪stackName.get‬‬

‫�صتَ�صتخدِ م وحدة الطابور الإن�صاء مُكدّ�ص فارغ‪.‬‬


‫* ‪from queue import‬‬
‫تذكّر اأن العمليات يف امل ُكدّ�س تعمل وفقًا‬
‫)(‪myStack = LifoQueue‬‬ ‫أوال (‪.)LIFO‬‬
‫لقاعدة امل ُ�صاف اآخرًا يَخرُج ا ً‬
‫)"‪myStack.put("a‬‬
‫)"‪myStack.put("b‬‬
‫)"‪myStack.put("c‬‬
‫عند ا�صتخدام دالة ‪ get‬مع الطابور‪،‬‬
‫)"‪myStack.put("d‬‬ ‫�صتَ�صتنِد عمليات اال�صتدعاء والطباعة اإىل‬
‫)"‪myStack.put("e‬‬ ‫أوال (‪.)FIFO‬‬
‫أوال يَخرُج ا ً‬
‫قاعدة امل ُ�صاف ا ً‬
‫‪for i in range(5):‬‬
‫)(‪k=myStack.get‬‬
‫)‪print(k‬‬

‫‪# empty the stack‬‬


‫)(‪checkEmpty= myStack.empty‬‬
‫)‪print("Is the stack empty?", checkEmpty‬‬

‫‪e‬‬
‫‪d‬‬
‫‪c‬‬
‫‪b‬‬
‫‪a‬‬
‫‪Is the stack empty? True‬‬

‫مثال‪ :‬الطباعة ‪Print‬‬


‫يظه��ر اأمام��ك يف املث��ال الت��ايل حم��اكاة لطاب��ور الطباع��ة يف الطابعة‪ .‬عندما ي ِ‬
‫ُر�ص��ل املُ�ص� ِ‬
‫�تخدمون اأوام��ر طباعة‪ ،‬تُ�صاف‬
‫اإىل طابور الطباعة‪ .‬ت ِ‬
‫َ�صتخدم الطابعة هذا الطابور لتحديد امللف الذي �ص ُيطبع ا ًأوال‪.‬‬
‫• افرت���ص اأن �ص��عة الطابع��ة ه��ي فق��ط ‪ 7‬ملف��ات‪ ،‬ولك��ن يف الوق��ت نف�ص��ه‪ ،‬حتت��اج اإىل طباع��ة ‪ 10‬ملف��ات م��ن املل��ف ‪A‬‬
‫اإىل امللف ‪.J‬‬
‫• اكتب برناجمً ا ُميثّل طابور الطباعة منذ بدء اأمر الطباعة االأول ‪ A‬حتى االنتهاء من كل اأوامر الطباعة‪.‬‬
‫• اأ�صف اللبنة التي توؤكد اأن طابور اأوامر الطباعة فارغ‪.‬‬

‫‪39‬‬
:‫ُميكنك ا�صتخدام اخلوارزمية االآتية‬
.‫ اأن�صئ طابور اأوامر الطباعة‬1
A B C D E F G
‫ يف‬G ‫ اإىل‬A ‫ اأدرِج امللفات من‬2
0 1 2 3 4 5 6 .‫طابور اأوامر الطباعة‬
‫متت طباعته‬ A B C D E F G H
.H ‫ واأدرج امللف‬A ‫اأخرِ ج امللف‬ 3
0 1 2 3 4 5 6

.I ‫ واأدرج امللف‬B ‫اأخرِ ج امللف‬ 4


‫متت طباعته‬ B C D E F G H I
0 1 2 3 4 5 6

.J ‫ واأدرج امللف‬C ‫اأخرِ ج امللف‬ 5


‫متت طباعته‬ C D E F G H I J
0 1 2 3 4 5 6

D E F G H I J
‫اأخرج امللفات التي متت طباعتها‬ 6
0 1 2 3 4 5 6 .‫) واحدً ا تلو االآخر‬D-E-F-G-H-I-J(

# import the queue library


from queue import *
# import the time library to use the sleep function
import time
# initialize the variables and the queue
printDocument = " "
printQueueSize = 0
printQueueMaxSize = 7
printQueue = Queue(printQueueMaxSize)
# add a document to print the queue
def addDocument(document):
printQueueSize = printQueue.qsize()
if printQueueSize == printQueueMaxSize:
print("!! ", document, " was not sent to print queue.")
print("The print queue is full.")
print()
return
printQueue.put(document)
time.sleep(0.5) #Wait 5.0 seconds
print(document, " sent to print queue.")
printQueueSizeMessage()
# print a document from the print queue
def printDocument():
printQueueSize = printQueue.qsize()
if printQueueSize == 0:
print("!! The print queue is empty.")

40
print()
return
printDocument = printQueue.get()
time.sleep(1) # wait one second
print ("OK - ", printDocument, " is printed.")
printQueueSizeMessage()
# print a message with the size of the queue
def printQueueSizeMessage():
printQueueSize = printQueue.qsize()
if printQueueSize == 0:
print ("There are no documents waiting for printing.")
elif printQueueSize == 1:
print ("There is 1 document waiting for printing.")
else:
print ("There are ", printQueueSize, " documents waiting for printing.")
print()
# the main program
# send documents to the print queue for printing
addDocument("Document A")
addDocument("Document B")
addDocument("Document C")
addDocument("Document D")
addDocument("Document E")
addDocument("Document F")
addDocument("Document G")
printDocument()
addDocument("Document H")
printDocument()
addDocument("Document I")
printDocument()
addDocument("Document J")
addDocument("Document K")
printDocument()
printDocument()
printDocument()
printDocument()
printDocument()
printDocument()
printDocument()
printDocument()

Document A sent to print queue.


There is 1 document waiting for printing.

Document B sent to print queue.


There are 2 documents waiting for printing.

Document C sent to print queue.


There are 3 documents waiting for printing.

41
Document D sent to print queue.
There are 4 documents waiting for printing.

Document E sent to print queue.


There are 5 documents waiting for printing.

Document F sent to print queue.


There are 6 documents waiting for printing.

Document G sent to print queue.


There are 7 documents waiting for printing.

OK - Document A is printed.
There are 6 documents waiting for printing.

Document H sent to print queue.


There are 7 documents waiting for printing.

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.

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.

OK - Document G is printed.
There are 3 documents waiting for printing.

OK - Document H is printed.
There are 2 documents waiting for printing.

OK - Document I is printed.
There is 1 document waiting for printing.

OK - Document J is printed.
There are no documents waiting for printing.

!! The print queue is empty.

42
‫هياكل البيانات الثابتة واملتغرة ‪Static and Dynamic Data Structures‬‬
‫�ص��بق تو�صيح اأن هياكل البيانات هي طريقة فعالة لتخزين البيانات وتنظيمها‪ ،‬وباالإ�صافة اإىل ما تعلمته حول ت�صنيف هياكل‬
‫أي�صا اإىل ثابتة (‪ )Static‬و متغرة (‪.)Dynamic‬‬ ‫البيانات اإىل اأوليّة وغر اأوليّة‪ ،‬فاإنه ميكن ت�صنيفها ا ً‬
‫هياكل البيانات الثابتة ‪Static Data Structure‬‬
‫يف البيان��ات الثابت��ة‪ ،‬يك��ون حج��م الهي��كل ثاب ًت��ا‪ ،‬و ُتخ�زَّن عنا�ص��ر البيان��ات يف مواق��ع الذاك��رة املتج��اورة‪ُ .‬تع� ُّد امل�صفوف��ة‬
‫(‪ )Array‬املثال االأبرز لهياكل البيانات الثابتة‪.‬‬
‫هياكل البيانات املتغرة ‪Dynamic Data Structure‬‬
‫يف هي��اكل البيان��ات املتغ��رة‪ ،‬ال يك��ون حج��م الهي��كل ثاب ًت��ا ولك��ن ميك��ن تعديل��ه اأثن��اء تنفي��ذ الربنام��ج‪ ،‬ح�ص��ب العملي��ات‬
‫املُن َّف��ذة علي��ه‪ .‬تُ�ص َّم��م هي��اكل البيان��ات املتغ��رة لت�ص��هيل تغي��ر حج��م هي��اكل البيان��ات اأثن��اء الت�ص��غيل‪ .‬و ُتع� ُّد القائم��ة‬
‫املرتابطة (‪ )Linked List‬املثال االأبرز لهياكل البيانات املتغرة‪.‬‬

‫جدول  ‪ :1.7‬مقارنة بني هياكل البيانات الثابتة واملتغرة‬


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

‫تخ�صي�س الذاكرة ‪Memory Allocation‬‬


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

‫= بايت واحد من الذاكرة املُ�صتخدَ مة‬ ‫املتغرة‬ ‫= بايت واحد من الذاكرة املُ�صتخدَ مة‬ ‫الثابتة‬

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

‫‪3‬‬

‫‪2‬‬

‫‪5‬‬

‫‪4‬‬

‫ال حتتاج القوائم املرتابطة اإىل اأن تكون متجاورة‬ ‫حتتاج امل�صفوفات اإىل لبنة ذاكرة متجاورة‪.‬‬
‫يف الذاكرة ولكن يزداد حجمها بطريقة متغرة‪.‬‬
‫�صكل ‪ :1.26‬مثال على تخ�صي�صيّ الذاكرة الثابتة واملتغرة‪.‬‬
‫‪43‬‬
‫القائمة املرتابطة ‪Linked List‬‬
‫القائمة املرتابطة (‪:)Linked List‬‬ ‫القائم��ة املرتابط��ة ه��ي ن��وع م��ن هي��اكل البيان��ات اخلط َّي��ة‪ ،‬وه��ي واح��دة م��ن هي��اكل‬
‫البيان��ات االأك��ر �ص��هرة يف الربجم��ة‪ .‬القائم��ة املرتابط��ة ت�ص��به �صل�ص��لة م��ن ال ُعق��د‪.‬‬
‫القائم��ة املرتابط��ة ه��ي ن��وع م��ن هي��اكل‬ ‫حتت��وي كل عُ ق��دة عل��ى حقل��ن‪ :‬حق��ل البيان��ات حي��ث ُتخ��زن البيان��ات‪ ،‬وحق��ل يحتوي‬
‫البيان��ات اخلط َّي��ة الت��ي ت�ص��به �صل�ص��لة م��ن‬ ‫عل��ى املوؤ�ص��ر ال��ذي ُي�ص��ر اإىل ال ُعق��دة التالي��ة‪ُ .‬ي�ص��تثنى م��ن هذا ال ُعق��دة االأخرة التي‬
‫العُقد‪.‬‬ ‫ال يحم��ل فيه��ا حق��ل العن��وان اأي بيان��ات‪ .‬اإح��دى مزاي��ا القائم��ة املرتابط��ة ه��ي اأن‬
‫حجمها يزداد اأو يقل باإ�صافة اأو حذف ال ُعقد‪.‬‬
‫العُقدة (‪:)Node‬‬ ‫الراأ�س‬ ‫القائمة املرتابطة‬ ‫القيمة الفارغة‬
‫(‪)Head‬‬ ‫(‪)Null‬‬
‫ال ُعق��دة ه��ي اللبن��ة الفردي��ة املُك ِّون��ة لهي��كل‬
‫البيان��ات وحتت��وي عل��ى البيان��ات وراب��ط‬
‫واح��د اأو اأك��ر م��ن الرواب��ط الت��ي تربطه��ا‬ ‫‪5‬‬ ‫‪7.2‬‬ ‫‪-2‬‬ ‫‪ABC‬‬
‫بالعُقد االأخرى‪.‬‬ ‫�صكل ‪ :1.27‬ر�صم تو�صيحي للقائمة املرتابطة‬

‫العُقدة ‪Node‬‬
‫تتكون كل عُ قدة يف القائمة املرتابطة من جزئن‪:‬‬
‫• اجلزء االأول يحتوي على البيانات‪.‬‬
‫‪12‬‬ ‫• اجلزء الثاين يحتوي على موؤ�صر يُ�صر اإىل العُقدة التالية‪.‬‬

‫حقل البيانات‪.‬‬ ‫موؤ�صر اإلى العُقدة التالية‪.‬‬ ‫لقراءة حمتوى عُقدة حمددة‪ ،‬عليك‬
‫املرور على كل العُقد ال�صابقة‪.‬‬
‫�صكل ‪ :1.28‬ر�صم تو�صيحي للعُقد‬

‫القيمة الفارغة تعني اأنها‬


‫مثاال على القائمة املرتابطة لالأعداد ال�صحيحة‪.‬‬
‫لت�صاهد ً‬
‫بال قيمة‪ ،‬اأو غر ُحمدَّدة‪ ،‬اأو‬ ‫تتكون القائمة املرتابطة من خم�ص عُ قد‪.‬‬
‫فارغة‪ .‬على الرغم من اأنه يف‬
‫بع�س االأحيان ن�صتخدم الرقم‬ ‫الراأ�س‬ ‫القيمة الفارغة‬
‫‪ 0‬لالإ�صارة اإىل القيمة الفارغة‪،‬‬
‫اإال اأنه رقم حمدَّد وقد ي�صر‬
‫اإىل قيمة حقيقية‪.‬‬ ‫‪3‬‬ ‫‪12‬‬ ‫‪1‬‬ ‫‪95‬‬ ‫‪21‬‬

‫�صكل ‪ :1.29‬ر�صم تو�صيحي ُميثّل قائمة مرتابطة لالأعداد ال�صحيحة‬

‫ال ُعق��د يف القائم��ة ال يك��ون له��ا ا�ص��م‪ ،‬وم��ا تعرف��ه عنها هو عنوانها (املوقع الذي تخزن في��ة العُقدة يف الذاكرة)‪ .‬للو�صول‬
‫اإىل اأي عُ ق��دة بالقائم��ة‪ ،‬حتت��اج فق��ط اإىل معرف��ة عن��وان ال ُعق��دة االأوىل‪ .‬ث��م تتب��ع �صل�ص��لة ال ُعق��د للو�ص��ول اإىل ال ُعق��دة‬
‫املطلوبة‪.‬‬
‫‪44‬‬
‫عل��ى �ص��بيل املث��ال‪ ،‬اإن كن��ت ترغب يف الو�ص��ول اإىل العُقدة الثالثة‬
‫يف القائم��ة ملعاجل��ة البيان��ات التي حتتوي عليها‪ ،‬عليك البدء من‬
‫الراأ�س‬ ‫القيم الفارغة‬ ‫ال ُعق��دة االأوىل يف القائم��ة‪ ،‬وم��ن ال ُعق��دة االأوىل للو�ص��ول اإىل‬
‫الثانية‪ ،‬ومن الثانية للو�صول اإىل الثالثة‪.‬‬
‫• عنوان العُقدة االأوىل ُخمزَّن يف مُتغر خا�ص (مُ�صتقِل) يُطلق‬
‫‪15‬‬ ‫‪25‬‬ ‫‪30‬‬ ‫عليه عاد ًة الراأ�س (‪.)Head‬‬
‫• قيمة موؤ�صر العُقدة االأخرة يف القائمة قيمة فارغة (‪،)Null‬‬
‫العُقدة االأوىل‬ ‫العُقدة الثانية‬ ‫العُقدة الثالثة‬ ‫ُوميثَّل بالرمز ‪.‬‬
‫• عندما تكون القائمة فارغة‪ ،‬ي�ص��ر موؤ�ص��ر الراأ���ص اإىل القيمة‬
‫�صكل ‪ :1.30‬الو�صول اإىل العُقدة الثالثة يف القائمة املرتابطة‬ ‫الفارغة (‪.)Null‬‬
‫اإلي��ك مث� ً�اال تو�صيح ًي��ا عل��ى القائم��ة املرتابط��ة يف �ص��كل ‪ ،1.31‬كما ذُ ك��ر من قبل فاإن كل عُ قدة تتكون من بيانات وموؤ�ص��ر‬
‫ي�صر اإىل ال ُعقدة التالية‪ ،‬بحيث تُخزّن كل عُ قدة يف الذاكرة يف عنوان ُحم َّدد‪.‬‬

‫مثال على العُقدة‪:‬‬ ‫لرنب��ط ال ُعق��دة ال�ص��ابقة بال ُعق��دة التالي��ة بقيم��ة بيان��ات ‪،42‬‬
‫• بيانات العُقدة هي الرقم ‪.15‬‬ ‫الت��ي بدوره��ا تُ�ص��ر اإىل ال ُعق��دة الثالث��ة وا أالخ��رة عن��د عن��وان‬
‫• عنوان العُقدة يف الذاكرة هو ‪.10‬‬ ‫‪ 30‬بقيمة بيانات ‪.37‬‬
‫• عنوان العُقدة التالية هو ‪.20‬‬

‫‪10‬‬ ‫‪15‬‬ ‫‪20‬‬


‫‪10‬‬ ‫‪20‬‬ ‫‪30‬‬
‫‪15‬‬ ‫‪20‬‬ ‫‪42‬‬ ‫‪30‬‬ ‫‪37‬‬

‫العنوان‪/‬الراأ�س‬ ‫البيانات‬ ‫العنوان التايل‬

‫�صكل ‪ :1.31‬املوؤ�صرات يف القائمة املرتابطة‬

‫جدول  ‪ :1.8‬األختالفات بني القائمة والقائمة املرتابطة‬


‫القائمة املرتابطة‬ ‫القائمة‬ ‫االختالفات‬
‫املواقع ع�صوائية يف الذاكرة‪.‬‬ ‫طريقة تخزين الذاكرة املواقع متجاورة يف الذاكرة‪.‬‬
‫ميكن الو�صول اإىل العنا�صر من خالل املوؤ�صر‬ ‫ميكن الو�صول اإىل كل عن�صر برقم‬ ‫الهيكل‬
‫(‪.)Pointer‬‬ ‫الفهر�س (‪.)Index‬‬
‫ُتخ �زَّن الكائن��ات يف �ص��ورة عُ ق��د حتت��وي عل��ى‬ ‫يُخ َّزن كل عن�صر تلو االآخر‪.‬‬ ‫احلجم‬
‫البيانات وعنوان العن�صر التايل‪.‬‬
‫تُخ َّزن البيانات واملوؤ�صرات يف الذاكرة‪.‬‬ ‫تُخ َّزن البيانات وحدَ ها يف الذاكرة‪.‬‬ ‫ا�صتخدام الذاكرة‬
‫نوع الو�صول اإىل البيانات الو�صول الع�صوائي اإىل اأي عن�صر بالقائمة‪ .‬الو�صول املت�صل�صل اإىل العنا�صر‪.‬‬
‫�صرعة اإ�صافة العنا�صر وحذفها‪.‬‬ ‫�صرعة االإ�صافة واحلذف بطء اإ�صافة العنا�صر وحذفها‪.‬‬
‫‪45‬‬
‫الفئة (‪:)Class‬‬ ‫القائمة املرتابطة يف لغة البايثون ‪Linked List in Python‬‬
‫الفئ��ة ه��ي هي��كل بيان��ات مع�رّف‬ ‫ال تُوف��ر لغ��ة البايث��ون ن��وع بيان��ات ُحم َّدد ُم�ص��بقًا للقوائ��م املرتابطة‪ .‬عليك اإن�ص��اء نوع البيانات‬
‫بوا�ص��طة امل�ص��تخدم‪ ،‬ويحت��وي‬ ‫متثيال لهذا النوع من البيانات‪ .‬الإن�صاء‬
‫اخلا�ص بك‪ ،‬اأو ا�صتخدام مكتبات البايثون التي توفر ً‬
‫عل��ى اأع�صاء البيانات (ال�ص��مات‬ ‫قائم��ة مرتابط��ة‪ ،‬ا�ص��تخدم فئ��ات البايث��ون‪ .‬يف املث��ال املو�ص��ح بال�ص��كل ‪� ،1.32‬صتُن�ص��ئ قائم��ة‬
‫‪ ،)Properties‬والطرا ئ��ق‬ ‫مرتابطة مكونة من ثالث ُعقد‪ ،‬كل واحدة ت�صم يومً ا من اأيام االأ�صبوع‪.‬‬
‫( ا ل�ص��لو ك ‪)B e h a v i o r‬‬
‫اخلا�ص��ة بها‪ .‬وتُ�ص��تخدَ م الفئات‬ ‫‪Monday‬‬ ‫‪Tuesday‬‬ ‫‪Wednesday‬‬
‫كقوالب الإن�صاء الكائنات‪.‬‬
‫�صكل ‪ :1.32‬مثال على القائمة املرتابطة‬

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


‫‪# single node‬‬
‫‪class Node:‬‬
‫‪def __init__(self, data, next=None):‬‬
‫‪self.data = data # node data‬‬
‫‪self.next = next # Pointer to the next node‬‬

‫‪# Create a single node‬‬


‫)"‪first = Node("Monday‬‬
‫)‪print(first.data‬‬

‫‪Monday‬‬

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

‫‪# single node‬‬


‫‪class Node:‬‬
‫‪def __init__(self, data = None, next=None):‬‬
‫‪self.data = data‬‬
‫‪self.next = next‬‬

‫‪# linked list with one head node‬‬


‫‪class LinkedList:‬‬
‫‪def __init__(self):‬‬
‫‪self.head = None‬‬

‫‪# list linked with a single node‬‬


‫)(‪Linkedlist1 = LinkedList‬‬
‫)"‪Linkedlist1.head = Node("Monday‬‬
‫)‪print(Linkedlist1.head.data‬‬

‫‪Monday‬‬

‫‪46‬‬
‫ا ِأ�ص ْف االآن املزيد من العُقد اإىل القائمة املرتابطة‪.‬‬

‫‪# single node‬‬


‫‪class Node:‬‬
‫‪def __init__(self, data = None, next=None):‬‬
‫‪self.data = data‬‬
‫‪self.next = next‬‬

‫‪# an empty linked list with a head node.‬‬


‫‪class LinkedList:‬‬
‫‪def __init__(self):‬‬
‫‪self.head = None‬‬

‫‪# the main program‬‬


‫)(‪linked_list = LinkedList‬‬
‫‪# the first node‬‬
‫)"‪linked_list.head = Node("Monday‬‬
‫‪# the second node‬‬
‫)"‪linked_list.head.next = Node("Tuesday‬‬
‫‪# the third node‬‬
‫)"‪linked_list.head.next.next = Node("Wednesday‬‬

‫‪# print the linked list‬‬


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

‫‪Monday‬‬
‫‪Tuesday‬‬
‫‪Wednesday‬‬

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


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

# linked list with one head node


class LinkedList:
def __init__(self):
self.head = None

def insertAfter(new, prev):


# create the new node
new_node = Node(new)
# make the next of the new node the same as the next of the previous node
new_node.next = prev.next
# make the next of the previous node the new node
prev.next = new_node

# create the linked list


L_list = LinkedList()

# add the first two nodes


L_list.head = Node(12)
second = Node(99)
L_list.head.next = second

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

# print the linked list


node = L_list.head
while node:
print (node.data)
node = node.next

12
37
99

Delete a Node from a Linked List ‫حذف العُقدة من القائمة املرتابطة‬


.‫ عليك تغير ُموؤ�صر العُقدة التي ت�صبق العُقدة املراد حذفها اإىل موؤ�صر العُقدة التي تلي العُقدة املحذوفة‬،‫حلذف عُ قدة‬
‫خ�ص�ص م�ص��احة الذاكرة‬
َّ ‫) و�ص� ُت‬Useless Data( ‫اأ�صبح��ت ال ُعق��دة املحذوف��ة (الثاني��ة) عب��ارة ع��ن بيانات غر ُمفيدة‬
.‫التي ت�صغلها ال�صتخدامات اأخرى‬
:‫مثال‬
‫ �ص��يكون لدي��ك‬،‫ يف النهاي��ة‬.37 ‫ وترغ��ب يف ح��ذف العن�ص��ر‬،99‫ و‬37‫ و‬12 :‫لدي��ك قائم��ة مرتابط��ة م��ن ثالث��ة عنا�ص��ر‬
.99‫ و‬12 :‫قائمة من عن�صرين‬
48
# single node
class Node: 12 37 99
def __init__(self, data = None, next=None):
self.data = data node node.next node.next.next
self.next = next
.99 ‫ بالعُقدة‬12 ‫ اربُط موؤ�صر العُقدة‬.1
# linked list with one head node
class LinkedList: .37 ‫ احذف العُقدة‬.2
def __init__(self):
self.head = None
1
12 99
def deleteNode(key, follow):
node node.next
# store the head node
temp = follow.head
2
37
# find the key to be deleted,
# the trace of the previous node to be changed node.next
while(temp is not None):
if temp.data == key: ‫النتيجة النهائية‬.3
break
prev = temp
temp = temp.next 3
12 99
# unlink the node from the linked list node node.next
prev.next = temp.next
temp = None

# create the linked list


L_list = LinkedList()

# add the first three nodes


L_list.head = Node(12)
second = Node(37)
third = Node(99)
L_list.head.next = second ‫اإذا كنت تريد حذف العُقدة االأوىل من‬
second.next = third
‫ عليك نقل موؤ�صر‬،‫القائمة املرتابطة‬
# delete node 37 .‫الراأ�س اإىل العُقدة الثانية من القائمة‬
deleteNode(37,L_list)

# print the linked list


node = L_list.head
while node:
print (node.data)
node = node.next

12
99

49
‫مترينات‬
‫‪1‬‬
‫خاطئة‬ ‫�صحيحة‬ ‫حدِّد اجلملة ال�صحيحة واجلملة اخلاطئة فيما يلي‪:‬‬
‫‪ .1‬لغة البايثون تُعرِّف هياكل البيانات غر االأوليّة‪.‬‬
‫‪ .2‬هياكل البيانات اخلطيَّة تُخزِّ ن عنا�صر البيانات يف ترتيب ع�صوائي فقط‪.‬‬
‫‪ .3‬اإ�صاف�ة العنا�ص�ر وحذفه�ا م�ن القائم�ة املُرتابط�ة (‪ )Linked List‬اأبط�اأ م�ن القائم�ة‬
‫(‪.)List‬‬
‫‪ .4‬ميكن الو�صول اإىل العنا�صر يف القائمة با�صتخدام رقم الفهر�ص فقط‪.‬‬
‫‪ُ .5‬ميكن تغير حجم هيكل البيانات الثابتة اأثناء تنفيذ الربنامج‪.‬‬

‫‪ 2‬حدِّد االختالفات بني هياكل البيانات الثابتة واملتغرة‪.‬‬


‫هياكل البيانات املتغرة‬ ‫هياكل البيانات الثابتة‬

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

‫‪50‬‬
‫امل ُخرَج النهائي‬ ‫امل ُكدّ�س‬ ‫‪ 4‬لديك مُكدّ�س به �صت م�صاحات فارغة‪.‬‬

‫‪5‬‬ ‫‪5‬‬
‫�صتُ�صيف احلروف االآتية ‪ C‬و‪ E‬و‪ B‬و‪ A‬و‪ D‬يف املواقع من ‪ 0‬اإىل ‪.4‬‬ ‫•‬
‫امالأ امل ُكدّ�س الذي يُ�صر اإىل موقع املوؤ�صر العلوي‪.‬‬ ‫•‬
‫‪4‬‬ ‫‪4‬‬ ‫َنفِّذ العمليات التالية‪:‬‬ ‫•‬
‫‪pop‬‬ ‫‪push K‬‬ ‫‪push X‬‬ ‫‪pop‬‬ ‫‪pop‬‬
‫‪3‬‬ ‫‪3‬‬
‫اظهِر امل ُخرَج النهائي بعد تنفيذ العمليات ال�صابقة لالإ�صارة اإىل موقع‬
‫‪2‬‬ ‫‪2‬‬ ‫املوؤ�صر العلوي‪.‬‬
‫املو�صح باالأعلى‪ ،‬ثم َنفِّذ العمليات‬
‫اكتب الربنامج الذي يُن�صئ امل ُكدّ�س َّ‬
‫‪1‬‬ ‫‪1‬‬
‫املذكورة اأعاله با�صتخدام مكتبة الطابور القيا�صية‪.‬‬
‫‪0‬‬ ‫‪0‬‬

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


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

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


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

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

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

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

‫‪51‬‬
‫‪ 6‬با�صتخدام العُقد التالية ار�صِّ م القائمة املرتابطة ثم اكتب القيم يف القائمة بالرتتيب ال�صليم‪:‬‬

‫=‪3‬‬ ‫الراأ�س‬
‫‪5‬‬ ‫‪9‬‬ ‫‪2‬‬
‫‪3‬‬ ‫‪0‬‬ ‫‪4‬‬
‫‪4‬‬ ‫‪1‬‬ ‫‪5‬‬
‫‪2 -3‬‬

‫ت�صم االأرقام التالية‪ 5 :‬و‪ 20‬و‪ 45‬و‪ 8‬و‪.1‬‬


‫‪ 7‬اأن�صئ قائمة ُ‬
‫ار�صم العُقد يف القائمة املرتابطة‪.‬‬ ‫•‬

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

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

‫ِ�صفْ العملية املطلوبة حلذف العُقدة الثانية من القائمة‪.‬‬ ‫•‬

‫ار�صم القائمة املرتابطة النهائية‪.‬‬ ‫•‬

‫‪52‬‬
‫الدر�س الثالث‬
‫هياكل البيانات غر اخلط َّية‬

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

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


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

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

‫�صكل ‪ :1.33‬الر�صم التو�صيحي لهياكل البيانات اخلطيَّة وغر اخلطيَّة‬

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

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

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

‫الورقة‬
‫قد يكون لديك �صجرة ب�صيطة‬
‫تتكون من عُقدة واحدة‪ .‬تكون‬ ‫امل�صتوى الرابع‬
‫‪H‬‬ ‫‪I‬‬ ‫‪J‬‬
‫هذه العُقدة يف الوقت نف�صه‬
‫جِ ذر هذه ال�صجرة الب�صيطة‪،‬‬ ‫العُقدة‬
‫أالنّها لي�س لها اأ�صل‪.‬‬ ‫الفَرع‬ ‫ال�صجرة‬ ‫�صكل ‪ :1.35‬هيكل بيانات ال�صجرة‬
‫الفرعية‬
‫‪54‬‬
‫وفيما يلي مثال على هيكل بيانات ال�صجرة‪:‬‬
‫أ�صال‬
‫قد تكون العُقدة فرعًا وا ً‬
‫يف الوقت نف�صه‪ :‬فرع للعُقدة‬ ‫اجلِ ذر‬
‫ال�صابقة واأ�صل للعُقدة التالية‪.‬‬
‫احليوانات‬
‫العُقدة االأ�صل‬

‫الفقاريَّات‬ ‫الالفقاريَّات‬

‫الطيور‬ ‫االأ�صماك‬ ‫الثد ِييَّات‬ ‫احل�صرات‬ ‫العنكبوتيات‬


‫العُقدة الفَرع‬ ‫الورقة‬
‫اجلَمل‬ ‫احل�صان‬ ‫النمر‬

‫�صكل ‪ :1.36‬مثال على هيكل بيانات ال�صجرة‬ ‫االأ�صقاء‬

‫خ�صائ�س هيكل بيانات ال�صجرة ‪Tree Data Structure Features‬‬


‫يُ�صتخدم لتمثيل املُخطَّ ط الهرمي‪.‬‬ ‫•‬
‫يتميّز باملرونة‪ ،‬فمن ال�صهل اإ�صافة عن�صر من ال�صجرة اأو حذفه‪.‬‬ ‫•‬
‫�صهولة البحث عن العنا�صر فيه‪.‬‬ ‫•‬
‫يعك�ص العالقات الهيكلية بن البيانات‪.‬‬ ‫•‬
‫مثال‬
‫تنظي��م امللف��ات يف نظ��ام الت�ص��غيل ه��و مث��ال عمل��ي عل��ى ال�ص��جرة‪ .‬كم��ا يت�ص��ح يف ال�ص��كل ‪ ،1.37‬يوج��د داخ��ل جمل��د‬
‫‪( Documents‬امل�صتندات) ُجملد اآخر ا�صمه ‪( Python Projects‬م�صروعات البايثون) يحتوي على ملفن اآخرين‪.‬‬

‫‪This PC‬‬

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

‫‪Alice‬‬ ‫‪Python Projects‬‬

‫‪HelloWorld.py‬‬ ‫‪infinite.py‬‬
‫�صكل ‪ :1.37‬تنظيم امللفات يف نظام الت�صغيل‬
‫‪55‬‬
a ‫هيكل بيانات ال�صجرة يف لغة البايثون‬
Tree Data Structure in Python
b c ‫ ومع‬.‫ال تُوفِر لغة البايثون نوعً ا حمددًا م�ص��بقًا من البيانات لهيكل بيانات ال�ص��جرة‬
1.38 ‫ يو�ص��ح ال�ص��كل‬.‫�صم��م االأ�ص��جار م��ن القوائ��م والقوامي���ص ب�ص��هولة‬ َّ ‫ ُت‬،‫ذل��ك‬
d e f .‫تطبيقًا ب�صيطً ا لل�صجرة با�صتخدام القامو�ص‬
‫ �صجرة قامو�ص البايثون‬:1.38 ‫�صكل‬ ‫ �ص��تمثّل عُ ق��د‬.‫ �صتُن�ص��ئ �ص��جرة با�ص��تخدام قامو���ص البايث��ون‬،‫يف ه��ذا املث��ال‬
‫ و�ص��تكون القيم��ة املقابل��ة لكل مفت��اح هي قائمة‬،‫ال�ص��جر ِة مفاتي��حَ القامو���ص‬
.‫حتتوي على ال ُعقد املُت�صلة بحافة مبا�صرة من هذه العُقدة‬

myTree = {
"a": ["b", "c"], # node
"b": ["d", "e"],
"c": [None, "f"],
"d": [None, None],
"e": [None, None],
"f": [None, None],
}
print(myTree)

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


'd': [None, None], 'e': [None, None], 'f': [None, None]}

:1.39 ‫يف املثال التايل �صتُن�صئ �صجرة مثل تلك املو�صحة يف ال�صكل‬
‫االأ�صل‬ ‫الفَرع‬
Data Structures myTree = {"Data Structures":["Linear","Non-linear"],
"Linear":["Stack","Queue","Linked List"],
"Non-linear":["Tree", "Graph"]}

for parent in myTree:


Linear Non-linear print(parent, "has",len(myTree[parent]),"nodes" )
for children in myTree[parent]:
print(" ",children)

Data structures has 2 nodes


Tree Graph Linear
Non-linear
Linear has 3 nodes
Stack
Queue
Linked List
Non-linear has 2 nodes
Stack Queue Linked List Tree
Graph
‫ �صجرة هياكل البيانات‬:1.39 ‫�صكل‬
56
‫ال�صجرة الثنائية ‪Binary Tree‬‬
‫ال�صجرة الثنائية هي نوع خا�ص من االأ�صجار‪ ،‬يكون لك ّل عُ قد ٍة فيها فرعان على االأكر؛ الفَرع االأمين والفَرع االأي�صر‪ .‬ال�صكل ‪1.40‬‬
‫مثاال يو�صح ال�صجرة وال�صجرة الثنائية‪.‬‬
‫يَعر�ص ً‬
‫ال�صجرة الثنائية‬ ‫ال�صجرة‬
‫‪a‬‬ ‫‪a‬‬

‫‪b‬‬ ‫‪c‬‬ ‫‪b‬‬ ‫‪d‬‬


‫‪c‬‬

‫‪d‬‬ ‫‪e‬‬ ‫‪f‬‬ ‫‪g‬‬ ‫‪e‬‬ ‫‪f‬‬ ‫‪h‬‬ ‫‪i‬‬ ‫‪j‬‬

‫‪g‬‬
‫‪h‬‬ ‫‪i‬‬ ‫‪k‬‬

‫الفَرع االأمُين الفَرع االأي�صر‬ ‫‪l‬‬ ‫‪m‬‬

‫�صكل ‪ :1.40‬ال�صجرة وال�صجرة الثنائية‬

‫جدول  ‪ :1.10‬اأنواع هياكل بيانات ال�صجرة الثنائية‬


‫ر�صم تو�صيحي للهيكل‬ ‫الو�صف‬ ‫النوع‬
‫‪0‬‬ ‫يكون لك ّل عُ قدة اإمّا ‪ 0‬اأو ‪ 2‬من الفروع‬ ‫ال�صجرة الثنائية التّامة‬
‫‪1‬‬ ‫‪2‬‬
‫(‪)Children‬بخالف االأوراق (‪.)Leaves‬‬ ‫(‪)Full Binary Tree‬‬
‫‪3‬‬ ‫‪4‬‬

‫‪0‬‬ ‫يكون ك ّل م�ص��توًى من م�ص��تويات ال�صجرة ممتلئًا‬ ‫ال�صجرة الثنائية الكاملة‬


‫‪1‬‬ ‫‪2‬‬
‫بالكام��ل‪ ،‬رمبا با�ص��تثناء امل�ص��توى االأخر‪ ،‬حيث‬ ‫(‪)Complete Binary Tree‬‬
‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫تك��ون كل ال ُعق��د في��ه ممل��وءة م��ن الي�ص��ار اإىل‬
‫اليمن‪.‬‬
‫‪0‬‬ ‫يك��ون ل��كل ال ُعق��د الداخلي��ة فرع��ان وتك��ون كل‬ ‫ال�ص��جرة الثنائي��ة املثالي��ة‬
‫‪1‬‬ ‫‪2‬‬
‫االأوراق عند امل�صتوى نف�صه‪.‬‬ ‫(‪)Perfect Binary Tree‬‬
‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬

‫اأمثلة على تطبيقات هياكل بيانات ال�صجرة‪:‬‬


‫‪Examples of Applications of Tree Data Structures:‬‬
‫تخزين البيانات الهرمية مثل‪ :‬هياكل املجلدات‪.‬‬ ‫•‬
‫تعريف البيانات يف لغة ترميز الن�س الت�صعبي (‪.)HTML‬‬ ‫•‬
‫تنفيذ الفهر�صة يف قواعد البيانات‪.‬‬ ‫•‬
‫‪57‬‬
‫هل تقدّم اجلامعة املقرر‬ ‫�صجرة القرار ‪Decision Tree‬‬
‫الدرا�صي الذي اأريده؟‬ ‫عب��ارة الق��رار ‪ if a: else b‬ه��ي واح��دة م��ن العب��ارات االأك��ر ا�ص��تخدامً ا يف لغ��ة البايث��ون‪.‬‬
‫نعم‬ ‫ال‬ ‫ومن خالل تداخل وجتميع هذه العبارات‪ ،‬ميكنك ت�صميم �صجرة القرار‪.‬‬
‫تُ�صتخدَ م اأ�صجار القرار يف الذكاء اال�صطناعي من خالل اإحدى تقنيات تعلم االآلة وتُعرف‬
‫هل درجاتي تُلبي‬ ‫َجتاهَ ل‬ ‫با�ص��م‪ :‬تع ُّل��م �ص��جرة الق��رار (‪ .)Decision Tree Learning‬ال ُعق��د االأخ��رة يف ه��ذه‬
‫�صروط القبول؟‬ ‫أي�صا‪ :‬االأوراق‪ ،‬وحتتوي على احللول املُحتملة للم�ص��كلة‪ .‬كل ُعقدة با�ص��تثناء‬ ‫التقنية تُ�ص�مّى ا ً‬
‫نعم‬ ‫ال‬ ‫االأوراق ترتبط بحالة منطقية يتفرع منها احتماال االإجابة بنعم اأو ال‪ .‬اأ�صجار القرار تعترب‬
‫�صهلة الفهم‪ ،‬واال�صتخدام‪ ،‬والت�صوير‪ ،‬وي�صهل التحقق منها‪ ،‬على �صبيل املثال‪ ،‬ال�صكل ‪1.41‬‬
‫تطبيق‬ ‫َجتاهَ ل‬ ‫يو�ص��ح �ص��جرة الق��رار الت��ي ُحت� ِّ�دد ما اإذا كنت �ص�تَتق َّدم بطلب االلتح��اق بجامعة ُحم َّددة اأم‬
‫�صكل ‪ :1.41‬مثال على �صجرة القرار‬ ‫ال بن��ا ًء عل��ى معياري��ن‪ :‬املق��ررات الدرا�ص��ية الت��ي ُتد َّر���ص يف اجلامع��ة‪ ،‬وا�ص��تيفاء متطلب��ات‬
‫القبول‪.‬‬

‫املُخطَّ طات ‪Graphs‬‬


‫ال�ص�مَة االأك��ر اأهمي��ة لهي��اكل البيان��ات غ��ر اخلط َّي��ة ه��ي اأنّ البيان��ات اخلا�ص��ة به��ا ال تت ّب��ع‬
‫املُخطَّ ط (‪:)Graph‬‬ ‫�وع م��ن اأن��واع التّ�صل�ص��ل‪ ،‬وذلك على خالف امل�صفوف��ات والقوائم املرتابطة‪ ،‬كما ميكن‬ ‫اأي ن� ٍ‬
‫املُخطَّ ��ط ه��و هي��كل البيان��ات املُك�وَّن‬ ‫رب��ط عنا�صره��ا باأك��ر م��ن عن�ص��ر وحي��د‪ .‬ال�ص��جرة اجلذري��ة (‪ )Rooted Tree‬تب��داأ‬
‫م��ن جمموع��ة م��ن ال ُعق��د وجمموع��ة‬ ‫ب ُعق��دة جذري��ة ميك��ن ربطه��ا بال ُعق��د االأخ��رى‪َ .‬ت ْتب��ع تتب��ع االأ�ص��جار قواع��د حم��ددة‪ :‬وهي اأن‬
‫م��ن اخلط��وط الت��ي ت�صل ب��ن جميع‬ ‫تكون عقد ال�ص��جرة مت�صلة‪ ،‬واأن تكون ال�ص��جرة خالية من احللقات(‪ )Loops‬واحللقات‬
‫العُقد‪ ،‬اأو بع�صها‪.‬‬ ‫الذاتية (‪ ،)Self Loops‬كما اأن لبع�ص اأنواع االأ�صجار قواعدها اخلا�صة (جدول ‪،)1.10‬‬
‫مثلم��ا يف حال��ة االأ�ص��جار الثنائي��ة‪ .‬ولك��ن م��اذا �ص��يحدث اإذا مل َت َّتب��ع قواع��د االأ�ص��جار؟ يف‬
‫ُتغرة‬ ‫ه��ذه احلال��ة أان��ت ال تتح��دث ع��ن االأ�ص��جار‪ ،‬ب��ل عن ن��وع جديد من هي��اكل البيان��ات امل ِّ‬
‫كل االأ�صجار ُخمطَّ طات‪ ،‬ولكن لي�صت‬ ‫الت��ي ُت�ص��مى املُخطَّ ط��ات‪ .‬يف احلقيق��ة‪ ،‬االأ�ص��جار هي ن��وع من املُخطَّ طات حي��ث اأن املُخطَّ ط‬
‫كل امل ُخطَّ طات اأ�صجارًا‪.‬‬ ‫ه��و ال�ص��كل الع��ام لهي��كل البيان��ات‪ ،‬مبعن��ى اأن كل هي��اكل البيانات ال�ص��ابقة ميك��ن اعتبارها‬
‫حاالت خا�صة من املُخطَّ طات‪ .‬ال�صكل ‪ 1.42‬يعر�ص ُخمطَّ طً ا به �صت عُ قد وع�صر حواف‪.‬‬

‫خططات‬ ‫جدول  ‪ :1.11‬الفرق بني األأ�صجار واملُ َّ‬


‫‪2‬‬
‫‪1‬‬ ‫امل ُخطَّ طات‬ ‫االأ�صجار‬
‫ت�ص�كّل ال ُعق��د املتّ�صل��ة فيه��ا منوذجً ��ا ت�صكّل العُقد املتّ�صلة فيها‬
‫‪3‬‬ ‫منوذجً ا �صبكيًّا‪.‬‬ ‫هرميًّا‪.‬‬
‫ال توجد فيها عُ قدة فريدة‬ ‫يف االأ�صجار اجلذرية توجد عُ قدة‬
‫اأو جذرية‪.‬‬ ‫فريدة تُ�صمى اجلِ ذر‪.‬‬
‫‪5‬‬ ‫‪4‬‬ ‫ترتب��ط ال ُعق��د يف �ص��ورة عالق��ة ب��ن ال تنطبق عالقة االأ�صل‬
‫والفَرع بن العُقد‪.‬‬ ‫االأ�صل والفَرع‪.‬‬
‫تركيب املخطّ طات اأكر‬ ‫تتميز بب�صاطة الرتكيب‪.‬‬
‫‪6‬‬ ‫تعقيدً ا‪.‬‬
‫�صكل ‪ :1.42‬مثال على ُخمطَّ ط به �صت عُ قد وع�صر حواف‬ ‫قد حتتوي على احللقات‪.‬‬ ‫ال ُي�صمح فيها باحللقات‪.‬‬
‫‪58‬‬
‫اأنواع املُخطَّ طات ‪Types of Graphs‬‬
‫• امل ُخطَّ ��ط امل ُوجَّ ��ه (‪ :)Directed Graph‬ترتب��ط ال ُعق��د باحل��واف املوجه��ة يف املخط��ط املُوجَّ ��ه‪ ،‬بحي��ث يك��ون للحاف��ة اجت��اه‬
‫واحد‪.‬‬
‫• امل ُخطَّ ��ط غ��ر امل ُوجَّ ��ه (‪ :)Undirected graphs‬ال حتت��وي الو�ص��الت عل��ى اجت��اه يف املُخطَّ ��ط غ��ر املُوجَّ ��ه‪ ،‬وه��ذا يعن��ي اأن‬
‫احلواف ت�صر اإىل عالقة ثنائية االجتاه ميكن من خاللها عر�ص البيانات يف كال االجتاهن‪.‬‬
‫وجه يتكونان من �صت ُعقد و�صت حواف‪.‬‬ ‫ال�صكل ‪ 1.43‬يعر�ص خمطّ طً ا موجَّ هًا‪ ،‬وخمطّ طً ا غر ُم َّ‬

‫امل ُخطّ ط غر امل ُوجَّ ه‬ ‫املخطّ ط امل ُوجَّ ه‬


‫�صكل ‪ :1.43‬املُخطَّ ط املُوجَّ ه و املُخطَّ ط غر املُوجَّ ه‬

‫املُخطَّ طات يف احلياة اليومية ‪Graphs in Everyday Life‬‬


‫�صبكة الويب العاملية ‪World Wide Web‬‬
‫ُتع� ُّد �ص��بكة الوي��ب العاملي��ة م��ن اأب��رز االأمثل��ة للمُخطَّ ط��ات‪ ،‬وميك��ن اعتباره��ا مبثاب��ة أاح��د اأن��واع املُخطَّ ط��ات املُوجَّ ه��ة حيث‬
‫ُوجه��ة‪ .‬تنقي��ب ُبن َي��ة الوي��ب‬
‫ُمت ِّث��ل الروؤو���س (‪� )Vertices‬صفح��ات الوي��ب‪ُ ،‬ومت ِّث��ل االرتباط��ات الت�ص��عبية احل��واف امل َّ‬
‫(‪ )Web Structure Mining‬ه��و اكت�ص��اف املعرِ ف��ة املُفي��دة م��ن هي��كل �ص��بكة الوي��ب املُمَث َل��ة م��ن خ��الل االرتباط��ات‬
‫الت�ص��عبية‪ ،‬وميك��ن اأن مي ّث��ل هي��كل املُخطَّ ��ط االرتباط��ات الت�ص��عبية والعالق��ات التي تُن�ص��ئها بن �صفح��ات الويب املختلفة‪.‬‬
‫خططات ُميكنك ح�صاب االأهمية الن�صبية‬ ‫يعر�ص ال�صكل ‪ 1.44‬ر�ص ًما تو�صيح ًيا ل�صبكة الويب العاملية‪ .‬با�صتخدام هذه املُ َّ‬
‫‪C‬‬ ‫‪B‬‬
‫ل�صفحات الويب‪.‬‬

‫‪C‬‬
‫‪A‬‬

‫‪D‬‬
‫‪B‬‬
‫‪D‬‬

‫‪D‬‬

‫�صكل ‪� :1.44‬صبكة الويب العاملية‬

‫يَ�ص��تخدِ م ُحم�رِّك البح��ث قوق��ل (‪ )Google Search Engine‬منهجي��ة مماثل��ة لتحديد االأهمية الن�ص��بية ل�صفحات‬
‫الوي��ب وم��ن ث��م ترتي��ب نتائ��ج البح��ث ح�ص��ب اأهميته��ا‪ .‬اخلوارزمي��ة املُ�ص��تخدَ مة بوا�ص��طة قوق��ل هي خوارزمي��ة ت�صنيف‬
‫ال�صفحة اأو بيج رانك (‪ )PageRank‬التي ابتكرها موؤ�صِّ �صو قوقل‪.‬‬

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

‫�صكل ‪ :1.46‬خرائط قوقل‬

‫ال�صبكة الع�صبية ‪Neural Network‬‬


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

‫طبقة امل ُخرَجات‬ ‫الطبقات املخف َّية‬ ‫طبقة امل ُدخَ الت‬
‫�صكل ‪ :1.47‬هيكل ال�صبكات الع�صبية‬
‫‪60‬‬
‫‪a‬‬ ‫املُخطَّ طات يف لغة البايثون ‪Graphs in Python‬‬
‫ال تُو ِف��ر لغ��ة البايث��ون نوعً ��ا حمددًا م�ص��بقًا من البيانات لالأ�ص��جار‪ ،‬كم��ا اأنّها ال تُو ِفر نو ًعا‬
‫‪b‬‬ ‫‪c‬‬ ‫حم��ددًا م�ص��بقًا م��ن البيان��ات لل ُمخطَّ ط��ات‪( ،‬تذك��ر اأن االأ�ص��جار ه��ي ن��وع خا���ص م��ن‬
‫املُخطَّ طات)‪ .‬ومع ذلك‪ُ ،‬ميكن ِبناء املُخطَّ طات با�صتخدام القوائم والقوامي�ص‪.‬‬
‫‪d‬‬ ‫‪e‬‬ ‫يف املثال التايل‪� ،‬صتقوم بتنفيذ التايل‪:‬‬
‫�صكل ‪ :1.48‬مثال على املُخطَّ ط‬ ‫وجه مثل املُو�صح بال�صكل ‪.1.48‬‬ ‫‪.1‬اإن�صاء ُخمطَّ ط ُم َّ‬
‫‪.2‬اإن�صاء دالة الإ�صافة عُ قدة اإىل املُخطَّ ط‪.‬‬
‫‪.3‬اإن�صاء دالة حتتوي على كل م�صارات املُخطَّ ط‪.‬‬
‫"‪myGraph = { "a‬‬ ‫‪: ["b","c"],‬‬
‫‪"b" :‬‬ ‫‪["c", "d"],‬‬
‫‪"c" :‬‬ ‫‪["d", "e"],‬‬
‫‪"d" :‬‬ ‫‪[],‬‬
‫‪"e" :‬‬ ‫‪[],‬‬
‫}‬
‫)‪print(myGraph‬‬

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


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

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


‫ّ‬
‫‪ .1‬اإن�صاء املُخطَّ ط‪.‬‬
‫‪ .2‬طباعة املُخطَّ ط‪.‬‬
‫‪ .3‬ا�صتدعاء دالة االإ�صافة‪.‬‬
‫‪ .4‬طباعة كل م�صارات املُخطَّ ط‪.‬‬
‫�صت ِ‬
‫َ�صتخدم القامو�ص الذي ُمتثِّل مفاتيحه العُقد باملُخطَّ ط‪ .‬تكون القيمة املقابِلة لكل مفتاح هي قائمة حتتوي على العُقد‬
‫املت�صلة بحافة مبا�صرة من هذه العُقدة‪.‬‬

‫‪# function for adding an edge to a graph‬‬


‫‪def addEdge(graph,u,v):‬‬
‫)‪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:‬‬

‫‪61‬‬
# for each neighbouring node of a single node
for neighbour in graph[node]:

# if edge exists then append to the list


edges.append((node, neighbour))
return edges

# main program
# initialisation of graph as dictionary
myGraph = {"a" : ["b","c"],
"b" : ["c", "d"],
"c" : ["d", "e"],
"d" : [],
"e" : [],
}

# print the graph contents


print("The graph contents")
print(generate_edges(myGraph))

# 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")
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')]

62
‫مترينات‬
‫‪1‬‬
‫خاطئة‬ ‫�صحيحة‬ ‫حدِّد اجلملة ال�صحيحة واجلملة اخلاطئة فيما يلي‪:‬‬
‫‪ .1‬ميكن ربط العن�صر يف هياكل البيانات غر اخلطيَّة باأكر من عن�صر واحد‪.‬‬

‫‪ .2‬تنفيذ هياكل البيانات اخلطيَّة يكون اأكر تعقيدً ا من تنفيذ هياكل البيانات غر اخلطيَّة‪.‬‬

‫‪ .3‬االأوراق يف تعلُّم �صجرة القرار حتتوي على حلول امل�صكلة‪.‬‬


‫‪َ .4‬حت�صِ ��ب خوارزمي��ة قوق��ل ت�صني��ف ال�صفح��ة (‪ )PageRank‬االأهمي��ة الن�ص��بية ل�صفح��ة‬
‫ويب على �صبكة الويب العاملية‪.‬‬
‫‪ .5‬ال�صبكات الع�صبية هي نوع املُخطَّ طات املُ�صتخدَ م لت�صوير امل�صكالت االأخرى‪.‬‬

‫و�صح االختالفات بني االأ�صجار وامل ُخطَّ طات‪.‬‬


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

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

‫‪63‬‬
‫‪ 4‬امالأ الفراغات باالأ�صماء ال�صحيحة الأجزاء ال�صجرة‪.‬‬

‫‪a‬‬

‫‪b‬‬ ‫‪e‬‬

‫‪f‬‬

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

‫‪g‬‬

‫‪j‬‬ ‫‪k‬‬

‫‪64‬‬
‫‪ 5‬يظهر اأمامك يف ال�صورة التالية �صفحة حمتويات الكتاب‪.‬‬
‫اأكمل متثيل ال�صجرة‪.‬‬ ‫•‬

‫‪Book‬‬
‫‪Book‬‬
‫‪C1‬‬ ‫‪C2‬‬ ‫‪C1‬‬
‫‪C1.1‬‬
‫‪C1.2‬‬
‫‪C2‬‬
‫‪C1.1‬‬
‫‪C2.1‬‬
‫‪C2.1.1‬‬
‫‪C2.1.2‬‬
‫‪C2.2‬‬
‫‪C2.3‬‬
‫‪C3‬‬

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

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

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

‫‪66‬‬
‫با�صتخدام القامو�س يف لغة البايثون اكتب الربنامج املنا�صب لتمثيل هذه ال�صجرة‪ ،‬ثم اأ�صف العُقدة االأ�صل والعُقد الفرعية‪.‬‬

‫‪67‬‬
‫الم�صروع‬

‫ُتق�دَّم اخلدم��ة للعم��الء يف اأح��د البن��وك بن��ا ًء على وق��ت و�صولهم‬


‫اإىل ف��رع البن��ك‪ .‬يعم��ل بالبن��ك موظ��ف وحي��د‪ ،‬و ُمتو�ص��ط وق��ت‬
‫اخلدمة لكل عميل هو دقيقتان‪.‬‬
‫عميال‪.‬‬
‫ال ُي�صمح باأن يتجاوز الطابور يف البنك ‪ً 40‬‬

‫‪1‬‬
‫اأن�ص��ئ برناجمً ��ا بلغ��ة البايث��ون ي�ص��تدعي اإح��دى قي��م اال�ص��تراد‪:‬‬
‫‪( ENTRY‬دخول) اأو ‪( NEXT‬التايل)‪.‬‬
‫• اإن اأدخل�ت القيم�ة ‪( ENTRY‬دخول) ‪� ،‬ص�يقراأ الربنامج ا�ص�م‬
‫العمي�ل وبعده�ا مبا�ص�ر ًة ُيظهِ �ر ع�دد االأ�ص�خا�ص يف قائم�ة‬
‫االنتظ�ار اأمام�ه‪ .‬اإن كان الطاب�ور ُممتلئً�ا‪ ،‬تظه�ر ر�ص�الة‬
‫‪( The branch is full. Come another day‬الفَ�رع‬
‫ُممتلئ‪ .‬الرجاء العودة يف يوم اآخر)‪.‬‬
‫• اإن اأدخل��ت القيم��ة ‪( NEXT‬الت��ايل)‪ ،‬الب��د اأن يظه��ر ا�ص��م‬
‫العميل التايل الذي �صتُق َّدم له اخلدمة‪.‬‬

‫‪2‬‬
‫َكرِّر العملية املو�صحة اأعاله حتى ال يكون هناك عمالء يف قائمة‬
‫االنتظار‪.‬‬

‫‪3‬‬
‫يف النهاية‪� ،‬ص َيعر�ص الربنامج على ال�صا�صة‪:‬‬
‫• عدد العمالء الذين ق ُِّدمت لهم اخلدمة‪.‬‬
‫• متو�صط وقت انتظار العميل‪.‬‬

‫‪68‬‬
‫ماذا تع ّلمت‬

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


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

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

‫‪Binary Tree‬‬ ‫ال�صجرة الثنائية‬ ‫‪Non-Primitive‬‬ ‫يل‬


‫غر اأو ّ‬
‫‪Child‬‬ ‫فَرع (ابن)‬ ‫‪Null‬‬ ‫قيمة فارغة‬
‫‪Data Structure‬‬ ‫هيكل البيانات‬ ‫‪Pointer‬‬ ‫موؤ�صر‬
‫‪Decision Tree‬‬ ‫�صجرة القرار‬ ‫‪Pop‬‬ ‫حذف عن�صر‬
‫‪Dequeue‬‬ ‫حذف العنا�صر من الطابور‬ ‫‪Primitive‬‬ ‫يل‬
‫اأو ّ‬
‫‪Directed Graph‬‬ ‫امل ُخطَّ ط امل ُوجّ ه‬ ‫‪Push‬‬ ‫اإ�صافة عن�صر‬
‫‪Dynamic‬‬ ‫متغر‬ ‫‪Rear‬‬ ‫اخللفي‬
‫‪Front‬‬ ‫االأمامي‬ ‫‪Root‬‬ ‫اجلذر‬
‫‪Graph‬‬ ‫ُخمطَّ ط‬ ‫‪Siblings‬‬ ‫اأ�صقاء‬
‫‪Index‬‬ ‫فهر�س‬ ‫‪Stack‬‬ ‫امل ُكدِّ�س‬
‫‪Head‬‬ ‫راأ�س‬ ‫‪Sub-Tree‬‬ ‫�صجرة فرعية‬
‫‪Leaf‬‬ ‫ورقة‬ ‫‪Top‬‬ ‫قمة‬
‫‪Linear‬‬ ‫خطي‬ ‫‪Underflow‬‬ ‫َغيْ�س امل ُكدّ�س‬
‫‪Linked List‬‬ ‫قائمة مرتابطة‬ ‫‪Undirected‬‬
‫‪Ggraph‬‬
‫امل ُخطَّ ط غر املوجّ ه‬
‫‪Non-Linear‬‬ ‫غر خطي‬
‫‪69‬‬
‫‪ .2‬خوارزميات ال��ذكاء األ�صطناعي‬
‫�ص ��يتعرف الطال ��ب يف ه ��ذه الوح ��دة عل ��ى بع� ��س اخلوارزمي ��ات األأ�صا�ص ��ية املُ�ص ��تخدَ مة يف‬
‫ال��ذكاء األ�صطناع��ي (‪ .)AI‬كم��ا �ص��يتعلم كي��ف يُن�صِ � ن ��ام ت�ص��خي�س طبي ب�ص��يط مُ�ص��ت ِند‬
‫اإىل القواع��د بِطُ ��رق برجمي��ة مُتع��ددة ث��م يق��ارن النتائ��ج‪ .‬ويف اخلتام �ص��يتعلّم خوارزميات‬
‫البحث وطرق حل األغاز املتاهة مع اأخذ معاير معيّنة يف األعتبار‪.‬‬

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

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

‫‪70‬‬
‫الدر�س األأول‬
‫األ�صتدعاء الذاتي‬

‫تق�صيم املُ�صكلة ‪Dividing the Problem‬‬


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

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


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

‫يحدث اال�صتدعاء الذاتي عندما‬


‫افتح ال�صندوق‬ ‫تتكرر التعليمات نف�صها‪ ،‬ولكن‬
‫مع بيانات خمتلفة واأقل تعقيدًا‪.‬‬
‫نعم‬

‫هل هناك �صندوق‬


‫بالداخل؟‬

‫ال‬

‫وجدت الهدية وانتهى‬


‫اال�صتدعاء الذاتي‬
‫�صكل ‪ :2.1‬مثال على اال�صتدعاء الذاتي‬

‫‪71‬‬
.‫ل ُتُلقِ نظرة على مثال لدالة ت�صتدعي دالة اأخرى‬

def mySumGrade (gradesList):


sumGrade=0
l=len(gradesList)
for i in range(l):
sumGrade=sumGrade+gradesList[i]
return sumGrade

def avgFunc (gradesList): ‫ا�صتدعاء الدالة‬


s=mySumGrade(gradesList) .mySumGrade
l=len(gradesList)
avg=s/l
return avg
‫ قائمة‬len)( ‫ت�صتخدم دالة‬
ِ ‫كم‬
‫ حل�صاب وحتديد‬،‫ُعامل مُدخَ ل‬
# program section
grades=[89,88,98,95] .‫عدد العنا�صر يف القائمة‬
averageGrade=avgFunc(grades)
print ("The average grade is: ",averageGrade)

The average grade is: 92.5

Recursive Function ‫دالة األ�صتدعاء التكرارية‬


‫يف بع���ص احل��االت ت�ص��تدعي الدّال� ُة نف�صَ ��ها وه��ذه اخلا�صي��ة تُ�ص��مى‬
‫الربنامج الرئي�س‬ .)Recursive Calls( ‫اال�صتدعاءات التكرارية‬
‫يك��ون ِبن��اء اجلمل��ة الع��ام لدال��ة اال�ص��تدعاء التكراري��ة عل��ى النح��و‬
:‫التايل‬
# recursive function
recurseFunction() def recurseFunction():
if (condition): # base case
statement
‫خاطئ‬ else:
#recursive call
recurseFunction()
‫ال�صر‬
# main program
.......

‫�صحيح‬ # normal function call


recurseFunction()
.........

‫االأمر‬
‫ متثيل اال�صتدعاء التكراري‬:2.2 ‫�صكل‬ ‫اال�صتدعاء التكراري هو عملية‬
.‫ا�صتدعاء الدالة لنف�صها‬

72
‫تتكون دالة اال�صتدعاء التكرارية من حالتن‪:‬‬
‫احلالة األأ�صا�صية ‪Base Case‬‬
‫ويف ه��ذه احلال��ة تتوق��ف الدال��ة ع��ن ا�ص��تدعاء نف�ص��ها‪ ،‬ويتاأ ّك��د الو�صول اإىل ه��ذه احلالة من خالل االأمر امل�ص��روط‪ .‬بدون‬
‫احلالة االأ�صا�صية‪� ،‬ص َتتَكرَّر عملية اال�صتدعاء الذاتي اإىل ما ال نهاية‪.‬‬
‫حالة األ�صتدعاء التكرارية ‪Recursive Case‬‬
‫ويف ه��ذه احلال��ة ت�ص��تدعي الدال� ُة نف�صَ ��ها عندم��ا ال ُحتق��ق �ص��رط التوق��ف‪ ،‬وتظ��ل الدال��ة يف حالة اال�ص��تدعاء الذاتي حتى‬
‫ت�صل اإىل احلالة االأ�صا�صية‪.‬‬
‫اأمثلة �صائعة على األ�صتدعاء الذاتي ‪Recursion Common Examples‬‬
‫أاح��د االأمثل��ة االأك��ر �ص��يوعً ا عل��ى ا�ص��تخدام اال�ص��تدعاء الذات��ي ه��و عملي��ة ح�ص��اب م�صروب رقم ُمع� ّ�ن‪ .‬م�ص��روب الرقم هو‬
‫عرب ع��ن امل�صروب بالرق��م متبو ًع��ا بالعالمة "!"‪،‬‬
‫ن��ا �ص��رب جمي��ع االأع��داد الطبيعي��ة االأق��ل م��ن اأو ت�ص��اوي ذل��ك الرق��م‪ُ .‬ي َّ‬
‫على �صبيل املثال‪ ،‬م�صروب الرقم ‪ 5‬هو !‪ 5‬وي�صاوي ‪.1*2*3*4*5‬‬

‫�ص��تالحظ اأن عملي��ة ح�ص��اب امل�ص��روب ت�ص��تند اإىل‬ ‫األأرقام من ‪ 0‬اإىل ‪5‬‬ ‫جدول  ‪ :2.1‬م�صرو‬
‫القاعدة اأدناه‪:‬‬ ‫!‪0!=1 0‬‬
‫‪1!= 0! *1‬‬ ‫اأو‬ ‫!‪1!=1*1=1 1‬‬
‫‪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‬‬
‫حالة اال�صتدعاء‬ ‫‪4!=3! * 4‬‬ ‫اأو‬ ‫!‪4!=4*3*2*1=24 4‬‬
‫التكرارية‬
‫�صكل ‪ :2.3‬قاعدة ح�صاب امل�صروب‬ ‫‪5!=4! * 5‬‬ ‫اأو‬ ‫!‪5!=5*4*3*2*1=120 5‬‬

‫الإن�صاء برنامج يقوم باحت�صاب م�صروب العدد با�صتخدام حلقة التكرار‪ ،for‬اتّبع ما يلي‪:‬‬

‫‪# calculate the factorial of an integer using iteration‬‬

‫‪def factorialLoop(n):‬‬
‫‪result = 1‬‬
‫‪for i in range(2,n+1):‬‬
‫‪result = result * i‬‬

‫‪return result‬‬

‫‪# main program‬‬


‫))" ‪num = int(input("Type a number:‬‬
‫)‪f=factorialLoop(num‬‬
‫)‪print("The factorial of ", num, " is:", f‬‬

‫‪Type a number: 3‬‬


‫‪The factorial of 3 is:6‬‬

‫‪73‬‬
‫االآن ِ‬
‫اح�صب م�صروب العدد با�صتخدام دالة امل�صروب‪.‬‬

‫م�صروب )‪(3‬‬ ‫‪# calculate the factorial of an integer using a‬‬


‫‪# recursive function‬‬
‫‪def factorial(x):‬‬
‫‪if x == 0:‬‬ ‫الحالة االأ�صا�صية‪.‬‬
‫‪3‬‬ ‫م�صروب )‪(2‬‬ ‫‪return 1‬‬
‫‪else:‬‬ ‫حالة اال�صتدعاء‬
‫))‪return (x * factorial(x-1‬‬
‫التكرارية‪.‬‬
‫‪2‬‬ ‫م�صروب )‪(1‬‬ ‫‪# main program‬‬
‫))" ‪num = int(input("Type a number:‬‬
‫)‪f=factorial(num‬‬
‫)‪print("The factorial of ", num, " is: ", f‬‬
‫‪1‬‬ ‫م�صروب )‪(0‬‬

‫‪Type a number: 3‬‬


‫‪1‬‬ ‫‪The factorial of 3 is: 6‬‬
‫‪3! = 3*2*1 = 6‬‬
‫�صكل ‪� :2.4‬صجرة اال�صتدعاء الذاتي‬
‫جدول  ‪ :2.2‬مزايا األ�صتدعاء ّ‬
‫الذاتي‪ ،‬وعيوبه‬
‫العيوب‬ ‫املزايا‬
‫• تقل��ل دوال اال�ص��تدعاء التكراري��ة م��ن ع��دد التعليم��ات يف • يف بع���ص االأحي��ان‪َ ،‬ي�ص ُع��ب تَت ُّب��ع منط��ق دوال‬
‫اال�صتدعاء التكرارية‪.‬‬ ‫املقطع الربجمي‪.‬‬
‫• ميك��ن تق�ص��يم املهم��ة اإىل جمموع��ة م��ن امل�ص��كالت الفرعي��ة • يتطل��ب اال�ص��تدعاء الذات��ي مزي��دً ا م��ن الذاك��رة‬
‫والوقت‪.‬‬ ‫با�صتخدام اال�صتدعاء الذاتي‪.‬‬
‫• يف بع���ص االأحي��ان‪ ،‬يَ�ص �هُل ا�ص��تخدام اال�ص��تدعاء الذات��ي • ال ي�ص��هل حتدي��د احل��االت الت��ي ميك��ن فيه��ا‬
‫ا�صتخدام دوال اال�صتدعاء التكرارية‪.‬‬ ‫ال�صتبدال التكرارات املُتداخلة‪.‬‬
‫األ�صتدعاء الذاتي والتكرار ‪Recursion and Iteration‬‬
‫ُي�ص��تخدم كل م��ن اال�ص��تدعاء الذات��ي والتك��رار يف تنفي��ذ جمموع��ة م��ن التعليم��ات لع��دة م��رات‪ ،‬والف��ارق الرئي���ص ب��ن‬
‫اال�صتدعاء الذاتي والتكرار هو طريقة اإنهاء الدالة التكرارية‪ .‬دالة اال�صتدعاء التكرارية ت�صتدعي نف�صها وتُنهي التنفيذ‬
‫عندم��ا ت�ص��ل اإىل احلال��ة االأ�صا�ص��ية‪ .‬اأم��ا التك��رار فيُن ِّف��ذ ل ِب َن� َة املقط��ع الربجم��ي با�ص��تمرارحتى يتحق��ق �ص��رط ُحم� َّدد اأو‬
‫ينق�صي عدد ُحم َّدد من التكرارات‪.‬‬
‫اجلدول التايل يعر�ص بع�ص االختالفات بن اال�صتدعاء الذاتي والتكرار‪.‬‬
‫جدول  ‪ :2.3‬التكرار واأل�صتدعاء الذاتي‬
‫اال�صتدعاء الذاتي‬ ‫التكرار‬
‫بطيء التنفيذ مقارن ًة بالتكرار‪.‬‬ ‫�صريع التنفيذ‪.‬‬
‫يتطلب حجم ذاكرة اأكرب‪.‬‬ ‫يتطلب حجم ذاكرة اأقل‪.‬‬
‫حجم املقطع الربجمي اأ�صغر‪.‬‬ ‫حجم املقطع الربجمي اأكرب‪.‬‬
‫ينته��ي با�ص��تكمال الع��دد املُح � َّدد م��ن التك��رارات اأو حتقي��ق‬
‫ينتهي مبجرد الو�صول اإىل احلالة االأ�صا�صية‪.‬‬ ‫�صرط ُم َّعن‪.‬‬
‫‪74‬‬
‫متى ت ِ‬
‫َ�صتخدم اال�صتدعاء الذاتي؟‬
‫• يُع ُّد اال�صتدعاء الذاتي الطريقة االأكر مالئمة للتعامل مع امل�صكلة يف العديد من احلاالت‪.‬‬
‫• يَ�ص ُهل ا�صتك�صاف بع�ص هياكل البيانات با�صتخدام اال�صتدعاء الذاتي‪.‬‬
‫• بع���ص خوارزمي��ات الت�صني��ف (‪ ،)Sorting Algorithms‬تَ�ص� ِ‬
‫�تخدم اال�ص��تدعاء الذات��ي‪ ،‬مث��ل‪ :‬الت�صني��ف ال�ص��ريع‬
‫(‪.)Quick Sort‬‬
‫يف املثال التايل‪� ،‬صت�صتخرج اأكرب رقم موجود يف قائمة مكونة من االأرقام با�صتخدام دالة اال�صتدعاء التكرارية‪.‬‬
‫كما يظهر يف ال�صطر االأخر من املثال دالة اأخرى للتكرار لغر�ص املقارنة‪.‬‬
‫‪def findMaxRecursion(A,n):‬‬

‫‪if n==1:‬‬
‫]‪m = A[n-1‬‬
‫‪else:‬‬
‫))‪m = max(A[n-1],findMaxRecursion(A,n-1‬‬
‫‪return m‬‬

‫‪def findMaxIteration(A,n):‬‬

‫]‪m = A[0‬‬
‫‪for i in range(1,n):‬‬ ‫ت�صتخرج الدالة ()‪ max‬العن�صر ذا القيمة‬
‫)]‪m = max(m,A[i‬‬
‫‪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‬‬

‫‪Max with recursion is:‬‬ ‫‪73‬‬


‫‪Max with iteration is:‬‬ ‫‪73‬‬

‫))‪max(A[3], findMaxRecursion(A, 3‬‬

‫> ‪42‬‬ ‫))‪max(A[2], findMaxRecursion(A, 2‬‬

‫‪-5‬‬ ‫>‬ ‫))‪max(A[1], findMaxRecursion(A, 1‬‬

‫‪73‬‬ ‫>‬ ‫‪3‬‬


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

def powerFunRecursive(baseNum,expNum):
if(expNum==1):
return(baseNum)
else:
return(baseNum*powerFunRecursive(baseNum,expNum-1))

def powerFunIteration(baseNum,expNum):

numPower = 1
for i in range(exp):
numPower = numPower*base
return numPower

# main program
base = int(input("Enter number: "))
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

Infinite Recursive Function ‫دالة األ�صتدعاء التكرارية الالنهائية‬


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

76
‫مترينات‬
‫‪1‬‬
‫خاطئة‬ ‫�صحيحة‬ ‫حدِّد اجلملة ال�صحيحة واجلملة اخلاطئة فيما يلي‪:‬‬
‫‪ .1‬تتكون دالة اال�صتدعاء التكرارية من حالتن‪.‬‬
‫‪ .2‬ت�صتدعي دالة اال�صتدعاء التكرارية دالة اأخرى‪.‬‬
‫‪ .3‬دوال اال�صتدعاء التكرارية اأ�صرع يف التنفيذ‪.‬‬
‫‪ .4‬ا�صتدعاء الدوال يجعل لبِنة املقطع الربجمي اأ�صغر حجمًا‪.‬‬
‫‪ .5‬كتابة مقطع برجمي مُتكرِّر يتطلب ا�صتدعا ًء ذاتيًّا اأقل‪.‬‬

‫‪ 2‬ما االختالفات بني التكرار واال�صتدعاء الذاتي؟‬

‫‪ 3‬متى يجب ا�صتخدام اال�صتدعاء الذاتي؟‬

‫‪77‬‬
‫‪ 4‬و َِّ�صح مزايا ا�صتخدام اال�صتدعاء الذاتي وعيوبه‪.‬‬

‫‪ 5‬اكت��ب دال��ة ا�ص��تدعاء تكراري��ة بلغ��ة البايث��ون تق��وم بح�ص��اب الرق��م االأك��رب برتتي��ب حم��دد (مث� ّ�ال ث��اين اأك��رب رق��م) يف‬
‫قائمة من االأرقام‪.‬‬

‫‪ 6‬اكتُب دالة ا�صتدعاء تكرارية بلغة البايثون حل�صاب جمموع كل االأرقام الزوجية يف قائمة معيّنة‪.‬‬

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

‫عُ قدة البث‬

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

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

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

‫‪A‬‬

‫عليك فح�س كل العُقد يف امل�صتوى ‪1‬‬ ‫‪B‬‬ ‫‪C‬‬


‫قبل االنتقال اإىل العُقد يف امل�صتوى ‪.2‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬

‫الطابور‬ ‫املُخطَّ ط‬

‫ا ح��ذف ال ُعق��دة م��ن مقد م��ة‬ ‫‪3‬‬ ‫اح��ذف ال ُعق��دة اجلذر ّي��ة م��ن‬ ‫‪2‬‬ ‫البداي��ة م��ن ال ُعق��دة اجلذرية‬ ‫‪1‬‬
‫الطاب��ور (ال ُعق��دة ‪ )B‬ملعاجلته��ا‪،‬‬ ‫الطاب��ور ملعاجلته��ا‪ ،‬ث��م اأ�ص��ف‬ ‫(ال ُعق��دة ‪ .)A‬اأ�ص��ف ال ُعق��دة‬
‫ث��م اأ�ص��ف ف��روع ه��ذه ال ُعق��دة اإىل‬ ‫ف��روع ه��ذه ال ُعق��دة اإىل الطاب��ور‬ ‫اجلذريّة اإىل الطابور‪.‬‬
‫الطابور (العُقدتن ‪ D‬و‪.)E‬‬ ‫(العُقدتن ‪ B‬و‪.)C‬‬

‫‪A‬‬ ‫فُحِ َ�صت‬ ‫‪A‬‬ ‫‪A‬‬

‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬

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

‫‪B‬‬ ‫‪C‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪A‬‬


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

‫‪C‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬


‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬

‫‪80‬‬
‫احذف العُقدة ‪ E‬ملعاجلتها‪.‬‬ ‫‪6‬‬ ‫احذف العُقدة ‪ D‬ملعاجلتها‪.‬‬ ‫‪5‬‬ ‫اح��ذف ال ُعق��دة ‪ C‬وعاجله��ا‪،‬‬ ‫‪4‬‬
‫(لي�ص لديها فروع)‪.‬‬ ‫(لي�ص لديها فروع)‪.‬‬ ‫ثم اأ�صف فرعها اإليها‪.‬‬

‫‪A‬‬ ‫‪A‬‬ ‫‪A‬‬

‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬

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

‫‪E‬‬ ‫‪F‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪C‬‬ ‫‪D‬‬ ‫‪E‬‬


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

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


‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬

‫‪A‬‬ ‫اح��ذف ال ُعق��دة ‪ F‬ملعاجلته��ا‪ ،‬وبذل��ك اأ�صب��ح‬ ‫‪7‬‬


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

‫الحظ كيف ُميكنك تطبيق خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬بلغة البايثون (‪ )Python‬يف املثال التايل‪:‬‬
‫{ = ‪graph‬‬
‫‪"A" : ["B","C"],‬‬
‫‪"B" : ["D","E"],‬‬
‫‪"C" : ["F"],‬‬
‫‪"D" : [],‬‬
‫‪"E" : [],‬‬
‫][ ‪"F" :‬‬
‫}‬

‫‪visitedBFS = [] # List to keep track of visited nodes‬‬


‫][ = ‪queue‬‬ ‫‪# Initialize a queue‬‬

‫‪# bfs function‬‬


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

‫‪81‬‬
‫)‪queue.append(node‬‬

‫‪while queue:‬‬
‫)‪n = queue.pop(0‬‬
‫)" " = ‪print (n, end‬‬

‫‪for neighbor in graph[n]:‬‬


‫‪if neighbor not in visited:‬‬
‫)‪visited.append(neighbor‬‬
‫)‪queue.append(neighbor‬‬

‫‪# main program‬‬


‫)"‪bfs(visitedBFS, graph, "A‬‬

‫‪A B C D E F‬‬

‫التطبيقات العملية خلوارزمية البحث باأولوية األت�صاع‬


‫‪Practical Applications of the BFS Algorithm‬‬

‫تُ�ص��تخدَ م يف �ص��بكات ال ّنظ��ر لل ّنظ��ر (‪ )Peer-to-Peer Networks‬للعث��ور عل��ى كل‬


‫ال ُعقد املجاورة من اأجل تاأ�صي�ص االت�صال‪.‬‬

‫تُ�ص��تخدَ م يف و�ص��ائل التوا�ص��ل االجتماع��ي (‪ )Social Media‬لرب��ط عُ ق��د املُ�ص� ِ‬


‫�تخدمن‬
‫املُرتبطن‪ ،‬مثل اأولئك الذين لهم االهتمامات نف�صها اأو املوقع نف�صه‪.‬‬

‫تُ�ص��تخدَ م يف ُنظ��م املالح��ة با�ص��تخدام ُحم �دِّد املواق��ع العامل��ي (‪GPS Navigation‬‬
‫‪ )Systems‬للبحث عن االأماكن املتجاورة حتى ُحت ِّدد االجتاهات التي يتبعها املُ�صتخدِ م‪.‬‬

‫تُ�صتخدَ م للح�صول على البث ال�صبكي (‪ )Network Broadcasting‬لبع�ص احلُزم‪.‬‬

‫معلومة‬
‫ُمُيكن تطوير خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬بتحديد نقطة البداية‬
‫(احلالة االأوليّة) ونقطة الهدف (احلالة امل ُ�صته َدفة) الإيجاد امل�صار بينهما‪.‬‬

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

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

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

‫‪83‬‬
‫عا ِلج العُقدة ‪ C‬ثم اأ�صفها اإىل املُكدّ�ص‪.‬‬ ‫‪6‬‬ ‫احذف العُقدة ‪.B‬‬ ‫‪5‬‬

‫‪A‬‬ ‫‪A‬‬

‫‪C‬‬ ‫‪B‬‬
‫‪B‬‬ ‫‪C‬‬ ‫‪B‬‬ ‫‪C‬‬
‫‪C‬‬

‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪A‬‬ ‫‪A‬‬ ‫‪D‬‬ ‫‪E‬‬ ‫‪F‬‬ ‫‪A‬‬

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

‫العُقد التي فُحِ �صَ ت با�صتخدام خوارزمية البحث‬ ‫واالآن �ص��تتعلّم طريق��ة تنفي��ذ خوارزمي��ة البح��ث باأولوي��ة العم��ق‬
‫باأولوية العمق (‪ )DFS‬هي‪.F ،C ،E ،D ،B ،A :‬‬ ‫(‪ )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‬‬

‫‪84‬‬
‫التطبيقات العملية خلوارزمية البحث باأولوية العمق‬
‫‪Practical Applications of the DFS Algorithm‬‬

‫تُ�ص��تخدَ م خوارزمي��ة البح��ث باأولوي��ة العم��ق يف اإيج��اد امل�ص��ارات (‪)Path Finding‬‬


‫ال�صتك�صاف امل�صارات املختلفة يف العمق للخرائط والطرقات والبحث عن امل�صار االأف�صل‪.‬‬

‫تُ�ص��تخدَ م خوارزمي��ة البح��ث باأولوي��ة العم��ق يف حل املتاه��ات (‪ )Solve Mazes‬من خالل‬


‫اجتياز كل الطُ ُرق املمكنة‪.‬‬

‫ُمي ِك��ن حتدي��د ال��دورات (‪ )Cycles‬يف املُخطَّ ��ط با�ص��تخدام خوارزمي��ة البح��ث باأولوي��ة‬
‫العم��ق م��ن خ��الل وج��ود حاف��ة خلفي��ة (‪ُ ،)Back Edge‬مت��ر م��ن خ��الل ال ُعق��دة نف�ص��ها‬
‫مرتن‪.‬‬

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

‫التنقّل ح�صب ُعمق ال�صجرة‪.‬‬ ‫التنقّل ح�صب م�صتوى ال�صجرة‪.‬‬ ‫طريقة التنفيذ‬

‫تَ�ص��تخدِ م هي��كل بيان��ات املُك ّد���ص لتت ُّب��ع‬ ‫تَ�ص� ِ‬


‫�تخدم هيكل بيانات الطابور لتت ُّبع املوقع‬
‫املوقع التايل لفح�صه‪.‬‬ ‫التايل لفح�صه‪.‬‬ ‫هيكل البيانات‬

‫ُف�ص��ل ا�ص��تخدامها عندم��ا يك��ون هي��كل‬


‫ي َّ‬ ‫ُف�ص��ل ا�ص��تخدامها عندم��ا يك��ون هي��كل‬
‫ي َّ‬
‫وطويال‪.‬‬
‫ً‬ ‫املُخطَّ ط �صيقًا‬ ‫املُخطَّ ط وا�صعًا وق�صرًا‪.‬‬ ‫اال�صتخدام‬

‫يتج��ة البح��ث اإىل قاع ال�ص��جرة الفرعية‪،‬‬ ‫تبح��ث ع��ن م�ص��ار الوجه��ة با�ص��تخدام اأق��ل‬
‫طريقة البحث‬
‫ثم يرتاجع‪.‬‬ ‫عدد من احلواف‪.‬‬

‫فح�ص عُ قد الفروع قبل االأ�صقاء‪.‬‬ ‫فح�ص عُ قد االأ�صقاء قبل الفروع‪.‬‬ ‫العُقد التي تُفح�س يف‬
‫البداية‬

‫‪85‬‬
‫مترينات‬
‫‪1‬‬

‫خاطئة‬ ‫�صحيحة‬ ‫حدِّد اجلملة ال�صحيحة واجلملة اخلاطئة فيما يلي‪:‬‬


‫‪ .1‬تُنفَّذ خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬وخوارزمية البحث باأولوية العمق (‪)DFS‬‬
‫با�صتخدام اال�صتدعاء الذاتي‪.‬‬
‫‪ .2‬ال ميكن ا�ص��تخدام خوارزمية البحث باأولوية االت�ص��اع (‪ )BFS‬وخوارزمية البحث باأولوية‬
‫العمق (‪ )DFS‬يف هيكل بيانات ال�صجرة‪.‬‬
‫‪ .3‬تُنفَّذ خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬مب�صاعدة هيكل بيانات القائمة املرتابطة‪.‬‬
‫‪ .4‬ميكن تنفيذ خوارزمية البحث باأولوية العمق (‪ )DFS‬مب�صاعدة هيكل بيانات املُكدّ�ص‪.‬‬
‫‪ .5‬ال ميكن ا�صتخدام خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬يف البث ال�صبكي‪.‬‬

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

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

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

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

‫‪ 6‬اكت��ب دال��ة بلغ��ة البايث��ون تَ�ص��تخدِ م خوارزمي��ة البح��ث باأولوي��ة العم��ق (‪ )DFS‬الإيج��اد امل�ص��ار االأق�ص��ر يف خمط��ط غ��ر‬
‫موزون‪.‬‬

‫‪88‬‬
‫الدر�س الثالث‬
‫اتخاذ القرار القائم على القواعد‬

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


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

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


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

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


‫العيوب‬ ‫املزايا‬
‫• تَعم��ل ه��ذه االأنظم��ة بكف��اءة طامل��ا كان��ت مُدخَ ��الت املعرِ ف��ة‬ ‫• ُميكنه��ا اتخ��اذ الق��رارات وح��ل امل�ص��كالت ب�ص��رعة‬
‫والقواع��د جي��دة‪ ،‬وق��د ال ت�ص��تطيع التعام��ل م��ع املواق��ف الت��ي‬ ‫وبدق��ة اأف�ص��ل م��ن الب�ص��ر‪ ،‬خا�ص ًة عندم��ا يتعلق االأمر‬
‫تقع خارج نطاق خرباتها‪.‬‬ ‫بامله��ام الت��ي تتطل��ب ق��درًا كب �رًا م��ن املعرِ ف��ة اأو‬
‫• ال ُميكنه��ا التعلُّ��م اأو التك ُّي��ف بالطريق��ة نف�ص��ها مث��ل الب�ص��ر‪،‬‬ ‫البيانات‪.‬‬
‫وه��ذا يجعله��ا اأق��ل قابلي��ة للتطبي��ق عل��ى ا أالح��داث املُتغ� ِّ�رة‬ ‫• تَعم��ل ه��ذه االأنظم��ة با�ص��تمرار‪ ،‬دون حت ُّي��ز اأو اأخط��اء‬
‫دخالت البيانات واملنطق كثرًا مبرور الوقت‪.‬‬ ‫حيث تتغر ُم َ‬ ‫ق��د ت ؤوث��ر يف بع���ص االأحي��ان عل��ى اتخ��اذ الق��رار‬
‫الب�صري‪.‬‬
‫‪89‬‬
‫نظام ذكاء ا�صطناعي قائم على القواعد‬ ‫يف ه��ذا الدر���ص �ص��تتعلّم املزي��د ح��ول االأنظم��ة القائم��ة عل��ى القواع��د يف �ص��ياق أاح��د تطبيقاته��ا‬
‫قاعدة املعرِفة‬ ‫�خي�صا طب ًي��ا وف ًق��ا لالأعرا���ص الت��ي‬
‫الرئي�ص��ة‪ ،‬وه��و‪ :‬الت�ص��خي�ص الطب��ي‪� .‬ص��يعر�ص النظ��ام ت�ص� ً‬
‫مر�س ‪1‬‬
‫و�ص��ح يف ال�ص��كل ‪ .2.8‬ب��دءًا بنظ��ام ت�ص��خي�ص ب�ص��يط ُم�ص��ت ِند‬
‫تظه��ر عل��ى املري���ص‪ ،‬كم��ا ه��و ُم ّ‬
‫‪a‬‬ ‫‪b‬‬ ‫‪c‬‬ ‫‪d‬‬ ‫اأعرا�س‬ ‫اإىل القواعد‪ ،‬و�صتكت�صف بع�ص االأنظمة االأكر ذكا ًء وكيف ُيحقِّق كل تكرار نتائج اأف�صل‪.‬‬
‫مر�س ‪2‬‬
‫‪e‬‬ ‫‪f‬‬ ‫‪g‬‬ ‫‪h‬‬ ‫اأعرا�س‬ ‫‪1‬‬ ‫االإ�صدار‬
‫مر�س ‪3‬‬ ‫يف االإ�ص��دار االأول �ص��تبني نظامً ��ا ب�ص��يطً ا قائ ًم��ا عل��ى القواع��د ميكن��ه ت�ص��خي�ص ثالث��ة اأمرا���ص‬
‫‪i‬‬ ‫‪j‬‬ ‫‪k‬‬ ‫‪l‬‬ ‫اأعرا�س‬ ‫ُحمتمل��ة‪( KidneyStones :‬ح�ص��ى ال ُكل��ى)‪ ،‬و‪( Appendicitis‬الته��اب الزائ��دة الدودي��ة)‪،‬‬
‫و‪( Food Poisoning‬الت�ص�مُم الغذائ��ي)‪� .‬ص��تكون املُدخَ ��الت اإىل النظ��ام ه��ي قاع��دة معرف��ة‬
‫ب�ص��يطة ترب��ط كل مر���ص بقائم��ة م��ن االأعرا���ص املُحتمل��ة‪ .‬يتو ّف��ر ذل��ك يف ملف بتن�ص��يق ‪JSON‬‬
‫و�صح باالأ�صفل‪.‬‬‫(جي�صون) ُميكنك حتميله وعر�صه كما هو ُم َّ‬

‫‪import json # a library used to save and load JSON files‬‬


‫مري�س ‪2‬‬ ‫مري�س ‪1‬‬
‫اأعرا�س‬ ‫اأعرا�س‬
‫‪b‬‬ ‫‪d‬‬ ‫‪a‬‬ ‫‪j‬‬
‫‪# the file with the symptom mapping‬‬
‫‪f‬‬ ‫‪g‬‬ ‫‪e‬‬ ‫‪k‬‬
‫'‪symptom_mapping_file='symptom_mapping_v1.json‬‬

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

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

‫‪def diagnose_v1(patient_symptoms:list):‬‬

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

‫‪if "vomiting" in patient_symptoms:‬‬

‫‪if "abdominal pain" in patient_symptoms:‬‬

‫‪if "diarrhea" in patient_symptoms:‬‬

‫‪# 1:vomiting, 2:abdominal pain, 3:diarrhea‬‬


‫)'‪diagnosis.append('food poisoning‬‬

‫‪elif 'fever' in patient_symptoms:‬‬

‫‪# 1:vomiting, 2:abdominal pain, 3:fever‬‬


‫)'‪diagnosis.append('food poisoning‬‬
‫)'‪diagnosis.append('appendicitis‬‬

‫‪elif "lower back pain" in patient_symptoms and 'fever' in patient_symptoms:‬‬

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


‫)'‪diagnosis.append('kidney stones‬‬

‫‪elif "abdominal pain" in‬‬ ‫\‪patient_symptoms and‬‬


‫\‪"diarrhea" in patient_symptoms and‬‬
‫\‪"fever" in patient_symptoms:‬‬
‫‪# 1:abdominal pain, 2:diarrhea, 3:fever‬‬
‫)'‪diagnosis.append('food poisoning‬‬

‫‪return diagnosis‬‬

‫يف ه��ذه احلال��ة‪ ،‬تك��ون قاع��دة املعرِ ف��ة حم��دد ًة بتعليم��اتٍ برجمي � ٍة ثابت��ة (‪ )Hard-Coded‬داخ��ل الدال��ة يف �ص��كل‬
‫َ�صتخدم هذه العبارات االأعرا�ص ال�صائعة بن االأمرا�ص الثالثة للتو�صل تدريجيًا اإىل الت�صخي�ص يف اأ�صرع‬ ‫عبارات ‪ .IF‬ت ِ‬
‫وق��ت ممك��ن‪ .‬عل��ى �ص��بيل املث��ال‪ ،‬عَ ر���ص ‪( Vomiting‬الق��يء) م�ص��رتك بن جمي��ع االأمرا�ص‪ .‬لذل��ك‪ ،‬اإذا كانت عبارة ‪IF‬‬
‫االأوىل �صحيح��ة فق��د مت بالفع��ل ح�ص��اب أاح��د االأعرا���ص الثالث��ة املطلوب��ة جلمي��ع االأمرا���ص‪ .‬بع��د ذل��ك‪� ،‬ص��وف تب��داأ يف‬
‫البح��ث ع��ن ‪( Abdominal Pain‬اأمل البط��ن) املرتب��ط مبر�ص��ن وت�ص��تمر بالطريق��ة نف�ص��هاحتى يت��م النظ��ر يف جمي��ع‬
‫جمموعات االأعرا�ص املمكنة‪.‬‬
‫‪91‬‬
‫ُميكنك بعد ذلك اختبار هذه الدالة على ثالثة مر�صى خمتلفن‪:‬‬

‫‪# Patient 1‬‬


‫]'‪my_symptoms=['abdominal pain', 'fever', 'vomiting‬‬
‫)‪diagnosis=diagnose_v1(my_symptoms‬‬
‫)‪print('Most likely diagnosis:',diagnosis‬‬

‫‪# Patient 2‬‬


‫] '‪my_symptoms=['vomiting', 'lower back pain', 'fever‬‬
‫)‪diagnosis=diagnose_v1(my_symptoms‬‬
‫)‪print('Most likely diagnosis:',diagnosis‬‬

‫‪# Patient 3‬‬


‫]'‪my_symptoms=['fever', 'cough', 'vomiting‬‬
‫)‪diagnosis=diagnose_v1(my_symptoms‬‬
‫)‪print('Most likely diagnosis:',diagnosis‬‬

‫]'‪Most likely diagnosis: ['food poisoning', 'appendicitis‬‬


‫]'‪Most likely diagnosis: ['kidney stones‬‬
‫][ ‪Most likely diagnosis:‬‬

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

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


‫‪( Fever‬احلُمى)‬ ‫•‬ ‫‪( Vomiting‬القيء)‬ ‫•‬ ‫‪Abdominal pain‬‬ ‫•‬
‫‪( Cough‬ال�صُ عال)‬ ‫•‬ ‫‪Lower back pain‬‬ ‫•‬ ‫(اأمل يف البطن)‬
‫‪( Vomiting‬القيء)‬ ‫•‬ ‫(اأمل باأ�صفل الظهر)‬ ‫‪( Fever‬احلُمى)‬ ‫•‬
‫‪( Fever‬احلُمى)‬ ‫•‬ ‫‪( Vomiting‬القيء)‬ ‫•‬

‫الت�صخي�س الطبي با�صتخدام نظام الذكاء اال�صطناعي القائم على القواعد | ‪symptom_mapping_v1.json‬‬

‫‪Food poisoning or Appendicitis‬‬


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

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

‫'‪symptom_mapping_file='symptom_mapping_v2.json‬‬

‫‪with open(symptom_mapping_file) as f:‬‬


‫)‪mapping=json.load(f‬‬

‫))‪print(json.dumps(mapping, indent=2‬‬

‫{‬ ‫‪"headache",‬‬
‫{ ‪"diseases":‬‬ ‫‪"tiredness",‬‬
‫[ ‪"covid19":‬‬ ‫‪"stuffy nose",‬‬
‫‪"fever",‬‬ ‫‪"sneezing",‬‬
‫‪"headache",‬‬ ‫‪"sore throat",‬‬
‫‪"tiredness",‬‬ ‫‪"cough",‬‬
‫‪"sore throat",‬‬ ‫"‪"runny nose‬‬
‫"‪"cough‬‬ ‫‪],‬‬
‫‪],‬‬ ‫[ ‪"allergies":‬‬
‫[ ‪"common cold":‬‬ ‫‪"headache",‬‬
‫‪"stuffy nose",‬‬ ‫‪"tiredness",‬‬
‫‪"runny nose",‬‬ ‫‪"stuffy nose",‬‬
‫‪"sneezing",‬‬ ‫‪"sneezing",‬‬
‫‪"sore throat",‬‬ ‫‪"cough",‬‬
‫"‪"cough‬‬ ‫"‪"runny nose‬‬
‫‪],‬‬ ‫]‬
‫[ ‪"flu":‬‬ ‫}‬
‫‪"fever",‬‬ ‫}‬

‫قاع��دة املعرِ ف��ة اجلدي��دة ه��ذه اأك��رب قلي� ً�ال م��ن �ص��ابقتها‪ .‬وم��ع ذل��ك‪ ،‬يتَّ�ص��ح اأن حماول��ة اإن�ص��اء‬
‫عب��ارات ‪ IF‬ال�صَ ��رطيَّة يف ه��ذه احلال��ة �ص��تكون اأ�صعب بكثر‪ .‬على �ص��بيل املث��ال‪ ،‬ت�صمنت قاعدة‬
‫املعرِ ف��ة ال�ص��ابقة رب��ط اأح��د االأمرا���ص باأربعة اأعرا�ص‪ ،‬ومر�صن بثالث��ة اأعرا�ص‪ .‬وعند تطبيق‬
‫قاع��دة ثالث��ة اأعرا���ص عل��ى االأق��ل املُط َّبق��ة يف االإ�ص��دار االأول‪ ،‬حت�ص��ل عل��ى ‪ 6‬جمموع��ات‬
‫االإ�صدار ‪1‬‬
‫ثالثي��ة م��ن االأعرا���ص املحتمل��ة الت��ي توؤخَ ��ذ يف االعتب��ار‪ .‬يف قاع��دة املعرِ ف��ة اجلدي��دة باالأعل��ى‪،‬‬
‫االإ�صدار ‪2‬‬ ‫تك��ون لالأمرا���ص االأربع��ة ‪ 5‬و‪ 5‬و‪ 8‬و‪ 6‬اأعرا���ص‪ ،‬عل��ى الت��وايل‪ .‬وبه��ذا‪ ،‬حت�ص��ل عل��ى ‪96‬‬
‫جمموع��ة ثالثي��ة م��ن االأعرا���ص املحتمل��ة‪ .‬ويف ح��ال التعامل م��ع مئات اأو حت��ى اآالف االأمرا�ص‪،‬‬
‫�صتج ُد اأنّه من امل�صتحيل اإن�صاء نظام مثل املوجود يف االإ�صدار االأول‪.‬‬
‫وكذل��ك‪ ،‬ال يوج��د �ص��بب طب��ي وجي��ه ل ِق َ�ص��ر الت�ص��خي�ص الطب��ي عل��ى جمموع��ات ثالثي��ة م��ن‬
‫�صكل ‪ :2.10‬االإ�صدار الثاين ال‬ ‫االأعرا���ص‪ .‬ولذل��ك‪� ،‬ص��تجعل منط��ق الت�ص��خي�س (‪ )Diagnosis Logic‬اأك��ر تنوعً ��ا بح�ص��اب‬
‫يحتوي على عبارات ‪ IF‬ال�صَ رطيَّة‬ ‫�تخدم بتحدي��د ع��دد االأعرا���ص املُطابق��ة‬ ‫ع��دد االأعرا���ص املُطابق��ة ل��كل مر���ص‪ ،‬وال�ص��ماح لل ُم�ص� ِ‬
‫بتعليمات برجمي ٍة ثابتة‪.‬‬
‫ٍ‬ ‫املحدد ًة‬ ‫التي يجب توافرها يف املر�ص لت�صمينه يف الت�صخي�ص‪.‬‬
‫‪93‬‬
def diagnose_v2(patient_symptoms:list,
symptom_mapping_file:str,
matching_symptoms_lower_bound:int):

diagnosis=[]

with open(symptom_mapping_file) as f:
mapping=json.load(f)

# access the disease information


disease_info=mapping['diseases']

# for every disease


for disease in disease_info:

counter=0

disease_symptoms=disease_info[disease]

# for each patient symptom


for symptom in patient_symptoms:

# if this symptom is included in the known symptoms for the disease


if symptom in disease_symptoms:

counter+=1

if counter>=matching_symptoms_lower_bound:
diagnosis.append(disease)

return diagnosis

‫ بعد حتمي��ل ُخمطَّ ط االأعرا�ص من‬.‫�ات برجمي ٍة ثابتة‬ ٍ �‫ ال�صَ ��رطيَّة املح��ددة بتعليم‬IF ‫ال يحت��وي ه��ذا االإ�ص��دار عل��ى عب��ارات‬
.FOR ‫ يب��داأ االإ�ص��دار يف اأخ��ذ ك ّل مر���ص حمتم��ل يف االعتب��ار با�ص��تخدام حلق��ة التك��رار االأوىل‬،)‫ (ج�ص��ون‬JSON ‫مل��ف‬
‫) يف كل مرة‬Counter( ‫تتحق��ق احللق��ة م��ن كل َع ْر���ص عل��ى ح��دة مبقارنت��ه باالأعرا�ص املعروفة للمر�ص وزي��ادة الع� َّداد‬
.‫يجد فيها النظام تطابقًا‬

94
‫‪# Patient 1‬‬
‫]"‪my_symptoms=["stuffy nose", "runny nose", "sneezing", "sore throat‬‬
‫)‪diagnosis=diagnose_v2(my_symptoms,'symptom_mapping_v2.json' , 3‬‬
‫)‪print('Most likely diagnosis:',diagnosis‬‬

‫‪# Patient 2‬‬


‫]"‪my_symptoms=["stuffy nose", "runny nose", "sneezing", "sore throat‬‬
‫)‪diagnosis=diagnose_v2(my_symptoms, 'symptom_mapping_v2.json' , 4‬‬
‫)‪print('Most likely diagnosis:',diagnosis‬‬

‫‪# Patient 3‬‬


‫]'‪my_symptoms=['fever', 'cough', 'vomiting‬‬
‫)‪diagnosis=diagnose_v2(my_symptoms, 'symptom_mapping_v2.json' , 3‬‬
‫)‪print('Most likely diagnosis:',diagnosis‬‬

‫]'‪Most likely diagnosis: ['common cold', 'flu', 'allergies‬‬


‫]'‪Most likely diagnosis: ['common cold‬‬
‫][ ‪Most likely diagnosis:‬‬

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

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


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

‫‪symptom_mapping_v2.json‬‬

‫?‬ ‫‪) Common cold‬نزالت الربد(‬ ‫‪Common cold or Flu or Allergies‬‬


‫)نزالت الربد اأو االإنفلونزا اأو احل�صا�صية (‬
‫�صكل ‪ :2.11‬متثيل االإ�صدار الثاين‬
‫الح��ظ اأن االإ�ص��دار الث��اين ه��و ن�ص��خة ُمع َّمم��ة م��ن االإ�صدار االأول‪ .‬ومع ذل��ك‪ُ ،‬يع ُّد هذا االإ�صدار اأك��ر قابلية للتطبيق على‬
‫نط��اق وا�ص��ع‪ ،‬وميك��ن ا�ص��تخدامه كم��ا ه��و م��ع اأي قاع��دة معرِ ف��ة اأخ��رى بالتن�ص��يق نف�ص��ه‪ ،‬حتى ل��و كانت ت�ص��مل االآالف من‬
‫االأمرا���ص م��ع ع��دد �صخ��م م��ن االأعرا���ص‪ .‬كم��ا َي�ص��مح لل ُم�ص� ِ‬
‫�تخدم بزي��ادة اأو تقلي��ل ع��دد القي��ود على الت�ص��خي�ص ب�صبط‬
‫املُتغ� ِّ�ر ‪ .matching_symptoms_lower_bound‬ميك��ن مالحظ��ة ذل��ك يف حال��ة املري���ص ‪ 1‬واملري���ص ‪ :2‬فعل��ى‬
‫ُتغر‪� ،‬صتح�صل على ت�صخي�ص خمتلف متامً ا‪.‬‬ ‫الرغم من اأنهما يعانيان من االأعرا�ص نف�صها‪ ،‬اإال اأنه عند �صبط هذا امل ِّ‬
‫متثيال دقيقًا للت�صخي�ص‬
‫على الرغم من هذه التح�صينات‪،‬اإال اإنّ بع�ص العيوب ال تزال موجودة يف هذا االإ�صدار‪ ،‬وال ُيع ُّد ً‬
‫الطبي احلقيقي‪.‬‬
‫‪95‬‬
3 ‫االإ�صدار‬
‫ُف�صل من قاعدة‬
َّ ‫ �ص��تزيد م��ن ذكاء النظ��ام القائ��م عل��ى القواع��د مبنحه اإمكاني��ة الو�صول اإىل ن��وع م‬،‫يف االإ�ص��دار الثال��ث‬
‫�يوعا من‬ ِ
ً �‫ اإنّ بع���ص االأعرا�ص تكون اأكر �ص‬:‫ ه��ذا الن��وع اجلدي��د ياأخ��ذ بع��ن االعتب��ار احلقيقة الطبي��ة التي تقول‬.‫املعرف��ة‬
.‫اأخرى للمر�ص نف�صه‬
symptom_mapping_file='symptom_mapping_v3.json'

with open(symptom_mapping_file) as f:
mapping=json.load(f)

print(json.dumps(mapping, indent=2))

{ "fever",
"diseases": { "headache",
"covid19": { "tiredness",
"very common": [ "sore throat",
"fever", "cough"
"tiredness", ],
"cough" "less common": [
], "stuffy nose",
"less common": [ "sneezing",
"headache", "runny nose"
"sore throat" ]
] },
}, "allergies": {
"common cold": { "very common": [
"very common": [ "stuffy nose",
"stuffy nose", "sneezing",
"runny nose", "runny nose"
"sneezing", ],
"sore throat" "less common": [
], "headache",
"less common": [ "tiredness",
"cough" "cough"
] ]
}, }
"flu": { }
"very common": [ }

96
‫ و�صيُ�ص��تبدَ ل بدالة ت�ص��جيل النقاط التي تعطي اأوزانًا ُخم َّ�ص�صة‬،‫لن يُنظر اإىل املنطق الذي يقت�صر على عدد االأعرا�ص‬
‫�يتم ت�صمن‬
ّ �‫ �ص‬.‫ �ص�تَتوفر للم�ص��تخدِ م كذلك املرونة لتحديد االأوزان التي يراها منا�ص��بة‬.‫لالأعرا�ص االأكر واالأقل �ص��يوعً ا‬
.‫املر�ص اأو االأمرا�ص ذات املجموع املوزون االأعلى يف الت�صخي�ص‬
from collections import defaultdict

def diagnose_v3(patient_symptoms:list,
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)

disease_info=mapping['diseases']

# holds a symptom-based score for each potential disease


disease_scores=defaultdict(int)

for disease in disease_info:

# get the very common symptoms of the disease


very_common_symptoms=disease_info[disease]['very common']

# get the less common symptoms for this disease


less_common_symptoms=disease_info[disease]['less common']

for symptom in patient_symptoms:

if symptom in very_common_symptoms:
disease_scores[disease]+=very_common_weight

elif symptom in less_common_symptoms:


disease_scores[disease]+=less_common_weight

# find the max score all candidate diseases


max_score=max(disease_scores.values())

if max_score==0:
return []

else:
# get all diseases that have the max score
diagnosis=[disease for disease in disease_scores if disease_scores
[disease]==max_score]

return diagnosis, max_score

97
‫املعرفة‪ُ ،‬حت ِّدد هذه الدالة اجلديدة االأعرا�ص االأكر واالأقل ظهورًا على املري�ص‪ ،‬ثم تزيد‬ ‫لكل مر�ص حمتمل يف قاعدة ِ‬
‫م��ن درج��ة املر���ص وف ًق��ا ل�الأوزان املُقا ِبل��ة‪ ،‬ويف االأخ��ر ُت��درَج االأمرا���ص ذات الدرج��ة االأعلى يف الت�ص��خي�ص‪ُ .‬ميكنك االآن‬
‫اختبار تنفيذ الدالة مع بع�ص االأمثلة‪:‬‬
‫‪# Patient 1‬‬
‫]"‪my_symptoms=["headache", "tiredness", "cough‬‬
‫)'‪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‬‬


‫]"‪my_symptoms=["stuffy nose", "runny nose", "sneezing", "sore throat‬‬
‫)‪diagnosis=diagnose_v3(my_symptoms, 'symptom_mapping_v3.json', 1, 1‬‬
‫)‪print('Most likely diagnosis:',diagnosis‬‬

‫)‪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‬متثيل االإ�صدار الثالث‬
‫ق��د تالح��ظ اأن��ه عل��ى الرغ��م م��ن اأن االأعرا���ص الثالث��ة عل��ى املري���ص ‪( Headache :1‬ال�ص��داع)‪ ،‬و‪Tiredness‬‬
‫(االإعي��اء)‪ ،‬و‪( Cough‬ال�ص��عال) تظه��ر عن��د االإ�صاب��ة ب��كل م��ن ‪( Flu‬االإنفلون��زا)‪ ،‬و ‪( Covid19‬كوفي��د‪.)19 -‬‬
‫واحل�صا�ص��ية‪ ،‬ا ّإال اأنّ الظّ اه��ر يف نتائ��ج التّ�ص��خي�ص ه��ي االإنفلون��زا فق��ط‪ .‬هذا الأن جميع االأعرا�ص الثالثة �ص��ائعة جدً ا يف‬
‫قاع��دة املعرِ ف��ة‪ ،‬مم��ا ي�وؤدي اإىل درج��ة ق�ص��وى قدره��ا ‪ .3‬وباملث��ل‪ ،‬يف ظ��ل معان��اة املري���ص الث��اين والثال��ث م��ن االأعرا�ص‬
‫دخالت االأوزان املختلفة لالأعرا�ص االأكر واالأقل �صيوعً ا اإىل ت�صخي�صات خمتلفة‪ .‬وعلى وجه التحديد‪،‬‬ ‫نف�صها‪ ،‬توؤدي ُم َ‬
‫يَنتج عن ا�صتخدام وزن مت�صا ٍو لنوعن من االأعرا�ص اإ�صافة االإنفلونزا اإىل الت�صخي�ص‪.‬‬
‫‪98‬‬
‫االإ�صدار ‪4‬‬

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

‫‪import pandas as pd # import pandas to load and process spreadsheet-type data‬‬

‫‪medical_dataset=pd.read_csv('medical_data.csv') # load a medical dataset.‬‬

‫‪medical_dataset‬‬

‫يف املث��ال اأع��اله‪ ،‬حتت��وي جمموع��ة البيان��ات عل��ى ‪ 2,000‬حال��ة مر�صي��ة‪ ،‬بحي��ث تتك��ون كل حال��ة من ‪ 8‬اأعرا���ص حمتملة‪:‬‬
‫(ال�ص��داع)‪ ،‬و‪Stuffy nose‬‬‫(ال�ص��عال)‪ ،‬و‪( Tiredness‬االإعي��اء)‪ ،‬و‪ُ Headache‬‬ ‫حلم��ى)‪ ،‬و‪ُ Cough‬‬ ‫‪( Fever‬ا ُ‬
‫(ان�ص��داد االأن��ف)‪ ،‬و‪( Runny nose‬ر�ص��ح االأن��ف)‪ ،‬و‪( Sneezing‬العُطا���ص)‪ ،‬و‪( Sore throat‬الته��اب احلل��ق)‪.‬‬
‫تُر َّمز كل واحدة من هذه االأعرا�ص يف عمود ثنائي ُمنف�صل‪ .‬العدد الثنائي ‪ 1‬ي�صر اإىل اأن املري�ص ُيعاين من االأعرا�ص‪،‬‬
‫بينما العدد الثنائي ‪ 0‬ي�صر اإىل اأن املري�ص ال ُيعاين من االأعرا�ص‪.‬‬
‫‪99‬‬
:‫ وهناك اأربعة ت�صخي�صات حمتملة‬،‫يحتوي العمود االأخر على ت�صخي�ص اخلبر الب�صري‬
.)‫ (نزالت الربد‬Common cold‫ و‬،)‫ (احل�صا�صية‬Allergies‫ و‬،)‫ (االإنفلونزا‬Flu‫ و‬،)19 -‫ (كوفيد‬Covid19
:‫ميكنك التحقق من ذلك ب�صهولة با�صتخدام املقطع الربجمي التايل بلغة البايثون‬

set(medical_dataset['diagnosis'])

،‫على الرغم من اأن هناك الع�صرات من خوارزميات تعلُّم االآلة املحتملة التي ميكن ا�صتخدامها مع جمموعة البيانات هذه‬
‫ كم�ا �صتَ�ص�تخدِ م‬،)Decision Tree( ‫اإال أان�ك �صت�ص�تخدم تل�ك الت�ي تتب�ع املنهجي�ة املُ�ص�ت ِندة عل�ى منط�ق �ص�جرة الق�رار‬
.‫) على وجه التحديد‬Sklearn( ‫ (م�ص ّنف �صجرة القرار) من مكتبة البايثون �صكلرن‬DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier

def diagnose_v4(train_dataset:pd.DataFrame):

# create a DecisionTreeClassifier
model=DecisionTreeClassifier(random_state=1)

# drop the diagnosis column to get only the symptoms


train_patient_symptoms=train_dataset.drop(columns=['diagnosis'])

# 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)

(1400, 9)
(600, 9)

100
.‫ نقطة �صتُ�صتخدَ م الختباره‬600‫ نقطة بيانات �صتُ�صتخدَ م لتدريب النموذج و‬1,400 ‫لديك االآن‬
:‫ابداأ بتدريب منوذج �صجرة القرار ومتثيله‬
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

my_tree=diagnose_v4(train_data) # train a model

print(my_tree.classes_) # print the possible target labels (diagnoses)

plt.figure(figsize=(12,6)) # size of the visualization, in inches

# plot the tree


plot_tree(my_tree,
max_depth=2,
fontsize=10,
feature_names=medical_dataset.columns[:-1]
)

['allergies' 'common cold' 'covid19' 'flu']

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

101
‫تُ�ص��تخدَ م دالة ()‪ plot_tree‬لر�ص��م وعر�ص �ص��جرة القرار‪ .‬ولعدم توفر م�ص��احة كافية للعر�ص �ص��يتم متثيل امل�ص��توين‬
‫ُتغر ‪.max_depth‬‬ ‫االأوّلن فقط‪ ،‬باالإ�صافة اإىل اجلذر‪ .‬ميكن �صبط هذا الرقم ب�صهولة با�صتخدام امل ِّ‬
‫‪# plot the tree‬‬
‫‪plot_tree(my_tree,‬‬
‫عُ مق‬
‫‪max_depth=2,‬‬
‫‪fontsize=10‬‬ ‫�صجرة القرار‪.‬‬

‫كل عُ قدة يف ال�صجرة ُمتثِّل جمموعة فرعية من املر�صى‪ ،‬فعلى �صبيل املثال‪،‬‬
‫ُمت ِّث��ل عُ ق��دة اجل��ذر اإجم��ايل ع��دد ‪ 1,400‬مري���ص يف جمموع��ة بيان��ات التدري��ب‪ .‬م��ن‬
‫بينه��م‪ ،354 ،‬و ‪ ،345‬و ‪ ،358‬و ‪� 343‬صُ ��خِّ �صوا ب � ‪( Allergies‬احل�صا�ص��ية)‪،‬‬
‫و‪( Common cold‬ن��زالت ال��ربد)‪ ،‬و‪( Covid19‬كوفي��د‪ ،)19-‬و‪( Flu‬االإنفلون��زا)‪،‬‬
‫على التوايل‪.‬‬

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

‫يقي�س موؤ�صر جيني (‪)Gini Index‬‬ ‫ي�ص��تمر التفرُّع حتى ُحتدِّ د اخلوارزمية احلاالت التي انق�ص��مت بالفعل‬
‫ال�صوائب بالعُقدة‪ ،‬وبالتحديد احتمالية‬ ‫اإىل ُعق��د نق َّي��ة متامً ��ا‪ .‬ال ُعق��دة النق َّي��ة بالكام��ل حتت��وي عل��ى احل��االت‬
‫ت�صنيف حمتويات العُقدة ب�صورة خاطئة‪.‬‬ ‫الت��ي له��ا الت�ص��خي�ص نف�ص��ه‪ِ .‬ق َي��م موؤ�ص��ر ‪( gini‬جين��ي) املُح� َّددة عل��ى‬
‫ي�صر انخفا�س م ِ‬
‫ُعامل جيني اإىل ارتفاع‬ ‫كل ُعق��دة‪ُ ،‬مت ِّث��ل موؤ�ص��رات عل��ى مقيا���ص جين��ي‪ ،‬وه��ي �صيغ��ة �ص��هرة‬
‫درجة تاأكُّد اخلوارزمية من الت�صنيف‪.‬‬ ‫ُ�صتخدم لتقييم درجة نقاء العُقدة‪.‬‬ ‫ت َ‬
‫‪102‬‬
‫احتماال للمر�صى يف جمموعة االختبار‪.‬‬‫ً‬ ‫�صتَ�صتخدِ م االآن �صجرة القرار للتنبوؤ بالت�صخي�ص االأكر‬
‫تُ�ص��تخدَ م جمموع��ة االختب��ار لتقيي��م اأداء النم��وذج‪ .‬تَ�ص��ت ِند طريق��ة التقيي��م الدقيقة على م��ا اإذا كان املق�صود من املهمة‬
‫االنح��دار (‪ )Regression‬اأم الت�صني��ف (‪ .)Classification‬يف مث��ل م�ص��كالت الت�صني��ف املعرو�ص��ة هن��ا‪ ،‬تُ�ص��تخدَ م‬
‫طرائق التقييم ال�صهرة مثل‪ :‬ح�صاب دقة النموذج (‪ )Model's Accuracy‬وم�صفوفة الدقة (‪.)Confusion Matrix‬‬
‫• الدق��ة ه��ي ن�ص��بة التنب�وؤات ال�صحيح��ة الت��ي يق��وم به��ا املُ�ص ِّن��ف‪َ .‬حت ُق��ق دق��ة عالي��ة قريب��ة م��ن ‪ 100%‬يعن��ي اأن معظم‬
‫التنبوؤات التي يقوم بها املُ�صنِّف �صحيحة‪.‬‬
‫• م�صفوف��ة الدق��ة ه��ي ج��دول يق��ارن ب��ن القيم احلقيقية (الفعلية) وبن التنبوؤات الت��ي يقوم بها املُ�صنِّف يف جمموعة‬
‫البيانات‪ .‬يحتوي اجلدول على �صف واحد لكل قيمة �صحيحة وعمود واحد لكل قيمة ُمتوقَّعة‪ .‬كل ُمدخَ ل يف امل�صفوفة‬
‫ُميثِّل عدد احلاالت التي لها قيم فعلية و ُمتوقَّعة‪.‬‬

‫‪# functions used to evaluate a classifier‬‬


‫‪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‬‬

‫‪0.8166666666666667‬‬

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

‫)‪confusion_matrix(test_diagnoses,pred‬‬

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


‫‪[ 48,‬‬ ‫‪98,‬‬ ‫‪5,‬‬ ‫‪4],‬‬
‫[‬ ‫‪2,‬‬ ‫‪1, 127,‬‬ ‫‪12],‬‬
‫[‬ ‫‪1,‬‬ ‫‪3,‬‬ ‫)]]‪31, 122‬‬

‫‪103‬‬
‫االإنفلونزا امل ُتوقَّعة‬ ‫امل ُتوقَّع‬ ‫كوفيد‪19‬‬ ‫احل�صا�صية امل ُتوقَّعة نزالت الربد امل ُتوقَّعة‬

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

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

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

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

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

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

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

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

‫مري�ص��ا ُيع��اين م��ن االأعرا�س التالية‬


‫ً‬ ‫‪ 3‬اأ�ص��ف اإىل املقط��ع الربجم��ي اخلا���س باالإ�ص��دار االأول لنظ��ام قائ��م عل��ى القواع��د‬
‫حلم��ى)‪،‬‬
‫[‪( Vomiting‬الق��يء)‪ ،‬و ‪( Abdominal pain‬اآالم البط��ن)‪ ،‬و ‪( Diarrhea‬االإ�ص��هال)‪ ،‬و ‪( Fever‬ا ُ‬
‫و‪( Lower back pain‬اأ باأ�صفل الظهر)]‪ .‬ما الت�صخي�س الطبي حلالة املري�س؟ َدوِّن مالحظاتك باالأ�صفل‪.‬‬

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

‫‪ 5‬يف االإ�صدار الثالث‪ ،‬غ ََّر كال الوزنني اإىل ‪ 1‬للمري�صني االأول والثاين‪ ،‬متامًا مثل املري�س الثالث‪.‬‬
‫َعدِّل املقطع الربجمي ثم َدوِّن مالحظاتك‪.‬‬

‫‪�ِ 6‬ص��فْ باإيج��از كي��ف ُمُيك��ن حت�ص��ني كل اإ�ص��دار بالن�ص��بة لالإ�ص��دار ال�ص��ابق ل��ه (االأول اإىل الث��اين‪ ،‬والث��اين اإىل الثال��ث‪،‬‬
‫والثالث اإىل الرابع)‪.‬‬

‫‪106‬‬
‫الدر�س الرابع‬
‫خوارزميات البحث امل�صتنرة‬
‫تطبيقات خوارزميات البحث‬
‫احلالة النهائية‬ ‫‪Applications of Search Algorithms‬‬
‫خوارزميات البحث هي اأحد املكونات الرئي�صة الأنظمة الذكاء اال�صطناعي‪ ،‬فبا�صتخدامها‬
‫ُميكن اكت�صاف االحتماالت املختلفة الإيجاد احللول املنا�صبة للم�صكالت املُعقدة يف العديد‬
‫من التطبيقات ال�صائدة‪ .‬وفيما يلي اأمثلة على بع�ص تطبيقات خوارزميات البحث‪:‬‬
‫• الروبوتي�ة (‪ :)Robotics‬ق�د يَ�ص�تخدِ م الروب�وت خوارزمي�ة البح�ث لتحدي�د طريق�ه‬
‫عرب املتاهة اأو لتحديد موقع اأحد الكائنات يف نطاق بيئته‪.‬‬
‫• مواقع التجارة االإلكرتونية (‪ :)E-commerce Websites‬ت ِ‬
‫َ�صتخدم مواقع الت�صوق‬
‫ع�رب االإنرتن�ت خوارزمي�ات البح�ث ِلتُطاب�ق ب�ن ا�صتف�ص�ارات العم�الء وب�ن املُنتج�ات‬
‫املتوف�رة‪ ،‬ولت�صفي�ة نتائ�ج البح�ث وف�ق بع�ص املعاير مثل ال�ص�عر‪ ،‬والعالم�ة التجارية‪،‬‬
‫والتقييمات‪ ،‬واقرتاح املُنتجات ذات ال�صلة‪.‬‬
‫كائن‬
‫من�ص�ات مواق�ع التوا�ص�ل االجتماع�ي (‪ :)Social Media Platforms‬تَ�ص�تخدِ م‬ ‫• ّ‬
‫الروبوت‬ ‫مواق�ع التوا�ص�ل االجتماع�ي خوارزمي�ات البح�ث لعر��ص التدوين�ات‪ ،‬واالأ�ص�خا�ص‪،‬‬
‫ُ�صتخدمن وفقًا للكلمات املفتاحية واهتمامات امل ِ‬
‫ُ�صتخدم‪.‬‬ ‫واملجموعات للم ِ‬
‫• متكني االآلة من ممار�صة االألعاب �صتوى ٍ‬
‫عال من املهارة‬
‫(‪ :)Enabling a machine to play games at a high skill level‬يَ�ص�تخدِ م‬
‫ال�ذكاء اال�صطناع�ي خوارزمي�ة البح�ث اأثن�اء لع�ب ال�ص�طرجن اأو ق�و (‪ )Go‬لتقيي�م‬
‫احلركات املختلفة واختيار اخلطوات التي من املرجح اأن توؤدي اإىل الفوز‪.‬‬
‫احلالة االأوليّة‬
‫• ُنظ�م املالح�ة با�ص�تخدام ُحم�دِّد املواق�ع العامل�ي (‪:)GPS Navigation Systems‬‬
‫�صكل ‪ :2.15‬ا�صتخدام الروبوت خوارزمية‬ ‫تَ�ص�تخدِ م ُنظ�م املالح�ة القائمة على ُحم ِّدد املواق�ع العاملي خوارزميات البحث لتحديد‬
‫البحث لتحديد طريقه‬
‫اأق�صر واأ�ص�رع طريق بن موقعن‪ ،‬مع مراعاة بيانات حركة املرور يف الوقت احلايل‪.‬‬
‫• نُظم اإدارة امللفات (‪ُ :)File Management Systems‬ت�صتخدم خوارزميات البحث‬
‫يف ُنظ�م اإدارة امللف�ات لتحدي�د موق�ع امللفات با�ص�تخدام ا�ص�م‪ ،‬وحمت�وى امللف‪ ،‬وبع�ص‬
‫ال�صمات االأخرى‪.‬‬
‫اأنواع خوارزميات البحث واأمثلتها ‪Types and Examples of Search Algorithms‬‬
‫هناك نوعان رئي�صان من خوارزميات البحث وهما‪:‬غر امل ُ�صتنرة (‪ )Uninformed‬وامل ُ�صتنرة (‪.)Informed‬‬
‫خوارزميات البحث غر امل�صتنرة ‪Uninformed Search Algorithms‬‬
‫أي�ص��ا‪ :‬خوارزميات البح��ث العمياء‪ ،‬هي تلك التي ال حتتوي عل��ى معلومات اإ�صافية‬ ‫خوارزمي��ات البح��ث غ��ر املُ�ص��تنرة‪ ،‬وت�ص� ّمى ا ً‬
‫حول حاالت امل�ص��كلة باإ�ص��تثناء املعلومات امل�ص��تفادة من تعريف امل�ص��كلة‪ .‬وتقوم هذه اخلوارزميات باإجراء فح�ص �ص��امل مل�ص��احة‬
‫البح��ث ا�ص��تنا ًدا اإىل جمموع��ة م��ن القواع��د املُح�دَّدة ُم�ص��بقًا‪ .‬و ُتع� ُّد تقني��ات البح��ث باأولوي��ة االت�ص��اع (‪ )BFS‬والبح��ث باأولوي��ة‬
‫العمق (‪ )DFS‬املُ�صار اإليها يف الدر�ص الثاين اأمثلة على خوارزميات البحث غر املُ�صتنرة‪.‬‬
‫‪107‬‬
‫عل��ى �ص��بيل املث��ال‪ ،‬تب��داأ خوارزمي��ة البح��ث باأولوي��ة العم��ق (‪ )DFS‬عن��د عُ ق��دة اجل��ذر بال�ص��جرة اأو املُخطَّ ��ط وتتو�صَّ ��ع‬
‫حت��ى ت�ص��ل لل ُعق��دة االأعم��ق الت��ي مل ُتفحَ ���ص‪ .‬وي�ص��تمر االأم��ر به��ذه الطريق��ة حت��ى ت�ص��تنفد اخلوارزمي��ة م�ص��احة البح��ث‬
‫باأكملها بعد فح�ص كل العُقد املتاحة‪ .‬ثم ُتخرِ ج احلل االأمثل الذي وجدته اأثناء البحث‪ .‬فاحلقيقة اأن خوارزمية البحث‬
‫باأولوي��ة العم��ق (‪ )DFS‬تَتب��ع دومً ��ا ه��ذه القواع��د وال ميك��ن �صبط ا�ص��رتاتيجتها ب�صرف النظر ع��ن نتائج البحث‪ ،‬وهذا‬
‫ما يجعلها خوارزمية غر مُ�صتنرة‪.‬‬
‫ومث��ال اآخ��ر ملح��و عل��ى ه��ذا الن��وع م��ن اخلوارزمي��ات ه��و خوارزمي��ة البح��ث باأولوي��ة العم��ق التك��راري امل ُتع ِّم��ق‬
‫(‪ )Iterative Deepening Depth-First Search - IDDFS‬الت��ي ميك��ن اعتباره��ا مزيجً ��ا ب��ن خوارزميت��ي البح��ث‬
‫�تخدم ا�ص��رتاتيجة ال ُعم��ق ا ًأوال للبح��ث يف جمي��ع‬ ‫باأولوي��ة العم��ق (‪ )DFS‬والبح��ث باأولوي��ة االت�ص��اع (‪ ،)BFS‬فه��ي تَ�ص� ِ‬
‫اخليارات املوجودة يف النطاق الكامل ب�صورة متكررة حتى ت�صل اإىل ُعقدة ُحم َّددة‪.‬‬
‫خوارزميات البحث امل�صتنرة ‪Informed Search Algorithms‬‬
‫الدالة األ�صتدأللية‬
‫(‪:)Heuristic function‬‬ ‫عل��ى النقي���ص م��ن خوارزمي��ات البح��ث غ��ر امل�ص��تنرة‪ ،‬تَ�ص� ِ‬
‫�تخدم‬
‫ه��ي الدال��ة الت��ي تُ�ص ِّن��ف البدائ��ل يف‬ ‫خوارزمي��ات البح��ث املُ�ص��تنرة املعلوم��ات ح��ول امل�ص��كلة وم�ص��احة البح��ث‬
‫خوارزمي��ات البح��ث عن��د كل مرحل��ة‬ ‫لتوجيه عملية البحث‪ .‬واالأمثلة على هذه اخلوارزميات ت�صمل‪:‬‬
‫فرعي��ة ا�ص��تنا ًد ا اإىل تقد ي��رات‬ ‫• خوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل (‪ )A* search‬تَ�ص��تخدِ م دال��ة‬
‫ا�ص��تداللية مبني��ة عل��ى البيا ن��ات‬ ‫ا�ص��تداللية لتقدي��ر امل�ص��افة ب��ن كل عُ ق��دة من العُقد املُر�صَّ ��حة والعُقدة‬
‫املتو ف��رة لتحد ي��د الف��رع ا ل��ذي‬ ‫املُ�ص��تهدَ فة‪ .‬ث��م تُو�صِّ ��ع ال ُعق��دة املُر�صَّ ��حة بالتقدي��ر االأق��ل‪ .‬اإن فعَّالي��ة‬
‫�صت�صلكه‪.‬‬ ‫خوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل (‪ )A* search‬مرتبط��ة بج��ودة‬
‫دالتها اال�ص��تداللية‪ .‬على �ص��بيل املثال‪ ،‬اإذا كنت ت�صمن اأن اال�ص��تدالل‬
‫ل��ن يتج��اوز امل�ص��افة الفعلي��ة اإىل اله��دف‪ ،‬فبالت��ايل �ص��وف تع��ر‬
‫اخلوارزمية على احلل االأمثل‪ .‬بخالف ذلك‪ ،‬قد ال يكون احلل النا من اخلوارزمية هو االأف�صل‪.‬‬
‫• خوارزمية ديك�صرتا (‪ )Dijkstra's Algorithm‬تُو�صِّ ع العُقدة بناء على اأق�صر م�صافة فعلية اإىل الهدف يف كل خطوة‪.‬‬
‫ولذلك‪ ،‬على النقي�ص من خوارزمية البحث باأولوية االأف�صل ‪ ،‬حت�صب خوارزمية ديك�صرتا (‪ )Dijkstra‬امل�صافة الفعلية‬
‫َ�صتخدم التقديرات اال�صتداللية‪ .‬وبينما يجعل هذا خوارزمية ديك�صرتا اأبط أا من خوارزمية البحث باأولوية االأف�صل‪،‬‬ ‫وال ت ِ‬
‫(ممثال بامل�صار االأق�صر من البداية حتى الهدف)‪.‬‬ ‫ً‬ ‫اإال اأن ذلك يعني �صمان العثور على احلل االأمثل دومً ا‬
‫• خوارزمية ت�ص�لُّق التالل (‪ )Hill Climbing‬تبداأ بتوليد حل ع�ص��وائي‪ ،‬ثم حتاول حت�ص��ن هذا احلل ب�صورة متكررة‬
‫باإج��راء تغي��رات ب�ص��يطة ُحت�صِّ ��ن م��ن دال��ة ا�ص��تداللية ُحم� َّددة‪ .‬وبالرغ��م م��ن اأن ه��ذه املنهجي��ة ال ت�صم��ن اإيجاد احلل‬
‫االأمثل‪ ،‬اإال اأنها �صهلة التنفيذ وتتميز بفعالية كبرة عند تطبيقها على اأنواع مُعينة من امل�صكالت‪.‬‬
‫خوارزمية دي�صكرتا (‪)Dijkstra's Algorithm‬‬ ‫خوارزمية البحث باأولوية االأف�صل (‪)A* search‬‬
‫اخلاليا ذات اللون‬
‫البنف�صجي هي‬
‫اخلاليا التي ّ‬
‫فح�صها‪ ،‬واخللية ذات‬
‫اللون االأخ�صرهي‬
‫مو�صع البدء‪ ،‬واخللية‬
‫ذات اللون االحمر هي‬
‫موقع الهدف‪ ،‬بينما‬
‫اخلاليا ذات اللون‬
‫االأ�صفر متثل امل�صار‬
‫الذي العثور عليه‪.‬‬

‫�صكل ‪ :2.16‬حل املتاهة نف�صها با�صتخدام خوارزمية البحث باأولوية االأف�صل وخوارزمية دي�صكرتا‬
‫‪108‬‬
‫يف هذه الوحدة‪� ،‬صت�صاهد بع�ص االأمثلة املرئية وتطبيقات البايثون على خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬وخوارزمية‬
‫البحث باأولوية االأف�صل (‪ )A* search‬ملعرِ فة االختالفات بن خوارزميتي البحث املُ�صتنرة وغر املُ�صتنرة‪.‬‬
‫الهدف‬ ‫اإن�صاء األغاز املتاهة بوا�صطة البايثون‬
‫العقبة‬
‫‪Creating Maze Puzzles in Python‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬
‫تُعرَّف املتاهة يف �صورة اإطار �صبكي ‪.3 3‬‬
‫‪0‬‬ ‫ُيح� َّدد مو�ص��ع البداي��ة بنجم��ة يف اأ�ص��فل ي�ص��ار املتاه��ة‪.‬‬
‫اله��دف ه��و الو�ص��ول اإىل اخللي��ة املُ�ص��ته َدفة املُح � َّددة‬
‫‪1‬‬
‫بالعالم��ة ‪ ،X‬وميك��ن ّلالع��ب االنتق��ال اإىل اأي خلي��ة‬
‫فارغة جماورة ملوقعه احلايل‪.‬‬
‫مو�صع‬ ‫‪2‬‬
‫البداية‬
‫�صكل ‪ :2.17‬لُغز متاهة ب�صيط‬
‫املو�صحة يف �ص��كل ‪ 2.17‬حتتوي على ‪ 3‬خاليا ت�ص��غلُها احلواجز‬ ‫تكون اخللية فارغة اإذا مل حتتوي على عائق‪ .‬على �ص��بيل املثال‪ ،‬املتاهة َّ‬
‫(‪ .)Blocks‬ه��ذه احلواج��ز املل ّون��ة بالل��ون الرم��ادي تُ�ص�كِّل عائ ًق��ا يج��ب عل��ى الالع��ب جت��اوزه للو�ص��ول اإىل اله��دف ‪ ،X‬وميك��ن ّلالع��ب‬
‫االنتقال ب�صكل اأفقي اأو راأ�صي اأو قطري اإىل اأي خلية فارغة جماورة ملوقعه احلايل كما يظهر يف �صكل ‪ ،2.18‬على �صبيل املثال‪:‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬

‫‪0‬‬ ‫‪0‬‬

‫‪1‬‬ ‫‪1‬‬

‫‪2‬‬ ‫‪2‬‬

‫�صكل ‪ :2.18‬ميكن لالعب االنتقال ب�صكل اأفقي اأو راأ�صي اأو قطري اإىل اأي خلية فارغة جماورة ملوقعه احلايل‬
‫الهدف هو اإيجاد امل�صار االأق�صر واالأق ّل عددًا ملرات‬
‫‪import numpy as np‬‬
‫فح��ص اخلالي�ا‪ .‬وبالرغ�م م�ن اأن املتاه�ة ال�صغ�رة‬
‫‪# create a numeric 3 x 3 matrix full of zeros.‬‬ ‫‪ 3 3‬قد تبدو ب�صيطة ّلالعب الب�صري‪ ،‬اإال اأنه يتوجب‬
‫))‪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.‬‬

‫‪109‬‬
‫ ميك��ن‬.)Ones( ‫) وامل�ص��غولة باالآح��اد‬Zeros( ‫ ُمت َّث��ل اخلالي��ا الفارغ��ة باالأ�صف��ار‬،‫يف ه��ذا التمثي��ل الرقم��ي للمتاه��ة‬
:‫ مثل‬،‫حتديث املقطع الربجمي نف�صه ب�صهولة الإن�صاء متاهات كبرة ومُعقدة للغاية‬
import random

random_maze=np.zeros((10,10))

# coordinates of 30 random cells occupied by blocks


blocks=[(random.randint(0,9),random.randint(0,9)) for i in range(30)]

for block in blocks:


random_maze[block]=1

:‫تُ�صتخدَ م الدالة التالية لتمثيل املتاهة‬

import matplotlib.pyplot as plt # library used for visualization

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')


plt.show()

plot_maze(random_maze)

‫المربعات الخ�صراء‬
‫فارغة ويُمكن‬
‫المربعات ال�صوداء‬ .‫اجتيازها‬
‫م�صغولة بالحواجز وال يُمكن‬
.‫اجتيازها‬

‫ با�صتخدام حواجز ع�صوائية‬10 10 ‫ متثيل متاهة‬:2.19 ‫�صكل‬

110
‫ُميكن ا�صتخدام الدالة التالية ال�صتدعاء قائمة حتتوي على كل اخلاليا الفارغ ِة واملُجاورة خللية ُحم َّددة يف اأي متاهة‪:‬‬

‫‪def get_accessible_neighbors(maze:np.ndarray, cell:tuple):‬‬

‫‪# list of accessible neighbors, initialized to empty‬‬ ‫‪x-1, y-1‬‬ ‫‪x-1, y‬‬ ‫‪x-1, y+1‬‬
‫][=‪neighbors‬‬
‫‪x, y-1‬‬ ‫‪x, y‬‬ ‫‪x, y+1‬‬
‫‪x,y=cell‬‬ ‫‪x+1, y-1‬‬ ‫‪x+1, y‬‬ ‫‪x+1, y+1‬‬

‫‪# 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),‬‬
‫‪(x+1,y+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‬‬

‫‪return neighbors‬‬

‫يفرت���ص ه��ذا التطبي��ق اأن كل عميل��ة انتق��ال م��ن خلي��ة اإىل اأخ��رى جم��اورة �ص��وا ًء اأفق ًي��ا اأو راأ�ص�يًا اأو قطر ًي��ا يت��م بتكلف��ة‬
‫َاح��دَ ة فق��ط‪� .‬ص��يتم اإع��ادة النظ��ر يف ه��ذه الفر�صية يف وق��ت الحق من هذا الدر���ص بعر�ص حاالت اأكر‬ ‫مقداره��ا ِوح��دَ ة و ِ‬
‫تعقيدً ا مع �صروط انتقال مُتغرة‪.‬‬
‫تَ�ص��تخدِ م كل خوارزمي��ات البح��ث دال��ة ()‪ get_accessible_neighbors‬يف حماول��ة ح��ل املتاه��ة‪ .‬يف االأمثل��ة التالي��ة‬
‫تُ�ص��تخدم املتاه��ة ‪ 3 3‬املُ�ص َّمم��ة باالأعل��ى للتحق��ق م��ن اأن الدال��ة ت�ص��تدعي اخللي��ة ال�صحيح��ة الفارغ��ة واملج��اورة للخلي��ة‬
‫املُحدَّدة‪.‬‬
‫‪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‬‬
‫الخلية‬
‫المُجاورة‬ ‫بعد اأن تعلّمت كيفية اإن�صاء املتاهات‪ ،‬وكذلك ا�صتدعاء اخلاليا املجاورة الأي خلية يف املتاهة‪،‬‬
‫ف�اإنّ اخلط��وة التالي��ة ه��ي تطبيق خوارزميات البحث التي ميكنها حل املتاهة من خالل اإيجاد‬
‫خلية البداية‬ ‫امل�صار االأق�صر من خلية البداية اإىل خلية الهدف املُحدَّدة‪.‬‬
‫�صكل ‪ :2.20‬اخلاليا املجاورة‬

‫‪111‬‬
‫ا�صتخدام خوارزمية البحث باأولوية األت�صاع يف حل األغاز املتاهة‬
Using BFS to Solve Maze Puzzles
‫) حل��ل األغ��از‬BFS( ‫ املُ�ص��ار اإليه��ا يف ه��ذا اجل��زء خوارزمي��ة البح��ث باأولوي��ة االت�ص��اع‬bfs_maze_solver)( ‫�تخدم دال��ة‬ِ �‫تَ�ص‬
‫ املُح�دَّدة‬get_accessible_neighbors)( ‫�تخدم ه��ذا النم��وذج دال��ة‬ ِ �‫ يَ�ص‬.‫املتاه��ة با�ص��تخدام خلي��ة البداي��ة وخلي��ة اله��دف‬
‫ و مبجرد عثور خوارزمية البحث باأولوية‬،‫باالأعلى ال�ص��تدعاء اخلاليا املُجاورة التي ميكن فح�صها عند اأي نقطة اأثناء البحث‬
‫ املُو�صح��ة باالأ�ص��فل الإع��ادة ِبن��اء‬reconstruct_shortest_path)( ‫ �صتُ�ص��تخدم دال��ة‬،‫) عل��ى اخلل ّي��ة اله��دف‬BFS( ‫االت�ص��اع‬
:‫ وذلك بتتبع امل�صار ب�صورة عك�صية من خلية الهدف اإىل خلية البداية‬،‫امل�صار االأق�صر وا�صتدعائه‬
def reconstruct_shortest_path(parent:dict, start_cell:tuple, target_cell:tuple):

shortest_path = []

my_parent=target_cell # start with the target_cell

# keep going from parent to parent until the search cell has been reached
while my_parent!=start_cell:

shortest_path.append(my_parent) # append the parent

my_parent=parent[my_parent] # get the parent of the current parent

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

shortest_path.reverse() # reverse the shortest path

return shortest_path

‫أي�ص��ا الإع��ادة ِبن��اء احل��ل خلوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل‬


ً ‫ ا‬reconstruct_shortest_path)( ‫�صتُ�ص��تخدَ م دال��ة‬
get_accessible_ neighbors)( ‫ وبالنظ��ر اإىل تعري��ف الدالت��ن‬.‫)املُ�ص��ار اإليه��ا �ص��لفًا يف ه��ذا الدر���ص‬A* search(
:‫ على النحو التايل‬bfs_maze_solver)( ‫ ُميكن تنفيذ دالة‬،‫ املُ�صاعدتن‬reconstruct_shortest_path)(‫و‬
from typing import Callable # used to call a function as an argument of another function

def bfs_maze_solver(start_cell:tuple,
target_cell:tuple,
maze:np.ndarray,
get_neighbors: Callable,
verbose:bool=False): # by default, suppresses descriptive output text

cell_visits=0 # keeps track of the number of cells that were visited during the search
visited = set() # keeps track of the cells that have already been visited
to_expand = [] # keeps track of the cells that have to be expanded

# add the start cell to the two lists


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

112
shortest_distance[start_cell] = 0

# remembers the direct parent of each cell on the shortest path from the start_cell to the cell
parent = {}
#the parent of the start cell is itself
parent[start_cell] = start_cell

while len(to_expand)>0:

next_cell = to_expand.pop(0) # get the next cell and remove it from the expansion list

if verbose:
print('\nExpanding cell', next_cell)

# for each neighbor of this cell


for neighbor,cost in get_neighbors(maze, next_cell):

if verbose:
print('\tVisiting neighbor cell',neighbor)

cell_visits+=1

if neighbor not in visited: # if this is the first time this neighbor is visited

visited.add(neighbor)
to_expand.append(neighbor)
parent[neighbor]= next_cell
shortest_distance[neighbor]=shortest_distance[next_cell]+cost

# target reached
if neighbor==target_cell:

# get the shortest path to the target cell, reconstructed in reverse.


shortest_path = reconstruct_shortest_path(parent,
start_cell, target_cell)

return shortest_path, shortest_distance[target_cell],cell_visits

else: # this neighbor has been visited before

# if the current shortest distance to the neighbor is longer than the shortest
# distance to next_cell plus the cost of transitioning from next_cell to this neighbor
if shortest_distance[neighbor]>shortest_distance[next_cell]
+cost:

parent[neighbor]=next_cell
shortest_distance[neighbor]=shortest_distance[next_cell]+cost

# search complete but the target was never reached, no path exists
return None,None,None

113
‫) للبحث يف كل اخليارات يف العُمق احلايل قبل االنتقال اإىل م�صتوى‬BFS( ‫تتّبع الدالة منهجية البحث باأولوية االت�صاع‬
.to_expand ‫ وقائمة تُ�صمى‬visited ‫ وتَ�صتخدم هذه املنهجية جمموعة واحدة تُ�ص ّمى‬،‫ال ُعمق التايل‬
‫ بينم��ا تت�صمن القائمة‬.‫تت�صم��ن املجموع��ة االأوىل كل اخلالي��ا الت��ي ف ُِح َ�ص��ت م��رة واح��دة عل��ى االأقل من قبل اخلوارزمية‬
‫ َت�ص��تخدم اخلوارزمي��ة كذل��ك‬.‫ مم��ا يعن��ي اأن اخلالي��ا املُج��اورة مل تُفح���ص بع��د‬،‫الثاني��ة كل اخلالي��ا الت��ي مل ُت َو َّ�ص��ع بع��د‬
‫ يحف��ظ االأوّل منهم��ا ط��ول امل�ص��ار االأق�ص��ر م��ن خلي��ة البداي��ة اإىل كل خلي��ة‬،parent‫ و‬shortest_distance ‫قامو�ص��ن‬
.‫ بينما يحفظ الثاين عُ قدة اخللية االأ�صل يف امل�صار االأق�صر‬،‫اأخرى‬
‫ طول احلل‬shortest_distance]target_cell[ ‫خزن املتغ� ِّ�ر‬ ِّ ‫ �ص� ُي‬،‫مبج��رد الو�ص��ول اإىل اخللي��ة الهدف وانتهاء البحث‬
.‫والذي ميثل طول امل�صار االأق�صر من البداية اإىل الهدف‬
:‫ُو�صحة باالأعلى‬
َّ ‫ امل‬3 3 ‫ حلل املتاهة ال�صغرة‬bfs_maze_solver)( ‫َ�صتخدم املقطع الربجمي التايل دالة‬ ِ ‫ي‬

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

solution, distance, cell_visits=bfs_maze_solver(start_cell,


target_cell,
small_maze,
get_accessible_neighbors,
verbose=True)

print('\nShortest Path:', solution)


print('Cells on the Shortest Path:', len(solution))
print('Shortest Path Distance:', distance)
print('Number of cell visits:', cell_visits)

Expanding cell (2, 0)


Visiting neighbor cell (1, 0)

Expanding cell (1, 0)


Visiting neighbor cell (0, 0)
Visiting neighbor cell (0, 1)
Visiting neighbor cell (2, 0)

Expanding cell (0, 0)


Visiting neighbor cell (0, 1)
Visiting neighbor cell (1, 0)

Expanding cell (0, 1)


Visiting neighbor cell (0, 0)
Visiting neighbor cell (0, 2)
Visiting neighbor cell (1, 0)
Visiting neighbor cell (1, 2)

Shortest Path: [(2, 0), (1, 0), (0, 1), (1, 2)]
Cells on the Shortest Path: 4
Shortest Path Distance: 3
Number of cell visits: 10

114
‫تنجح خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬يف اإيجاد امل�صار االأق�صر بعد فح�ص ‪ 10‬خاليا‪ُ .‬ميكن ت�صوير عملية‬
‫البحث املطبّقة بخوارزمية البحث باأولوية االت�صاع (‪ )BFS‬ب�صهولة عند ت�صوير املتاهة بالتمثيل املُ�صت ِند اإىل ُخمطَّ ط‪.‬‬
‫املثال التايل يعر�ص متاهة ‪ 3 3‬ومتثيلها باملُخطَّ ط‪:‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬
‫‪1,0‬‬ ‫‪0,0‬‬ ‫‪1,2‬‬ ‫‪0‬‬

‫‪1‬‬

‫‪2,0‬‬ ‫‪0,1‬‬ ‫‪0,2‬‬ ‫‪2‬‬

‫ُو�ص��ح القيم��ة عل��ى ال ُعق��د اإحداثي��ات خلي��ة امل�صفوف��ة‬


‫يت�صم��ن متثي��ل املُخطَّ ��ط عُ ق��دة واح��دة ل��كل خلي��ة غ��ر م�ص��غولة‪ .‬ت ِّ‬
‫وجه��ة م��ن عُ ق��دة اإىل اأخ��رى يف حال كانت اخلالي��ا املُقابِلة ُميكن الو�ص��ول اإليها من خالل‬ ‫املُقابل��ة‪� .‬ص��تظهر حاف��ة غ��ر ُم َّ‬
‫االنتق��ال م��ن واح��دة اإىل االأخ��رى‪ .‬اإح��دى املالحظ��ات املُه ّم��ة ح��ول خوارزمي��ة البح��ث باأولوي��ة االت�ص��اع (‪ )BFS‬ه��ي اأن��ه‬
‫يف حال��ة امل ُخطَّ ط��ات غ��ر املوزون��ة (‪ )Unweighted Graphs‬يك��ون امل�ص��ار االأول ال��ذي ُحت��دِّ ده اخلوارزمي��ة ب��ن خلي��ة‬
‫البداي��ة واأي خلي��ة اأخ��رى ه��و امل�ص��ار ال��ذي يت�صم��ن اأق��ل ع��دد من اخلالي��ا التي ّمت فح�صه��ا‪ .‬وهذا يعني اأن��ه اإذا كانت ك ّل‬
‫احلواف يف املُخطَّ ط لها الوزن نف�صه‪،‬اأي كان لك ّل االنتقاالت من خلية اإىل اأخرى التكلفة نف�صها‪ ،‬فاإنّ امل�صار االأول الذي‬
‫ُحت��دِّ ده اخلوارزمي��ة اإىل ُعق��دة ُحم� َّددة يك��ون ه��و امل�ص��ار االأق�ص��ر اإىل تل��ك ال ُعق��دة‪ .‬وله��ذا ال�ص��بب‪ ،‬تتوق��ف دال��ة _‪bfs‬‬
‫ُ�صتهدفة‪.‬‬
‫َح�صت فيها العُقدة امل َ‬ ‫()‪ maze_solver‬عن البحث‪ ،‬و َتعر�ص نتيجة املرة االأوىل التي ف َ‬
‫يو�ص��ح‬
‫وم��ع ذل��ك‪ ،‬ال ميك��ن تطبي��ق ه��ذه املنهجي��ة عل��ى امل ُخطَّ ط��ات املوزون��ة (‪ .)Weighted Graphs‬املث��ال الت��ايل ِّ‬
‫اإ�صدارًا موزونًا (‪ )Weighted Version‬لتمثيل ُخمطَّ ط متاهة ‪:3 3‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬
‫‪1,0‬‬ ‫‪1‬‬ ‫‪0,0‬‬ ‫‪1,2‬‬ ‫‪0‬‬

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

‫‪2,0‬‬ ‫‪0,1‬‬ ‫‪1‬‬ ‫‪0,2‬‬ ‫‪2‬‬


‫وخمطَّ طها املوزون‬
‫�صكل ‪ :2.21‬املتاهة ُ‬
‫�صماال‪ ،‬غربًا‪� ،‬صرقًا) ي�صاوي ‪.1‬‬
‫يف هذا املثال‪ ،‬يكون وزن كل احلواف املُقابلة للحركات الراأ�صية اأو االأفقية (جنوبًا‪ً ،‬‬
‫ومع ذلك‪ ،‬يكون وزن كل احلواف املُقابلة للحركات القُطرية (جنوبية غربية‪ ،‬جنوبية �ص��رقية‪� ،‬ص��مالية غربية‪� ،‬ص��مالية‬
‫�ص��رقية) ي�ص��اوي ‪ .3‬يف ه��ذه احلال��ة املوزون��ة‪� ،‬ص��يكون امل�ص��ار االأق�ص��ر ه��و [(‪،)0,2( ،)0,1( ،)0,0( ،)1,0( ،)2,0‬‬
‫(‪ ،])1,2‬مب�صافة اإجمالية‪.5=1 1 1 1 1 :‬‬
‫ميك��ن ترمي��ز ه��ذه احلال��ة االأك��ر تعقي��دً ا با�ص��تخدام االإ�ص��دار امل��وزون م��ن الدال��ة ()‪get_accessible_neighbors‬‬
‫ُو�صحة باالأ�صفل‪.‬‬
‫امل َّ‬
‫‪def get_accessible_neighbors_weighted(maze:np.ndarray,‬‬
‫‪cell:tuple,‬‬
‫‪horizontal_vertical_weight:float,‬‬
‫‪diagonal_weight:float):‬‬

‫‪115‬‬
neighbors=[]
x,y=cell

for i,j in [(x-1,y-1), (x-1,y+1), (x+1,y-1), (x+1,y+1)]: # for diagonal neighbors

# if the cell is within the bounds of the grid and it 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), diagonal_weight))

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:

neighbors.append(((i,j), horizontal_vertical_weight))

return neighbors

‫ وكذلك وزن ُخم ّ�ص�ص خمتلف للحركات‬،‫ُ�صتخدم بتعين وزن ُخم ّ�ص�ص للحركات االأفقية و احلركات الراأ�صية‬ ِ ‫ت�صمح الدالة للم‬
‫) املُ�ص��ار اإليه بوا�ص��طة اأداة احلل يف البحث باأولوية االت�ص��اع‬Weighted Version( ‫ اإذا ا�ص�تُخدِ م االإ�صدار املوزون‬.‫القُطرية‬
:‫ فاإنّ النتائج �صتكون كما يلي‬،)BFS solver(
from functools import partial

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

solution, distance, cell_visits=bfs_maze_solver(start_cell,


target_cell,
small_maze,
partial(get_accessible_neighbors_weighted,
horizontal_vertical_weight=horz_vert_w,
diagonal_weight=diag_w),
verbose=False)

print('\nShortest Path:', solution)


print('Cells on the Shortest Path:', len(solution))
print('Shortest Path Distance:', distance)
print('Number of cell visits:', cell_visits)

Shortest Path: [(2, 0), (1, 0), (0, 1), (1, 2)]
Cells on the Shortest Path: 4
Shortest Path Distance: 7
Number of cell visits: 6

116
‫وكم��ا ه��و ُمتو َّق��ع‪ ،‬اأخط �اأت اأداة احل��ل يف البح��ث باأولوي��ة االت�ص��اع (‪ )BFS solver‬يف عر���ص امل�ص��ار ال�ص��ابق نف�ص��ه‬
‫بال�صب��ط‪ ،‬عل��ى الرغ��م م��ن اأن التكلف��ة ت�ص��اوي ‪ ،7‬وم��ن الوا�صح اأنه لي���ص امل�ص��ار االأق�صر‪ .‬ويرجع ذل��ك اإىل الطبيعة غر‬
‫امل�ص��تنرة خلوارزمي��ة البح��ث باأولوي��ة االت�ص��اع (‪ ،)BFS‬حي��ث ال تاأخ��ذ اخلوارزمي��ة االأوزان بع��ن االعتب��ار عن��د حتدي��د‬
‫اخللية املُق َّرر تو�ص��يعها يف اخلطوة التالية؛ الأنها تُطبِّق بب�ص��اطة منهجية البحث بالعر�ص ِ‬
‫نف�ص��ها والتي توؤدي اإىل امل�ص��ار‬
‫نف�ص��ه ال��ذي وجدت��ه اخلوارزمي��ة يف االإ�ص��دار غ��ر امل��وزون (‪ )Unweighted Version‬م��ن املتاه��ة‪ .‬الق�ص��م الت��ايل‬
‫ي�ص��ف طريق��ة معاجل��ة نقط��ة ال�صع��ف ه��ذه با�ص��تخدام خوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل (‪ ،)A* search‬وه��ي‬
‫خوارزمي��ة ُم�ص��تنرة واأك��ر ذكا ًء ت�صب��ط �ص��لوكها وف ًق��ا ل �الأوزان املُح � َّددة‪ ،‬وبالت��ايل ُميكنه��ا ح��ل املتاه��ات با�ص��تخدام‬
‫االنتقاالت املوزونة (‪ )Weighted Transitions‬واالنتقاالت غر املوزونة (‪.)Unweighted Transitions‬‬
‫ا�صتخدام خوارزمية البحث باأولوية األأف�صل يف حل األغاز املتاهة‬
‫‪Using A* Search to Solve Maze Puzzles‬‬
‫كم�ا يف خوارزمي�ة البح�ث باأولوي�ة االت�ص�اع (‪ ،)BFS‬تَفحَ ��ص خوارزمية البح�ث باأولوية االأف�صل (‪ )A* search‬خلية‬
‫واح�دة يف كل م�رة بفح��ص كل خلي�ة جم�اورة ميك�ن الو�صول اإليها‪ .‬فبينما ت�ص�تخدم خوارزمية البحث باأولوية االت�ص�اع‬
‫(‪ )BFS‬منهجية بحث عمياء باأولوية العر�ص لتحديد اخللية التالية التي �صتَفحَ �صها‪ ،‬تَفحَ �ص خوارزمية البحث باأولوية‬
‫�تهدفة اأق�ص�ر م�ص�افة حم�ص�وبة بوا�ص�طة الدال�ة‬ ‫االأف�ص�ل (‪ )A* search‬اخللي�ة الت�ي يك�ون بينه�ا وب�ن اخللي�ة املُ�ص َ‬
‫اال�ص�تداللية (‪ .)Heuristic Function‬يعتم�د التعري�ف الدقي�ق للدال�ة اال�ص�تداللية عل�ى التطبي�ق‪ .‬يف حال�ة األغ�از‬
‫املتاه�ة‪ ،‬توفِّ�ر الدال�ة اال�ص�تداللية تقدي�رًا دقيقً�ا مل�دى قُ�رب اخللي�ة املُر�صَّ �حة اإىل اخللي�ة املُ�ص�تهدَ فة‪ .‬ي�صم�ن اال�ص�تدالل‬
‫املُطبَّق عدم املبالغة يف تقدير (‪ )Overestimate‬امل�ص�افة الفعلية اإىل اخللية املُ�ص�تهدَ فة مثل‪ :‬عر�ص م�ص�افة تقديرية‬
‫اأك�رب م�ن امل�ص�افة احلقيقي�ة اإىل اله�دف‪ ،‬وبالت�ايل �ص�وف ُحت�دِّ د اخلوارزمي�ة اأق�ص�ر م�ص�ار ُحمتم�ل ل�كلٍ م�ن املُخطَّ ط�ن‬
‫املوزون (‪ )Weighted‬وغر املوزون (‪ .)Unweighted‬اإذا كان اال�صتدالل ُيبالِغ يف بع�ص االأحيان يف تقدير امل�صافة‪،‬‬
‫حال‪ ،‬ولكن قد ال يكون االأف�صل‪ .‬اال�صتدالل املُحتمل االأب�صط‬ ‫�صتُقدِّ م خوارزمية البحث باأولوية االأف�صل (‪ً )A* search‬‬
‫الذي لن يوؤدي اإىل املُبالغة يف تقدير امل�صافة هو دالة ب�صيطة تعطي دومً ا م�صافة تقديرية قدرها وِحدَ ة واحدة‪.‬‬
‫‪def constant_heuristic(candidate_cell:tuple, target_cell:tuple):‬‬

‫‪return 1‬‬

‫‪1,0‬‬ ‫‪1‬‬ ‫‪0,0‬‬ ‫عل��ى الرغ��م م��ن اأن ه��ذا اال�ص��تدالل �ص��ديد التف��اوؤل‪ ،‬اإال اأن��ه ل��ن ُيق��دم أاب��دً ا تقدي�رًا اأعل��ى م��ن‬
‫‪1‬‬
‫امل�صافة احلقيقية‪ ،‬وبالتايل �صيوؤدي اإىل اأف�صل حل ممكن‪� .‬صيتم تقدمي ا�صتدالل متطور ُميكنه‬
‫العثور على اأف�صل حل ب�صكلٍ �صريع يف هذا الق�صم الحقًا‪.‬‬
‫‪0,1‬‬
‫َ�صتخدم الدالة التالية دالة ا�صتداللية معطاة للعثور على اخللية التي يجب تو�صيعها بعد ذلك‪� :‬صكل ‪ :2.22‬اال�صتدالل الثابت‬ ‫ت ِ‬

‫‪def get_best_candidate(expansion_candidates:set,‬‬
‫‪shortest_distance:dict,‬‬
‫‪heuristic:Callable):‬‬

‫‪winner = None‬‬
‫‪# best (lowest) distance estimate found so far. Initialized to a very large number‬‬
‫‪best_estimate= sys.maxsize‬‬

‫‪for candidate in expansion_candidates:‬‬

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

‫‪117‬‬
candidate_estimate=shortest_distance[candidate]+heuristic(candidate,target_cell)
if candidate_estimate < best_estimate:

winner = candidate
best_estimate=candidate_estimate

return winner

ِ �‫َي�ص‬
.‫ لفح���ص اخلالي��ا املُر�صَّ ��حة يف املجموع��ة وحتدي��د االأف�ص��ل‬For ‫�تخدم التطبي��ق املُ�ص��ار اإلي��ه باالأعل��ى حلق��ة التك��رار‬
‫) يف حتدي��د املُر�صَّ ��ح االأف�ص��ل دون احلاج��ة‬Priority Queue( ‫ ق��د ُي�ص��تخدم طاب��ور االأولوي��ة‬،‫و ِلتطبي��ق اأك��ر كف��اءة‬
‫ كدال� ٍة ُم�ص��اعدة بوا�ص��طة دال��ة‬get_best_candidate)( ‫�تخدم دال��ة‬ َ �‫ تُ�ص‬.‫اإىل فح���ص كل املُر�صَّ � ِ�حن ب�ص��ورة متك��ررة‬
‫�تخدم ه��ذا التطبي��ق كذل��ك‬ ِ �‫ يَ�ص‬،‫ وباالإ�صاف��ة اإىل الدال��ة اال�ص��تداللية‬.‫ُو�صح��ة فيم��ا يل��ي‬
َّ ‫ امل‬astar_maze_solver)(
‫ املُ�ص��ار‬reconstruct_shortest_path)( ‫ و‬get_accessible_neighbors_weighted)( ‫الدالتن املُ�ص��اعدتن‬
.‫اإليهما يف الق�صم ال�صابق‬
import sys

def astar_maze_solver(start_cell:tuple,
target_cell:tuple,
maze:np.ndarray,
get_neighbors: Callable,
heuristic:Callable,
verbose:bool=False):

cell_visits=0

shortest_distance = {}
shortest_distance[start_cell] = 0

parent = {}
parent[start_cell] = start_cell

expansion_candidates = set([start_cell])

fully_expanded = set()

# while there are still cells to be expanded


while len(expansion_candidates) > 0:

best_cell = get_best_candidate(expansion_candidates,shortest_distance,heuristic)

if best_cell == None: break

if verbose: print('\nExpanding cell', best_cell)

# if the target cell has been reached, reconstruct the shortest path and exit
if best_cell == target_cell:

118
shortest_path=reconstruct_shortest_path(parent,start_cell,target_cell)

return shortest_path, shortest_distance[target_cell],cell_visits

for neighbor,cost in get_neighbors(maze, best_cell):

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

cell_visits+=1

# first time this neighbor is reached


if neighbor not in expansion_candidates and neighbor not in fully_expanded:

expansion_candidates.add(neighbor)

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

# this neighbor has been visited before, but a better (shorter) path to it has just been found
elif shortest_distance[neighbor] > shortest_distance[best_cell] + cost:

shortest_distance[neighbor] = shortest_distance[best_cell] + cost

parent[neighbor] = best_cell

if neighbor in fully_expanded:

fully_expanded.remove(neighbor)

expansion_candidates.add(neighbor)

# all neighbors of best_cell have been inspected at this point


expansion_candidates.remove(best_cell)

fully_expanded.add(best_cell)

return None, None, None # no solution was found

shortest_distance ‫ُو�صحة باالأعلى كذلك القامو�صن‬ ِ ‫ ت‬،bfs_maze_solver)( ‫وكما احلال يف الدالة‬


َّ ‫َ�صتخدم الدالة امل‬
‫ وحفظ عُ قدة اأ�صل اخللية يف هذا امل�ص��ار‬،‫ حلف��ظ ط��ول امل�ص��ار االأق�ص��ر م��ن خلي��ة البداي��ة اإىل اأي خلي��ة اأخ��رى‬parent‫و‬
.‫االأق�صر‬
ِ �‫ فه��ي تَ�ص‬،‫ منهجي��ة خمتلف��ة لفح���ص اخلالي��ا وتو�ص��يعها‬astar_maze_solve)( ‫ تَتب��ع الدال��ة‬،‫ورغ��م ذل��ك‬
‫�تخدم‬
‫ تُ�ص��تخدَ م دال��ة‬،‫ يف كل تك��رار‬.‫ لتت ُّب��ع كل اخلالي��ا الت��ي ميك��ن تو�ص��يعها بع��د ذل��ك‬expansion_candidates
.‫و�ص ُعها بعد ذلك‬
ِّ ‫ لتحديد اأي من اخلاليا املُر�صَّ حة �ص ُت‬get_best_candidate)(
‫ اإذا كانت اخللية‬.‫ لفح�ص كل اخلاليا املجاورة لها‬For ‫ تُ�صتخدَ م حلقة التكرار‬،best_cell ‫بعد اختيار اخللي ِة املر�صح ِة‬
.‫ عُ قدة االأ�صل للخلية املجاورة يف امل�صار االأق�صر‬best_cell ‫ ف�صت�صبح‬،‫فح�ص للمرة االأوىل‬ َ ‫املجاورة ُت‬
119
‫ ولكن فقط اإذا كان امل�صار اإىل هذه اخللية املجاورة من خالل‬،‫يحدث االأمر نف�صه اإذا مت فح�ص الدالة املجاورة من قبل‬
‫ ف�صيتعن على اخللية املجاورة العودة‬،‫ اإذا عرت الدالة بالفعل على م�صار اأف�صل‬.‫ اأق�صر من امل�صار ال�صابق‬best_cell
‫ ُي�ص�تخدم املقط�ع‬.‫ الإع�ادة تقيي�م امل�ص�ار االأق�ص�ر اإىل اخلالي�ا املج�اورة له�ا‬expansion_candidates ‫اإىل جمموع�ة‬
:3x3 ‫) للُغز املتاهة‬Unweighted Case( ‫ حلل احلالة غر املوزونة‬astar_maze_solver)( ‫الربجمي التايل‬

start_cell=(2,0)
target_cell=(1,2)

solution, distance, cell_visits=astar_maze_solver(start_cell,


target_cell,
small_maze,
get_accessible_neighbors,
constant_heuristic,
verbose=False)

print('\nShortest Path:', solution)


print('Cells on the Shortest Path:', len(solution))
print('Shortest Path Distance:', distance)
print('Number of cell visits:', cell_visits)

Shortest Path: [(2, 0), (1, 0), (0, 1), (1, 2)]
Cells on the Shortest Path: 4
Shortest Path Distance: 3
Number of cell visits: 12

‫) ع�ن امل�ص�ار املُحتم�ل االأق�ص�ر واالأف�ص�ل بع�د‬A* search solver( ‫�ص�تبحث اأداة احل�ل يف البح�ث باأولوي�ة االأف�ص�ل‬
‫) الت�ي وج�دت احل�ل بع�د‬BFS solver( ‫ وه�ذا اأك�ر قلي ً�ال م�ن اأداة احل�ل يف البح�ث باأولوي�ة االت�ص�اع‬.‫ خلي�ة‬12 ‫فح��ص‬
‫ وكما‬.astar_maze_solver)( ‫�تخدم الإر�ص�اد‬ َ ‫ ه�ذا يع�ود اإىل ب�ص�اطة اال�ص�تدالل الثابت املُ�ص‬.‫ خالي�ا فق�ط‬10 ‫فح��ص‬
ٍ ‫ ُميكن ا�صتخدام دالة ا�صتدالل اأخرى لتمكن اخلوارزمية من اإيجاد احلل‬،‫�صيت�صح الحقًا يف هذا الق�صم‬
.‫ب�صكل اأ�صرع‬
‫) ق��ادرة عل��ى ح��ل املتاه��ة‬A* search( ‫اخلط��وة التالي��ة ه��ي تقيي��م م��ا اإذا كان��ت خوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل‬
:‫) يف العثور على اأق�صر م�صار لها اأم ال‬BFS( ‫املوزونة التي ف�صلت خوارزمية البحث باأولوية االت�صاع‬
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

solution, distance, cell_visits=astar_maze_solver(start_cell,


target_cell,
small_maze,
partial(get_accessible_neighbors_weighted,
horizontal_vertical_weight=horz_vert_w,
diagonal_weight=diag_w),
constant_heuristic,
verbose=False)

120
‫)‪print('\nShortest Path:', solution‬‬
‫))‪print('Cells on the Shortest Path:', len(solution‬‬
‫)‪print('Shortest Path Distance:', distance‬‬
‫)‪print('Number of cell visits:', cell_visits‬‬

‫])‪Shortest Path: [(2, 0), (1, 0), (0, 0), (0, 1), (0, 2), (1, 2‬‬
‫‪Cells on the Shortest Path: 6‬‬
‫‪Shortest Path Distance: 5‬‬
‫‪Number of cell visits: 12‬‬

‫ُو�صح النتائج قدرة ()‪ astar_maze_solver‬على حل احلالة املوزونة بالعثور على امل�صار االأق�صر املُحتمل‬ ‫ت ِّ‬
‫يو�ص��ح مزاي��ا ا�ص��تخدام‬
‫[(‪ ])2 ،1( ،)2 ،0( ،)1 ،0( ،)0 ،0( ،)0 ،1( ،)0 ،2‬بتكلف��ة اإجمالي��ة قدره��ا ‪ .5‬وه��ذا ِّ‬
‫خوارزمية بحث م�صتنرة‪ ،‬فهي ُمتكِّنك من اإيجاد احلل االأمثل با�صتخدام اأب�صط طريقة ممكنة‪.‬‬

‫‪( target_cell‬الخلية الم�صتهدَ فة)‬ ‫املقارنة بني اخلوارزميات ‪Algorithm Comparison‬‬


‫اخلطوة التالية هي املقارنة بن خوارزمية البحث باأولوية االت�صاع (‪ )BFS‬وخوارزمية‬
‫البح�ث باأولوي�ة االأف�ص�ل (‪ )A* search‬يف متاه�ة أاك�رب حجمً�ا واأك�ر تعقي�دً ا‪.‬‬
‫�صتخدم املقطع الربجمي التايل بلغة البايثون الإن�صاء متثيل رقمي لهذه املتاهة‪:‬‬
‫ُي َ‬
‫))‪big_maze=np.zeros((15,15‬‬

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


‫‪blocks=[(2,8), (2,9), (2,10), (2,11), (2,12),‬‬
‫‪(8,8), (8,9), (8,10), (8,11), (8,12),‬‬
‫‪(3,8), (4,8), (5,8), (6,8), (7,8),‬‬
‫])‪(3,12), (4,12), (6,12), (7,12‬‬

‫‪for block in blocks:‬‬


‫‪# set the value of block-occupied cells to be equal to 1‬‬
‫�صكل ‪:2.23‬خلية البداية واخللية امل�صتهدَ فة للمتاهة‬ ‫‪big_maze[block]=1‬‬

‫‪( start_cell‬خلية البداية)‬


‫الالع��ب جتاوزه��ا للو�ص��ول اإىل‬
‫ه��ذه املتاه��ة ‪ 15 15‬حتت��وي عل��ى ق�ص��م م��ن احلواج��ز عل��ى �ص��كل ح��رف ‪ C‬ينبغ��ي عل��ى ّ‬
‫اله��دف املُح� َّدد بالعالم��ة ‪ .X‬ث��م تُ�ص��تخدَ م اأداة احل��ل يف البح��ث باأولوي��ة االت�ص��اع (‪ )BFS solver‬واأداة احل��ل يف البحث‬
‫باأولوية االأف�صل (‪ )A* search solver‬حلل االإ�صدارات املوزونة وغر املوزونة من هذه املتاهة كبرة احلجم‪:‬‬
‫)‪start_cell=(14,0‬‬
‫)‪target_cell=(5,10‬‬
‫االإ�صدار غر املوزون‬
‫‪solution_bfs_unw, distance_bfs_unw, cell_visits_bfs_unw=bfs_maze_solver(start_cell,‬‬
‫‪target_cell,‬‬
‫‪big_maze,‬‬
‫‪get_accessible_neighbors,‬‬

‫‪121‬‬
verbose=False)

print('\nBFS unweighted.')
print('\nShortest Path:', solution_bfs_unw)
print('Cells on the Shortest Path:', len(solution_bfs_unw))
print('Shortest Path Distance:', distance_bfs_unw)
print('Number of cell visits:', cell_visits_bfs_unw)

solution_astar_unw, distance_astar_unw, cell_visits_astar_unw=astar_maze_solver(


start_cell,
target_cell,
big_maze,
get_accessible_neighbors,
constant_heuristic,
verbose=False)

print('\nA* Search unweighted with a constant heuristic.')


print('\nShortest Path:', solution_astar_unw)
print('Cells on the Shortest Path:', len(solution_astar_unw))
print('Shortest Path Distance:', distance_astar_unw)
print('Number of cell visits:', cell_visits_astar_unw)

BFS unweighted.

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)]
Cells on the Shortest Path: 19
Shortest Path Distance: 18
Number of cell visits: 1237

A* Search unweighted with a constant heuristic.

Shortest Path: [(14, 0), (13, 1), (12, 2), (11, 3), (10, 4), (10, 5), (10,
6), (9, 7), (9, 8), (10, 9), (9, 10), (9, 11), (9, 12), (8, 13), (7, 13),
(6, 13), (5, 12), (6, 11), (5, 10)]
Cells on the Shortest Path: 19
Shortest Path Distance: 18
Number of cell visits: 1272

start_cell=(14,0) ‫االإ�صدار املوزون‬


target_cell=(5,10)

horz_vert_w=1
diag_w=3

solution_bfs_w, distance_bfs_w, cell_visits_bfs_w=bfs_maze_solver(start_cell,


target_cell,

122
big_maze,
partial(get_accessible_neighbors_weighted,
horizontal_vertical_weight=horz_vert_w,
diagonal_weight=diag_w),
verbose=False)

print('\nBFS weighted.')
print('\nShortest Path:', solution_bfs_w)
print('Cells on the Shortest Path:', len(solution_bfs_w))
print('Shortest Path Distance:', distance_bfs_w)
print('Number of cell visits:', cell_visits_bfs_w)

solution_astar_w, distance_astar_w, cell_visits_astar_w=astar_maze_solver(start_cell,


target_cell,
big_maze,
partial(get_accessible_neighbors_weighted,
horizontal_vertical_weight=horz_vert_w,
diagonal_weight=diag_w),
constant_heuristic,
verbose=False)

print('\nA* Search weighted with constant heuristic.')


print('\nShortest Path:', solution_astar_w)
print('Cells on the Shortest Path:', len(solution_astar_w))
print('Shortest Path Distance:', distance_astar_w)
print('Number of cell visits:', cell_visits_astar_w)

BFS weighted.

Shortest Path: [(14, 0), (14, 1), (14, 2), (13, 2), (13, 3), (12, 3), (12,
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,
12), (4, 11), (5, 10)]
Cells on the Shortest Path: 26
Shortest Path Distance: 30
Number of cell visits: 1235

A* Search weighted with constant heuristic.

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)]
Cells on the Shortest Path: 26
Shortest Path Distance: 25
Number of cell visits: 1245

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

‫)(‪maze_bfs_w=big_maze.copy‬‬ ‫)(‪maze_astar_w=big_maze.copy‬‬

‫‪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‬‬

‫خوارزمية البحث باأولوية االأف�صل (‪.)A* search‬‬ ‫خوارزمية البحث باأولوية االت�صاع (‪.)BFS‬‬

‫�صكل ‪ :2.24‬مقارنة بن حلَّي خوارزميتي البحث باأولوية االت�صاع والبحث باأولوية االأف�صل‬
‫يوؤك��د التّمثي��الن اأن الطبيع��ة املُ�ص��تنرة خلوارزمي��ة البح��ث باأولوي��ة االأف�ص��ل (‪ )A* search‬ت�ص��مح لها بتجنب احلركة‬
‫ال ُقطري��ة‪ ،‬الأن تكلفته��ا اأعل��ى م��ن احلركت��ن االأفقي��ة والراأ�ص��ية‪ .‬وم��ن ناحي��ة اأخ��رى‪ ،‬تتجاه��ل خوارزمي��ة البح��ث باأولوية‬
‫االأف�ص��ل (‪ )BFS‬غ��ر امل�ص��تنرة تكلف��ة كل حرك��ة وتُعط��ي ح� ً�ال اأعل��ى تكلف��ة‪ .‬وفيم��ا يل��ي مقارن��ة عام��ة ب��ن اخلوارزميات‬
‫املُ�صتنرة وغر املُ�صتنرة كما هو مو�صح يف جدول ‪:2.6‬‬
‫‪124‬‬
‫جدول  ‪ :2.6‬مقارنة بني اخلوارزميات املُ�صتنرة وغر املُ�صتنرة‬
‫غر امل ُ�صتنرة‬ ‫امل ُ�صتنرة‬ ‫معاير املقارنة‬
‫التعقيد احل�صابي‬
‫اأكر تعقيدً ا ح�صابيًا‪.‬‬ ‫اأقل تعقيدً ا‪.‬‬
‫(‪)Computational Complexity‬‬

‫اأبطاأ من اخلوارزميات املُ�صتنرة‪.‬‬ ‫اأ�صرع يف عمليات البحث‪.‬‬ ‫الكفاءة (‪)Efficiency‬‬

‫غ��ر عملي��ة حل��ل م�ص��كالت البح��ث‬ ‫اأف�صل يف حل م�ص��كالت البحث وا�ص��ع‬


‫االأداء (‪)Performance‬‬
‫وا�صع النطاق‪.‬‬ ‫النطاق‪.‬‬

‫ُحتقِق احلل االأمثل‪.‬‬ ‫حتقّقُ حلوال مُنا�صب ًة ب�صكلٍ عام‪.‬‬ ‫الفعالية (‪)Effectiveness‬‬

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

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

‫)‪B (x2, y2‬‬

‫)‪A (x1, y1‬‬

‫�صكل ‪ :2.25‬م�صافة مانهاتن‬


‫‪125‬‬
:‫ميكن تطبيق هذا ب�صهولة يف �صورة دالة البايثون كما يلي‬
def manhattan_heuristic(candidate_cell:tuple,target_cell:tuple):

x1,y1=candidate_cell
x2,y2=target_cell
return abs(x1 - x2) + abs(y1 - y2)

astar_maze_solver)( ‫�تخدم املقط��ع الربجم��ي الت��ايل الختب��ار اإمكاني��ة ا�ص��تخدام هذا اال�ص��تدالل الذكي لدع��م‬
َ �‫يُ�ص‬
ٍ ‫يف البحث ب�صكل اأ�صرع يف‬
:‫كل من احلاالت املوزونة وغر املوزونة‬

start_cell=(14,0)
target_cell=(5,10)

solution_astar_unw_mn, distance_astar_unw_mn, cell_visits_astar_unw_mn=astar_


maze_solver(start_cell,
target_cell,
big_maze,
get_accessible_neighbors,
manhattan_heuristic,
verbose=False)

print('\nA* Search unweighted with the Manhattan heuristic.')


print('\nShortest Path:', solution_astar_unw_mn)
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)

horz_vert_w=1 # weight for horizontal and vertical moves


diag_w=3 # weight for diagonal moves

solution_astar_w_mn, distance_astar_w_mn, cell_visits_astar_w_mn=astar_maze_


solver(start_cell,
target_cell,
big_maze,
partial(get_accessible_neighbors_weighted,
horizontal_vertical_weight=horz_vert_w,
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))
print('Shortest Path Distance:', distance_astar_w_mn)
print('Number of cell visits:', cell_visits_astar_w_mn)

126
‫‪A* Search unweighted with the Manhattan heuristic.‬‬

‫‪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), (5, 11), (5, 10‬‬
‫‪Cells on the Shortest Path: 19‬‬
‫‪Shortest Path Distance: 18‬‬
‫‪Number of cell visits: 865‬‬

‫‪A* Search weighted with the Manhattan heuristic.‬‬

‫‪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,‬‬
‫])‪12), (5, 11), (5, 10‬‬
‫‪Cells on the Shortest Path: 26‬‬
‫‪Shortest Path Distance: 25‬‬
‫‪Number of cell visits: 1033‬‬

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

‫جدول  ‪ :2.7‬مقارنة بني اأداء اخلوارزميات‬


‫خوارزمية البحث باأولوية‬ ‫خوارزمية البحث باأولوية‬ ‫خوارزمية البحث باأولوية‬
‫االأف�صل (‪)A* search‬‬ ‫االأف�صل (‪)A* search‬‬ ‫االت�صاع (‪)BFS‬‬
‫با�صتدالل مانهاتن‬ ‫باال�صتدالل الثابت‬

‫َح�صت ‪1033‬‬
‫امل�صافة=‪ ،25‬وف َ‬ ‫َح�صت ‪1245‬‬
‫امل�صافة=‪ ،25‬وف َ‬ ‫َح�صت ‪1235‬‬
‫امل�صافة=‪ ،30‬وف َ‬ ‫املوزونة‬

‫َح�صت‪865‬‬
‫امل�صافة=‪ ،18‬وف َ‬ ‫َح�صت ‪1272‬‬
‫امل�صافة=‪ ،18‬وف َ‬ ‫َح�صت‪1237‬‬
‫امل�صافة=‪ ،18‬وف َ‬ ‫غر املوزونة‬

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

‫‪127‬‬
‫مترينات‬
‫‪ 1‬اذكر تطبيقني خلوارزميات البحث‪.‬‬

‫مثاال على كل خوارزمية‪.‬‬


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

‫‪128‬‬
‫‪ 3‬ا�سرح باإيجاز كيف تعمل خوارزمية البحث باأولوية االأف�سل (‪.)A* search‬‬

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

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

‫‪129‬‬
‫الم�سروع‬

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

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

‫‪3‬‬
‫اتب��ع اخلط��وات نف�س��ها لالإ�س��دارات املوزون��ة م��ن خوارزميت��ي البح��ث باأولوية االت�س��اع‬
‫(‪ )BFS‬والبح��ث باأولوي��ة االأف�س��ل (‪ )A* search‬با�س��تخدام دال��ة اال�س��تدالل‬
‫الثابت‪.‬‬

‫‪4‬‬
‫كرِّر العملية لالإ�سدارات غر املوزونة واملوزونة من خوارزميتي البحث باأولوية االت�ساع‬
‫(‪ )BFS‬والبح��ث باأولوي��ة االأف�س��ل (‪ )A* search‬با�س��تخدام دال��ة ا�س��تدالل مانهات��ن‬
‫(‪.)Manhattan Heuristic‬‬

‫‪130‬‬
‫ماذا تع ّلمت‬

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


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

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

‫‪A* Search‬‬ ‫البحث باأولوية االأف�سل‬ ‫‪Model Training‬‬ ‫تدريب النموذج‬


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

‫‪131‬‬
‫‪ .3‬معا ة اللغ��ات الطبيعية‬
‫�س ��يتعلّم الطال ��ب يف ه ��ذه الوح ��دة عملي ��ة تدري ��ب �س ��املة لنم ��وذج التع ُّل ��م املوجَّ ��ه‬
‫والتع ُّل ��م غ ��ري املوجَّ ��ه لفه ��م املعن ��ى الكام ��ن يف اأج ��زاء الن�سو� ��ض‪ .‬وكذل � �س ��يتعلّم‬
‫كيفي ��ة ا�س ��تخدام تع ُّل ��م األل ��ة (‪ )Machine Learning - ML‬يف دع ��م التطبيق ��ات‬
‫ذات ال�سلة عا ة اللغات الطبيعية (‪.)Natural Language Processing -NLP‬‬

‫اأهداف التعلُّم‬
‫بنهاية هذه الوحدة �سيكون الطالب قادرًا على اأن‪:‬‬
‫ يُعرِّ ف التعلُّم املوجَّ ه‪.‬‬
‫ يُدرِّب منوذج التعلُّم املوجَّ ه على فهم الن�ض‪.‬‬
‫ يُعرِّ ف التعلُّم غري املوجَّ ه‪.‬‬
‫ يُدرِّب منوذج التعلُّم غري املوجَّ ه على فهم الن�ض‪.‬‬
‫ يُن�سئ روبوت درد�سة ب�سيط‪.‬‬
‫ يُنت� ��ج الن�سو�� ��ض با�س� ��تخدام تقني� ��ات تولي� ��د اللغ� ��ات الطبيعي� ��ة‬
‫(‪.)Natural Language ener tion -NLG‬‬

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

‫‪132‬‬
‫الدر�ض األأول‬
‫املوجه‬
‫التع ُّلم َّ‬
‫ا�ستخدام التع ُلّم املوجَّ ه لفهم الن�سو�ض‬
‫‪Using Supervised Learning to Understand Text‬‬
‫معا جل��ة اللغ��ات الطبيعي��ة ( ‪ )Natural Language Processing - NLP‬ه��ي اإ ح��دى جم��االت ا ل��ذكاء اال�سطنا ع��ي‬
‫(‪ )Artificial Intelligence - AI‬الت��ي تر ّك��ز عل��ى متك��ني اأجه��زة احلا�س��ب لت�سب��ح ق��ادرة عل��ى فه��م اللغ��ات الب�س��ريّة‪ ،‬وتف�س��رها‪،‬‬
‫واإنتاجها‪ .‬حيث تُعنى معاجلة اللغات الطبيعية بعدد من املهام‪ ،‬مثل‪ :‬ت�سنيف الن�سو�س‪ ،‬وحُتليل امل�س��اعر‪ ،‬والرتجمة االآلية‪ ،‬واالإجابة‬
‫عل��ى االأ�س��ئلة‪� .‬س��ركز ه��ذا الدر���س ب�س��كل خا���س عل��ى كيفي��ة ا�س��تخدام التع ُّل��م َّ‬
‫املوج��ه ال��ذي ُيع� ُّد اأح��د االأن��واع الرئي�س��ة لتع ُّل��م االآل��ة‬
‫(‪ )Machine Learning - ML‬يف حُتقيق الفهم والتنبوؤ التلقائي خل�سائ�س الن�سو�س‪.‬‬
‫كال من تعلُّم االآلة والتعلُّم العميق‪ ،‬كما يت�سح يف ال�سكل ‪،3.1‬‬ ‫لقد تعلّمت يف الوحدة االأوىل اأن الذكاء اال�سطناعي هو م�سطلح ي�سم ُل ًّ‬
‫فال��ذكاء اال�سطناع��ي ه��و ذل��ك املج��ال الوا�س��ع م��ن علوم احلا�س��ب الذي ُيعنى بابت��كار اآالت ذكية‪ ،‬بينما تعلُّم االآلة ه��و اأحد فروع الذكاء‬
‫اال�سطناع��ي ال��ذي ير ّك��ز عل��ى ت�سمي��م اخلوارزميات وبِناء النم��اذج التي ُمتكِّن االآلة من التعلُّم من البيانات دون احلاجة اإىل برجمتها‬
‫ب�سكل �سريح‪.‬‬

‫التعلُّم العميق (‪:)Deep learning‬‬ ‫الذكاء األ�سطناعي‬


‫التعلُّ��م العمي��ق ه��و اأح��د اأن��واع تعلُّ��م االآل��ة ال��ذي ي�س� ِ‬
‫�تخدم‬ ‫تعلُّم األلة‬
‫ال�سبكات الع�سبية العميقة للتعلُّم تلقائيًا من جمموعات‬
‫كب��رة م��ن البيان��ات‪ ،‬فه��و ي�س��مح الأجه��زة احلا�س��ب‬
‫بالتع ّرف على االأمناط واتخاذ القرارات بطريقة حُتاكي‬ ‫التعلُّم العميق‬
‫االإن�سان‪ ،‬عرب ت�سميم مناذج ُمعقدة من البيانات‪.‬‬
‫�سكل ‪ :3.1‬فروع الذكاء اال�سطناعي‬
‫تعلُّم األلة ‪Machine Learning‬‬
‫تعلُّم االآلة هو اأحد فروع الذكاء اال�سطناعي املعني بتطوير اخلوارزميات التي ُمتكِّن اأجهزة احلا�سب من التعلُّم من البيانات‬
‫بدال من اتباع التعليمات الربجمية ال�سريحة‪ ،‬فهو يعمل على تدريب مناذج احلا�سب للتعرُّف على االأمناط والقيام‬ ‫املُدخَ لة‪ً ،‬‬
‫بالتنبوؤات وفقًا للبيانات املُدخَ لة مما ي�سمح للنموذج بتح�سني الدقة مع مرور الوقت‪ ،‬وكذلك يتيح لالآلة اأداء مهام متعددة‪ ،‬مثل‪:‬‬
‫الت�سنيف‪ ،‬واالنحدار‪ ،‬والتجميع‪ ،‬وتقدمي التو�سيات دون احلاجة اإىل برجمة االآلة ب�سكل �سريح للقيام بكل مُهِ مَّة على حدة‪.‬‬
‫مُيكن ت�سنيف تعلُّم االآلة اإىل ثالثة اأنواع رئي�سة‪:‬‬
‫التع ُّل��م املوجَّ ��ه (‪ )Supervised learning‬ه��و ن��وع م��ن تعلُّ��م االآل��ة تتع ّل��م فيه اخلوارزمية م��ن بيانات تدريب مُعن َون��ة (‪)Labelled‬‬
‫به��دف القي��ام بالتنب�وؤات ح��ول بيان��ات جدي��دة غ��ر موج��ودة يف جمموعة التدري��ب اأو االختبار كما هو مو�سح يف �س��كل ‪ ،3.2‬ومن‬
‫االأمثلة عليه‪:‬‬
‫• ت�سنيف ال�سور (‪ ،)Image Classification‬مثل‪ :‬التعرف على الكائنات يف ال�سور‪.‬‬
‫• ك�سف االحتيال (‪ ،)Fraud Detection‬مثل‪ :‬حُتديد املُعامَ الت املالية امل�سبوهة‪.‬‬
‫• ت�سفية الربيد االإلكرتوين الع�سوائي (‪ ،)Spam Filtering‬مثل‪ :‬حُتديد ر�سائل الربيد االإلكرتوين غر املرغوب فيها‪.‬‬
‫‪133‬‬
‫املوج��ه (‪ )Unsupervised learning‬ه��و ن��وع م��ن تعلُّ��م االآل��ة تعم��ل‬ ‫التع ُّل��م غ��ر َّ‬
‫في��ه اخلوارزمي��ة مبوج��ب بيان��ات غ��ر مُعن َون��ة (‪ )Unlabeled‬يف حُماول��ة‬
‫الإيجاد االأمناط والعالقات بني البيانات‪ ،‬ومن االأمثلة عليه‪:‬‬
‫امل ُخرَج املتوقّع‬ ‫• الك�س��ف ع��ن االخت��الف (‪ ،)Anomaly Detection‬مث��ل‪ :‬حُتدي��د االأمن��اط‬
‫غر العادية يف البيانات‪.‬‬
‫النموذج‬ ‫• التجميع (‪ ،)Clustering‬مثل‪ :‬جتميع البيانات ذات اخل�سائ�س املت�سابهة‪.‬‬
‫• تقلي���س االأبع��اد (‪ ،)Dimensionality Reduction‬مث��ل‪ :‬اختي��ار االأبع��اد‬
‫جمموعة بيانات‬
‫املُ�ستخدَ مة للحدِّ من تعقيد البيانات‪.‬‬
‫االختبار‬ ‫التع ُّل��م املع �زَّز (‪ )Reinforcement learning‬ه��و ن��وع م��ن تعلُّ��م االآل��ة تتفاع��ل‬
‫اخلوارزمية‬ ‫في��ه االآل��ة م��ع البيئ��ة املحيط��ة وتتع ّل��م ع��رب املحاول��ة واخلط �اأ اأو تل ّق��ي املكاف �اأة‬
‫والعقاب‪ ،‬ومن االأمثلة عليه‪:‬‬
‫جمموعة بيانات‬ ‫• لعب االألعاب‪ ،‬مثل‪ :‬لعبة ال�سطرجن اأو لعبة قو (‪. )GO‬‬
‫التدريب‬
‫• الروبوتية‪ ،‬مثل‪ :‬تعليم الروبوت كيف يتنقل يف البيئة املحيطة به‪.‬‬
‫امل ُخرَج املطلوب‬
‫• تخ�سي�س املوارد‪ ،‬مثل‪ :‬حُت�سني ا�ستخدام املوارد يف �سبكة ما‪.‬‬
‫جدول ‪ 3.1‬يلخ�س مزايا وعيوب اأنواع تعلُّم االآلة‪.‬‬
‫�سكل ‪ :3.2‬متثيل التعلُّم املوجَّ ه‬
‫جدول  ‪ :3.1‬مزايا اأنواع تع ّلم األلة‪ ،‬وعيوبها‬
‫العيوب‬ ‫املزايا‬
‫التعلُّم املوجَّ ه‬
‫• يتطلب بيانات مُعنوَنة‪ ،‬والتي قد تكون مرتفعة التكلفة‪.‬‬ ‫• اأثبت كفاءة وفعالية كبرة ويُ�ستخدم على نطاق وا�سع‪.‬‬
‫• يقت�سر ا�س��تخدامه على املُهِ َّمة التي مت تدريبه عليها‪ ،‬وقد‬ ‫• �سهل الفهم والتطبيق‪.‬‬
‫ال مُيكنه اإعطاء التنبوؤ ال�سحيح للبيانات اجلديدة‪.‬‬ ‫• ُمُيكن��ه التعام��ل م��ع البيان��ات اخلطي��ة وغ��ر اخلطي��ة عل��ى‬
‫• ي�سع��ب تكيف��ه م��ع امل�س��كالت االأخ��رى يف ح��االت النم��اذج‬ ‫حد �سواء‪.‬‬
‫املُعقدة جدً ا‪.‬‬
‫التعلُّم غر املوجَّ ه‬
‫• اأ�سعب من التعلُّم املوجَّ ه من حيث الفهم والتف�سر‪.‬‬ ‫• ال يتطلب بيانات مُعنوَنة‪ ،‬مما يجعله اأكر مرونة‪.‬‬
‫• يقت�سر على التحليل اال�ستك�س��ايف‪ ،‬وقد ال ينا�س��ب عمليات‬ ‫• ُمُيكنه اكت�ساف االأمناط اخلفية يف البيانات‪.‬‬
‫�سنع القرار‪.‬‬ ‫• ُمُيكنه التعامل مع البيانات ال�سخمة واملُعقدة‪.‬‬
‫• ي�سع��ب تكيف��ه م��ع امل�س��كالت االأخ��رى يف ح��االت النم��اذج‬
‫املُعقدة جدً ا‪.‬‬
‫التعلُّم املعزَّز‬
‫• اأكر تعقيدً ا من التعلّم املوجَّ ه وغر املوجَّ ه‪.‬‬ ‫• يتّ�س��م باملرون��ة‪ُ ،‬ومُيكن��ه التعام��ل م��ع البيئ��ات املُعق��دة‬
‫• �سعوب��ة ت�سمي��م نظ��م مكاف �اآت ُحُت��دد ال�س��لوك املطل��وب‬ ‫واملتغرة با�ستمرار‪.‬‬
‫ب�سكل دقيق‪.‬‬ ‫• مُيكن��ه التعلُّ��م م��ن التج��ارب ال�س��ابقة وحُت�س��ني الكف��اءة مع‬
‫• ق��د يتطل��ب جمموع��ات كبرة م��ن بيانات التدري��ب واملوارد‬ ‫مرور الوقت‪.‬‬
‫احل�سابية‪.‬‬ ‫• يتنا�س��ب م��ع عملي��ات �سن��ع الق��رار مث��ل لع��ب االألع��اب‬
‫والروبوتية‪.‬‬
‫‪134‬‬
‫التعلُّم املوجَّ ه ‪Supervised Learning‬‬
‫التعلُّ��م املوجَّ ��ه ه��و اأح��د اأن��واع تعلُّ��م االآل��ة ال��ذي يعتمد عل��ى ا�س��تخدام البيانات‬
‫التعلُّم املوجَّ ه‬ ‫املُعنوَنة لتدريب اخلوارزميات للقيام بالتنبوؤات‪ .‬يتم تدريب اخلوارزمية على‬
‫(‪:)Supervised Learning‬‬ ‫جمموع��ة م��ن البيان��ات املُعن َون��ة ث��م اختبارها على جمموع��ة بيانات جديدة مل‬
‫�ست�س��تخدم يف التعلُّ��م املوجَّ ��ه جمموع��ات‬ ‫املوج��ه ع��اد ًة يف معاجل��ة‬
‫�تخدم التعلُّ��م َّ‬
‫تك��ن ج��زءًا م��ن بيان��ات التدري��ب‪ُ .‬ي�س� َ‬
‫البيان��ات املُعن َون��ة واملُنظم��ة ب�س��كل ي��دوي‬ ‫اللغ��ات الطبيعي��ة للقي��ام مبه��ام مث��ل‪ :‬ت�سني��ف الن�سو���س‪ ،‬وحُتلي��ل امل�س��اعر‪،‬‬
‫لتدري��ب خوارزميات احلا�س��ب على التنبوؤ‬ ‫والتعرّف على الكيانات امل�سماة (‪.)Named Entity Recognition - NER‬‬
‫بالقيم اجلديدة‪.‬‬ ‫يف ه��ذه امله��ام يت��م تدري��ب اخلوارزمي��ة عل��ى جمموع��ة م��ن البيان��ات املُعن َون��ة‪،‬‬
‫حيث يتم اإدراج كل مثال حُتت عنوان الت�سنيف املنا�سب اأو امل�ساعر املنا�سبة‪.‬‬
‫املوج��ه ا�س��م االنح��دار (‪ )Regression‬عندم��ا‬ ‫يُط َل��ق عل��ى عملي��ة التعلُّ��م َّ‬
‫تك��ون القي��م الت��ي تتنب�اأ به��ا االآل��ة رقم ّي��ة‪ ،‬بينم��ا يطل��ق عليه��ا ا�س��م الت�سني��ف‬
‫(‪ )Classification‬عندما تكون القيم متقطّ عه‪.‬‬
‫األنحدار‬
‫على �س��بيل املثال‪ ،‬قد ُي�س��تخدم االنحدار يف التنبوؤ ب�س��عر بيع املنزل وفقًا مل�س��احته‪ ،‬وموقعه‪ ،‬وعدد غرف النوم فيه‪ .‬كما‬
‫مُيك��ن ا�س��تخدامه يف التنب� ؤو بحج��م الطل��ب عل��ى اأح��د املنتج��ات ا�س��تنادًا اإىل بيان��ات املبيع��ات التاريخي��ة وحج��م االإنف��اق‬
‫�تخدم االنح��دار الن�سو���س املُدخَ ل��ة املتوفرة للتنب�وؤ بتقييم اجلمهور‬‫االإع��الين‪ .‬ويف جم��ال معاجل��ة اللغ��ات الطبيعي��ة‪َ ،‬ي�س� ِ‬
‫للفيلم اأو مدى التفاعل مع املن�سورات اخلا�سة به على و�سائل التوا�سل االجتماعي‪.‬‬
‫الت�سنيف‬
‫من ناحية اأخرى‪ُ ،‬ي�ستخدم الت�سنيف يف التطبيقات مثل‪ :‬ت�سخي�س احلاالت الطبية وفقًا لالأعرا�س ونتائج الفحو�سات‪.‬‬
‫املوجه يف ت�سنيف الن�سو�س املُدخَ لة اإىل فئات اأو عناوين‬ ‫وعندما يتعلق االأمر بفهم الن�سو�س‪ ،‬مُيكن ا�ستخدام التعلُّم َّ‬
‫املوجه‬
‫اأو التنب�وؤ به��ا بن��ا ًء عل��ى الكلم��ات اأو العب��ارات املوج��ودة يف املُ�س��تنَد‪ .‬على �س��بيل املثال‪ ،‬مُيكن تدريب من��وذج التعلُّم َّ‬
‫�تخدمة يف ر�س��الة‬
‫لت�سنيف ر�س��ائل الربيد االإلكرتوين اإىل ر�س��ائل مزعجة اأو غر مزعجة وفقًا للكلمات اأو العبارات املُ�س� َ‬
‫الربي��د االإلك��رتوين‪ .‬و ُيع� ّد ت�سني��ف امل�س��اعر اأح��د التطبيق��ات ال�س��هرة كذل��ك‪ ،‬حي��ث مُيك��ن التنب�وؤ باالنطب��اع العام حول‬
‫و�س ُي�س��تخدم ه��ذا التطبي��ق كمث��ال عمل��ي يف ه��ذه الوح��دة‪ ،‬ل�س��رح كل خط��وات‬ ‫م�س��تند م��ا �س��واء كان �س��لب ًّيا اأم اإيجاب ًّي��ا‪َ .‬‬
‫املوجه ب�سكل �سامل من بداية رحلة التعلم حتى نهايتها‪.‬‬ ‫عملية بِناء وا�ستخدام منوذج التعلُّم َّ‬
‫يف ه��ذه الوح��دة �ستَ�س��تخدم جمموع��ة بيان��ات م��ن مراجع��ات االأف��الم على موقع ‪ 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‬‬
# load the train and testing data.
imdb_train_reviews=pd.read_csv('imdb_data/imdb_train.csv')
imdb_test_reviews=pd.read_csv('imdb_data/imdb_test.csv')

imdb_train_reviews

‫ف �اإن‬،3.3 ‫وكم��ا يت�س��ح يف ال�س��كل‬


DataFrame ‫جمموع��ة بيان��ات‬
:‫حُتتوي على عمودين‬
.‫ن�س التقييم‬
ّ •
.)‫(ال�سنف‬
َّ ‫• القيم‬

‫تقييم اإيجابي‬

‫تقييم �سلبي‬

‫ متثل تقييمًا �سلبيًّا‬0 ‫القيمة‬


.‫ متثل تقييمًا اإيجابيًّا‬1 ‫بينما القيمة‬
‫ جمموعة بيانات التدريب املُعنوَنة‬:3.3 ‫�سكل‬
‫اخلطوة التالية هي اإ�سناد اأعمدة الن�س والقيم اإىل متغرات م�ستقلة يف اأمثلة التدريب واالختبار املُمثّلة كمجموعة‬
:‫ كما يلي‬DataFrame ‫بيانات‬

# extract the text from the 'text' column for both training and testing.
X_train_text=imdb_train_reviews['text']
X_test_text=imdb_test_reviews['text']
‫ عاد ًة يف‬Y‫ و‬X ‫ت�ستخدم الرموز‬
‫ عن البيانات‬X ‫فيعرب‬
ّ ‫التعلُّم املوجَّ ه‬
# extract the labels from the 'label' column for both training and testing. ‫ عن القيم‬Y‫ و‬،‫املدخلة للتنبوؤ‬
Y_train=imdb_train_reviews['label'] .‫امل�ستهدفة‬
Y_test=imdb_test_reviews['label']
X_train_text # training data in text format

DataFrame ‫) من جمموعة بيانات‬X train text( ‫ �سورة من اأمثلة التدريب‬:3.4 ‫�سكل‬


136
‫هيز البيانات واملعا ة املُ�سبقة ‪Data re r tion and Pre-Processing‬‬
‫على الرغم من اأن تن�س��يق الن�س االأويل كما يف �س��كل ‪ 3.4‬بديهي للقار الب�س��ري‪ ،‬اإال اأنَّ خوارزميات التعلُّم املوجَّ ه ال ت�س��تطيع التعامل‬
‫فبدال من ذلك‪ ،‬حُتتاج اخلوارزميات اإىل حُتويل هذه املُ�ست َندات اإىل تن�سيق متَّجَ ه رقمي (‪.)Numeric Vector‬‬ ‫معه ب�سورته احلالية‪ً .‬‬
‫فيم��ا ُيع��رف بعملي��ة الربجم��ة اال اهي��ة (‪ .)Vectorization‬ومُيك��ن تطبيق عملية الربجمة االجتاهي��ة بعدة طرائق خمتلفة‪ ،‬وتتميز‬
‫باأن لها تاأثرًا اإيجابيًّا كبرًا على اأداء النموذج املُد ّرب‪.‬‬
‫مكتبة �سكلرين ‪Sklearn Library‬‬
‫املوجه با�ستخدام مكتبة �سكلرن وتُعرف كذلك با�سم مكتبة �سايكيت لرن (‪ ،)Scikit-Learn‬وهي‬ ‫�سيتم بناء النموذج َّ‬
‫مكتبة �س�هرة يف بايثون تخت�س بتعلُّم االآلة‪ .‬توفر املكتبة جمموعة من االأدوات واخلوارزميات الأداء مهام متعددة‪ ،‬مثل‪:‬‬
‫الت�سني�ف‪ ،‬واالنح�دار‪ ،‬والتجمي�ع‪ ،‬وتقلي��س االأبع�اد‪ .‬اإح�دى االأدوات املفي�دة يف مكتب�ة �س�كلرن ه�ي اأداة تُ�س�مى‬
‫‪ ،CountVectorizer‬ومُيكن ا�ستخدامها يف تهيئة عملية املعاجلة ومتثيل البيانات الن�سية باملتَّجَ هات‪.‬‬
‫اأداة ‪CountVectorizer‬‬
‫الربجمة األ اهية‬
‫(‪:) ec ori tion‬‬ ‫تُ�س��تخدم اأداة ‪ CountVectorizer‬يف حُتويل جمموعة من املُ�س��تنَدات الن�سية‬
‫اإىل م�سفوف��ة م��ن رم��وز متع��ددة‪ ،‬حي��ث مُي ّث��ل ك ّل �س� ّ�ف م�س��تندً ا وكل عم��ود مُيثل‬
‫الربجم��ة االجتاهي��ة ه��ي عملي��ة حُتوي��ل‬ ‫خا�س��ا‪ .‬ق��د تك��ون الرم��وز كلم��ات فردي��ة اأو عب��ارات اأو ُبني��ات اأك��ر تعقي��دً ا‬
‫رم��زً ا ً‬
‫ال�سال�س��ل الن�سية املك َون��ة من الكلمات‬ ‫تقوم بالتقاط االأمناط املتعددة من البيانات الن�سية االأ�سا�سية‪ .‬تُ�سر املُدخَ الت‬
‫اأو العب��ارات (الن���س) اإىل متَّجَ ��ه‬ ‫أي�س��ا‬
‫يف امل�سفوف��ة اإىل ع��دد م��رات ظه��ور الرم��ز يف كل م�س��تند‪ .‬و ُيع��رف ذل��ك ا ً‬
‫متجان���س م��ن ا الأر ق��ام احلقيقي��ة‬ ‫با�س��م متثي��ل حقيب��ة الكلم��ات (‪ ،"bag-of-words" )BoW‬حي��ث يتجاه��ل‬
‫ي�س��تخدم لرتمي��ز خ�سائ���س الن���س‬ ‫ترتي��ب الكلم��ات يف الن���س م��ع املحافظ��ة عل��ى تكراره��ا في��ه‪ .‬على الرغ��م من اأن‬
‫با�س��تخدام تن�س��يق تفهم��ه خوارزمي��ات‬ ‫متثي��ل حقيب��ة الكلم��ات ه��و تب�س��يط �س��ديد للغ��ة الب�س��رية‪ ،‬اإال اأن��ه يحق��ق نتائ��ج‬
‫تعلُّم االآلة‪.‬‬ ‫تناف�سية للغاية عند التطبيق العملي‪.‬‬
‫‪0‬‬ ‫‪apples‬‬
‫حقيبة كلمات ن�سية متَّجَ هة‬ ‫‪1‬‬ ‫‪do‬‬
‫‪1‬‬ ‫‪I‬‬
‫"?‪"I like oranges, do you like oranges‬‬ ‫‪2‬‬ ‫‪like‬‬
‫("اأنا اأحب الربتقال‪ ،‬هل حُتب الربتقال؟")‬ ‫‪2‬‬
‫‪1‬‬
‫‪oranges‬‬
‫‪you‬‬
‫�سكل ‪ :3.5‬متثيل حقيبة الكلمات (‪)bag-of-words‬‬
‫ي�ستخدم املقطع الربجمي التايل اأداة ‪ CountVectorizer‬لتمثيل جمموعة بيانات التدريب ‪ IMDb‬باملتَّجَ هات‪:‬‬
‫‪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‬‬

‫‪137‬‬
‫‪# expand the sparse data into a sparse matrix format, where each column represents a different word.‬‬
‫‪X_train_v1_dense=pd.DataFrame(X_train_v1.toarray(),‬‬
‫))(‪columns=vectorizer_v1.get_feature_names_out‬‬
‫‪X_train_v1_dense‬‬

‫�سكل ‪ :3.6‬متثيل جمموعة بيانات التدريب باملتَّجَ هات‬


‫ُيع� ِّ�رب ه��ذا التن�س��يق الكثي��ف (‪ )Dense‬للم�سفوف��ة ع��ن ‪ 40,000‬تقيي��م ومراجع��ة ف ِل��م يف بيان��ات التدري��ب‪ .‬حُتت��وي‬
‫امل�سفوف��ة عل��ى عم��ود ل��كل كلم��ة تظه��ر يف ‪ 10‬مراجع��ات عل��ى االأق��ل (مُنف��ذة بوا�س��طة املتغ��ر ‪ .)min_df‬كم��ا يت�س��ح‬
‫دخ��ل امل�سفوف��ة يف املو�س��ع [‪ ]i،j‬عن‬ ‫باالأعل��ى‪ ،‬ينت��ج ع��ن ذل��ك ‪ 23,392‬عم��ودًا‪ ،‬مرتب��ة يف ترتي��ب اأبج��دي رقم��ي‪ُ .‬يع� ِّ�رب ُم َ‬
‫ع��دد امل��رات الت��ي تظه��ر فيه��ا كلم��ة ‪ j‬يف املراجع��ة ‪ .i‬وعل��ى الرغ��م م��ن اإمكان ّي��ة ا�س��تخدام ه��ذه امل�سفوف��ة مبا�س��ر ًة م��ن‬
‫املوج��ه‪ ،‬اإال اأنه��ا غ��ر ف ّعال��ة م��ن حي��ث ا�س��تخدام الذاك��رة‪ .‬وال�س��بب يف ذل��ك اأن الغالبي��ة العظم��ى‬
‫ِق َب��ل خوارزمي��ة التعلُّ��م َّ‬
‫م��ن املُدخَ ��الت يف ه��ذه امل�سفوف��ة ت�س��اوي ‪ .0‬وه��ذا يح��دث الأن ن�س��بة �سئيل��ة ج��دً ا فق��ط م��ن ب��ني ‪ 23,392‬كلم��ة حُمتمل��ة‬
‫�س��تظهر فعل ًي��ا يف كل مراجع��ة‪ .‬وملعاجل��ة ه��ذا الق�س��ور‪ُ ،‬تخ��زِّ ن اأداة ‪ CountVectorizer‬البيان��ات املمثل��ة باملتَّجَ ه��ات‬
‫يف م�سفوف��ة متباع��دة‪ ،‬حي��ث حُتتف��ظ فق��ط باملُدخَ الت غر ال�سفرية يف كل عمود‪ .‬ي�س��تخدم املقطع الربجمي باالأ�س��فل‬
‫الدال��ة ()‪ getsizeof‬الت��ي حُت��دد حج��م الكائن��ات يف لغ��ة البايث��ون (‪ )Python‬بالباي��ت (‪ )Bytes‬لتو�سي��ح م��دى‬
‫التوفر يف الذاكرة عند ا�ستخدام امل�سفوفة املتباعدة لبيانات ‪:IMDb‬‬

‫‪from sys import getsizeof‬‬


‫‪print('\nMegaBytes of RAM memory used by the raw text format:',‬‬
‫)‪getsizeof(X_train_text)/1000000‬‬
‫‪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‬‬

‫‪MegaBytes of RAM memory used by the raw text format: 54.864133‬‬

‫‪MegaBytes of RAM memory used by the dense matrix format: 7485.440144‬‬

‫‪MegaBytes of RAM memory used by the sparse format: 4.8e-05‬‬

‫‪138‬‬
‫وبح�سب املتوقّع حُتتاج امل�سفوفة املتباعدة اإىل ذاكرة اأقل بكثر وحُتديدً ا ‪ 0.000048‬ميجابايت‪ .‬بينما ت�سغل امل�سفوفة‬
‫الكثيفة ‪ 7‬جيجابايت‪ ،‬كما اأنّ هذه امل�سفوفة لن تُ�ستخدَ م مرة اأخرى وبالتايل مُيكن حذفها لتوفر هذا احلجم الكبر‬
‫من الذاكرة‪:‬‬

‫‪# delete the dense matrix.‬‬


‫‪del X_train_v1_dense‬‬

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


‫‪Build a re iction Pipeline‬‬
‫املُ�سنِّف (‪:) ssi er‬‬ ‫االآن بع��د اأن مت َّكن��ت م��ن متثي��ل بيان��ات التدري��ب باملتَّجَ ه��ات ف�اإن اخلط��وة التالي��ة‬
‫املُ�س ِّن��ف يف تعلُّ��م االآل��ة ه��و من��وذج يُ�س��تخدم‬ ‫ه��ي ِبن��اء خ��ط اأنابي��ب التنبوؤ االأول‪ .‬اأحد االأمثلة على املُ�سنِّفات املُ�س��تخدَ مة للتنبوؤ‬
‫لتمييز نقاط البيانات يف فئات اأو ت�سنيفات‬ ‫بال َّن���س ه��و امل ُ�س ِّن��ف باي��ز ال�س��اذج (‪ .)Naive Bayes Classifier‬يَ�س��تخدِ م ه��ذا‬
‫خمتلف��ة‪ .‬الهدف م��ن املُ�سنِّف هو التعلُّم من‬ ‫امل�سنِّف احتماالت الكلمات اأو العبارات املحددة الواردة يف النَّ�س للتنبوؤ باحتمال‬
‫بيان��ات التدري��ب املُعن َون��ة‪ ،‬وم��ن ث��م القي��ام‬ ‫انتمائ��ه اإىل ت�سني��ف حُم��دد‪ .‬ج��اءت كلم��ة ال�س��اذج (‪ )Naive‬يف ا�س��م املُ�س ِّن��ف‬
‫بالتنب �وؤات ح��ول قي��م الت�سني��ف لبيان��ات‬ ‫م��ن افرتا���س اأن وج��ود كلم��ة بعينه��ا يف ال َّن���س م�س��تقل ع��ن وجود اأي كلم��ة اأخرى‪.‬‬
‫جديدة‪.‬‬ ‫وهذا افرتا�س قوي‪ ،‬ولكنه ي�سمح بتدريب اخلوارزمية ب�سرعة وبفعالية كبرة‪.‬‬

‫ي�س��تخدم املقط��ع الربجم��ي الت��ايل تطبي��ق م�س َّن��ف باي��ز ال�س��اذج ( ‪ )Multinomial NB‬م��ن مكتب��ة �س��كلرن‬
‫(‪ )Sklearn Library‬لتدريب منوذج التعلُّم املوجَّ ه على بيانات التدريب ‪ IMDb‬باملتَّجَ هات‪:‬‬

‫‪from sklearn.naive_bayes import MultinomialNB‬‬

‫‪model_v1=MultinomialNB() # a Naive Bayes Classifier‬‬

‫‪model_v1.fit(X_train_v1, Y_train) # fit the classifier on the vectorized training data.‬‬

‫‪from sklearn.pipeline import make_pipeline‬‬

‫‪# create a prediction pipeline: first vectorize using vectorizer_v1, then use model_v1 to predict.‬‬
‫)‪prediction_pipeline_v1 = make_pipeline(vectorizer_v1, model_v1‬‬

‫عل��ى �س��بيل املث��ال‪� ،‬س�يُنتج ه��ذا املقط��ع الربجم��ي م�سفوف��ة نتائ��ج يرم��ز فيه��ا الرق��م ‪ 1‬للتقيي��م االإيجاب��ي و‪ 0‬للتقيي��م‬
‫ال�سلبي‪:‬‬
‫‪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‬‬
‫)] '‪lost all interest after 30 minutes‬‬

‫)‪array([1, 0], dtype=int64‬‬

‫‪139‬‬
‫يتنب�اأ خ��ط االأنابي��ب ب�س��كل �سحي��ح بالقيم��ة االإيجابي��ة وال�س��لبية للتقيمي��ني االأول والث��اين عل��ى الت��وايل‪ُ .‬مُيك��ن ا�س��تخدام‬
‫الدال��ة املُ�س ّمن��ة ()‪ predict_proba‬لتحدي��د جمي��ع االحتم��االت الت��ي يقوم خط االأنابي��ب بتخ�سي�سها لكل واحدة من‬
‫القيمتني املحتملتني‪ .‬العن�سر االأول هو احتمال تعيني ‪ 0‬والعن�سر الثاين هو احتمال تعيني ‪:1‬‬

‫‪prediction_pipeline_v1.predict_proba(['One of the best movies of the year. Ex‬‬


‫‪cellent cast and very interesting plot.',‬‬
‫‪'I was very disappointed with his film.‬‬
‫)] '‪I lost all interest after 30 minutes‬‬

‫‪array([[0.08310769, 0.91689231],‬‬
‫)]]‪[0.83173475, 0.16826525‬‬

‫التقييم الثاين‬ ‫التقييم االأول‬


‫‪16.8%‬‬ ‫‪8.3%‬‬

‫النموذج يوؤكد بن�سبة ‪ 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‬‬

‫توف�ر لغ�ة البايث�ون العدي�د م�ن االأدوات لتحلي�ل وت�سوي�ر نتائ�ج خط�وط اأنابي�ب الت�سني�ف‪ .‬ت�س�مل االأمثل�ة دال�ة‬
‫()‪ accuracy_score‬من مكتبة �س�كلرن ومتثيل م�سفوفة الدقة (‪ )Confusion Matrix‬من مكتبة �س�ايكيت بلوت‬
‫(‪ ،)Scikit-Plot‬وهن�اك مقايي��س تقيي�م اأخ�رى مث�ل‪ :‬الدق�ة‪ ،‬واال�س�تدعاء‪ ،‬والنوعية‪ ،‬واحل�سا�س�ية‪ ،‬ومقيا��س درجة ‪،F1‬‬
‫وفقًا حلالة اال�ستخدام التي مُيكن ح�سابها من م�سفوفة الدقة‪ .‬املُخرَج التايل هو تقريب دقيق لدرجة التنبوؤ‪:‬‬
‫‪from sklearn.metrics import accuracy_score‬‬
‫‪accuracy_score(Y_test, predictions_v1) # get the achieved accuracy.‬‬

‫‪0.8468‬‬

‫‪140‬‬
‫‪%%capture‬‬
‫‪!pip install scikit-plot; # install the scikit-plot library, if it is missing.‬‬
‫‪import scikitplot; # import the library‬‬

‫‪class_names=['neg','pos'] # pick intuitive names for the 0 and 1 labels.‬‬


‫القيم‬
‫‪# plot the confusion matrix.‬‬ ‫الحقيقية‪.‬‬
‫(‪scikitplot.metrics.plot_confusion_matrix‬‬
‫‪[class_names[i] for i in Y_test],‬‬
‫‪[class_names[i] for i in predictions_v1],‬‬
‫‪title="Confusion Matrix", # title to use‬‬
‫القيم المُتوقَّعة‪.‬‬ ‫‪cmap="Purples", # color palette to use‬‬
‫‪figsize=(5,5) # figure size‬‬
‫;)‬

‫حُتت��وي م�سفوف��ة الدق��ة عل��ى ع��دد الت�سنيف��ات احلقيقي��ة مقاب��ل املُتو َّقع��ة‪ .‬يف ُمهِ َّم��ة الت�سني��ف الثنائي��ة (مث��ل‪ :‬م�س�األة‬
‫احتواء قيمتني‪ ،‬املوجودة يف ُمهِ َّمة ‪� ،)IMDb‬ستحتوي م�سفوفة الدقة على اأربع خاليا‪:‬‬

‫التنبوؤات ال�سالبة ال�سحيحة (اأعلى الي�سار)‪:‬‬


‫ع��دد امل��رات الت��ي تنب �اأ فيه��ا املُ�س ِّن��ف باحل��االت‬
‫ال�سالبة ب�سكل �سحيح‪.‬‬
‫التنبوؤات ال�سالبة اخلاطئة (اأعلى اليمني)‪:‬‬
‫ع��دد امل��رات الت��ي تنب �اأ فيه��ا املُ�س ِّن��ف باحل��االت‬
‫ال�سالبة ب�سكل خاطئ‪.‬‬
‫التنبوؤات املوجبة اخلاطئة (اأ�سفل الي�سار)‪:‬‬
‫ع��دد امل��رات الت��ي تنب �اأ فيه��ا املُ�س ِّن��ف باحل��االت‬
‫املوجبة ب�سكل خاطئ‪.‬‬
‫التنبوؤات املوجبة ال�سحيحة (اأ�سفل اليمني)‪:‬‬
‫ع��دد امل��رات الت��ي تنب �اأ فيه��ا املُ�س ِّن��ف باحل��االت‬
‫املوجبة ب�سكل �سحيح‪.‬‬
‫�سكل ‪ :3.8‬نتائج م�سفوفة الدقة بتطبيق م�سنَّف بايز ال�ساذج على بيانات االختبار با�ستخدام جمموعة بيانات ‪.IMDb‬‬

‫تُظه��ر النتائ��ج اأن��ه عل��ى الرغ��م م��ن اأن خ��ط االأنابي��ب‬


‫الدقة (‪:)Accuracy‬‬ ‫االأول يحق��ق دق��ة تناف�س��ية ت�س��ل اإىل ‪ ،84.68%‬اإال‬
‫الدقة هي ن�سبة التنبوؤات ال�سحيحة اإىل اإجمايل عدد التنبوؤات‪.‬‬ ‫اأن��ه ال ي��زال ُيخط��ئ يف ت�سني��ف مئ��ات التقييم��ات‪.‬‬
‫(التنبوؤات املوجبة ال�سحيحة ‪ +‬التنبوؤات ال�سالبة ال�سحيحة)‬ ‫فهن��اك ‪ 331‬تن ّب �وؤًا غ��ر �سحي��ح يف الرب��ع االأمُي��ن‬
‫الدقة =‬ ‫العل��وي و‪ 435‬تن ّب �وؤًا غ��ر �سحي��ح يف الرب��ع االأي�س��ر‬
‫(التنب�وؤات املوجب��ة ال�سحيح��ة ‪ +‬التنب�وؤات ال�س��البة ال�سحيح��ة‬
‫‪ +‬التنبوؤات املوجبة اخلاطئة ‪ +‬التنبوؤات ال�سالبة اخلاطئة)‬ ‫ال�س��فلي‪ .‬باإجم��ايل ‪ 766‬تن ّب �وؤً ا غ��ر �سحي��ح‪.‬‬
‫اخلطوة االأوىل نحو حُت�س��ني االأداء هي درا�س��ة �س��لوك‬
‫الن�س‬
‫خط اأنابيب التنبوؤ‪ ،‬ملعرفة كيف يقوم مبعاجلة ّ‬
‫‪141‬‬ ‫وفهمه‪.‬‬
‫�سر مُتن ِّب ات ال�سندوق األأ�سود ‪Explaining Black-Box Predictors‬‬
‫ي�س��تخدم م�س َّن��ف باي��ز ال�س��اذج ال�سي��غ الريا�سي��ة الب�س��يطة لتجمي��ع احتماالت اآالف الكلمات وتق ��دي� ��م تنبوؤاته��ا‪ .‬وبالرغم من‬
‫ب�س��اطة النم��وذج‪ ،‬اإال اأن��ه ال ي��زال غ��ر ق��ادر عل��ى تق��دمي �س��رح ب�س��يط ومبا�س��ر لكيفي��ة قي��ام النم��وذج بتو ُّق��ع القيم��ة املوجب��ة اأو‬
‫ال�س��البة جل��زء حُم��دد م��ن الن���س‪ .‬ق��ا ِرن ذلك مع ُم�س ِّنفات �س��جرة القرار االأكر و�سوحً ا‪ ،‬حيث يتم متثي��ل القواعد التي تعلمها‬
‫النم��وذج يف الهي��كل ال�س��جري‪ ،‬مم��ا ُي�س� ِّهل عل��ى االأ�س��خا�س فه��م كي��ف يق��وم املُ�س ِّن��ف بالتنب�وؤات‪ .‬يتي��ح هي��كل ال�س��جرة كذل��ك‬
‫احل�س��ول عل��ى ت�س��ور مرئ��ي للق��رارات املُتخ��ذَّ ة يف كل فرع‪ ،‬ممّ ا يكون مفيدً ا يف فهم العالقات بني اخل�سائ�س املُدخَ لة واملتغر‬
‫امل�ستهدف‪.‬‬
‫االفتق��ار اإىل ق��درة التف�س��ر متث��ل حُتد ًي��ا كب�رًا يف اخلوارزمي��ات االأك��ر تعقي��دً ا‪ ،‬كتل��ك املُ�س��ت ِندة اإىل التجميع��ات مث��ل‪:‬‬
‫توليف��ات م��ن اخلوارزمي��ات املتع��ددة اأو ال�س��بكات الع�سبي��ة‪ .‬فب��دون الق��درة عل��ى التف�س��ر‪ ،‬تتقل���س خوارزمي��ات التعلُّ��م‬
‫كاف للتنبوؤ بالقيم‪ ،‬اإال اأنها ال تزال غر‬ ‫املوجه اإىل متنبئات ال�سندوق االأ�سود‪ :‬على الرغم من اأنها تفهم الن�س ب�سكل ٍ‬ ‫َّ‬
‫ق��ادرة عل��ى تف�س��ر كي��ف تق��وم باتخ��اذ القرار‪ .‬اأجريت العديد م��ن االأبحاث للتغلب على هذه التحديات بت�سميم و�س��ائل‬
‫ق��ادرة عل��ى التف�س��ر ت�س��تطيع فه��م من��اذج ال�سن��دوق االأ�س��ود‪ .‬واح��دة م��ن الو�س��ائل االأك��ر �س��هرة ه��ي النم��وذج املحاي��د‬
‫املحلي القابل للتف�سر وال�سرح (‪.)Local Interpretable Model-Agnostic Explanations - LIME‬‬
‫النموذج املحايد املحلي القابل للتف�سري وال�سر‬
‫‪Local Interpretable Model- gnostic‬‬ ‫‪n tions - LIME‬‬
‫النموذج املحايد املحلي القابل للتف�سر وال�سرح (‪ )LIME‬هو طريقة لتف�سر التنبوؤات التي قامت بها مناذج ال�سندوق‬
‫االأ�س��ود‪ .‬وذل��ك م��ن خ��الل النظ��ر يف نقط��ة بيان��ات واح��دة يف وق��ت حُم��دد‪ ،‬واإج��راء تغي��رات ب�س��يطة عليه��ا ملعرف��ة كيف‬
‫يوؤث��ر ذل��ك عل��ى ق��درة تنب�وؤ النم��وذج‪ ،‬ث��م ُت�س��تخدم ه��ذه املعلومات لتدري��ب منوذج مفهوم وب�س��يط مثل االنح��دار اخلطي‬
‫على تف�س��ر هذه التنبوؤات‪ .‬بالن�س��بة للبيانات الن�سية‪ ،‬يقوم النموذج املحايد املحلي القابل للتف�س��ر وال�س��رح بالتع ّرف‬
‫على الكلمات اأو العبارات التي لها االأثر االأكرب على القيام بالتنبوؤات‪.‬‬
‫يو�سح ذلك‪:‬‬‫وفيما يلي‪ ،‬تطبيق بلغة البايثون ّ‬

‫‪%%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‬‬

‫‪142‬‬
.‫ يقدم منوذج التنبوؤ تنبوؤًا �سلبيًا موؤكدً ا بدرجة كبرة يف هذا املثال الب�سيط‬،‫كما هو مُتوقَّع‬

# 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),
('very', 0.008956707731803237),
('were', -0.008897098392433257)]

‫معامال في نموذج‬
ً ‫الدرجة المقابلة لكل كلمة تمثل‬ ‫الخ�سائ�س الع�سرة‬
.‫االنحدار الخطي الب�سيط المُ�ستخدَ م لتقديم التف�سير‬ .‫االأكثر تاأثيرًا‬

:‫مُيكن احل�سول على ت�سور مرئي اأكر دق ًة على النحو التايل‬

# visualize the impact of the most influential words.


fig = exp.as_pyplot_figure()

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


143
‫ُعام��ل املوج��ب من��ه‪ .‬عل��ى �س��بيل املث��ال‪ ،‬الكلم��ات‪:‬‬ ‫يَزي��د امل ِ‬
‫ُعام��ل ال�س��الب م��ن احتمالي��ة الت�سني��ف ال�س��الب‪ ،‬بينم��ا يُقل��ل امل ِ‬
‫‪( horrible‬فظي��ع)‪ ،‬و ‪( terrible‬مري��ع)‪ ،‬و ‪( boring‬مم��ل) له��ا التاأث��ر االأق��وى عل��ى ق��رار النم��وذج بالتنب�وؤ بالقيم��ة‬
‫ال�س��البة‪ .‬الكلم��ة ‪( very‬ج��دً ا) دفع��ت النم��وذج قلي� ً�ال يف اجت��اه اآخ��ر اإيجاب��ي‪ ،‬ولكنه��ا مل تك��ن كافي��ة لتغي��ر الق��رار‪.‬‬
‫بالن�س��بة للمراق��ب الب�س��ري‪ ،‬ق��د يب��دو غري ًب��ا اأن الكلم��ات اخلالي��ة م��ن امل�س��اعر مث��ل‪( plot :‬احلبك��ة الدرامي��ة) اأو ‪was‬‬
‫(كان) له��ا م ِ‬
‫ُعام��الت مرتفع��ة ن�س��بيًا‪ .‬وم��ع ذل��ك‪ ،‬م��ن ال�س��روري اأن تتذك��ر اأن تعلُّ��م االآل��ة ال يتب��ع دومً ��ا الوع��ي الب�س��ري‬
‫ال�سليم‪.‬‬
‫ُعامالت املرتفعة بالفعل عن ق�سور يف منطق اخلوارزمية وقد تكون م�سوؤولة عن بع�س اأخطاء منوذج‬ ‫وقد تك�سف هذه امل ِ‬
‫التن ُّبوؤ‪ .‬وعلى نح ٍو بديل‪ُ ،‬يع ُّد منوذج التن ُّبوؤ مبثابة موؤ�سرٍ على االأمناط التنبوؤية الكامنة والغن ّية يف الوقت نف�سه باملعلومات‪.‬‬
‫عل��ى �س��بيل املث��ال‪ ،‬ق��د يب��دو الواق��ع وكاأن املُقي ِّم��ني الب�س��ريني اأك��ر ا�س��تخدامً ا لكلم��ة ‪( plot‬احلبك��ة الدرامي��ة) اأو �سيغة‬
‫املا�س��ي ‪( was‬كان) عن��د احلدي��ث يف �س��ياق �س��لبي‪ .‬ومُيك��ن ملكتب��ة النم��وذج املحاي��د املحل��ي القاب��ل للتف�س��ر وال�س��رح‬
‫(‪ )LIME‬يف لغة البايثون ت�سوير ال�سروحات بطرائق اأخرى‪ .‬على �سبيل املثال‪:‬‬
‫)(‪exp.show_in_notebook‬‬

‫�سكل ‪ :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‬‬
‫‪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‬‬
‫‪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.‬‬

‫‪144‬‬
‫‪# get the correct labels of this example.‬‬
‫)]]‪print('Correct Label:', class_names[Y_test[4600‬‬

‫‪# get the prediction probabilities for this example.‬‬


‫‪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‬‬

‫التنب�وؤ ق�دّم تنب�وؤًا �س��لبيًا م ؤوك��دً ا للغاي��ة باحتمالي��ة‬


‫عل��ى الرغ��م م��ن اأن ه��ذا التقيي��م اإيجاب��ي ب�س��كل وا�س��ح‪ ،‬اإال اأنّ من��وذج ُّ‬
‫التنبوؤ مثل هذا القرار اخلاطئ‪:‬‬ ‫ف�سر لتو�سيح ال�سبب وراء اتخاذ منوذج ُّ‬ ‫و�سلت اإىل ‪ .83%‬مُيكن االآن ا�ستخدام املُ ِّ‬
‫‪# explain the prediction for this example.‬‬
‫_‪exp = explainer_v1.explain_instance(mistake_example, prediction_pipeline‬‬
‫)‪v1.predict_proba, num_features=10‬‬

‫‪# visualize the explanation.‬‬


‫)(‪fig = exp.as_pyplot_figure‬‬

‫�سكل ‪ :3.11‬الكلمات التي اأثرت على القرار اخلاطئ‬

‫على الرغم من اأن منوذج التن ُّبوؤ ي�ستنبط التاأثر االإيجابي لبع�س الكلمات على نح ٍو �سحيح مثل‪:‬‬
‫‪( beautifully‬ب�س��كل جمي��ل)‪ ،‬و‪( great‬رائ��ع)‪ ،‬و‪( superb‬مده���س)‪ ،‬اإال اأ ّن��ه ي ّتخ��ذ يف النهاي��ة ق��رارًا �س��لبيًا ا�س��تنادًا‬
‫اإىل العدي��د م��ن الكلم��ات الت��ي يب��دو اأنه��ا ال تع��رب ب�س��كل وا�س��ح ع��ن امل�س��اعر ال�س��لبية مث��ل‪( Asano :‬اأ�س��انو)‪ ،‬و‪Asian‬‬
‫(اآ�سيوي)‪ ،‬و‪( movie‬فيلم)‪ ،‬و‪( acting‬متثيل)‪.‬‬
‫املنطق الذي ي�ستخدمه منوذج التن ُّبوؤ لت�سنيف املفردات الواردة يف ن�سو�س التقييمات‬ ‫يو�سح العيوب الكبرة يف ِ‬ ‫وهذا ِّ‬
‫ٍ‬
‫يو�سح كيف اأن حُت�سني هذا املنطق مُيكن اأن يطور من اأداء منوذج التن ُّبوؤ اإىل حد كبر‪.‬‬ ‫املُقدمة‪ .‬الق�سم التايل ّ‬
‫‪145‬‬
‫�سن الربجمة األ اهية للن�سو�ض‬
‫‪Improving Text ec ori tion‬‬
‫ا�س��تخدم االإ�س��دار االأول خل��ط اأنابي��ب التنب �وؤ اأداة ‪CountVectorizer‬‬
‫التعبري النمطي (‪:)Regular Expression‬‬ ‫حل�س��اب ع��دد امل��رات الت��ي تظه��ر فيه��ا كل كلم��ة يف كل تقيي��م‪ .‬تتجاه��ل ه��ذه‬
‫التعب��ر النمط��ي ه��و من��ط ن���س ُي�س��تخدَ م ملطابقة‬ ‫املنهجية حقيقتني اأ�سا�سيتني حول اللغات الب�سرية‪:‬‬
‫وملعاجل��ة �سال�س��ل الن�سو���س وتق��دمي طريق��ة‬ ‫• قد يتغر معنى الكلمة واأهميّتها ح�سب الكلمات املُ�ستخدَ مة معها‪.‬‬
‫موج��زة ومرن��ة لتحدي��د اأمن��اط الن�سو���س‪ ،‬كم��ا‬ ‫• تك��رار الكلم��ة يف املُ�س��تنَد ال ُيع� ُّد دومً ��ا متثي� ً�ال دقيقًا الأهميّتها‪ .‬على �س��بيل‬
‫تُ�س�تَخدم عل��ى نط��اق وا�س��ع يف معاجل��ة الن�سو���س‬ ‫املث��ال‪ ،‬عل��ى الرغ��م م��ن اأن تك��رار كلم��ة ‪( great‬رائ��ع) مرت��ني ق��د مُيث��ل‬
‫وحُتليل البيانات‪.‬‬ ‫موؤ�س�رًا اإيجاب ًي��ا يف م�س��تند يحت��وي عل��ى ‪ 100‬كلم��ة‪ ،‬اإال اأن��ه مُيث��ل موؤ�س�رًا‬
‫اأقل اأهمية بكثر يف م�ستند يحتوي على ‪ 1000‬كلمة‪.‬‬
‫�سي�س��رح ه��ذا اجل��زء كيفي��ة حُت�س��ني الربجم��ة االجتاهي��ة للن�سو���س الأخ��ذ هات��ني احلقيقت��ني يف عني االعتب��ار‪ .‬ي�س��تدعي املقطع‬
‫الربجمي التايل ثالثة مكتبات خمتلفة بلغة البايثون‪� ،‬س ُت�ستخدم لتحقيق ذلك‪:‬‬
‫• ‪ nltk‬و جين�سم (‪ :)Gensim‬تُ�ستَخدم هاتان املكتبتان ال�سّ هرتان يف مهام معاجلة اللغات الطبيعية املُتنوّعة‪.‬‬
‫• ‪ :re‬تُ�ستَخدم هذه املكتبة يف البحث عن النّ�سو�س‪ ،‬ومعاجلتها با�ستخدام التعبرات النمطية‪.‬‬
‫‪%%capture‬‬

‫‪!pip install nltk # install nltk‬‬


‫‪!pip install gensim # install gensim‬‬

‫‪import nltk # import nltk‬‬


‫‪nltk.download('punkt') # install nltk's tokenization tool, used to split a text into sentences.‬‬

‫‪import re‬‬ ‫‪# import re‬‬

‫‪from gensim.models.phrases import Phrases, ENGLISH_CONNECTOR_WORDS # import tools‬‬


‫‪from the gensim library.‬‬

‫ديد العبارات ‪e ecting Phrases‬‬


‫التق�سيم (‪:) o eni tion‬‬
‫مُيك��ن ا�س��تخدام الدال��ة االآتي��ة لتق�س��يم م�س��تند حُم��دد‬
‫يق�س��د ب��ه‪ :‬عملي��ة تق�س��يم البيان��ات الن�سي��ة اإىل اأج��زاء مث��ل‬ ‫ُق�س��مة‪ ،‬حي��ث مُيك��ن متثي��ل كل‬
‫وجمل‪ ،‬ورموز‪ ،‬وعنا�سر اأخرى يطلق عليها الرموز‪.‬‬ ‫كلمات‪ُ ،‬‬ ‫جلم��ل امل َّ‬
‫اإىل قائم��ة م��ن ا ُ‬
‫ق�سمة بقائمة من الكلمات‪:‬‬ ‫جملة ُم َّ‬
‫دالة ()‪ sent_tokenize‬تُق�سِّ م‬
‫‪# convert a given doc to a list of tokenized sentences.‬‬
‫‪def tokenize_doc(doc:str):‬‬
‫الجمل‪.‬‬ ‫المُ�ستنَد اإلى قائمة من ُ‬
‫‪return [re.findall(r'\b\w+\b',‬‬
‫])‪sent.lower()) for sent in nltk.sent_tokenize(doc‬‬

‫دالة ()‪ sent_tokenize‬من مكتبة ‪ nltk‬تُق�سِّ م املُ�ستنَد اإىل قائمة من اجلُمل‪.‬‬


‫بع��د ذل��ك‪ ،‬يت��م كتاب��ة كل جمل��ة باأح��رف �سغ��رة وتغذيته��ا اإىل دال��ة ()‪ findall‬م��ن مكتب��ة ‪ re‬لتق��وم بتحدي��د تك��رارات‬
‫التعبرات النمطية '‪� .'\b\w+\b‬ستختربها على ال�سل�سلة الن�سية املوجودة يف متغر ‪ . raw_text‬يف هذا ال�سياق‪:‬‬
‫‪146‬‬
‫• ‪ \w‬تتطابق مع كل الرموز االأبجدية الرقمية (‪ )0-9، A-Z، a-z‬وال�سَ رطة ال�سفلية‪.‬‬
‫• ‪ \w+‬تُ�س �تَخدم للبح��ث ع��ن وا ح��د اأو اأ ك��ر م��ن ر م��وز ‪ .\w‬لذ ل��ك‪ ،‬يف ال�سل�س��لة الن�سي��ة ‪hello123_world‬‬
‫(مرحبًا ‪ _123‬العامل)‪ ،‬النمط ‪� \w+‬سيتطابق مع الكلمات ‪( hello‬مرحبًا) و ‪ 123‬و‪( world‬العامل)‪.‬‬
‫• ‪ \b‬متث��ل الفا�س��ل (‪ )boundry‬ب��ني رم��ز ‪ \w‬ورم��ز لي���س ‪، \w‬وكذل��ك يف بداي��ة اأو نهاي��ة ال�سل�س��لة الن�سي��ة املُعط��اة‪ .‬عل��ى‬
‫�س��بيل املث��ال‪� :‬س��وف يتطاب��ق النم��ط ‪ \bcat\b‬م��ع الكلم��ة ‪( cat‬القط��ة) يف ال�سل�س��لة الن�سي��ة ‪(The cat is cute‬القط��ة‬
‫لطيف��ة)‪ ،‬ولكن��ه ل��ن يتطاب��ق م��ع الكلم��ة ‪( cat‬القط��ة) يف ال�سل�س��لة الن�سي��ة ‪( The category is pets‬فئ��ة احليوان��ات‬
‫االأليفة)‪.‬‬
‫مثاال على التق�سيم با�ستخدام الدالة ()‪.tokenize_doc‬‬ ‫اأدناه ً‬
‫'‪raw_text='The movie was too long. I fell asleep after the first 2 hours.‬‬
‫)‪tokenized_sentences=tokenize_doc(raw_text‬‬
‫‪tokenized_sentences‬‬

‫‪[['the', 'movie', 'was', 'too', 'long'],‬‬


‫]]'‪['i', 'fell', 'asleep', 'after', 'the', 'first', '2', 'hours‬‬

‫مُيكن االآن جتميع الدالة ()‪ tokenize_doc‬مع اأداة العبارات من مكتبة جين�سم (‪ )Gensim‬الإن�ساء منوذج العبارة‪،‬‬
‫وه��و من��وذج مُيكن��ه التع�رّف عل��ى العب��ارات املكون��ة م��ن ع��دة كلم��ات يف جمل��ة معط��اة‪ .‬ي�س��تخدم املقطع الربجم��ي التايل‬
‫بيانات التدريب ‪ IMDB‬اخلا�سة ب� (‪ )X_train_text‬لبناء مثل هذا النموذج‪:‬‬
‫‪sentences=[] # list of all the tokenized sentences across all the docs in this dataset‬‬

‫‪for doc in X_train_text: # for each doc in this dataset‬‬


‫‪sentences+=tokenize_doc(doc) # get the list of tokenized sentences in this doc‬‬

‫‪# build a phrase model on the given data‬‬


‫‪imdb_phrase_model = Phrases(sentences, 1‬‬
‫‪connector_words=ENGLISH_CONNECTOR_WORDS, 2‬‬
‫‪scoring='npmi', 3‬‬
‫‪threshold=0.25).freeze() 4‬‬

‫كما هو مو�سح باالأعلى‪ ،‬ت�ستقبل الدالة ()‪ Phrases‬اأربعة متغرات‪:‬‬


‫ُق�سمة من جمموعة الن�سو�س املُعطاة‪.‬‬ ‫جلمل امل َّ‬
‫‪ 1‬قائمة ا ُ‬
‫‪ 2‬قائمة بالكلمات االإجنليزية ال�سائعة التي تظهر ب�سورة متكررة يف العبارات (مثل‪ ،the :‬و ‪ ،)of‬ولي�س لها اأي قيمة موجبة‬
‫اأو �سالبة‪ ،‬ولكن مُيكنها اإ�سفاء امل�ساعر ح�سب ال�سياق‪ ،‬ولذلك يتم التعامل معها ب�سورة خمتلفة‪.‬‬
‫‪ 3‬تُ�ستَخدم دالة ت�سجيل النقاط لتحديد ما اإذا كان ت�سمني جمموعة من الكلمات يف العبارة نف�سها واجبًا‪ .‬املقطع الربجمي‬
‫باالأعلى َي�ستخدم مقيا�س املعلومات النقطية امل�سرتكة امل ُعايَر (‪)Normalized Pointwise Mutual Information - NPMI‬‬
‫له��ذا الغر���س‪ .‬ي�س��تند ه��ذا املقيا���س عل��ى تك��رار ت��وارد الكلم��ات يف العب��ارة املُر�س��حة وتك��ون قيمت��ه ب��ني ‪ -1‬و يرم��ز اإىل‬
‫اال�ستقاللية الكاملة (‪ ،)Complete Independence‬و ‪ +1‬ويرمز اإىل التوارد الكامل (‪.)Complete Co-occurrence‬‬
‫‪ 4‬يف ح��دود دال��ة ت�س��جيل النق��اط يت��م جتاه��ل العب��ارات ذات النق��اط االأق��ل‪ .‬وم��ن الناحي��ة العملي��ة‪ ،‬مُيك��ن �سبط ه��ذه احلدود‬
‫لتحديد القيمة التي تُعطي اأف�سل النتائج يف التطبيقات النهائية مثل‪ :‬النمذجة التنبوؤية‪.‬‬
‫ُحُتوِّل دالة ()‪ freeze‬منوذج العبارة اإىل تن�سيق غر قابل للتغير اأي ُجممّد (‪ )Frozen‬لكنّه اأكر �سرعة‪.‬‬
‫‪147‬‬
:‫ �س ُيحقق منوذج العبارة النتائج التالية‬،‫عند تطبيقها على اجلملتني املُق�سَّ متني باملثال املُو�سح باالأعلى‬
imdb_phrase_model[tokenized_sentences[0]]

['the', 'movie', 'was', 'too_long']

imdb_phrase_model[tokenized_sentences[1]]

['i', 'fell_asleep', 'after', 'the', 'first', '2_hours']

،)‫ (طوي��ل ج��دً ا‬too_long‫ (�س��قط نائ ًم��ا) و‬fell_asleep :‫يح��دِّ د من��وذج العب��ارة ثالث��ة عب��ارات عل��ى النح��و الت��ايل‬
.‫�ساعة) وجميعها حُتمل معلومات اأكر من كلماتها املفردة‬-2( 2_hours‫و‬
‫�سلبي‬ ‫ُحمايد‬ ‫ُحمايد‬ ‫ (طوي��ل‬too_long ‫ حُتم��ل عب��ارة‬،‫عل��ى �س��بيل املث��ال‬
‫مُق�سَّ م‬
too_long long too ‫ عل��ى الرغ��م م��ن اأن‬،‫ج��دً ا) م�س��اعر �س��لبية وا�سح��ة‬
‫�سلبي‬ ‫�سلبي‬ ‫ (طوي��ل) ال تع��ربان ع��ن ال�سياق‬long‫ (ج��دً ا) و‬too ‫كلمت��ي‬
fell_asleep
‫مُق�سَّ م‬ asleep fell ‫ فعل��ى الرغ��م م��ن اأن كلم��ة‬،‫ وباملث��ل‬،‫ذل��ك منفردت��ني‬
،‫ (نائ��م) يف مراجع��ة الفيل��م متثل داللة �س��لبية‬asleep
‫ال�سياق امل ُحدد‬ ‫ال�سياق‬ ‫ (�س��قط نائ ًم��ا) تو�س��ل ر�س��الة ال�سياق‬fell_asleep ‫فالعب��ارة‬
‫مُق�سَّ م‬
2_hours hours 2 2_hours ‫ ت�س��تنبط م��ن‬،‫ و اأ خ �رًا‬.‫اأ ك��ر و�سوحً ��ا‬
‫ امل�ساعر االإيجابية وال�سلبية قبل التق�سيم وبعده‬:3.12 ‫�سكل‬ 2 ‫�س��اعة) �س��ياقًا اأك��ر حُتدي��دً ا م��ن الكلمت��ني‬-2(
.‫ كلٍّ على حدة‬hours‫و‬
:‫ت�ستخدم الدالة التالية اإمكانية حُتديد العبارات بهذا ال�سكل لتف�سر العبارات يف وثيقة مُعطاه‬
def annotate_phrases(doc:str, phrase_model):

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]
return ' '.join(tokens) # join all the tokens together to create a new annotated document.

‫ لتف�س��ر كلٍ م��ن تقييم��ات التدري��ب واالختب��ار م��ن‬annotate_phrases)( ‫ي�س��تخدم املقط��ع الربجم��ي الت��ايل دال��ة‬
.IMDb ‫جمموعة بيانات‬
# annotate all the test and train reviews.
X_train_text_annotated=[annotate_phrases(doc,imdb_phrase_model) for doc in X_
train_text]
X_test_text_annotated=[annotate_phrases(text,imdb_phrase_model)for text in X_
test_text]

148
‫‪# an example of an annotated document from the imdb training data‬‬
‫]‪X_train_text_annotated[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‬‬
‫‪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‬‬
‫‪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‬‬
‫‪acceptable but replacing marionettes with homo_sapiens subsp sapiens was a huge error‬‬
‫'‪of judgment‬‬

‫تكرار امل�سطل ‪ -‬تكرار امل�ستند العك�سي‬ ‫ا�ستخدام مقيا�ض تكرار امل�سطل ‪-‬تكرار املُ�ستنَد‬
‫‪Term Frequency Inverse Document‬‬ ‫العك�س�ي يف الربجم�ة األ اهي�ة للن�سو��ض‬
‫(‪Frequency )TF-IDF‬‬ ‫‪Using TF-IDF for Text Vec ori tion‬‬
‫تك��رار امل�سطل��ح‪ -‬تك��رار املُ�س��تنَد العك�س��ي ه��و‬ ‫متثيال دقيقًا الأهميتها‪ .‬الطريقة املُثلى‬ ‫تكرار الكلمة يف املُ�ستنَد ال ُيع ُّد دومً ا ً‬
‫طريقة تُ�ستخدم لتحديد اأهمية الرموز يف املُ�ستنَد‪.‬‬ ‫لتمثي��ل التك��رار ه��ي املقيا���س ال�س��هر لتك��رار امل�سطل��ح ‪ -‬تك��رار امل ُ�س��تنَد‬
‫العك�سي (‪ .)TF-IDF‬ي�ستخدم هذا املقيا�س �سيغة ريا�سية ب�سيطة لتحديد‬
‫الن�سي (‪)Corpus‬‬
‫االأ�سل ّ‬ ‫اأهمية الرموز مثل‪ :‬الكلمات اأو العبارات يف املُ�ستنَد بنا ًء على عاملني‪:‬‬
‫• تكرار الرمز يف املُ�س��تنَد‪ ،‬بقيا���س عدد مرات ظهوره يف املُ�س��تنَد مق�سومً ا‬
‫على اإجمايل عدد الرموز يف جميع املُ�ستنَدات‪.‬‬
‫• تكرار املُ�ستنَد العك�سي للرمز‪ ،‬املح�سوب بق�سمة اإجمايل عدد املُ�ستنَدات‬
‫يف جمموعة البيانات على عدد املُ�ستنَدات التي حُتتوي على الرمز‪.‬‬
‫امل ُ�ستنَد‬ ‫الكلمة‬ ‫امل�سطلح‬
‫�سكل ‪ :3.13‬الكلمات وامل�سطلحات الواردة يف امل�ستند‬
‫العام��ل االأول يتجن��ب املبالغ��ة يف تقدي��ر اأهمي��ة امل�سطلح��ات الت��ي تظه��ر يف‬
‫الوثائ��ق االأط��ول‪ ،‬اأ ّم��ا العام��ل الث��اين في�س��تبعد امل�سطلح��ات الت��ي تظه��ر يف‬
‫الن�سي‬
‫عدد امل ُ�ستنَدات يف االأ�سل ّ‬ ‫كث ٍر من املُ�س��تنَدات‪ ،‬مما ي�س��اعد على اإثبات حقيقة اأن بع�س الكلمات هي‬
‫تكرار امل ُ�ستنَد العك�سي‬
‫عدد امل ُ�ستنَدات التي حتتوي على امل�سطلح‬
‫اأكر �سيوعً ا من غرها‪.‬‬
‫عدد مرات هور امل�سطلح يف امل ُ�ستنَد‬
‫تكرار امل�سطلح‬
‫عدد الكلمات يف امل ُ�ستنَد‬
‫تكرار امل�سطلح تكرار امل ُ�ستنَد العك�سي القيمة‬
‫اأداة ‪ec ori er‬‬
‫توف��ر مكتب��ة �س��كلرن (‪ )Sklearn‬اأداة تدع��م ه��ذا الن��وع م��ن الربجم��ة االجتاهي��ة لتك��رار امل�سطلح‪-‬تك��رار امل ُ�س��تنَد‬
‫العك�سي (‪ .)TF-IDF‬مُيكن ا�ستخدام اأداة ‪ TfidfVectorizer‬لتمثيل عبارة با�ستخدام املتَّجهات‪.‬‬
‫‪from sklearn.feature_extraction.text import TfidfVectorizer‬‬

‫‪# Train a TF-IDF model with the IMDb training dataset‬‬


‫)‪vectorizer_tf = TfidfVectorizer(min_df=10‬‬
‫)‪vectorizer_tf.fit(X_train_text_annotated‬‬
‫)‪X_train_tf = vectorizer_tf.transform(X_train_text_annotated‬‬

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

# train a new Naive Bayes Classifier on the newly vectorized data.


model_tf =MultinomialNB()
model_tf.fit(X_train_v2, Y_train)

# create a new prediction pipeline.


prediction_pipeline_tf = make_pipeline(vectorizer_tf, model_tf)

# get predictions using the new pipeline.


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.


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_
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]]

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

‫‪# create an explainer.‬‬


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

‫‪# explain the prediction of the second pipeline for this example.‬‬
‫_‪exp = explainer_tf.explain_instance(mistake_example_annotated, prediction‬‬
‫)‪pipeline_tf.predict_proba, num_features=10‬‬

‫‪# visualize the results.‬‬


‫)(‪fig = exp.as_pyplot_figure‬‬

‫�سكل ‪ :3.14‬تاأثر الكلمة يف مزيج تكرار امل�سطلح‪ -‬تكرار املُ�ستنَد العك�سي وم�سنّف بايز ال�ساذج‬

‫ت ؤوك��د النتائ��ج اأن خ��ط االأنابي��ب اجلدي��د يتب��ع منط ًق��ا اأك��ر ذكا ًء‪ .‬فه��و ُيح��دد ب�س��كل �سحي��ح امل�س��اعر االإيجابي��ة للعبارات‬
‫مث��ل‪( beautifully_shot :‬لقط��ة _ جميل��ة)‪ ،‬و ‪( superb_acting‬متثيل_رائ��ع)‪ ،‬و‪( very good‬جي��د ج��دً ا)‪ ،‬وال‬
‫مُيكن ت�سليله با�ستخدام الكلمات التي جعلت خط االأنابيب االأول يتنباأ بنتائج خاطئة‪.‬‬
‫مُيك��ن حُت�س��ني اأداء خ��ط االأنابي��ب لنم��وذج التن ُّبوؤ بطرق متعددة‪ ،‬باإ�س��تبدال م�سنف بايز الب�س��يط بط��رق اأكر تطورًا مع‬
‫�سب��ط متغراته��ا لزي��ادة احتماالته��ا‪ .‬وث َّم��ة خي��ار اآخر يتلخ�س يف ا�س��تخدام تقنيات الربجمة االجتاهي��ة البديلة التي ال‬
‫ت�ستند اإىل تكرار الرمز‪ ،‬مثل ت�سمني الكلمات و الن�سو�س‪ ،‬و�س ُي�ستعر�س ذلك يف الدر�س التايل‪.‬‬

‫‪151‬‬
‫مترينات‬
‫‪1‬‬
‫خاطئة‬ ‫�سحيحة‬ ‫حدِّد اجلملة ال�سحيحة واجلملة اخلاطئة فيما يلي‪:‬‬
‫‪ .1‬يف التعلُّم املوجَّ ه‪ ،‬تُ�ستخدم جمموعات البيانات املُعنوَنة لتدريب النموذج‪.‬‬
‫‪ .2‬الربجمة االجتاهية هي تقنية لتحويل البيانات من تن�سيق متَّجَ ه رقمي اإىل بيانات اأولية‪.‬‬
‫‪ .3‬تتطلب امل�سفوفة املتباعدة ذاكرة اأقل بكثر من امل�سفوفة الكثيفة‪.‬‬
‫‪ .4‬تُ�ستخدم خوارزمية مُ�سنَّف بايز ال�ساذج لبناء خط اأنابيب التنبوؤ‪.‬‬
‫‪ .5‬تكرار الكلمة يف املُ�ستنَد يُع ُّد التمثيل الدقيق الوحيد الأهمية هذه الكلمة‪.‬‬

‫‪ 2‬ا�سرح ملاذا تتطلب امل�سفوفة الكثيفة م�ساحة من الذاكرة اأكرب من امل�سفوفة املتباعدة‪.‬‬

‫‪ 3‬ح ِّل��ل كي��ف يُ�س��تخدَم العام��الن الرّيا�س ّي��ان يف تك��رار امل�سطل��ح‪ -‬تك��رار امل ُ�س��تنَد العك�س��ي (‪ )TF-IDF‬لتحدي��د اأهمي��ة‬
‫الكلمة يف الن�س‪.‬‬

‫‪152‬‬
‫ لدي��ك كذل��ك‬.‫ تت�سم��ن م�س��تندًا واح �دًا يف كل �س��ف‬numPy ‫ وه��ي عب��ارة ع��ن م�سفوف��ة‬X_train_text ‫ لدي��ك‬4
‫ اأكم��ل املقط��ع الربجم��ي الت��ا بحي��ث مُيك��ن‬.X_train_text ‫ تت�سم��ن قي��م امل ُ�س��تنَدات يف‬Y_train ‫م�سفوف��ة ثاني��ة‬
‫ وتدري��ب ��وذج ت�سني��ف‬،‫) لتمثي��ل البيان��ات باملتَّجَ ه��ات‬TF-IDF( ‫ تك��رار امل ُ�س��تنَد العك�س��ي‬-‫ا�س��تخدام تك��رار امل�سطل��ح‬
‫ ث��م مي��ع اأداة التمثي��ل باملتَّجَ ه��ات و ��وذج الت�سني��ف يف خ��ط‬،‫ عل��ى االإ�س��دار امل ُ َم َّث��ل باملتَّجَ ه��ات‬MultinomialNB
:‫اأنابيب تنبوؤ واحد‬

from .naive_bayes import MultinomialNB


from sklearn.pipeline import make_pipeline

from sklearn.feature_extraction.text import

vectorizer = (min_df=10)

vectorizer.fit( ) # fits the vectorizer on the training data

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

prediction_pipeline = make_pipeline( , )

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

from import LimeTextExplainer


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
‫الدر�ض الثاين‬
‫املوجه‬
‫التع ُّلم غري َّ‬
‫ا�ستخدام التعلُّم غري املوجَّ ه لفهم الن�سو�ض‬
‫‪Unsupervised Learning to Understand Text‬‬
‫قدم له جمموع��ة من االأمثل��ة التي يتوىل‬ ‫املوج��ه ه��و ن��وع م��ن تعلُّ��م االآل��ة‪ ،‬ي�س��تخدم في��ه النم��وذج بيان��ات غ��ر ُمعَنونة‪ ،‬حي� ُ�ث ُي ِّ‬
‫التعلُّ��م غ��ر َّ‬
‫املوجه يف حُتديد‬‫البحث فيها عن االأمناط والعالقات بني البيانات من تلقاء نف�سه‪ .‬ويف �سياق فهم الن�س‪ ،‬مُيكن ا�ستخدام التعلُّم غر َّ‬
‫الهي��اكل وا أالمن��اط الكامن��ة �سم��ن جمموع��ة بيانات املُ�س��تنَدات الن�سية‪ .‬هناك العديد من التقنيات املختلفة التي مُيكن ا�س��تخدامها يف‬
‫املوج��ه للبيان��ات الن�سي��ة‪ ،‬مب��ا يف ذل��ك خوارزمي��ات التجمي��ع (‪ ،)Clustering Algorithms‬وتقني��ات تقلي���س االأبع��اد‬ ‫التعلُّ��م غ��ر َّ‬
‫(‪ ،)Dimensionality Reduction Techniques‬والنماذج التوليدية (‪ُ .)Generative Models‬ت�س��تخدم خوارزميات التجميع‬
‫ل�سم املُ�ستنَدات املت�سابهة معًا‪ ،‬بينما تُ�ستخدم تقنيات تقلي�س االأبعاد لتقلي�س اأبعاد‬
‫التعلُّم غري املوجَّ ه‬ ‫البيانات وحُتديد اخل�سائ�س الهامة‪ .‬ومن ناحية اأخرى‪ُ ،‬ت�ستخدم النماذج التوليدية‬
‫(‪:)Unsupervised Learning‬‬ ‫لتعلُّم التوزيع االأ�سا�سي للبيانات وتوليد ن�س جديد م�سابه ملجموعة البيانات االأ�سلية‪.‬‬
‫املوج��ه‪ُ ،‬ي��زوَّد النم��وذج‬
‫يف التعلُّ��م غ��ر َّ‬
‫بكمي��ات كب��رة من البيانات غر املُعنوَنة‬ ‫‪Clustering Algorithms‬‬
‫ويتوج��ب علي��ه البح��ث ع��ن االأمن��اط يف‬ ‫مُيكن خلوارزميات التجميع جتميع العمالء املت�سابهني ا�ستنادًا اإىل ال�سلوكيات‬
‫البيا ن��ات غ��ر ا ملُرتاكب��ة م��ن خ��الل‬ ‫�تهدف وزي��ادة‬
‫اأو الدمُيوغرافي��ا‪ ،‬اأو �س��جل امل�س��رتيات؛ الأغرا���س الت�س��ويق املُ�س� َ‬
‫املالحظة والتجميع‪.‬‬ ‫معدالت االحتفاظ بالعمالء‪.‬‬
‫تقنيات تقلي�ض األأبعاد‬
‫‪i ension i‬‬ ‫‪e uction ec ni ues‬‬
‫تقلي�ض األأبعاد‬
‫ُت�س��تخدم تقني��ات تقلي���س االأبع��اد يف �سغ��ط ال�س��ورة لتقلي��ل ع��دد وح��دات‬
‫(‪:)Dimensionality e uction‬‬ ‫البيك�س��ل فيه��ا مم��ا ي�س��اعد عل��ى تقلي���س حج��م البيانات الالزم��ة لتمثيلها مع‬
‫تقني��ة تقلي�س االأبع��اد هي اإحدى تقنيات‬ ‫احلفاظ على خ�سائ�سها الرئي�سة‪.‬‬
‫تعلُّ��م االآل��ة وحُتلي��ل البيان��ات املُ�س��تخدَ مة‬
‫‪ener ti e‬‬ ‫النماذج التوليدية ‪o e s‬‬
‫لتقلي���س ع��دد اخل�سائ���س (االأبع��اد)‬
‫يف جمموع��ة البيان��ات م��ع االحتف��اظ‬ ‫تُ�س��تخدم النماذج التوليدية يف تطبيقات الك�س��ف عن االختالف؛ حيث ُحُت ِّدد‬
‫باأكرب قدر ممكن من املعلومات‪.‬‬ ‫االختالفات يف البيانات بتعلُّم االأمناط الطبيعية للبيانات با�ستخدام النموذج‬
‫التوليدي‪.‬‬
‫مُدخَ الت البيانات‬
‫املعاجلة‬
‫َ‬ ‫اخلوارزمية‬ ‫التف�سر‬ ‫االأولية‬

‫امل ُخرَج املتوقع‬

‫�سكل ‪ :3.15‬متثيل التعلُّم غر املوجَّ ه‬


‫‪154‬‬
‫املوجه هي اأنه مُيكن ا�س��تخدامه‬َّ ‫واإحدى املزايا الرئي�س��ة ال�س��تخدام التعلُّم غر‬
:)Cluster( ‫العنقود‬ ‫للك�س��ف ع��ن ا أالمن��اط والعالق��ات الت��ي ق��د ال تب��دو وا�سح��ة على الف��ور للمراقب‬
‫العنق��ود ه��و جمموع��ة من االأ�س��ياء‬ ‫ وق��د يك��ون ه��ذا مفي��دً ا ب�س��كل خا���س يف فه��م جمموع��ات البيان��ات‬.‫الب�س��ري‬
‫ ي�س��ر‬،‫ ويف تعلُّ��م ا آالل��ة‬.‫املت�س��ابهة‬ ‫ حيث يكون التحلي��ل اليدوي غر‬،‫الكب��رة املكون��ة م��ن الن�سو���س غ��ر املُرتاكبة‬
‫) اإىل‬Clustering ( ‫التجمي��ع‬ ‫ �ستَ�ستخدم جمموعة بيانات متوافرة للعا ّمة من املقاالت‬،‫ يف هذه الوحدة‬.‫عملي‬
‫عملي��ة جتمي��ع البيا ن��ات غ��ر‬ ،‫) بوا�سطة جرين وكوننجهام‬BBC( ‫االإخبارية من هيئة االإذاعة الربيطانية‬
.‫املُعنوَنة يف عناقيد متجان�سة‬ ‫)لتو�سي��ح بع���س التقني��ات الرئي�س��ة‬Greene & Cunningham،2006(
،‫ ُي�ستخدم املقطع الربجمي التايل لتحميل جمموعة البيانات‬.‫املوجه‬ َّ ‫للتعلُّم غر‬
‫املُنظّ مة يف خم�س��ة جملدات اإخبارية خمتلفة متثل مقاالت من اأق�س��ام اإخبارية‬
.‫ والرتفي��ه‬،‫ والتقني��ة‬،‫ والريا�س��ة‬،‫ وال�سيا�س��ة‬،‫ االأعم��ال التجاري��ة‬:‫ ه��ي‬،‫خمتلف��ة‬
‫ُ�ستخدمة يف هذه‬
َ ‫لن ت�ستخدم القيم اخلم�سة يف توجيه ا ٍأي من اخلوارزميات امل‬
.‫ �س ُت�س��تخدم فق��ط الأغرا���س الت�سوي��ر وامل�سادق��ة‬،‫�دال م��ن ذل��ك‬ ً �‫ وب‬.‫الوح��دة‬
‫ وكل مل��ف يت�سم��ن حُمت��وى‬،‫يت�سم��ن كل جمل��د اإخب��اري مئ��ات امللف��ات الن�سي��ة‬
‫ وقد ُحملّت جمموعة البيانات بالفعل اإىل مفكرة جوبيرت‬.‫مقالة واحدة حُمددة‬
‫) و�س��تقوم لبنة التعليمات الربجمية بفتح وا�س��تخراج‬Jupyter Notebook(
.‫ على التوايل‬،‫كل املُ�ستنَدات والقيم املطلوبة يف تركيبتني لبيانات القوائم‬
‫ متثيل عنقود‬:3.16 ‫�سكل‬

BBC open dataset


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
# used for generating random number
import random shuffling lists

bbc_docs=[] # holds the text of the articles


bbc_labels=[] # holds the news section for each article

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.

155
‫ميع املُ�ستنَدات‬ ‫ميع املُ�ستنَدات ‪Document Clustering‬‬
‫(‪:)Document Clustering‬‬ ‫االآن بع��د حُتمي��ل جمموع��ة البيان��ات ف�اإن اخلط��وة التالي��ة ه��ي جترب��ة ع��دة ط��رق غ��ر‬
‫املوجه ��ة ا أالك ��ر �س ��هرة يف ه ��ذا‬
‫موجه ��ة‪ ،‬ومنه ��ا‪ :‬التجمي ��ع ال ��ذي ُيع � ّد الطريق ��ة غ ��ر َّ‬ ‫َّ‬
‫جتمي��ع املُ�س��تنَدات هو طريقة تُ�س��تخدم‬ ‫النط ��اق‪ .‬وبال ّنظ ��ر اإىل جمموع ��ة م ��ن املُ�س ��تنَدات غ ��ر املُعن َون ��ة‪� ،‬س ��يكون اله ��دف ه ��و‬
‫لتجمي��ع املُ�س��تنَدات الن�س ّي��ة يف عناقيد‬ ‫جتميع الوثائق املت�س��ابهة معًا‪ ،‬ويف الوقت نف�س��ه الف�سل بني الوثائق غر املت�س��ابهة‪.‬‬
‫بنا ًء على ت�سابه حُمتواها‪.‬‬
‫جدول  ‪ :3.2‬العوامل التي ُ دد جودة النتائج‬
‫طريقة متثيل البيانات باملتَّجَ هات‪ .‬على الرغم من اأن تقنية تكرار امل�سطلح‪ -‬تكرار امل ُ�ستنَد العك�سي (‪ )TF-IDF‬اأثبتت‬ ‫‪1‬‬
‫كفاءتها وفعاليتها يف هذا املجال‪ ،‬اإال اأنّك �ستتعرف يف هذه الوحدة على مزيد من البدائل االأكر تطورًا وتعقيدً ا‪.‬‬
‫التعري��ف الدقي��ق للت�س��ابه ب��ني م�س��تند واآخ��ر‪ .‬بالن�س��بة للبيان��ات الن�س ّي��ة املُمثل��ة باملتَّجَ ه��ات‪ ،‬تك��ون مقايي���س امل�س��افة‬ ‫‪2‬‬
‫االإقليدية وجيب التمام هما االأكر �سيوعً ا‪� .‬س ُي�ستخدم االأول يف االأمثلة امل�سروحة يف هذه الوحدة‪.‬‬
‫ع��دد العناقي��د امل ُخت��ارة‪ .‬يوف��ر التجمي��ع التكتل��ي (‪ )Agglomerative Clustering - AC‬طريق��ة وا�سح��ة لتحدي��د‬ ‫‪3‬‬
‫العدد املنا�سب من العناقيد �سمن جمموعة حُمددة من البيانات‪ ،‬وهو التحدي الرئي�س الذي يواجه مهام التجميع‪.‬‬

‫ديد عدد العناقيد‬


‫‪Se ecting the Number of Clusters‬‬
‫امل�سافة األإقليدية‬ ‫حُتدي��د الع��دد ال�سحي��ح للعناقي��د ه��و خط��وة �سروري��ة �سم��ن مه��ام التجمي��ع‪.‬‬
‫(‪:)Euclidean Distance‬‬ ‫لالأ�س��ف‪ ،‬تعتم��د الغالبي��ة العظم��ى م��ن خوارزمي��ات التجمي��ع على املُ�س��تخدِ م يف‬
‫امل�س��افة االإقليدي��ة ه��ي م�س��افة اخلط امل�س��تقيم‬ ‫حُتدي��د ع��دد العناقي��د ال�سحيح��ة �سم��ن املُدخَ ��الت‪ .‬رمب��ا يك��ون للع��دد املح��دد‬
‫ب��ني نقطت��ني يف ف�س��اء متعدد االأبعاد‪ُ .‬وحُت�س��ب‬ ‫تاأث�رًا كب�رًا عل��ى ج��ودة النتائ��ج وقابليته��ا للتف�س��ر‪ ،‬ولك��ن هن��اك العدي��د م��ن‬
‫باجل��ذر الرتبيع��ي ملجم��وع مربع��ات الفروق��ات‬ ‫املقايي�س اأو املوؤ�سرات التي مُيكن ا�ستخدامها لتحديد عدد العناقيد‪.‬‬
‫بني االأبعاد املناظرة للنقاط‪ُ .‬ت�س��تخدم امل�سافة‬ ‫• اإحدى الطرائق ال�سائعة هي ا�ستخدام مقيا�س الرتا�س (‪.)Compactness‬‬
‫االإقليدي��ة يف التجمي��ع لقيا���س الت�س��ابه ب��ني‬ ‫مُيكن القيام بذلك عن طريق ح�ساب جمموع امل�سافات بني النقاط �سمن كل‬
‫نقطتي بيانات‪.‬‬ ‫عنقود‪ ،‬وحُتديد عدد العناقيد الذي يقلل من هذا املجموع اإىل احلد االأدنى‪.‬‬
‫• هن��اك طريق��ة اأخ��رى تتلخ���س يف مقيا���س الف�س��ل (‪ )Separation‬ب��ني‬
‫م�سافة جيب التمام‬ ‫العناقيد‪ ،‬مثل متو�سط امل�سافة بني النقاط يف العناقيد املختلفة‪،‬وبناء عليه‪،‬‬
‫(‪:)Cosine Distance‬‬ ‫يتم حُتديد عدد العناقيد الذي يرفع من هذا املتو�سط‪.‬‬
‫ت�س��تخدم م�س��افة جي��ب التمام لقيا���س الت�س��ابه‬ ‫وب�س��كل عمل��ي‪ ،‬غال ًب��ا م��ا تتعار���س املنهجي��ات املذك��ورة باالأعل��ى م��ع بع�سه��ا من‬
‫يف جي��ب التم��ام ب��ني نقطت��ي البيان��ات‪ .‬فه��ي‬ ‫حي��ث التو�سي��ة باأرق��ام خمتلف��ة‪ ،‬ومُي ّث��ل ه��ذا حُت ّد ًي��ا م�س��رتكًا عن��د التعام��ل م��ع‬
‫حُت�سب جيب متام الزاوية بني م َّت َجهني مُيثالن‬ ‫البيانات الن�سية ب�سكلٍ خا�س‪ ،‬فعاد ًة ما ي�س ُعب متييز تركيبها‪.‬‬
‫�تخدم ع��اد ًة يف جتمي��ع‬
‫نق��اط البيان��ات‪ ،‬و ُت�س� َ‬
‫البيان��ات الن�س ّي��ة‪ .‬وتق��ع قيم��ة جيب التمام بني‬
‫‪ 1-‬و ‪1‬؛ حي��ث ت�س��ر القيم��ة ‪ 1-‬اإىل االجت��اه‬
‫العك�س��ي‪ ،‬بينم��ا ت�س��ر القيم��ة ‪ 1‬اإىل االجت��اه‬
‫نف�سه‪.‬‬
‫�سكل ‪ :3.17‬اآلة ح�ساب امل�سافات بني النقاط‬
‫‪156‬‬
‫يف التعلُّ��م غ��ر املوجَّ ��ه‪ ،‬ي�س��ر ع��دد العناقي��د اإىل ع��دد املجموع��ات اأو‬
‫الت ميع الهرمي‬ ‫الت�سنيف��ات الت��ي تنق�س��م اإليه��ا البيان��ات بوا�س��طة اخلوارزمي��ة‪ .‬و ُيع� ُّد‬
‫(‪:)Hierarchical Clustering‬‬ ‫حُتدي��د ع��دد العناقي��د ال�سحي��ح اأمرًا مه ًم��ا الأنه يوؤثر عل��ى دقة النتائج‬
‫التجمي��ع الهرم��ي ه��و خوارزمي��ة التجمي��ع املُ�س��تخدَ مة‬
‫وقابليتها للتف�سر‪ .‬اإذا كان عدد العناقيد كبرًا للغاية‪ ،‬فاإنّ املجموعات‬
‫لتجمي��ع البيان��ات يف عناقي��د بن��ا ًء عل��ى الت�س��ابه‪ .‬يف‬
‫�س��تكون حُم� ّدد ًة ج��دً ا وب��دون معن��ى‪ .‬يف ح��ني اأنه اإذا كان ع��دد العناقيد‬
‫التجميع الهرمي‪ ،‬تُنظّ م نقاط البيانات يف تركيب ي�سبه‬ ‫منخف� ًس��ا للغاي��ة‪ ،‬ف �اإنّ املجموع��ات �س��تكون ممت��دة عل��ى نط��اق وا�س��ع‬
‫ال�س��جرة‪ ،‬حي��ث تك��ون كل ُعق��دة مبثاب��ة عنق��ود‪ ،‬وتك��ون‬
‫جدً ا‪ ،‬ولن ت�ستنبط الرتكيب االأ�سا�سي للبيانات‪ .‬من ال�سروري حُتقيق‬
‫العُقدة االأم هي نقطة التقاء ال ُعقد املتفرعة منها‪.‬‬ ‫كاف من العناقيد ال�ستنباط اأمناط ذات معنى‪،‬‬ ‫عدد ٍ‬ ‫التوازن بني توفر ٍ‬
‫واأال تك��ون كث��رة يف الوق��ت نف�س��ه بالق��در ال��ذي يجع��ل النتائ��ج ُمعق��دة‬
‫للغاية وغر مفهومة‪.‬‬
‫ُي�ستخدَ م املقطع الربجمي التايل ال�ستراد مكتبات حُمددة تُ�ستخدَ م يف التجميع الهرمي من بدايته حتى نهايته‪:‬‬

‫‪# 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‬‬

‫‪# 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.‬‬


‫‪hierarchy.set_link_color_palette‬‬
‫)]'‪(['blue','green','red','yellow','brown','purple','orange','pink','black‬‬

‫‪import matplotlib.pyplot as plt # used for general visualizations‬‬

‫الربجمة األ اهية للن�سو�ض ‪Text ec ori tion‬‬


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

‫‪vectorizer = TfidfVectorizer(min_df=10) # apply tf-idf vectorization, ignore words that‬‬


‫‪appear in more than 10 docs.‬‬

‫‪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‬‬

‫االآن حُتوَّلت بيانات الن�س اإىل تن�سيق رقمي متباعد كما اُ�ستخدمت يف الدر�س ال�سابق‪.‬‬

‫‪157‬‬
‫يَ�س��تخدِ م املقط��ع الربجم��ي الت��ايل اأداة ‪ TSENVisualizer‬م��ن مكتب��ة ‪ yellowbrick‬الإ�س��قاط وت�سوي��ر الن�سو���س‬
‫املُمثلة باملتَّجَ هات يف ف�ساء ثنائي االأبعاد‪:‬‬
‫‪%%capture‬‬
‫‪!pip install yellowbrick‬‬
‫‪from yellowbrick.text import TSNEVisualizer‬‬

‫تقلي�ض األأبعاد ‪Dimensionality Re uction‬‬


‫اور الع�سوائي املوزع على �سكل ‪T‬‬ ‫ت�سمن امل‬ ‫يكون تقلي�س االأبعاد مفيدً ا يف العديد من التطبيقات مثل‪:‬‬
‫‪t-Distributed S oc stic Neighbor‬‬
‫(‪Embedding )T-SNE‬‬
‫• ت�سوي��ر البيان��ات عالي��ة االأبع��اد‪ :‬م��ن ال�سع��ب ت�سوي��ر البيانات‬
‫يف ف�س��اء ع��ايل االأبع��اد‪ ،‬ولذل��ك تُق ّل���س االأبع��اد لي�س��هل ت�سوي��ر‬
‫خوارزمي��ة ت�سم��ني املج��اور الع�س��وائي امل��وزَّع عل��ى‬ ‫البيانات وفهمها يف هذه احلالة‪.‬‬
‫�س��كل ‪ )T-SNE( T‬ه��ي خوارزمي��ة تعلُّ��م االآل��ة غ��ر‬ ‫• تب�سيط النموذج‪ :‬النموذج ذو االأبعاد االأقل يكون اأب�سط واأ�سهل‬
‫املوجه املُ�ستخدَ مة لتقلي�س االأبعاد‪.‬‬
‫َّ‬ ‫فهمًا‪ ،‬وي�ستغرق وقتًا اأقل يف عملية التدريب‪.‬‬
‫• حت�س��ني اأداء النم��وذج‪ُ :‬ي�س��اعد تقلي���س االأبع��اد يف التخل���س من‬
‫ح�سن اأداء النموذج‪.‬‬ ‫الت�سوي�س وتكرار البيانات‪ ،‬مما ُي ّ‬
‫جدول  ‪ :3.3‬تقنيات تقلي�ض األأبعاد‬
‫مثال التطبيق العملي‬ ‫الو�سف‬ ‫التقنية‬
‫حتديد اخل�سائ�س حُتد ي��د اخل�سائ���س يت�سم��ن حُتد ي��د حُتت��وي جمموع��ات البيان��ات الطبي��ة عل��ى مئ��ات م��ن‬
‫جممو ع��ة فرعي��ة م��ن اخل�سائ���س اأعمدة البيانات ذات ال�سلة بحالة املري�س‪ .‬مُيكن لعدد‬ ‫(‪Feature‬‬
‫قلي��ل م��ن ه��ذه اخل�سائ���س م�س��اعدة النم��وذج يف‬ ‫‪ )selection‬الرئي�سة‪.‬‬
‫الت�س��خي�س ال�س��ليم حلالة املري�س‪ .‬بينما تكون ال�س��مات‬
‫االأخرى غر مرتبطة بالت�س��خي�س وقد ُت�س��تت النموذج‪،‬‬
‫وحُتدي��د اخل�سائ�س يتجاهل كل اخل�سائ�س باإ�س��تثناء‬
‫االأكر متيزً ا منها‪.‬‬
‫حتويل اخل�سائ�س يت�سم��ن حُتو ي��ل اخل�سائ���س جتمي��ع اإذا تو َّق��ع النم��وذج اإقام��ة املري���س يف امل�ست�س��فى‪ ،‬مُيك��ن‬
‫اخل�سائ���س االأ�سلي��ة اأو حُتويله��ا الإن�س��اء اإن�س��اء خ�سائ���س اإ�سافي��ة للنم��وذج با�س��تخدام‬ ‫(‪Feature‬‬
‫‪ )transformation‬جممو ع��ة جد ي��دة م��ن اخل�سائ���س‪ ،‬اخل�سائ�س احلالية ل�س��جالت احلالة الطبية للمري�س‪.‬‬
‫وا�س��تبدال اخل�سائ���س الرئي�س��ة اإذا مل عل��ى �س��بيل املث��ال‪ ،‬ح�س��اب ع��دد الفحو�س��ات املخربي��ة‬
‫املطلوب��ة عل��ى م��دار االأ�س��بوع املا�س��ي‪ ،‬اأو ع��دد الزي��ارات‬ ‫تكن هناك حاجة اإليها‪.‬‬
‫عل��ى م��دار ال�س��هر املا�س��ي‪ .‬وهن��اك مث��ال اآخ��ر‪ ،‬وه��و‪:‬‬
‫ح�ساب م�ساحة امل�ستطيل باإ�ستخدام ارتفاعه وعر�سه‪.‬‬
‫مُيك��ن له��ذه التقني��ات حُتوي��ل �س��ورة عالي��ة االأبع��اد اإىل‬ ‫تقني�ات التعلُّ�م املت�س�عِّب‪ ،‬مث�ل ت�سم�ني‬ ‫التعلُّم املت�سعِّب‬
‫ف�س��اء منخف���س االأبع��اد م��ع احلف��اظ عل��ى اخل�سائ���س‬ ‫املج�اور الع�س�وائي ا مل�و زَّع عل�ى �س�كل‬ ‫(‪Manifold‬‬
‫والرتكي��ب االأ�سا�س��يني له��ا‪ .‬ونظ�رًا الأن ه��ذا يقل���س م��ن‬ ‫‪ ) T-SNE ( T‬والتقر ي�ب وا الإ�س�قاط‬ ‫‪)learning‬‬
‫امل�س��احة املطلوب��ة‪ ،‬فاإن��ه مُيك��ن تخزي��ن واإر�س��ال ه��ذا‬ ‫املت�س�عِّب املنتظ�م (‪Uniform Manifold‬‬
‫التمثي��ل واإع��ادة بن��اء ال�س��ورة االأ�سلي��ة م��ع خ�س��ارة اأق��ل‬ ‫‪Approximation and Projection‬‬
‫قدر من املعلومات‪.‬‬ ‫املوجه‬
‫‪ ) -UMAP‬هي تقنيات التعلُّم غر َّ‬
‫الت�ي ته�دف اإىل احلف�اظ عل�ى تركي�ب‬
‫البيانات يف الف�ساء منخف�س االأبعاد‪.‬‬
‫‪158‬‬
‫اإح��دى اخل�سائ���س الرئي�س��ة لتقني��ة ت�سم��ني املج��اور الع�س��وائي امل��وزَّع عل��ى �س��كل ‪ )T-SNE( T‬ه��ي حُماول��ة احلف��اظ عل��ى‬
‫الرتكيب املحلي للبيانات قدر االإمكان‪ ،‬حتى تتقارب نقاط البيانات ال�سبيهة يف التمثيل منخف�س االأبعاد‪ ،‬ويتحقق ذلك بتقلي�س‬
‫التباعد بني التوزيعني املحتملني‪ :‬توزيع البيانات عالية االأبعاد‪ ،‬وتوزيع البيانات منخف�سة االأبعاد‪.‬‬
‫م�ستقال‬
‫ً‬ ‫جمموعة بيانات هيئة االإذاعة الربيطانية املُمثلة باملتَّجَ هات تُ�سنَّف بالتاأكيد كبيانات عالية االأبعاد‪ ،‬الأنها تت�سمن بُعدً ا‬
‫اأي عمودًا (‪ )Column‬لكل كلمة فريدة تظهر يف البيانات‪ُ .‬يح�سب العدد االإجمايل لالأبعاد كما يلي‪:‬‬
‫‪print('Number of unique words in the BBC documents vectors:',‬‬
‫)))(‪len(vectorizer.get_feature_names_out‬‬

‫‪Number of unique words in the BBC documents vectors: 5867‬‬

‫يُ�س��تخدَ م املقط��ع الربجم��ي الت��ايل الإ�س��قاط ‪ُ 5,867‬بع��دً ا يف حُموري��ن فق��ط وهم��ا حُم��وري ‪ X‬و ‪ Y‬يف الر�س��م البي��اين‪.‬‬
‫ُي�ستخدَ م املقطع الربجمي التايل لت�سميم ُخمطَّ ط االنت�سار حيث مُيثل كل لون اأحداالأق�سام االإخبارية اخلم�سة‪.‬‬
‫)]'‪tsne = TSNEVisualizer(colors=['blue','green','red','yellow','brown‬‬
‫)‪tsne.fit(text_tfidf,bbc_labels‬‬
‫;)(‪tsne.show‬‬

‫�سكل ‪ :3.18‬اإ�سقاط ت�سمني املجاور الع�سوائي املوزَّع على �سكل ‪)T-SNE( T‬‬

‫�تخدم ه��ذا الت�س��ور قيم��ة ‪( ground-truth‬بيان��ات احلقيق��ة املعتم��دة) من الق�س��م االإخب��اري (‪)News Section‬‬ ‫يَ�س� ِ‬
‫ِ‬
‫يف كل م�س��تند للك�س��ف عن انت�س��ار كل قيمة يف اإ�س��قاط ف�ساء الربجمة االجتاهية ثنائي االأبعاد‪ .‬يو�سح ال�س��كل اأنه على‬
‫الرغ��م م��ن ظه��ور بع���س ال�س��وائب يف فراغ��ات ُحُم� َّددة من ف�س��اء البيانات‪ ،‬اإال اأن االأق�س��ام االإخبارية اخلم�س��ة منف�سلة‬
‫ُح�سنة للحد من هذه ال�سوائب‪.‬‬ ‫ب�سكل جيد‪ .‬و�سن�ستعر�س الحقًا الربجمة االجتاهية امل َّ‬

‫‪159‬‬
‫ميع التكتلي (‪gg o er ti e Clustering )AC‬‬ ‫الت‬
‫امل�ستوى ال�ساد�س‬
‫التجميع التكتلي (‪ )AC‬هو الطريقة االأكر انت�سارًا وفعالي ًة يف هذا الف�ساء‪ ،‬فمن‬
‫امل�ستوى اخلام�س‬ ‫خاللها مُيكن التغلّب على هذا التحدي بتوفر طريقة وا�سحة لتحديد العدد املنا�سب‬
‫امل�ستوى الرابع‬ ‫من العناقيد‪ .‬ي�ستند التجميع التكتلي (‪ )AC‬اإىل منهجية الت�سميم من اأ�سفل اإىل‬
‫امل�ستوى الثالث‬ ‫اأعلى‪ ،‬حيث تبداأ بح�ساب امل�سافة بني كل اأزواج نقاط البيانات‪ ،‬ثم اختيار النقطتني‬
‫امل�ستوى الثاين‬ ‫االأقرب ودجمهما يف عنقود واحد‪ .‬تتكرر هذه العملية حتى تُدمج كل نقاط البيانات‬
‫امل�ستوى االأول‬ ‫يف عنقود واحد‪ ،‬اأو حتى الو�سول اإىل العدد املطلوب من العناقيد‪.‬‬
‫‪a b c d e f g h i‬‬
‫�سكل ‪ :3.19‬التجميع التكتلي (‪)AC‬‬ ‫دالة ()‪Linkage‬‬
‫تُنفِذ لغة البايثون التجميع التكتلي (‪ )AC‬با�ستخدام دالة ()‪.linkage‬‬
‫يجب توفر متغرين لدالة ()‪:linkage‬‬
‫• البيانات الن�سيّة املُمثلة باملتَّجَ هات‪ ،‬ومُيكن ا�ستخدام دالة ()‪ toarray‬لتحويل البيانات اإىل تن�سيق كثيف مُيكن لهذه الدالة‬
‫اأن تتعامل معه‪.‬‬
‫• مقيا���س امل�س��افة الذي يجب ا�س��تخدامه لتحديد العناقيد التي �س�تُدمج اأثناء عملية التجميع التكتلي‪ .‬تتوفر عدة خيارات من‬
‫مقايي���س امل�س��افة لالختيار من بينها وفقًا ملتطلبات وتف�سيالت املُ�س� ِ‬
‫�تخدم‪ ،‬مثل امل�س��افة االإقليدية (‪ ،)Euclidian‬وم�س��افة‬
‫مانهاتن (‪ ...)Manhattan‬اإل ‪ ،‬ولكن يف هذا امل�سروع �ست�ستخدم طريقة وارد (‪ )ward‬القيا�سية‪.‬‬
‫ي�س��تخدم املقط��ع الربجم��ي الت��ايل دال��ة ()‪ linkage‬م��ن االأداة الهرمي��ة (‪ )Hierarchy‬ال��واردة باالأعل��ى لتطبي��ق ه��ذه العملية‬
‫على بيانات هيئة االإذاعة الربيطانية املُمثَّلة باملتَّجَ هات‪:‬‬

‫‪plt.figure() # create a new empty figure‬‬

‫‪# 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‬‬

‫‪# visualize the linkage‬‬


‫)‪hierarchy.dendrogram(linkage_tfidf‬‬

‫‪# show the figure‬‬


‫)(‪plt.show‬‬

‫�سكل ‪ :3.20‬الر�سم ال�سجري الهرمي لبيانات هيئة االإذاعة الربيطانية‬


‫‪160‬‬
‫م�سافة وارد ‪Ward Distance‬‬
‫�تخدم املث��ال اأع��اله طريق��ة وارد (‪ )Ward‬القيا�س��ية لقيا���س امل�س��افة للمتغ��ر الث��اين‪ .‬ت�س��تند م�س��افة وارد (‪)Ward‬‬ ‫يَ�س� ِ‬
‫اإىل مفهوم التباين داخل العنقود‪ ،‬وهو جمموع امل�سافات بني النقاط يف العنقود‪ .‬يف كل تكرار‪ ،‬تُقيِّم الطريقة كل عملية‬
‫دم��ج ممكن��ة بح�س��اب التباي��ن داخ��ل العنق��ود قب��ل عمل ّي��ة الدم��ج‪ ،‬وبعده��ا‪ ،‬ثم تب��داأ عملية الدم��ج التي حُتقِّق اأق��ل ارتفاع‬
‫يف التباي��ن‪ .‬اأظه��رت م�س��افة وارد (‪ )Ward‬نتائ��ج جي��دة يف معاجل��ة البيان��ات الن�س ّي��ة‪ ،‬بالرغ��م م��ن وج��ود العدي��د م��ن‬
‫اخليارات االأخرى‪.‬‬

‫�سكل ‪ :3.21‬مثال على طريقة وارد (‪)Ward‬‬

‫الر�س��م ال�س��جري يف ال�س��كل ‪ 3.20‬يعر���س طريق��ة وا�سح��ة لتحدي��د‬


‫الر�سم ال�س ري (‪:)Dendrogram‬‬ ‫ع��دد العناقي��د‪ .‬يف ه��ذا املث��ال‪ ،‬تق��رتح املكتب��ة ا�س��تخدام ‪ 7‬عناقي��د‪،‬‬
‫الر�س��م ال�س��جري ه��و ر�س��م تخطيط��ي‬ ‫م��ع متيي��ز كل عنق��ود بلون خمتلف‪ .‬قد يتبنى املُ�س� ِ‬
‫�تخدم هذا املُقرتح‬
‫تفر ع��ي يو�س��ح العال ق��ة الهرمي��ة ب��ني‬ ‫�ستخدم الر�سم ال�سجري الختيار رقم خمتلف‪ .‬على �سبيل املثال‪،‬‬ ‫اأو َي ِ‬
‫البيان��ات‪ ،‬وي أات��ي ع��ادة يف �س��ورة اأح��د‬ ‫ُد ِّم��ج اللون��ني االأزرق واالأخ�س��ر يف اآخ��ر خطوة م��ع جمموعة العناقيد‬
‫ُخم َرجات التجميع الهرمي‪.‬‬ ‫ل��كل االأل��وان االأخ��رى‪ .‬وهك��ذا‪� ،‬س��يوؤدي اختي��ار ‪ 6‬عناقي��د اإىل دم��ج‬
‫اللون��ني االأرج��واين والربتق��ايل‪ ،‬بينم��ا اختيار ‪ 5‬عناقيد �س��يوؤدي اإىل‬
‫دمج اللونني االأزرق واالأخ�سر‪.‬‬
‫يتبن��ى املقط��ع الربجم��ي الت��ايل مقرتح��ات االأداة ويَ�س� ِ‬
‫�تخدم اأداة التجمي��ع التكتل��ي م��ن مكتب��ة �س��كلرن (‪)Sklearn‬‬
‫لتق�س��يم املُخطَّ ط ال�س��جري بعد اإن�س��اء العناقيد ال�س��بع‪:‬‬
‫‪AC_tfidf=AgglomerativeClustering(linkage='ward',n_clusters=7) # prepare the tool,‬‬
‫‪set the number of clusters.‬‬

‫‪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‬قيم_ هيئة االإذاعة الربيطانية)‪.‬‬

‫‪161‬‬
‫يَ�س� ِ‬
‫�تخدم املقط��ع الربجم��ي الت��ايل قي��م بيان��ات احلقيق��ة املعتم��دة وثالث��ة دوال خمتلف��ة لت�س��جيل النق��اط م��ن مكتب��ة �س��كلرن‬
‫(‪ )Sklearn‬لتقييم جودة جتميع البيانات‪:‬‬
‫• تك��ون قي��م موؤ�س��ر التجان���س (‪ )Homogeneity Score‬ب��ني ‪ 0‬و ‪ 1‬ومُيك��ن زي��ادة ه��ذه القيم عندم��ا تكون كل النقاط يف كل‬
‫عنقود لها قيمة بيانات احلقيقة املعتمدة‪ .‬وباملثل‪ ،‬يحتوي كل عنقود على نقاط البيانات وحيدة الت�سنيف‪.‬‬
‫• تك��ون قيم��ة موؤ�س��ر ران��د املُع��دل (‪ )Adjusted Rand Score‬ب��ني ‪ -0.5‬و ‪ 1.0‬ومُيك��ن زي��ادة ه��ذه القي��م عندم��ا تق��ع كل‬
‫نقاط البيانات ذات القيم نف�سها يف العنقود نف�سه وكل نقاط البيانات ذات القيم املختلفة يف عناقيد خمتلفة‪.‬‬
‫• تك��ون قيم��ة موؤ�س��ر االكتم��ال (‪ )Completeness Score‬ب��ني ‪ 0‬و ‪ 1‬ومُيك��ن زي��ادة ه��ذه القيم��ة بتعي��ني كل نق��اط البيان��ات‬
‫من ت�سنيف ُحُمدد يف العنقود نف�سه‪.‬‬

‫_‪from sklearn.metrics import homogeneity_score,adjusted_rand‬‬


‫‪score,completeness_score‬‬

‫))‪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‬‬

‫‪Homogeneity score: 0.6224333236569846‬‬ ‫الموؤ�سر اأقرب اإلى ‪ 1‬وهذا يعني اأن مجموعة‬
‫الن�سو�س في العنقود تنتمي اإلى قيمة واحدة‪.‬‬
‫‪Adjusted Rand score: 0.4630492696176891‬‬

‫‪Completeness score: 0.5430590192420555‬‬


‫الموؤ�سر اأقرب اإلى ‪ 1‬وهذا يعني اإن�ساء روابط‬
‫اأف�سل بين العناقيد والقيم؛ ك ٌّل على حده‪.‬‬

‫ال�س��تكمال حُتلي��ل البيان��ات‪ُ ،‬يع��اد جتمي��ع البيان��ات با�س��تخدام ‪ 5‬عناقي��د‪ ،‬بالت�س��اوي م��ع الع��دد احلقيق��ي لقي��م‬
‫‪( ground-truth‬بيانات احلقيقة املعتمدة)‪:‬‬
‫)‪AC_tfidf=AgglomerativeClustering(linkage='ward',n_clusters=5‬‬
‫))(‪AC_tfidf.fit(text_tfidf.toarray‬‬
‫_‪pred_tfidf=AC_tfidf.labels‬‬

‫))‪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‬‬

‫‪Homogeneity score: 0.528836079209762‬‬ ‫نظرًا لقدرة التجميع الهرمي على اإيجاد‬


‫العدد الحقيقي من القيم‪ ،‬وتوفير موؤ�سر‬
‫‪Adjusted Rand score: 0.45628412883628383‬‬ ‫اكتمال اأكثر دقة‪� ،‬ستح�سل على عملية‬
‫‪Completeness score: 0.6075627851312266‬‬ ‫تجميع اأف�سل من حيث تمثيل البيانات‪.‬‬

‫عل��ى الرغ��م م��ن اأن نتائ��ج املوؤ�س��ر تُظه��ر اأن التجمي��ع التكتل��ي با�س��تخدام الربجم��ة االجتاهي��ة لتك��رار امل�سطلح‪-‬تك��رار‬
‫امل ُ�س��تنَد العك�س��ي (‪ )TF-IDF‬حُتقق نتائج معقولة‪ ،‬اإال اأنّه ال يزال باالإمكان حُت�س��ني دقة عملية التجميع‪� .‬س��يو�سح الق�س��م‬
‫التايل كيف مُيكن اأن نحقق نتائج مبهرة با�ستخدام تقنيات الربجمة االجتاهية املُ�ست ِندة على ال�سبكات الع�سبية‪.‬‬
‫‪162‬‬
‫الربجمة األ اهية للكلمات با�ستخدام ال�سبكات الع�سبية‬
‫‪Word ec ori tion with Neural Networks‬‬
‫الربجم��ة االجتاهي��ة لتك��رار امل�سطلح‪-‬تك��رار امل ُ�س��تنَد العك�س��ي (‪ )TF-IDF‬ت�س��تند اإىل ح�س��اب تك��رار الكلم��ات ومعاجلته��ا ع��رب‬
‫املُ�س��تنَدات يف جمموع��ة البيان��ات‪ .‬بالرغ��م م��ن اأن ه��ذا يحق��ق نتائ��ج جي��دة‪ ،‬اإال اأنّ القي��ود الكب��رة تعي��ب الطرائ��ق امل�س��ت ِندة اإىل‬
‫التك��رار‪ .‬فه��ي تتجاه��ل متامً ��ا العالق��ة الداللي��ة ب��ني الكلم��ات‪ .‬عل��ى �س��بيل املث��ال‪ ،‬عل��ى الرغ��م م��ن اأن كلمت��ي ‪( trip‬نزه��ة) و‬
‫االجتاهيّة املُ�ستنِدة اإىل التّكرار �ستتعامل معهما باعتبارهما كلمتان منف�سلتان‬ ‫‪( journey‬رحلة) مرتادفتان‪ ،‬اإال اأنّ الربجمة ّ‬
‫متامً ��ا ولهم��ا خ�سائ���س م�س��تقلة‪ .‬وباملث��ل‪ ،‬بالرغ��م م��ن اأن كلمت��ي ‪( apple‬تفاح��ة) و ‪( fruit‬فاكه��ة) مرتابطت��ان دالل ًي��ا؛ الأن‬
‫أي�سا‪.‬‬
‫التفاح نوع من الفاكهة اإال اأنّ ذلك لن يوؤخذ بعني االعتبار ا ً‬
‫توؤثر هذه القيود كثرًا على التطبيقات التي ت�ستخدم هذا النوع من الربجمة االجتاهية‪ .‬فكِّر يف اجلملتني التاليتني‪:‬‬
‫• ‪( I have a very high fever، so I have to visit a doctor‬لديّ حمّى �سديدة‪ ،‬ويجب عليّ زيارة الطبيب)‪.‬‬
‫• ‪My body temperature has risen significantly، so I need to see a healthcare professional‬‬
‫(ارتفعت درجة حرارة ج�سمي كثرًا‪ ،‬ويجب عليّ زيارة اأخ�سائي الرعاية ال�سحية)‪.‬‬
‫بالرغ��م م��ن اأن اجلملت��ني ت�سف��ان احلال��ة نف�س��ها اإال اأنهم��ا ال تت�س��اركان اأي كلم��ات داللي��ة‪ .‬ولذلك‪� ،‬ستف�س��ل خوارزميات‬
‫التجميع املُ�ست ِندة اإىل تكرار امل�سطلح‪-‬تكرار امل ُ�ستنَد العك�سي (‪ )TF-IDF‬اأو اأي برجمة اجتاهية (ت�ستند اإىل التكرار)‬
‫يف روؤية الت�سابه بني الكلمات‪ ،‬ومن املحتمل اأال ت�سعها يف نف�س العنقود‪.‬‬
‫الكلمات املُ�ستبعَدة (‪:)Stopwords‬‬ ‫َ ه ‪Word2Vec‬‬ ‫منوذج الكلمة اإىل امل َّت‬
‫الكلم��ات املُ�س��تبعَدة ه��ي كلم��ات �س��ائعة يف‬ ‫مُيك��ن معاجل��ة ه��ذه القي��ود بالطرائق الت��ي تاأخذ بعني االعتبار الت�س��ابه‬
‫اللغ��ات تُ�س��تبعد ع��اد ًة اأثن��اء املعاجل��ة املُ�س �بَقة‬ ‫ال��داليل ب��ني الكلم��ات‪ .‬اإح��دى الط��رق ال�س��هرة املُتبع��ة يف ه��ذا ال�س��دد‬
‫للن�سو ���س �سم��ن مه��ام معا جل��ة اللغ��ات‬ ‫�تخدم بُني��ة‬‫ه��ي ��وذج الكلم��ة اإىل املتَّجَ ��ه (‪ )Word2Vec‬الت��ي تَ�س� ِ‬
‫الطبيعي��ة (‪ )NPL‬مث��ل الربجم��ة االجتاهي��ة‬ ‫تَ�س��تنِد اإىل ال�س��بكات الع�سبي��ة‪ .‬يَ�س��تنِد ��وذج الكلم��ة اإىل املتَّجَ ��ه‬
‫للكلمات‪ .‬هذه الكلمات ت�س��مل اأدوات التعريف‪،‬‬ ‫(‪ )Word2Vec‬اإىل فك��رة اأن الكلم��ات املت�س��ابهة دالل ًي��ا ُحُت��اط بكلمات‬
‫وح��روف العط��ف‪ ،‬وح��روف اجل��ر‪ ،‬والكلم��ات‬ ‫مماثل��ة يف ال�س��ياق نف�س��ه‪ .‬ولذل��ك‪ ،‬جن��د ال�س��بكات الع�سبي��ة ت�س��تخدم‬
‫الت��ي ال تك��ون مفي��دة لتحدي��د معن��ى الن� ّ��س‪ ،‬اأو‬ ‫الت�سم��ني اخلف��ي ل��كل كلم��ة للتنبوؤ بال�س��ياق‪ ،‬مع �سرورة اإن�س��اء الروابط‬
‫�سياقه‪.‬‬ ‫ب��ني الكلم��ات والت�سمين��ات ال�س��بيهة‪ .‬عمل ًي��ا‪ ،‬يخ�سع ��وذج الكلمة اإىل‬
‫املتَّجَ ��ه (‪ )Word2Vec‬للتدري��ب املُ�س�بَق عل��ى ماليني املُ�س��تنَدات لتعلُّم‬
‫الت�سمن (‪:)Embedding‬‬ ‫الت�سم��ني ع��ايل الدق��ة للكلم��ات‪ .‬مُيك��ن حُتمي��ل النم��اذج املُد َّربة م�س� َبقًا‬
‫وا�س��تخدامها يف التطبيق��ات املُ�س��تنِدة اإىل الن�سو���س‪ .‬يَ�س��تخدِ م املقطع‬
‫الت�سم��ني ُيع� ِّ�رب ع��ن الكلم��ات اأو الرم��وز يف‬ ‫الربجم��ي الت��ايل مكتب��ة جين�س��م (‪ )Gensim‬لتحمي��ل من��وذج �س��هر‬
‫ف�س��اء امل َّت َج��ه امل�س��تمر حي��ث ترتب��ط الكلم��ات‬ ‫ُم��د َّر ب م�س � َبقًا عل��ى جممو ع��ة كب��رة ج��دً ا م��ن اأخب��ار قو ق��ل‬
‫املت�سابهة دالليًا مع النقاط القريبة‪.‬‬ ‫(‪:)Google News‬‬
‫‪import gensim.downloader as api‬‬
‫)'‪model_wv = api.load('word2vec-google-news-300‬‬
‫هذا النموذج يربط كل كلمة‬ ‫]'‪fox_emb=model_wv['fox‬‬
‫بت�سمين مكوّن من ‪ُ 300‬بعد‪.‬‬ ‫))‪print(len(fox_emb‬‬

‫‪300‬‬

‫‪163‬‬
‫االأبعاد الع�سرة االأوىل للت�سمني العددي لكلمة ‪( fox‬ثعلب) مو�سحة باالأ�سفل‪:‬‬
‫]‪fox_emb[:10‬‬

‫‪array([-0.08203125, -0.01379395, -0.3125‬‬ ‫‪, -0.04125977,‬‬ ‫‪0.05493164,‬‬


‫‪-0.12988281, -0.10107422, -0.00164795,‬‬ ‫‪0.15917969,‬‬ ‫‪0.12402344],‬‬
‫)‪dtype=float32‬‬

‫يَ�س� ِ‬
‫�تخدم النم��وذج ت�سمين��ات الكلم��ات لتقيي��م درج��ة الت�س��ابه‪ .‬ف ِّك��ر يف املث��ال الت��ايل حي��ث تُظه��ر املقارن��ة ب��ني كلم��ة ‪car‬‬
‫(ال�سيارة) والكلمات االأخرى درجة الت�سابة من خالل تناق�س قيم الت�سابة‪ .‬عل ًما باأن قيم الت�سابه تقع دومً ا بني ‪ 0‬و ‪.1‬‬

‫[ = ‪pairs‬‬
‫‪('car', 'minivan'),‬‬
‫‪('car', 'bicycle'),‬‬
‫‪('car', 'airplane'),‬‬
‫‪('car', 'street'),‬‬
‫‪('car', 'apple'),‬‬
‫]‬
‫‪for w1, w2 in pairs:‬‬
‫))‪print(w1, w2, model_wv.similarity(w1, w2‬‬

‫‪car minivan 0.69070363‬‬


‫‪car bicycle 0.5364484‬‬
‫‪car airplane 0.42435578‬‬
‫‪car street 0.33141237‬‬
‫‪car apple 0.12830706‬‬

‫ُمُيكن ا�ستخدام املقطع الربجمي التايل للعثور على الكلمات اخلم�سة امل�سابهة الإحدى الكلمات‪:‬‬
‫))‪print(model_wv.most_similar(positive=['apple'], topn=5‬‬

‫‪[('apples', 0.720359742641449), ('pear', 0.6450697183609009),‬‬


‫‪('fruit', 0.6410146355628967), ('berry', 0.6302295327186584), ('pears',‬‬
‫])‪0.613396167755127‬‬

‫ُمُيكن ا�ستخدام الت�سوير يف التحقق من �سحة ت�سمينات هذا النموذج املُدرَّب مُ�سبقًا‪ُ ،‬ومُيكن حُتقيق ذلك عرب‪:‬‬
‫• حُتديد مناذج الكلمات من جمموعة بيانات هيئة االإذاعة الربيطانية‪.‬‬
‫• ا�س��تخدام ت�سم��ني املج��اور الع�س��وائي امل��وزَّع عل��ى �س��كل ‪ )T-SNE( T‬لتخفي���س الت�سم��ني ذي ال � ‪ 300‬بع� ٍ�د ل��كل‬
‫كلمة اإىل نقطة ثنائية االأبعاد‪.‬‬
‫• ت�سوير النقاط يف ُخم َّطط االنت�سار يف الف�ساء ثنائي االأبعاد‪.‬‬

‫‪164‬‬
%%capture
import nltk # import the nltk library for nlp.
import re # import the re library for regular expressions.
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.

# download the 'stopwords' tool from the nltk library. It includes very common words for different
languages
nltk.download('stopwords')

from nltk.corpus import stopwords # import the 'stopwords' tool.

stop=set(stopwords.words('english')) # load the set of english stopwords.

‫حدد‬
ِّ ‫ ُي‬.‫تُ�س��تخدَ م الدال��ة االآتي��ة الح ًق��ا لتحدي��د عين��ة من الكلمات التمثيلية من جمموعة بيانات هيئ��ة االإذاعة الربيطانية‬
‫املقط��ع الربجم��ي الكلم��ات اخلم�س��ني االأك��ر تك��رارًا عل��ى وج��ه التحدي��د م��ن االأق�س��ام االإخباري��ة اخلم�س��ة لهيئ��ة االإذاعة‬
‫) وه��ي الكلمات االإجنليزية ال�س��ائعة ج��دً ا والكلمات التي مل‬Stopwords( ‫الربيطاني��ة م��ع ا�س��تثناء الكلم��ات امل ُ�س��تبعَدة‬
.‫) املُدرَّب م�سبقًا‬Word2Vec( ‫تُ�س َّمن يف وذج الكلمة اإىل املتَّجَ ه‬

def get_sample(bbc_docs:list,
bbc_labels:list
‫بع�س الكلمات االإ ليزية ال�سائعة التي تعترب كلمات مُ�ستبعَدة‬
): .)‫ (يكونون‬are ‫ (يكون) و‬is ‫ (ال) و‬the ‫ (اأ) و‬a ‫) هي‬Stopwords(
word_sample=set() # a sample of words from the BBC dataset

# for each BBC news section


for label in ['business', 'entertainment', 'politics', 'sport', 'tech']:

# 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))
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
word in model_wv]

cnt=Counter(label_words) # count the frequency of each word in this news section.

# 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)

word_sample=list(word_sample) # convert the set to a list.


return word_sample

word_sample=get_sample(bbc_docs,bbc_labels)

165
‫واأخ �رًا‪� ،‬ستَ�س� ِ‬
‫�تخدم طريق��ة ت�سم��ني املج��اور الع�س��وائي امل��وزَّع عل��ى �س��كل ‪ )T-SNE( T‬لتخفي���س الت�سمين��ات ذات‬
‫بعد للكلمات يف العينة �سمن النقاط ثنائية االأبعاد‪ .‬بعدها‪ُ ،‬متثَّل النقاط يف ُخمطَّ ط انت�سار ب�سيط‪.‬‬‫ال� ‪ٍ 300‬‬

‫�سكل ‪ :3.22‬متثيل الكلمات االأكر تكرارًا من جمموعة بيانات هيئة االإذاعة الربيطانية‬

‫يُثب��ت املُخطَّ ��ط اأن ت�سمين��ات ��وذج الكلم��ة اإىل املتَّجَ ��ه (‪ )Word2Vec‬ت�س��تنبط االرتباط��ات الداللي��ة ب��ني الكلم��ات‪ ،‬كم��ا‬
‫يت�سح من جمموعات الكلمات الوا�سحة مثل‪:‬‬
‫• ‪( economy‬االقت�س��اد)‪( economic،‬االقت�سادي��ة)‪( business ،‬االأعم��ال)‪( financial ،‬املالي��ة)‪( sales ،‬املبيعات)‪،‬‬
‫‪( bank‬امل�سرف)‪( firm ،‬ال�سركة)‪( firms ،‬ال�سركات)‪.‬‬
‫• ‪( Internet‬االإنرتن��ت)‪( mobile ،‬الهات��ف املحم��ول)‪( phones ،‬الهوات��ف)‪( phone ،‬الهات��ف)‪broadband ،‬‬
‫(النطاق العري�س)‪( online ،‬مت�سل)‪( digital ،‬رقمي)‪.‬‬
‫• ‪( actor‬ممث��ل)‪( actress ،‬ممثل��ة)‪( film ،‬فيل��م)‪( comedy ،‬كومي��دي)‪( films ،‬اأف��الم)‪(festival ،‬مهرج��ان)‪،‬‬
‫‪( band‬فرقة)‪( movie ،‬فيلم)‪.‬‬
‫• ‪( game‬لعب��ة)‪( team ،‬فري��ق)‪( match ،‬مب��اراة)‪( players ،‬العب��ون)‪( coach ،‬م��درِّب)‪( injury ،‬اإ�ساب��ة)‪،‬‬
‫‪( club‬نادي)‪( rugby ،‬الرجبي)‪.‬‬
‫‪166‬‬
‫الربجمة األ اهية لل ُ مل با�ستخدام التعلُّم العميق‬
‫‪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‬‬
‫ُ مل واملحوألت ‪Sentence_transformers Library‬‬ ‫مكتبة ا‬
‫جلم��ل واملح��والت (‪ )sentence_transformers‬الوظائ��ف الكامل��ة لنم��وذج متثي��الت ترمي��ز ا ُ‬
‫جلم��ل‬ ‫تُطب��ق مكتب��ة ا ُ‬
‫ثنائي��ة اال ��ا م��ن املح��والت (‪ .)SBERT‬تاأت��ي املكتب��ة بالعدي��د م��ن من��اذج متثي��الت ترمي��ز ا ُ‬
‫جلم��ل ثنائي��ة اال ��ا‬
‫م��ن املح��والت (‪ )SBERT‬املُد َّرب��ة ُم�س��بقًا؛ ك ٌل منه��ا ُم��د َّرب عل��ى جمموع��ة بيان��ات خمتلف��ة ولتحقي��ق اأه��داف خمتلف��ة‪.‬‬
‫يعمل املقطع الربجمي التايل على حُتميل اأحد النماذج العامة ال�س��هرة املُد َّربة ُم�س��بقًا‪ ،‬وي�س��تخدمها الإن�س��اء ت�سمينات‬
‫للم�ستندات يف جمموعة بيانات هيئة االإذاعة الربيطانية‪:‬‬
‫‪%%capture‬‬
‫‪!pip install sentence_transformers‬‬
‫‪from sentence_transformers import SentenceTransformer‬‬

‫‪model = SentenceTransformer('all-MiniLM-L6-v2') # load the pre-trained model.‬‬

‫‪text_emb = model.encode(bbc_docs) # embed the BBC documents.‬‬

‫‪167‬‬
‫لق��د ا�س��تخدمت يف وق��ت �س��ابق يف ه��ذه الوح��دة اأداة ت�سم��ني املج��اور الع�س��وائي امل��وزع عل��ى �س��كل ‪ T‬والت��ي ه��ي‬
‫(‪ ،)TSNEVisualizer‬لت�سوي��ر املُ�س��تندات املُمثل��ة باملتُّجَ ه��ات املُنتج��ة با�س��تخدام اأداة تك��رار امل�سطلح‪-‬تكرار امل�س��تند‬
‫العك�س��ي (‪ .)TF-IDF‬مُيكن االآن ا�س��تخدامها للت�سمينات املُنتَجة بوا�س��طة متثيالت ترميز اجلُمل ثنائية اال ا من‬
‫املحوالت (‪:)SBERT‬‬
‫)]'‪tsne = TSNEVisualizer(colors=['blue','green','red','yellow','brown‬‬
‫)‪tsne.fit(text_emb,bbc_labels‬‬
‫;)(‪tsne.show‬‬

‫�سكل ‪ :3.23‬اإ�سقاط ت�سمني املجاور الع�سوائي املوزَّع على �سكل ‪ )T-SNE( T‬للت�سمينات‬
‫املُنتجة بوا�سطة متثيالت ترميز اجلُمل ثنائية االجتاه من املحوالت (‪)SBERT‬‬
‫اأك��ر و�سوحً ��ا‬
‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ )SBERT‬ت �وؤدي اإىل ف�س��لٍ‬ ‫يو�س��ح ال�س��كل اأن متثي��الت ترمي��ز ا ُ‬
‫لالأق�س��ام االإخباري��ة املختلف��ة م��ع ع��دد اأق��ل م��ن ال�س��وائب م��ن تك��رار امل�سطلح‪-‬تك��رار امل ُ�س��تنَد العك�س��ي (‪.)TF-IDF‬‬
‫اخلطوة التالية هي ا�ستخدام الت�سمينات لتدريب خوارزمية التجميع التكتلي‪:‬‬
‫‪plt.figure() # create a new figure.‬‬

‫‪# iteratively merge points and clusters until all points belong to a single cluster. Return the the linkage of‬‬
‫‪the produced tree.‬‬
‫)'‪linkage_emb=hierarchy.linkage(text_emb, method='ward‬‬

‫‪hierarchy.dendrogram(linkage_emb) # visualize the linkage.‬‬


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

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

‫)‪AC_emb=AgglomerativeClustering(linkage='ward',n_clusters=4‬‬
‫)‪AC_emb.fit(text_emb‬‬
‫_‪pred_emb=AC_emb.labels‬‬

‫))‪print('\nHomogeneity score:',homogeneity_score(bbc_labels,pred_emb‬‬
‫))‪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‬‬
‫)‪AC_emb.fit(text_emb‬‬
‫_‪pred_emb=AC_emb.labels‬‬

‫))‪print('\nHomogeneity score:',homogeneity_score(bbc_labels,pred_emb‬‬
‫))‪print('\nAdjusted Rand score:',adjusted_rand_score(bbc_labels,pred_emb‬‬
‫))‪print('\nCompleteness score:',completeness_score(bbc_labels,pred_emb‬‬

‫‪Homogeneity score: 0.7865655030556284‬‬

‫‪Adjusted Rand score: 0.8197670431956582‬‬

‫‪Completeness score: 0.7887580797775077‬‬

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

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

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


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

‫‪ 3‬ا�سرح و ائف الربجمة اال اهية ملقيا�س تكرار امل�سطلح‪-‬تكرار امل�ستند العك�سي (‪.)TF-IDF‬‬

‫‪170‬‬
‫ لدي��ك كذل��ك م�سفوف��ة‬.‫' تت�سم��ن م�س��تندًا ن�سي��ا واح �دًا يف كل �س��ف‬Docs' ‫ تدع��ى‬numPy ‫ لدي��ك م�سفوف��ة‬4
‫ اأكم��ل املقط��ع الربجم��ي الت��ا بحي��ث ت�س��تخدم ��وذج متثي��الت ترمي��ز‬.Docs ‫ تت�سم��ن قي��م كل م�س��تند يف‬labels
‫ ث��م ا�س��تخدم‬Docs ‫) املُ��درَّب مُ�س��بقًا حل�س��اب ت�سمين��ات كل الوثائ��ق يف‬SBERT( ‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت‬ ُ ‫ا‬
،‫ لت�سوي��ر الت�سمين��ات يف الف�س��اء ثنائ��ي االأبع��اد‬T ‫ ت�سم��ني املج��اور الع�س��وائي امل��وزَّع عل��ى �س��كل‬TSNEVisualizer ‫اأداة‬
:‫با�ستخدام لون خمتلف لكل واحد من القيم االأربعة املحتملة‬

from sentence_transformers import

from import TSNEVisualizer model = ('all-MiniLM-


L6-v2') # loads the pre-trained model.

docs_emb = model. (Docs) # embeds the docs

tsne = ( =['blue','green','red','yellow'])

tsne. ( , )

tsne.show();

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

import gensim.downloader as
import re

model_wv = . ('word2vec-google-news-300')
old_sentence='My name is John and I like basketball.'
new_sentence=''

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
‫الدر�ض الثالث‬
‫توليد الن�ض‬
‫توليد اللغات الطبيعية (‪Natural Language ener tion )NLG‬‬
‫تولي��د اللغ��ات الطبيعي��ة (‪ )NLG‬ه��و اأح��د ف��روع معاجل��ة اللغ��ات الطبيعي��ة (‪ )NLP‬الت��ي تر ِّك��ز عل��ى تولي��د الن�سو���س الب�س��رية‬
‫با�س��تخدام خوارزمي��ات احلا�س��ب‪ .‬اله��دف م��ن تولي��د اللغ��ات الطبيعي��ة (‪ )NLG‬ه��و تولي��د اللغ��ات املكتوب��ة اأو املنطوق��ة ب�س��ورة‬
‫طبيعي��ة ومفهوم��ة للب�س��ر دون احلاج��ة اإىل تدخ��ل ب�س��ري‪ .‬توج��د العدي��د م��ن املنهجي��ات املختلف��ة لتولي��د اللغ��ات الطبيعي��ة‪ ،‬مث��ل‬
‫املنهجيات املُ�ست ِندة اإىل القوالب‪ ،‬واملُ�ست ِندة اإىل القواعد‪ ،‬واملُ�ستنِدة اإىل تعلُّم االآلة‪.‬‬

‫معا ة اللغات الطبيعية‬


‫(‪:)Natural Language Processing-NLP‬‬ ‫علوم احلا�سب‬
‫معاجل��ة اللغ��ات الطبيعي��ة (‪ )NLP‬ه��و اأح��د ف��روع ال��ذكاء‬
‫اال�سطناع��ي ال��ذي مُين��ح اأجه��زة احلا�س��ب الق��درة عل��ى‬
‫حُماكاة اللغات الب�سرية الطبيعية‪.‬‬
‫معاجلة اللغات‬
‫الطبيعية‬
‫توليد اللغات الطبيعية‬ ‫الذكاء‬ ‫علم اللُغويات‬
‫‪:)Natural Language ener tion‬‬ ‫(‬ ‫اال�سطناعي‬
‫تولي��د اللغ��ات الطبيعي��ة ( ‪ )NLG‬ه��ي عملي��ة تولي��د‬
‫الن�سو�س الب�سرية با�ستخدام الذكاء اال�سطناعي (‪.)AI‬‬ ‫�سكل ‪ُ :3.25‬خمطَّ ط فِنْ (‪ )Venn‬ملعاجلة اللغات الطبيعية (‪)NLP‬‬

‫جدول  ‪ :3.4‬تاأثري توليد اللغات الطبيعية‬

‫يُ�س��تخدم تولي��د اللغ��ات الطبيعي��ة (‪ )NLG‬لتولي��د املق��االت والتقاري��ر االإخباري��ة‪ ،‬واملحتوى‬


‫املكتوب اآليًا مما يوفّر الوقت‪ ،‬وي�ساعد االأ�سخا�س يف الرتكيز على املهام االإبداعية اأو املهام‬
‫عالية امل�ستوى‪.‬‬

‫مُيكن اال�ستفادة من ذلك يف حُت�سني كفاءة وفعالية روبوت الدرد�سة خلدمة العمالء ومتكينه‬
‫من تقدمي ردود طبيعية ومفيدة الأ�سئلتهم وا�ستف�ساراتهم‪.‬‬

‫مُيك��ن اال�س��تفادة م��ن تولي��د اللغ��ات الطبيعي��ة (‪ )NLG‬يف حُت�س��ني اإمكاني��ة الو�س��ول ل��ذوي‬
‫االإعاق��ة اأو ل��ذوي احلواج��ز اللغوي��ة‪ ،‬بتمكينه��م م��ن التوا�س��ل م��ع االآالت بطريق��ة طبيعي��ة‬
‫وبديهية تنا�سبهم‪.‬‬

‫‪172‬‬
‫هناك اأربع اأنواع من توليد اللغات الطبيعية (‪:)NLG‬‬
‫تولي��د اللغ��ات الطبيعي��ة املبن��ي عل��ى القوال��ب تولي��د اللغ��ات الطبيعي��ة املبن��ي عل��ى األختي��ار‬
‫‪Se ection se‬‬ ‫‪Template-Based NLG‬‬
‫املبني على االختيار حُتديد جمموعة‬ ‫يت�سمن توليد اللغات الطبيعية ّ‬ ‫يت�سم�ن تولي�د اللغ�ات الطبيعي�ة املبن ّ�ي عل�ى القوال�ب ا�س�تخدام‬
‫للن�س االأ�سلي االأكرب‬
‫جلمل اأو الفقرات الإن�ساء ملخّ �س ّ‬ ‫فرعية من ا ُ‬ ‫قوال�ب ُحُم� َّددة ُم�س�بقًا حُت�دد بنية وحُمت�وى الن�س املتولِّ�د‪ .‬تُزَ وّد‬
‫ن�سو�س��ا جدي��دة‪ ،‬اإال‬
‫ً‬ ‫حج ًم��ا‪ .‬بالرغ��م م��ن اأن ه��ذه املنهجي��ة ال تُو ِّل��د‬ ‫ه�ذه القوال�ب مبعلوم�ات ُحُم َّددة لتوليد الن�س النهائي‪ُ .‬تع ُّد هذه‬
‫اأنه��ا ُمطب َّق��ة عمل ًي��ا على نطاق وا�س��ع؛ وذلك الأ ّنه��ا تاأخذ العينات من‬ ‫املنهجية ب�سيطة ن�سبيًا وحُتقق فعالية يف توليد الن�سو�س للمهام‬
‫جلم��ل املكتوب��ة بوا�س��طة الب�س��ر‪ ،‬مُيك��ن احل��د م��ن‬ ‫جمموع��ة م��ن ا ُ‬ ‫املُح� َّددة واملُع َّرف�ة جي�دً ا‪ .‬م�ن ناحية اأخرى‪ ،‬ق�د تواجه �سعوبة مع‬
‫خماط��رة تولي��د الن�سو���س غ��ر املُتنب��ئ به��ا اأو �سعيف��ة البني��ة‪ .‬على‬ ‫امله�ام املفتوح�ة اأو امله�ام التي تتطلب درجة عالية من التباين يف‬
‫�س��بيل املث��ال‪ُ ،‬مو ِّل��د تقري��ر الطق���س املبن� ّ�ي عل��ى االختي��ار ق��د ي�س��م‬ ‫الن��س املُ َولَّ�د‪ .‬عل�ى �س�بيل املثال‪ ،‬قالب تقرير حالة الطق��س رمبا‬
‫قاع��دة بيان��ات م��ن العب��ارات مث��ل‪( It is hot outside :‬الطق���س‬ ‫يبدو كما يلي‪Today in [city]، it is [temperature] degrees :‬‬
‫ح��ار باخل��ارج)‪ ،‬و ‪( The temperature is rising‬درج��ة احل��رارة‬ ‫‪( with [weather condition].‬الي�وم يف [املدين�ة]‪ ،‬درج�ة‬
‫ترتفع)‪ ،‬و ‪( Expect sunny skies‬تنبوؤات بطق�س ُم�سم�س)‪.‬‬ ‫احلرارة هي [درجة احلرارة] مئوية و [حالة الطق�س]‪.).‬‬
‫تولي��د اللغ��ات الطبيعي��ة املبن��ي عل��ى القواع��د توليد اللغات الطبيعية املبني على تعلُّم األلة‬
‫‪Machine Learning-Based NLG‬‬ ‫‪Rule-Based NLG‬‬
‫املبني على تعلُّم االآلة تدريب منوذج‬
‫يت�سمن ت�وليد اللغات الطبيعية ّ‬ ‫يَ�س��تخدِ م تولي��د اللغ��ات الطبيعي��ة املبن� ّ�ي عل��ى القواع��د جمموع��ة‬
‫تعلُّ��م االآل��ة عل��ى جمموع��ة كب��رة م��ن بيان��ات الن�سو���س الب�س��رية‪.‬‬ ‫م��ن القواع��د املُح � َّددة مُ�س��بقًا لتولي��د الن���س‪ .‬ق��د حُت��دد ه��ذه‬
‫يتع ّل��م النم��وذج اأمن��اط الن� ّ��س وبنيت��ه‪ ،‬وم��ن ث��م مُيكن��ه تولي��د الن�س‬ ‫جلم��ل‪ ،‬اأو‬
‫القواع��د طريق��ة جتمي��ع الكلم��ات والعب��ارات لت�س��كيل ا ُ‬
‫اجلديد الذي ي�سبه الن�س الب�سري يف االأ�سلوب واملحتوى‪ .‬قد تكون‬ ‫�تخدمة في��ه‪ .‬ع��اد ًة‬
‫كيفي��ة اختي��ار الكلم��ات وف ًق��ا لل�س��ياق املُ�س� َ‬
‫املنهجي��ة اأك��ر فعالي��ة يف املهام التي تتطلب درجة عالية من التباين‬ ‫ُت�س��تخدم ه��ذه القواع��د لت�سمي��م روب��وت الدرد�س��ة خلدم��ة‬
‫يف الن���س املُو َّل��د‪ .‬وق��د تتطل��ب املنهجي��ة جمموعات اأك��رب من بيانات‬ ‫العم��الء‪ .‬ق��د يك��ون م��ن ال�س��هل تطبي��ق االأنظم��ة املبني��ة عل��ى‬
‫التدريب واملوارد احل�سابية‪.‬‬ ‫القواعد‪ .‬ويف بع�س االأحيان قد تت�سم باجلمود وال ُتولِّد ُخم َرجات‬
‫تبدو طبيعية‪.‬‬
‫ا�ستخدام توليد اللغات الطبيعية املبني على القوالب ‪Using Template-Based NLG‬‬
‫فعاال يف توليد الن�سو�س للمهام املُح َّددة واملُع َّرفة مثل اإن�ساء التقارير‬ ‫املبني على القوالب ب�سيط ن�سبيًا وقد يكون ً‬ ‫توليد اللغات الطبيعية ّ‬
‫اأو تو�سي��ف البيان��ات‪ .‬اإح��دى ممي��زات تولي��د اللغ��ات الطبيعي��ة املبن� ّ�ي عل��ى القوال��ب ه��و �س��هولة التطبي��ق وال�سيان��ة‪ُ .‬ي�س ِّم��م االأ�س��خا�س‬
‫القوال��ب‪ ،‬دون احلاج��ة اإىل خوارزمي��ات تعلُّ��م االآل��ة املُعق� َ�دة اأو جمموعات كبرة من بيانات التدريب‪ .‬وهذا يجعل توليد اللغات الطبيعية‬
‫ن�س حُم ّددين‪ ،‬دون احلاج��ة اإىل اإجراء تغيرات كبرة‪.‬‬ ‫املبن� ّ�ي عل��ى القوال��ب ه��و اخلي��ار املنا�س��ب للمه��ام التي تك��ون ذات بنية وحُمتوى ّ‬
‫تَ�س��تنِد قوالب توليد اللغات الطبيعية (‪ )NLG‬اإىل اأي ُبنية لغوية ُحُم َّددة ُم�س��بقًا‪ .‬اإحدى املمار�س��ات ال�س��ائعة هي اإن�س��اء القوالب التي‬
‫تتطلب كلمات بو�سوم حُمددة كجزء من الكالم الإدراجها يف الفراغات املُح َّددة �سمن اجلملة‪.‬‬
‫و�سوم اأق�سام الكالم ‪Part of Speech )POS( Tags‬‬
‫‪PRON‬‬ ‫‪VERB‬‬ ‫‪DET‬‬ ‫‪ADJ‬‬ ‫‪NOUN‬‬
‫و�س�وم اأق�س�ام ال�كالم (‪ ،)Part Of Speech‬الت�ي ُتع� َّرف كذل�ك با�س�م‬
‫ُخ�س��س للكلم�ات يف الن��س لالإ�س�ارة اإىل البن�اء‬ ‫و�س�وم ‪ POS‬ه�ي قي�م ت َّ‬
‫‪I‬‬ ‫‪want‬‬ ‫‪an‬‬ ‫‪early‬‬ ‫‪upgrade‬‬ ‫النح�وي للكلم�ات‪ ،‬اأو ج�زء ال�كالم يف اجلمل�ة‪ .‬على �س�بيل املثال‪ ،‬قد تكون‬
‫�سكل ‪ :3.26‬مثال على عملية و�سم اأق�سام الكالم‬ ‫فعال اأو �سف ًة اأو ظرفًا‪ ،‬اإل ‪ ،‬وتُ�ستخدَ م و�سوم اأق�سام الكالم‬
‫الكلمة ا�سمًا اأو ً‬
‫الن�س وفهم معناه‪.‬‬‫يف معاجلة اللغات الطبيعية (‪ )NLP‬لتحليل بنية ّ‬
‫‪173‬‬
‫ُ مل ‪Syntax Analysis‬‬ ‫ليل بِناء ا‬
‫ُي�ستخدم حُتليل ِبناء اجلُمل عاد ًة اإىل جانب و�سوم اأق�سام الكالم (‪ )POS‬يف توليد اللغات الطبيعية ّ‬
‫املبني على القوالب ل�سمان‬
‫جلم��ل‪ ،‬والعالقات‬
‫جلم��ل التع�رّف عل��ى اأجزاء ال��كالم يف ا ُ‬
‫ق��درة القوال��ب عل��ى تولي��د الن�سو���س الواقعي��ة‪ .‬يت�سم��ن حُتلي��ل ِبن��اء ا ُ‬
‫جلملة اأنواعً ا خمتلفة من عنا�سر بناء اجلُملة‪ .‬مثل ‪:‬‬ ‫للجملة‪ .‬تت�سمن ا ُ‬ ‫بينها لتحديد البناء النحوي ُ‬
‫جلملة الذي يحتوي على الفعل‪ .‬وهو عاد ًة يعرب عمّا يقوم به الفاعل اأو عمّا يحدث‪.‬‬ ‫• الفعل (‪ )Predicate‬هو ق�سم ا ُ‬
‫جلملة الذي ُينفّذ الفعل‪.‬‬ ‫• الفاعل (‪ )Subject‬هو ق�سم ا ُ‬
‫• املفعول به (‪ )Direct Object‬هو ا�سم اأو �سمر ي�سر اإىل ال�سخ�س اأو ال�سيء الذي يتاأثر مبا�سر ًة بالفعل‪.‬‬
‫جلم��ل لعر���س بع���س‬
‫يَ�س��تخدِ م املقط��ع الربجم��ي الت��ايل مكتب��ة وون��درووردز (‪ )Wonderwords‬الت��ي تتب��ع منهجي��ة ِبن��اء ا ُ‬
‫املبني على القوالب‪.‬‬
‫االأمثلة على توليد اللغات الطبيعية ّ‬
‫‪%%capture‬‬

‫‪!pip install wonderwords‬‬


‫‪# used to generate template-based randomized sentences‬‬
‫‪from wonderwords.random_sentence import RandomSentence‬‬

‫‪# make a new generator with specific words‬‬


‫(‪generator=RandomSentence‬‬
‫‪# specify some nouns‬‬
‫‪nouns=["lion", "rabbit", "horse","table"],‬‬
‫‪verbs=["eat","run","laugh"], # specify some verbs.‬‬
‫‪adjectives=['angry','small']) # specify some adjectives.‬‬

‫])‪# generates a sentence with the following template: [subject (noun)] [predicate (verb‬‬
‫)(‪generator.bare_bone_sentence‬‬

‫'‪'The table runs.‬‬

‫‪# generates a sentence with the following template:‬‬


‫])‪# the [(adjective)] [subject (noun)] [predicate (verb)] [direct object (noun‬‬
‫)(‪generator.sentence‬‬

‫'‪'The small lion runs rabbit.‬‬

‫جلمل وف��ق ُبنية ُحُم َّددة‬


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

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

def paraphrase(text:str, # text to be paraphrased


stop:set, # set of stopwords
model_wv,# Word2Vec Model
lexical_sim_ubound:float, # upper bound on lexical similarity
semantic_sim_lbound:float # lower bound on semantic similarity
):

words=word_tokenize(text) # tokenizes the text to words

new_words=[] # new words that will replace the old ones.

for word in words: # for every word in the text

word_l=word.lower() # lower-case the word.

# if the word is a stopword or is not included in the Word2Vec model, do not try to replace it.
if word_l in stop or word_l not in model_wv:
new_words.append(word) # append the original word

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.
# semantic similarity is always between 0 and 1.
replacement_words=model_wv.most_similar(positive=[word_l],
topn=10)
# for each candidate replacement word
for rword, sem_sim in replacement_words:
# 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

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

175
# quality check: if the chosen candidate is not semantically similar enough to
# the original, then just use the original word.
if sem_sim<semantic_sim_lbound:
new_words.append(word)
else: # use the candidate.
new_words.append(rword)

return ' '.join(new_words) # re-join the new words into a single string and return.

.‫المُخرَج هو اإ�سدار مُعاد �سياغته من الن�س المُدخَ ل‬

‫ ويف املرب��ع االأبي���س‬paraphrase)( ‫يُ�س��تخدَ م املقط��ع الربجم��ي الت��ايل ال�س��تراد كل االأدوات الالزم��ة لدع��م دال��ة‬
:text ‫) للن�س املُ�سند اإىل املتغر‬Paraphrase( ‫ حُت�سل على ُخم َرج طريقة اإعادة ال�سياغة‬،‫اأدناه‬

%%capture

import gensim.downloader as api # used to download and load a pre-trained Word2Vec model
model_wv = api.load('word2vec-google-news-300')

import nltk
# used to split a piece of text into words. Maintains punctuations as separate tokens
from nltk import word_tokenize
nltk.download('stopwords') # downloads the stopwords tool of the nltk library
# used to get list of very common words in different languages
from nltk.corpus import stopwords
stop=set(stopwords.words('english')) # gets the list of english stopwords

!pip install fuzzywuzzy[speedup]


from fuzzywuzzy import fuzz

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
excellent and the steaks were delicious. I will definitely return soon, highly
recommended!'
# parameters: target text, stopwords, Word2Vec model, upper bound on lexical similarity, lower bound
on semantic similarity
paraphrase(text, stop, model_wv, 80, 0.5)

'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
and the tenderloin were delicious. I will certainly rejoin quickly, hugely
advised!'

‫ مُيك��ن حُت�س��ني النتائ��ج باإ�ساف��ة املزي��د م��ن القي��ود لت�سحي��ح بع���س‬،‫كم��ا يف املنهجي��ات االأخ��رى املُ�س��ت ِندة اإىل القوال��ب‬
‫ يو�س��ح املث��ال اأعاله اأن��ه ُمُيكن با�س��تخدام هذه الدالة الب�س��يطة‬،‫ وم��ع ذل��ك‬.‫البدائ��ل االأق��ل و�سو ًح��ا واملذك��ورة يف االأعل��ى‬
.‫توليد ن�سو�س واقعية للغاية‬
176
‫ا�ستخدام توليد اللغات الطبيعية املبني على األختيار‬
‫‪Using Se ection-Based NLG‬‬
‫جلمل الفرعية من وثيقة ُحُم َّددة‪ .‬هذه املنهجية ُجت ِ�سد ا�ستخدام‬‫يف هذا الق�سم‪� ،‬ست�ستعر�س منهجية عملية الختيار منوذج من ا ُ‬
‫املبني على االختيار ي�ستند اإىل لبنتني رئي�سيتني‪:‬‬
‫ومزايا توليد اللغات الطبيعية ّ‬
‫ُ�ستخدم لتحديد اأزواج الكلمات املت�سابهة دالليًا‪.‬‬
‫• وذج الكلمة اإىل املتَّجَ ه (‪ )Word2Vec‬امل َ‬
‫�ستخدمة الإن�ساء ومعاجلة اأنواع خمتلفة من بيانات ال�سبكة‪.‬‬ ‫• مكتبة ‪ Networkx‬ال�سهرة �سمن لغة البايثون املُ َ‬
‫النَّ�س املُدخَ ل الذي �س ُي�ستخدم يف هذا الف�سل هو مقالة اإخبارية نُ�سرت بعد املباراة النهائية لكاأ�س العامل ‪.2022‬‬

‫‪# reads the input document that we want to summarize‬‬


‫)(‪with open('article.txt',encoding='utf8',errors='ignore') as f: text=f.read‬‬

‫‪text[:100] # shows the first 100 characters of the article‬‬

‫‪'It was a consecration, the spiritual overtones entirely appropriate.‬‬


‫' ‪Lionel Messi not only emulated‬‬

‫ُ�ستخدم يف الوحدات ال�سابقة‪:‬‬


‫يف البداية‪ ،‬يُر َّمز الن�س با�ستخدام مكتبة ‪ re‬والتعبر النمطي نف�سه امل َ‬
‫‪import re # used for regular expressions‬‬

‫‪# tokenize the document, ignore stopwords, focus only on words included in the Word2Vec model.‬‬
‫‪tokenized_doc=[word for word in re.findall(r'\b\w\w+\b',text.lower()) if word‬‬
‫]‪not in stop and word in model_wv‬‬

‫‪# get the vocabulary (set of unique words).‬‬


‫)‪vocab=set(tokenized_doc‬‬

‫مكتبة ‪Networkx‬‬
‫مطعم‬ ‫‪2‬‬
‫مُيكن االآن منذجة مفردات املُ�ستنَد يف ُخمطَّ ط موزون (‪.)Weighted Graph‬‬
‫منزل‬ ‫تُوف��ر مكتب��ة ‪ Networkx‬يف لغ��ة البايث��ون جمموع��ة وا�س��عة م��ن االأدوات الإن�س��اء‬
‫رائع‬
‫‪3‬‬ ‫وحُتلي��ل املُخطَّ ط��ات‪ .‬يف تولي��د اللغ��ات الطبيعي��ة املبن� ّ�ي عل��ى االختي��ار‪ُ ،‬ي�س��اعد‬
‫‪2‬‬ ‫‪1‬‬ ‫متثي��ل مف��ردات الوثيق��ة يف ُخمطَّ ��ط م��وزون يف حُتدي��د العالق��ات ب��ني الكلم��ات‬
‫ع�ساء‬
‫‪2‬‬ ‫جلم��ل ذات ال�سل��ة‪ .‬يف املُخطَّ ��ط امل��وزون‪ُ ،‬متث��ل كل‬‫وت�س��هيل اختي��ار العب��ارات وا ُ‬
‫‪2‬‬
‫ُعق��دة كلم� ًة اأو مفهومً ��ا‪ُ ،‬ومتث��ل احل��واف بني ال ُعق��د العالقات بني ه��ذه املفاهيم‪.‬‬
‫املوقع‬ ‫ُتع��رب االأوزان عل��ى احل��واف ع��ن ق��وة ه��ذه العالق��ات‪ ،‬مم��ا ي�س��مح لنظ��ام تولي��د‬
‫لذيذ‬ ‫‪1‬‬
‫اللغ��ات الطبيعي��ة بتحدي��د املفاهي��م االأق��وى ارتبا ًط��ا‪ .‬عن��د تولي��د الن�سو���س‪،‬‬
‫‪3‬‬ ‫جلمل ا�س��تنادًا اإىل العالقات‬ ‫ُي�س��تخدم املُخطَّ ��ط امل��وزون للبح��ث عن العب��ارات وا ُ‬
‫مُو�سي به‬ ‫�ستخدم النظام املُخطَّ ط للبحث عن الكلمات‬ ‫بني الكلمات‪ .‬على �سبيل املثال‪ ،‬قد َي ِ‬
‫والعبارات االأكر ارتباطً ا لو�سف كيان ُحُم َّدد ثم ا�ستخدام هذه الكلمات لتحديد‬
‫جلملة االأكر مالءم ًة من قاعدة بيانات النظام‪.‬‬ ‫ا ُ‬
‫�سكل ‪ :3.27‬مثال على ُخمطَّ ط موزون ل � ‪Networkx‬‬
‫‪177‬‬
‫دالة ()‪Build_graph‬‬
‫تُ�ستخدم دالة ()‪ Build_graph‬مكتبة ‪ NetworkX‬الإن�ساء ُخمطَّ ط يت�سمن‪:‬‬
‫• عُ قدة واحدة لكل كلمة �سمن مفردات حُمددة‪.‬‬
‫• حاف��ة ب��ني كل كلمت��ني‪ .‬ال��وزن عل��ى احلاف��ة ي�س��اوي الت�س��ابه الداليل بني الكلمات‪ ،‬املح�س��وب بوا�س��طة اأداة ‪Doc2Vec‬‬
‫الن�س كم َّت َجه وه��ي تعميم ملنهجية وذج الكلم��ة اإىل املتَّجَ ه‬
‫وه��ي اأداة معاجل��ة اللغ��ات الطبيعي��ة املُخ�س�س��ة لتمثي��ل ّ‬
‫(‪.)Word2Vec‬‬
‫تَر�س��م الدال��ة خمطّ طً ��ا ذا عُ ق��دة واح��دة ل��كل كلم��ة يف املف��ردات املُح َّددة‪ .‬توج��د كذلك حافة بني عُ قدتني اإذا كان ت�س��ابه‬
‫وذج الكلمة اإىل املتَّجَ ه (‪ )Word2Vec‬اأكرب من احلد املُعطى‪.‬‬

‫‪# tool used to create combinations (e.g. pairs, triplets) of the elements in a list‬‬
‫‪from itertools import combinations‬‬
‫‪import networkx as nx # python library for processing graphs‬‬

‫‪def build_graph(vocab:set, # set of unique words‬‬


‫‪model_wv # Word2Vec model‬‬
‫‪):‬‬
‫‪# gets all possible pairs of words in the doc‬‬
‫)‪pairs=combinations(vocab,2‬‬

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

‫‪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‬‬
‫)‪G.add_edge(w1,w2,weight=sim‬‬

‫‪return G‬‬

‫‪# creates a graph for the vocabulary of the World Cup document‬‬
‫)‪G=build_graph(vocab,model_wv‬‬
‫‪# prints the weight of the edge (semantic similarity) between the two words‬‬
‫]'‪G['referee']['goalkeeper‬‬

‫}‪{'weight': 0.40646762‬‬

‫وبالنظ��ر اإىل ذل��ك املُخطَّ ��ط املبن��ي عل��ى الكلم��ة‪ ،‬مُيك��ن‬


‫متثي��ل جمموع��ة م��ن الكلمات املت�س��ابهة دالل ًي��ا يف �سورة‬
‫عناقي��د م��ن ال ُعق��د املت�سل��ة م ًع��ا بوا�س��طة ح��واف عالي��ة‬
‫ال��وزن‪ُ .‬يطل��ق عل��ى عناقي��د ال ُعق��د كذل��ك املجت َمع��ات‬
‫(‪ُ .)Communities‬خم � َرج املُخطَّ ��ط ه��و جمموع��ة‬
‫ب�سيطة من الروؤو�س واحلواف املوزونة‪ .‬مل ُجترى عملية‬
‫التجمي��ع حت��ى االآن الإن�س��اء املجت َمعات‪ .‬يف ال�س��كل ‪3.28‬‬
‫تُ�س��تخدم األ��وان خمتلف��ة لتميي��ز املجت َمع��ات يف املُخطَّ ��ط‬
‫املذكور باملثال ال�سابق‪.‬‬
‫�سكل ‪ :3.28‬املجت َمعات يف املُخطَّ ط‬
‫‪178‬‬
Louvain Algorithm ‫خوارزمية لوفان‬
‫ واحدة م��ن اخليارات‬.‫ العدي��د م��ن اخلوارزمي��ات لتحلي��ل املُخطَّ ��ط والبح��ث ع��ن املجت َمعات‬Networkx ‫تت�سم��ن مكتب��ة‬
‫االأكر فعالية هي خوارزمية لوفان التي تعمل عرب حُتريك ال ُعقد بني املجت َمعات حتى جتد ُبنية املجتمع التي متثل الربط‬
.‫االأف�سل يف ال�سبكة ال�سمنية‬

e co unities)( ‫دالة‬
‫ َحُت�س��ب الدالة كذلك‬.‫املبني عل��ى الكلمات‬
ّ ‫تَ�س��تخدِ م الدال��ة االآتي��ة خوارزمي��ة لوف��ان للبح��ث ع��ن املجت َمع��ات يف املُخطَّ ��ط‬
:‫ ثم تكون املُخ َرجات يف �سورة قامو�سني‬.‫موؤ�سر االأهمية لكل جمتمع على حده‬
.‫ الذي يربط الكلمة باملجتمع‬word_to_community •
.‫ الذي يربط املجتمع بدرجة االأهمية‬community_scores •
5 ‫ اإذا كان املجتم��ع يت�سم��ن ثالث��ة كلم��ات تظهر‬،‫ عل��ى �س��بيل املث��ال‬.‫الدرج��ة ت�س��اوي جمم ��وع تك��رار الكلم��ات يف املجتم��ع‬
‫الن�س الذي‬
ّ ‫ مُيثل املوؤ�س��ر جزءًا من‬،‫ ومن ناحية املفهوم‬.19 ‫ فاإنّ موؤ�سّ ��ر املجتمع حينئذٍ ي�س��اوي‬،‫الن�س‬ ّ ‫ مرات يف‬6‫ و‬8‫و‬
.‫ي�س ُّمه املجتمع‬
ُ
from networkx.algorithms.community import louvain_communities
from collections import Counter # used to count the frequency of elements in a list

def get_communities( G, # the input graph


tokenized_doc:list): # the list of words in a tokenized document

# gets the communities in the graph


communities=louvain_communities(G, weight='weight')
word_cnt=Counter(tokenized_doc)# counts the frequency of each word in the doc

word_to_community={}# maps each word to its community

community_scores={}# maps each community to a frequency score

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)
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.

return word_to_community, community_scores

179
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'

('champion',
'stretch',
'finished',
'fifth',
'playing',
'scoring',
'scorer',
'opening',
'team',
'win')

‫ �ستكون اخلطوة التالية هي ا�ستخدام هذه املعلومات‬،‫ وربط املجتمع مبوؤ�سر االأهمية‬،‫االآن بعد ربط كل الكلمات باملجتمع‬
.‫ مُ�سمَّمة لهذا الغر�س‬evaluate_sentences)( ‫ دالة‬.‫لتقييم اأهمية كل جملة يف املُ�ستنَد االأ�سلي‬

Evaluate_sentences)( ‫دالة‬
.‫ ا�س��تنادًا اإىل الكلم��ات الت��ي تت�سمنه��ا‬،‫ ث��م ح�س��اب موؤ�س��ر االأهمي��ة ل��كل ُجمل��ة‬.‫تب��داأ الدال��ة بتق�س��يم املُ�س��تنَد اإىل ُجم��ل‬
.‫تكت�سب كل كلمة موؤ�سر االأهمية من املجتمع الذي تنتمي اإليه‬
‫ تنتمي��ان‬w2‫ و‬w1 ‫ الكلمت��ان‬.w1، w2، w3، w4، w5 ‫ لدي��ك جمل��ة مكون��ة م��ن خم�س��ة كلم��ات‬،‫عل��ى �س��بيل املث��ال‬
‫ تنتم��ي اإىل‬w5 ‫ والكلم��ة‬،30 ‫ تنتمي��ان اإىل جمتم��ع مبوؤ�س��ر قيمت��ه‬w4‫ و‬w3 ‫ والكلمت��ان‬،25 ‫اإىل جمتم��ع مبوؤ�س��ر قيمت��ه‬
ِ �‫ تَ�س‬.125=15+30+30+25+25 ‫جلم��ل ه��و‬
‫�تخدم الدال��ة بع��د ذل��ك هذه‬ ُ ‫ جمم��وع موؤ�س��رات ا‬.15 ‫جمتم��ع مبوؤ�س��ر قيمت��ه‬
.‫ من االأكر اإىل االأقل اأهمية‬،‫جلمل يف ترتيب تنازيل‬ ُ ‫املوؤ�سرات لت�سنيف ا‬
from nltk import sent_tokenize # used to split a document into sentences

def evaluate_sentences(doc:str, # original document


word_to_community:dict,# maps each word to its community
community_scores:dict, # maps each community to a score
model_wv): # Word2Vec model

# splits the text into sentences


sentences=sent_tokenize(doc)
scored_sentences=[]# stores (sentence, score) tuples

for raw_sent in sentences: # for each sentence

# get all the words in the sentence, ignore stopwords and focus only on words that are in the
Word2Vec model.
sentence_words=[word
for word in re.findall(r'\b\w\w+\b',raw_sent.lower()) # tokenizes
if word not in stop and # ignores stopwords

180
word in model_wv] # ignores words that are not in the Word2Vec model

sentence_score=0 # the score of the sentence

for word in sentence_words: # for each word in the sentence

word_comm=word_to_community[word] # get the community of this word


sentence_score+=community_scores[word_comm] # add the score of this
community to the sentence score.

scored_sentences.append((sentence_score,raw_sent)) # stores this sentence and


its total score

# scores the sentences by their score, in descending order


scored_sentences=sorted(scored_sentences,key=lambda x:x[0],reverse=True)

return scored_sentences

scored_sentences=evaluate_sentences(text,word_to_community,community_
scores,model_wv)
len(scored_sentences)

61

‫جلم��ل الثالث��ة االأك��ر‬


ُ ‫ ويُ�س��تخدَ م املقط��ع الربجم��ي الت��ايل للعث��ور عل��ى ا‬،‫ جُ مل��ة‬61 ‫يت�سم��ن املُ�س��تنَد االأ�سل��ي اإجم��ايل‬
:‫جلمل‬ ُ ‫اأهمية من بني هذه ا‬
for i in range(3):
print(scored_sentences[i],'\n')

(3368, 'Lionel Messi not only emulated the deity of Argentinian football,
Diego Maradona, by leading the nation to World Cup glory; he finally
plugged the burning gap on his CV, winning the one title that has eluded
him – at the fifth time of asking, surely the last time.')

(2880, 'He scored twice in 97 seconds to force extra-time; the first a


penalty, the second a sublime side-on volley and there was a point towards
the end of regulation time when he appeared hell-bent on making sure that
the additional period would not be needed.')

(2528, 'It will go down as surely the finest World Cup final of all time,
the most pulsating, one of the greatest games in history because of how
Kylian Mbappé hauled France up off the canvas towards the end of normal
time.')

181
‫‪print(scored_sentences[-1]) # prints the last sentence with the lowest score‬‬
‫)(‪print‬‬
‫‪print(scored_sentences[30]) # prints a sentence at the middle of the scoring scale‬‬

‫)'‪(0, 'By then it was 2-0.‬‬

‫‪(882, 'Di María won the opening penalty, exploding away from Ousmane‬‬
‫)'‪Dembélé before being caught and Messi did the rest.‬‬

‫جلم��ل االأ�سا�س��ية الت��ي ت�س��تنبط النق��اط الرئي�س��ة يف املُ�س��تنَد االأ�سلي‪ ،‬مع‬


‫النتائ��ج توؤك��د اأن ه��ذه املنهجي��ة ُحُت� ِّ�دد بنج��اح ا ُ‬
‫ملخ�س الأي وثيقة ُحُم َّددة‪.‬‬ ‫ّ‬ ‫لتوليد‬ ‫هي‬ ‫كما‬ ‫نف�سها‬ ‫املنهجية‬ ‫تعيني موؤ�سرات اأقل للجُ مل االأقل داللةً‪ُ .‬تط َّبق‬
‫ا�ستخدام توليد اللغات الطبيعية املبني على القواعد ألإن�ساء روبوت الدرد�سة‬
‫‪Using Rule-Based NLG to Create a Chatbot‬‬
‫يف ه��ذا الق�س��م‪� ،‬س�تُ�س ِّمم روب��وت درد�س��ة (‪ )Chatbot‬وف��ق امل�س��ار املُح� َّدد املو�س��ي ب��ه باجلم��ع ب��ني قواع��د املعرِ ف��ة الرئي�س��ة‬
‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ ،)SBERT‬وي�س��ر ه��ذا اإىل اأن‬ ‫لالأ�س��ئلة واالأجوب��ة والنم��وذج الع�سب��ي متثي��الت ترمي��ز ا ُ‬
‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت (‪ )SBERT‬ل��ه البنية نف�س��ها كما يف متثيالت‬ ‫�تخدم يف متثي��الت ترمي��ز ا ُ‬
‫نق��ل التعلُّ��م املُ�س� َ‬
‫جلمل ثنائية اال ا من املحوالت (‪ all-MiniLM-L6-v2 )SBERT‬و�سوف يه َّياأ ب�سكل دقيق مل ُِه َّمة اأخرى غر حُتليل‬ ‫ترميز ا ُ‬
‫امل�ساعر‪ ،‬وهي‪ :‬توليد اللغات الطبيعية‪.‬‬
‫‪ .1‬ميل منوذج متثيالت ترميز ا ُ مل ثنائية األ اه من املحوألت املُدرَّب مُ�سبقًا‬
‫‪Load the Pre-Trained SBERT Model‬‬
‫اخلطوة االأوىل هي حُتميل منوذج متثيالت ترميز اجلُمل ثنائية اال ا من املحوالت (‪ )SBERT‬املُدرَّب مُ�سبقًا‪:‬‬
‫‪%%capture‬‬
‫‪from sentence_transformers import SentenceTransformer, util‬‬
‫)'‪model_sbert = SentenceTransformer('all-MiniLM-L6-v2‬‬

‫‪ .2‬اإن�ساء قاعدة معرِ فة ب�سيطة ‪Create a Simple Knowledge Base‬‬


‫معرفة ب�س��يطة لتحديد الن�س الربجمي املكون من االأ�س��ئلة واالأجوبة التي ي�س��تخدمها‬ ‫اخلطوة الثانية هي اإن�س��اء قاعدة ِ‬
‫روب��وت الدرد�س��ة‪ .‬يت�سم��ن الن���س الربجم��ي ‪ 4‬اأ�س��ئلة (ال�س �وؤال ‪ 1‬اإىل ‪ )4‬واالأجوب��ة عل��ى كل �س �وؤال (االإجاب��ة ‪ 1‬اإىل‬
‫‪ .)4‬كل اإجاب��ة مكون��ة م��ن جمموع��ة م��ن اخلي��ارات كل خي��ار يتك��ون من قيمتني فق��ط‪ُ ،‬متثِّل القيمة الثانية ال�س�وؤال التايل‬
‫الذي ي�س��تخدمه روبوت الدرد�س��ة‪ .‬اإذا كان هذا هو ال�س�وؤال االأخر‪� ،‬س��ت�سبح القيمة الثانية خالية‪ .‬هذه اخليارات متثل‬
‫االإجاب��ات ال�سحيح��ة املحتمل��ة عل��ى االأ�س��ئلة املعني��ة به��ا‪ .‬عل��ى �س��بيل املث��ال‪ ،‬االإجاب��ة عل��ى ال�س�وؤال الث��اين له��ا خي��اران‬
‫حُمتم��الن [‪"[(]"Java"،None[ and ]"Python"،None‬جاف��ا"‪،‬ال يوج��د] و ["البايث��ون"‪،‬ال يوج��د])‪ .‬كل خي��ار‬
‫ُمكون من قيمتني‪:‬‬
‫• الن�س احلقيقي لالإجابة املقبولة مثل‪( Java :‬جافا) اأو ‪( Courses on Marketing‬دورات تدريبية يف الت�سويق)‪.‬‬
‫• ُمع�رِّف ي�س��ر اإىل ال�س�وؤال الت��ايل ال��ذي �س��يطرحه روب��وت الدرد�س��ة عن��د حُتدي��د ه��ذا اخلي��ار‪ .‬عل��ى �س��بيل املث��ال‪ ،‬اإذا‬
‫�تخدم خي��ار ["‪"[( ]"Courses on Engineering"،"3‬دورات تدريبي��ة يف الهند�س��ة"‪)]"3" ،‬كاإجاب��ة‬ ‫ح � َّدد املُ�س� ِ‬
‫على ال�سوؤال االأول‪ ،‬يكون ال�سوؤال التايل الذي �سيطرحه روبوت الدرد�سة هو ال�سوؤال الثالث‪.‬‬
‫‪182‬‬
.ً‫ وجتعل روبوت الدرد�سة اأكر ذكاء‬،‫مُيكن تو�سيع قاعدة املعرِ فة الب�سيطة لت�سمل م�ستويات اأكر من االأ�سئلة واالأجوبة‬

QA={
"Q1":"What type of courses are you interested in?",
"A1":[["Courses in Computer Programming","2"],
["Courses in Engineering","3"],
["Courses in Marketing","4"]],

"Q2":"What type of Programming Languages are you interested in?",


"A2":[["Java",None],["Python",None]],

"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]]
}

Chat)( ‫دالة‬
‫ يق��راأ روب��وت‬،‫ بع��د ط��رح ال�س�وؤال‬.‫ ملعاجل��ة قاع��دة املعرِ ف��ة وتنفي��ذ روب��وت الدرد�س��ة‬Chat)( ‫�تخدم دال��ة‬
َ �‫ تُ�س‬،‫يف النهاي��ة‬
ِ ‫الدرد�سة رد امل‬
.‫ُ�ستخدم‬
‫ ُيح َّدد ذلك اخليار وينتقل روبوت الدرد�سة‬،‫• اإن كان الرد م�سابهًا دالليًا الأحد خيارات االإجابات املقبولة لهذا ال�سوؤال‬
.‫اإىل ال�سوؤال التايل‬
ِ ‫ ُيطلب من امل‬،‫• اإن مل يت�سابه الرد مع ا ٍأي من اخليارات‬
.‫ُ�ستخدم اإعادة �سياغة الرد‬
‫) لتقيي��م موؤ�س��ر الت�س��ابه ال��داليل ب��ني‬SBERT( ‫جلم��ل ثنائي��ة اال ��ا م��ن املح��والت‬ ُ ‫تُ�س��تخدَ م دال��ة متثي��الت ترمي��ز ا‬
. sim_lbound ‫ ُيع ُّد اخليار مت�سابهًا اإذا كان املوؤ�سر اأعلى من ُمتغر احلد االأدنى‬.‫الرد وكل اخليارات املُر�سَّ حة‬

import numpy as np # used for processing numeric data

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

qa_id='1' # the QA id

while True: # an infinite loop, will break in specific conditions

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


response=input() # reads the user's response

# embed the response


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.

183
candidate_embeddings = model_sbert.encode([x for x,y in candidates],
convert_to_tensor=True)

# gets the similarity score for each candidate


similarity_scores = util.cos_sim(response_embeddings, candidate_
embeddings)

# finds the index of the closest answer.


# np.argmax(L) finds the index of the highest number in a list L
winner_index=np.argmax(similarity_scores[0])

# if the score of the winner is less than the bound, ask again.
if similarity_scores[0][winner_index]<sim_lbound:
print('>> Apologies, I could not understand you. Please rephrase
your response.')
continue

# gets the winner (best candidate answer)


winner=candidates[winner_index]

# prints the winner's text


print('\n>> You have selected:',winner[0])
print()

qa_id=winner[1] # gets the qa_id for this winner

if qa_id==None: # no more questions to ask, exit the loop


print('>> Thank you, I just emailed you a list of courses.')
break

:‫اأنظر اإىل التفاعلني التاليني بني روبوت الدرد�سة واملُ�ستخدِ م‬


‫التفاعل االأول‬
chat(QA,model_sbert, 0.5)

>> What type of courses are you interested in?


marketing courses

>> You have selected: Courses on Marketing


>> What type of Marketing are you interested in?
seo
>> You have selected: Search Engine Optimization

>> Thank you, I just emailed you a list of courses.

ِ � ‫ يفه ��م روب ��وت الدرد�س ��ة اأن املُ�س‬،‫يف التفاع ��ل االأول‬
‫ روب ��وت‬،‫ وكذل ��ك‬.‫�تخدم يبح ��ث ع ��ن دورات تدريبي ��ة يف الت�س ��ويق‬
Search Engine Optimization ‫ ي�س ��به دالل ًي ��ا م�سطل ��ح‬SEO ‫الدرد�س ��ة ذك ��ي بالق ��در ال ��كايف ليفه ��م اأن امل�سطل ��ح‬
.‫(حُت�سني حُمركات البحث) مما يوؤدي اإىل اإنهاء املناق�سة بنجاح‬

184
‫التفاعل الثاين‬
‫)‪chat(QA,model_sbert, 0.5‬‬

‫?‪>> What type of courses are you interested in‬‬


‫‪cooking classes‬‬
‫‪>> Apologies, I could not understand you. Please rephrase your response.‬‬
‫?‪>> What type of courses are you interested in‬‬
‫‪software courses‬‬
‫‪>> You have selected: Courses on Computer Programming‬‬
‫?‪>> What type of Programming Languages are you interested in‬‬
‫‪C++‬‬
‫‪>> You have selected: Java‬‬
‫‪>> Thank you, I just emailed you a list of courses.‬‬

‫يف التفاع��ل الث��اين‪ ،‬يفه��م روب��وت الدرد�س��ة اأن ‪( Cooking Classes‬درو���س الطهي) ال ت�س��به دالل ًي��ا اخليارات املوجودة‬
‫املعرف��ة‪ .‬وه��و ذك��ي بالق��در ال��كايف ليفه��م اأن ‪( Software courses‬ال��دورات التدريبي��ة يف الربجم��ة) يج��ب‬ ‫يف قاع��دة ِ‬
‫اأن ترتب��ط بخي��ار ‪( Courses on Computer Programming‬ال��دورات التدريبي��ة يف برجم��ة احلا�س��ب)‪ .‬اجل��زء‬
‫�تخدم ‪ C++‬و ‪ .Java‬عل��ى‬ ‫االأخ��ر م��ن التفاع��ل ي�س��لط ال�س��وء عل��ى نق��اط ال�سع��ف‪ :‬يرب��ط روب��وت الدرد�س��ة ب��ني رد املُ�س� ِ‬
‫الرغ��م م��ن اأن لغت��ي الربجم��ة مرتبطت��ان بالفع��ل ومُيكن القول باأنهما اأكر ارتباطً ا من لغتي البايثون و ‪ ،C++‬اإال اأن الرد‬
‫املنا�س��ب يجب اأن ُيو�سح اأن روبوت الدرد�س��ة ال يتمتع بالدراية الكافية للتو�سية بالدورات التدريبية يف لغة ‪ .C++‬اإحدى‬
‫�دال م��ن الت�س��ابه ال��داليل للمقارن��ة ب��ني ال��ردود‬
‫الطرائ��ق ملعاجل��ة ه��ذا الق�س��ور ه��ي ا�س��تخدام الت�س��ابه ب��ني املف��ردات ب� ً‬
‫واخليارات ذات ال�سلة ببع�س االأ�سئلة‪.‬‬
‫ا�ستخدام تعلُّم األلة لتوليد ن�ض واقعي‬
‫‪Using Machine Learning to Generate Re istic Text‬‬
‫الطرائق املو�سحة يف االأق�سام ال�سابقة ت ِ‬
‫َ�ستخدم القوالب‪ ،‬والقواعد‪ ،‬اأو تقنيات التحديد لتوليد الن�سو�س للتطبيقات املختلفة‪.‬‬
‫ُ�ستخدمة يف توليد اللغات الطبيعية (‪.)NLG‬‬
‫يف هذا الق�سم‪� ،‬ستتع َّرف على اأحدث تقنيات تعلُّم االآلة امل َ‬
‫جدول  ‪ :3.5‬تقنيات تعلُّم األلة املُتقدمة املُ�ستخدَ مة يف توليد اللغات الطبيعية‬
‫الو�سف‬ ‫التقنية‬
‫�س��بكة الذاك��رة امل ُطو ّل��ة ق�س��رة تتكون �سبكة الذاكرة امل ُطولّة ق�سرة املدى (‪ )LSTM‬من خاليا ذاكرة (‪)Memory Cells‬‬
‫امل��دى ( ‪ Long Short-Term‬مرتبط�ة ببع��س‪ .‬عن�د اإدخ�ال �سل�س�لة من البيانات اإىل ال�س�بكة‪ ،‬تت�وىل معاجلة كل عن�سر‬
‫يف ال�سل�س�لة واح�دًا تل�و االآخ�ر‪ُ ،‬وحُت ِّ�دث ال�س�بكة خالي�ا الذاك�رة لتوليد ُخم� َرج لكل عن�سر‬ ‫‪)Memory - LSTM‬‬
‫على حده‪� .‬س�بكات الذاكرة امل ُطولّة ق�سرة املدى (‪ )LSTM‬تنا�س�ب مهام توليد اللغات‬
‫الطبيعية (‪ )NLG‬لقدرتها على االحتفاظ باملعلومات من �سال�سل البيانات (مثل التع ّرف‬
‫على الكالم اأو الكتابة اليدوية) ومعاجلة تعقيد اللغات الطبيعية‪.‬‬
‫النماذج املبنية على املحوالت النماذج املبنية على املحوالت هي تلك التي تفهم اللغات الب�س�ريّة وتولّدها‪ ،‬وتَ�س�ت ِند هذه‬
‫النم�اذج يف عمله�ا اإىل تقني�ة االنتب�ا الذات�ي (‪ )Self-Attention‬التي متكِّنها من فهم‬ ‫(‪Transformer-Based‬‬
‫جلمل‪.‬‬‫العالقات بني الكلمات املختلفة يف ا ُ‬ ‫‪)Models‬‬
‫‪185‬‬
‫امل ُرمِّز‬ ‫‪OUTPUT N‬‬ ‫‪OUTPUT 2‬‬ ‫‪OUTPUT 1‬‬
‫مُفكِّك الرتميز‬
‫(‪)DECODERS‬‬ ‫(‪)ENCODERS‬‬ ‫‪LSTM‬‬ ‫‪LSTM‬‬ ‫‪LSTM‬‬

‫امل ُخرَج‬ ‫امل ُدخَ ل‬ ‫‪INPUT N‬‬ ‫‪INPUT 2‬‬ ‫‪INPUT 1‬‬
‫اأنا طالب‬ ‫‪I am a student‬‬ ‫"‪"today‬‬ ‫"‪"am‬‬ ‫"‪"I‬‬
‫�سكل ‪ :3.30‬املُحوِّل‬ ‫�سكل ‪ :3.29‬الذاكرة املُطولّة ق�سرة املدى‬

‫املُحوِّألت ‪Transformers‬‬
‫املُحوِّالت منا�سبة ملهام توليد اللغات الطبيعية لقدرتها على معاجلة البيانات املُدخَ لة املُت�سل�سلة بكفاءة‪ .‬يف منوذج املُحوِّالت‪،‬‬
‫ُمت� َّرر البيان�ات املُدخَ ل�ة ع�رب املُرمِّ �ز ال�ذي يُحوّل املُدخَ الت اإىل متثيل م�س�تمر‪ .‬ثم ُمُي َّرر التمثيل عرب ُمفكِّك الرتميز الذي‬
‫ُيولِّد الت�سل�سل املُخرَج‪ .‬اإحدى اخل�سائ�س الرئي�سة لهذه النماذج هي ا�ستخدام اآليات االنتباه التي ت�سمح للنموذج بالرتكيز‬
‫عل�ى االأج�زاء املُهِ َّم�ة م�ن الت�سل�س�ل يف ح�ني تتجاه�ل االأجزاء االأقل دالل�ةً‪ .‬اأظهرت مناذج املُح ِّوالت كف�اءة يف توليد الن�س‬
‫عايل الدقة للعديد من مهام توليد اللغات الطبيعية مبا يف ذلك ترجمة االآلة‪ ،‬والتلخي�س‪ ،‬واالإجابة على االأ�سئلة‪.‬‬
‫منوذج األإ�سدار الثاين من املُحوِّل التوليدي مُ�سبَق التدريب ‪OpenAI GPT-2 Model‬‬
‫يف هذا الق�س��م‪� ،‬س��وف ت�س��تخدم االإ�سدار الثاين من وذج امل ُحوِّل التوليدي مُ�س�بَق التدريب (‪ )GPT-2‬وهو منوذج‬
‫لغ��وي ق��وي طورت��ه �س��ركة اأوب��ن اأي اآي (‪ )OpenAI‬لتولي��د الن�سو���س املُ�س��تنِدة اإىل الن���س التلقين��ي املُدخَ ��ل بوا�س��طة‬
‫ُ�ستخدم‪ .‬االإ�سدار الثاين من امل ُحوِّل التوليدي مُ�سبق التدريب (‪)GenerativePre-trainingTransformer2-GPT-2‬‬ ‫امل ِ‬
‫ُم��د َّرب عل��ى جمموع��ة بيان��ات ت�س��م اأك��ر م��ن ثم��ان مالي��ني �سفحة ويب ويتمي��ز بالقدرة على اإن�س��اء الن�سو�س الب�س��رية‬
‫بعدَّة لغات واأ�ساليب‪ُ .‬بنية االإ�سدار الثاين من امل ُحوِّل التوليدي مُ�سبق التدريب (‪ )GPT-2‬املبنية على املُحوِّل ت�سمح‬
‫بتحدي��د التبع َّي��ات (‪ )Dependencies‬بعي��دة امل��دى وتولي��د الن�سو���س ا ُملتَّ�س��قة‪ ،‬وهو ُمد َّرب للتنبوؤ بالكلم��ة التالية وفقًا‬
‫لكل الكلمات ال�س��ابقة �سمن الن�س‪ ،‬وبالتايل‪ ،‬مُيكن ا�س��تخدام النموذج لتوليد ن�سو�س طويلة ج ًدا عرب التنبوؤ امل�س��تمر‬
‫واإ�سافة املزيد من الكلمات‪.‬‬

‫‪%%capture‬‬
‫‪!pip install transformers‬‬
‫‪!pip install torch‬‬
‫‪import torch # an open-source machine learning library for neural networks, required for GPT2.‬‬
‫‪from transformers import GPT2LMHeadModel, GPT2Tokenizer‬‬

‫‪# initialize a tokenizer and a generator based on a pre-trained GPT2 model.‬‬

‫‪# used to:‬‬


‫‪# -encode the text provided by the user into tokens‬‬
‫‪# -translate (decode) the output of the generator back to text‬‬
‫)'‪tokenizer = GPT2Tokenizer.from_pretrained('gpt2‬‬

‫‪# used to generate new tokens based on the inputted text‬‬


‫)'‪generator = GPT2LMHeadModel.from_pretrained('gpt2‬‬

‫يُقدَّم الن�س التايل كاأ�سا�س ي�ستند اإليه االإ�سدار الثاين من امل ُحوِّل التوليدي مُ�سبق التدريب (‪:)GPT-2‬‬

‫‪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‬‬

‫‪186‬‬
excellent and the steaks were delicious. I will definitely return soon, highly
recommended!'

# encodes the given text into tokens


encoded_text = tokenizer.encode(text, return_tensors='pt')

# use the generator to generate more tokens.


# do_sample=True prevents GPT-2 from just predicting the most likely word at every step.
generated_tokens = generator.generate(encoded_text,
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
recommended!

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 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 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 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.
generated_tokens = generator.generate(encoded_text,
max_length=200, # max number of new tokens to
generate
do_sample=True)

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
recommended!

If you just found this place helpful. If you like to watch videos or
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
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
neighborhood, and it is in the neighborhood that it needs to

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

# Generate tokens with higher diversity


generated_tokens = generator.generate(
encoded_text, max_length=200, do_sample=True, temperature=2.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
and the steaks were delicious.I will definitely return soon, highly
recommended!

Worth a 5 I thought a steak at a large butcher was the end story!! We were
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
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

‫ فاإنّ النموذج �سيتجاهل االإر�سادات االأ�سا�سية التي تظهر يف امل ُدخَ ل‬،‫ اإذا كانت درجة احلرارة مرتفعة للغاية‬،‫ومع ذلك‬
:‫) ويُولِّد ُخمرجً ا اأقل واقعية ولي�س له معنى‬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
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

188
‫مترينات‬
‫‪1‬‬
‫خاطئة‬ ‫�سحيحة‬ ‫حدِّد اجلملة ال�سحيحة واجلملة اخلاطئة فيما يلي‪:‬‬
‫املبني على تعلُّم االآلة يتطلب جمموعات كبرة من بيانات التدريب‬
‫‪ .1‬توليد اللغات الطبيعية ّ‬
‫واملوارد احل�سابية‪.‬‬
‫‪ .2‬الفعل هو نوع من و�سوم اأق�سام الكالم (‪.)POS‬‬
‫جلم��ل لتولي��د اللغ��ات الطبيعي��ة املبن��يّ عل��ى القوال��ب‪ ،‬يُ�س��تخدَ م التحلي��ل‬
‫‪ .3‬يف حُتلي��ل ِبن��اء ا ُ‬
‫ب�سورة منف�سلة عن و�سوم اأق�سام الكالم (‪.)POS‬‬
‫‪ .4‬املجت َمعات هي عناقيد العُقد التي ُمتثِّل الكلمات املختلفة دالليًا‪.‬‬
‫‪ .5‬ي�سب��ح روب��وت الدرد�س��ة اأك��ر ذكا ًء كلم��ا ازداد ع��دد م�س��تويات االأ�س��ئلة واالأجوب��ة املُ�سافة‬
‫اإىل قاعدة املعرِ فة‪.‬‬

‫‪ 2‬قارن بني املنهجيات املختلفة لتوليد اللغات الطبيعية (‪.)NLG‬‬

‫‪ 3‬حدِّد ثالث تطبيقات خمتلفة لتوليد اللغات الطبيعية (‪.)NLG‬‬

‫‪189‬‬
‫ مف��ردات ُحم � َّددة م��ن الكلم��ات و ��وذج الكلم��ة‬build_graph)( ‫ اأكم��ل املقط��ع الربجم��ي الت��ا حت��ى تقب��ل الدال��ة‬4
‫ يج��ب اأن يحت��وي‬.‫) املُ��د َّرب لر�س��م ُخمطَّ ��ط ذي ُعق��دة واح��دة ل��كل كلم��ة يف املف��ردات املُح� َّددة‬Word2Vec( ‫اإىل املتَّجَ ��ه‬
‫) اأك��رب م��ن م�س��توى الت�س��ابه‬Word2Vec( ‫امل ُخطَّ ��ط عل��ى حاف��ة ب��ني عُقدت��ني اإذا كان ت�س��ابه ��وذج الكلم��ة اإىل املتَّجَ ��ه‬
.‫ يجب اأال تكون هناك اأوزان على احلواف‬.‫امل ُعطى‬

from import combinations # tool used to create combinations

import networkx as nx # python library for processing graphs

def build_graph(vocab:set, # set of unique words

model_wv, # Word2Vec model

similarity_threshold:float

):

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

G=nx. # makes a new graph

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

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

if :

G. (w1,w2)

return G

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

from sentence_transformers import , util

from import combinations # tool used to create combinations

model_sbert = ('all-MiniLM-L6-v2')

def get_max_sim(L1,my_sentence):

# embeds my_sentence

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

# embeds the sentences from L2

L_embeddings = model_sbert. (L, convert_to_tensor=True)

similarity_scores = .cos_sim( , )

winner_index=np.argmax(similarity_scores[0])

return

191
‫الم�سروع‬

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


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

‫يج��ب متثي��ل الن�سو���س يف كل م��ن جمموعات بيانات التدريب واالختبار باملتَّجَ هات قبل ا�س��تخدامها‪ .‬تُ�س��تخدَ م‬
‫اأدوات ‪ CountVectorizer‬اأو ‪ TfidfVectorizer‬من مكتبة �سكلرن (‪ )Sklearn‬يف الربجمة االجتاهية‪.‬‬

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

‫مهمت��ك ه��ي ا�س��تخدام جمموع��ة بيان��ات التدري��ب ‪ IMDB‬املُ�س��تخدَ مة يف ه��ذا الدر���س لتدري��ب النم��وذج ال��ذي‬
‫يحق��ق اأعل��ى درج��ة م��ن الدق��ة عل��ى جمموع��ة بيان��ات االختب��ار ‪.)imdb_data imdb_ test.csv( IMDB‬‬
‫مُيكنك حُتقيق ذلك عرب‪:‬‬

‫‪1‬‬
‫ا�س��تبدال املُ�س ِّن��ف ‪ MultinomialNB‬بنم��اذج ت�سني��ف اأخ��رى م��ن مكتب��ة �س��كلرن (‪)Sklearn‬‬
‫مثل املو�سحة باالأعلى‪.‬‬

‫‪2‬‬
‫اإعادة ت�سغيل املفكرة التفاعلية لديك بعد اال�ستبدال‪ ،‬حل�ساب دقة كل منوذج جديد بعد جتربته‪.‬‬

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

‫‪192‬‬
‫ماذا تع ّلمت‬

‫ ت�سنيف الن�ض با�ستخدام مناذج التعلُّم غري املوجَّ ه‪.‬‬


‫ ليل الن�ض با�ستخدام مناذج التعلُّم املوجَّ ه‪.‬‬
‫ ا�ستخدام مناذج تعلُّم األلة لتوليد اللغات الطبيعية‪.‬‬
‫ برجمة روبوت درد�سة ب�سيط‪.‬‬

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

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


‫‪predictors‬‬
‫متنبئات ال�سندوق االأ�سود‬ ‫‪)POS( Tags‬‬
‫و�سوم اأق�سام الكالم‬
‫‪Chatbot‬‬ ‫روبوت الدرد�سة‬ ‫‪Senti en‬‬
‫حتليل امل�ساعر‬
‫‪Analysis‬‬
‫‪Cluster‬‬ ‫عنقود‬
‫‪Supervised‬‬
‫‪Dendrogram‬‬ ‫الر�سم ال�سجري‬ ‫‪Learning‬‬
‫التعلُّم املوجَّ ه‬
‫‪Dimensionality‬‬
‫‪e uction‬‬
‫تقلي�س االأبعاد‬ ‫‪Syntax Analysis‬‬ ‫حتليل بِناء اجلُمل‬
‫‪Document‬‬
‫‪o eni tion‬‬ ‫التق�سيم‬
‫‪Clustering‬‬
‫ميع امل ُ�ستنَدات‬ ‫‪Transfer Learning‬‬ ‫التعلُّم املنقول‬
‫‪Natural Language‬‬ ‫‪Unsupervised‬‬
‫‪ener tion‬‬
‫توليد اللغات الطبيعية‬ ‫‪Learning‬‬
‫التعلُّم غر املوجَّ ه‬
‫‪Natural Language‬‬
‫معاجلة اللغات الطبيعية‬ ‫‪ec ori tion‬‬ ‫الربجمة اال اهية‬
‫‪Processing‬‬

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

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

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

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

‫ر عربي‬ ‫‪98%‬‬

‫‪ 1%‬تفاحة‬

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

‫جدول  ‪ :4.1‬د ّيات ت�سنيف البيانات املرئية‬

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

‫متخ�س�سة‪ ،‬وتتناول هذه الوحدة التقنيات التي‬


‫ّ‬ ‫نتيجة لهذه التعقيدات يتطلب الت�سنيف الفعّال للبيانات املرئية اأ�ساليب‬
‫ِ‬
‫ت�ستخدم اخل�سائ�س الهند�سية واللونية لل�سور‪ ،‬باالإ�سافة اإىل اأ�ساليب تعلُّم االآلة املُتقدمة القائمة على ال�سبكات الع�سبية‪.‬‬
‫يو�سح الدر�س االأول كيفية ا�ستخدام لغة البايثون (‪ )Python‬يف‪:‬‬ ‫ِّ‬
‫• حُتميل جمموعة بيانات من ال�سور املُعَنوَنة‪.‬‬
‫• حُتويل ال�سور اإىل �سيغة رقمية مُيكن اأن ت�ستخدمها خوارزميات روؤية احلا�سب‪.‬‬
‫• تق�سيم البيانات الرقمية اإىل جمموعات بيانات للتدريب‪ ،‬وجمموعات بيانات لالختبار‪.‬‬

‫‪198‬‬
.‫• حُتليل البيانات؛ ال�ستخراج اأمناط وخ�سائ�س مفيدة‬
.‫• ا�ستخدام البيانات امل�ستخل�سة؛ لتدريب مناذج الت�سنيف التي مُيكن ا�ستخدامها للتنبوؤ بعناوين ال�سور اجلديدة‬
‫) �سورة لوجوه �ستّة ع�سر نوعً ا ُخمتلفًا‬1,730( ‫حُتتوي جمموعة البيانات التي �ست�ستخدمها على األف و�سبعمئة وثالثني‬
.‫املوجه لتطبيق التقنيات املذكورة �سابقًا‬
َّ ‫ وبالتايل فهي جمموعة مثالية للتعلُّم‬،‫من احليوانات‬
Loading and Preprocessing Images ‫تها األأولية‬ ‫ميل ال�سور ومعا‬
‫ي�س��تورد املقط��ع الربجم��ي الت��ايل جمموع��ة م��ن املكتب��ات الت��ي تُ�س��تخدم لتحمي��ل ال�س��ور م��ن جمموع��ة بيان��ات‬
:‫ (وجوه _احليوانات) وحُتويلها اإىل �سيغة رقمية‬LHI-Animal- Faces

%%capture
import matplotlib.pyplot as plt # used for visualization
from os import listdir # used to list the contents of a directory

!pip install scikit-image # used for image manipulation


from skimage.io import imread # used to read a raw image file (e.g. png or jpg)
from skimage.transform import resize # used to resize images

# used to convert an image to the "unsigned byte" format


from skimage import img_as_ubyte

‫ ولذل�ك ف�اإن املقط�ع‬،‫تتطل�ب خوارزمي�ات التعلُّ�م املوجَّ �ه اأن تك�ون كل ال�س�ور يف جمموع�ة البيان�ات له�ا االأبع�اد نف�س�ها‬
‫ (جمل�د_ املُدخَ �الت) و ُيغ ِّ�ر حج�م كل منه�ا بحي�ث تك�ون له�ا اأبع�اد‬input_folder ‫الربجم�ي الت�ايل يق�راأ ال�س�ور م�ن‬
:‫الطول والعر�س نف�سها‬
def resize_images(input_folder:str,
width:int,
height:int
):

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): # for each sub folder

print(subfolder)
path = input_folder + '/' + subfolder

for file in listdir(path): # for each image file in this subfolder

image = imread(path + '/' + file) # reads the image


resized = img_as_ubyte(resize(image, (width, height))) # resizes the image
labels.append(subfolder[:-4]) # uses subfolder name without "Head" suffix
resized_images.append(resized) # stores the resized image
filenames.append(file) # stores the filename of this image

return resized_images, labels, filenames

199
‫‪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‬‬

‫‪BearHead‬‬ ‫‪EagleHead‬‬ ‫‪PigeonHead‬‬ ‫هذه هي اأ�سماء المجلدات‪ ،‬وبدون‬


‫‪CatHead‬‬ ‫‪ElephantHead‬‬ ‫‪RabbitHead‬‬ ‫المقطع الالحق ‪( Head‬راأ�س)‪ ،‬تُمثِّل‬
‫‪ChickenHead‬‬ ‫‪LionHead‬‬ ‫‪SheepHead‬‬
‫‪CowHead‬‬ ‫‪MonkeyHead‬‬ ‫‪TigerHead‬‬
‫هذه االأ�سماء عناوين لل�سور الموجودة‬
‫‪DeerHead‬‬ ‫‪Natural‬‬ ‫‪WolfHead‬‬ ‫داخلها‪.‬‬
‫‪DuckHead‬‬ ‫‪PandaHead‬‬

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


‫ويُ�س��تخدم ه��ذا التن�س��يق عل��ى نط��اق وا�س��ع؛ الأن��ه ي�س��مح بتمثي��ل‬
‫جمموعة وا�سعة من االألوان‪ .‬ويف نظام االألوان ‪ ،RGB‬تعني االأحرف‬
‫‪ R‬و ‪ G‬و ‪ B‬احت��واء التن�س��يق عل��ى ثالث��ة مكون��ات رئي�س��ة لالأل��وان‪،‬‬
‫وه��ي الل��ون االأحم��ر (‪ )R = Red‬والل��ون االأخ�سر (‪)G = Green‬‬
‫والل��ون االأزرق (‪ُ .)B = Blue‬مُي َّث��ل كل بك�س��ل بث��الث قن��وات وه��ي‪:‬‬
‫(قن��اة لل��ون االأحم��ر‪ ،‬وقن��اة لل��ون االأخ�سر‪ ،‬وقناة لل��ون االأزرق)‪ ،‬كل‬
‫قن��اة حُت��وي ثماني��ة ب��ت (‪ ،)8-bit‬ومُيك��ن اأن ياأخ��ذ البك�س��ل قيم��ة‬
‫أي�س��ا با�س��م تن�س��يق الباي��ت‬
‫ب��ني‪ 0 :‬و‪ُ .255‬يع��رف التن�س��يق ‪ 255-0‬ا ً‬
‫بدون اإ�سارة (‪.)Unsigned byte‬‬
‫�سكل ‪� :4.2‬سورة راأ�س اأ�سد اأ�سلية‬
‫يتي��ح اجلم��ع ب��ني ه��ذه القن��وات الث��الث متثي��ل جمموع��ة وا�س��عة م��ن‬
‫االألوان يف البك�سل‪ ،‬على �سبيل املثال‪ :‬البك�سل ذو القيمة (‪� )255 ،0 ،0‬سيكون لونه اأحمر بالكامل‪ ،‬والبك�سل ذو القيمة‬
‫(‪� )0 ،255 ،0‬س��يكون لون��ه اأخ�س��ر بالكام��ل‪ ،‬والبك�س��ل ذو القيم��ة (‪� )0 ،0 ،255‬س��يكون لون��ه اأزرق بالكام��ل‪ ،‬والبك�س��ل‬
‫ذو القيمة (‪� )255 ،255 ،255‬سيكون لونه اأبي�س‪ ،‬والبك�سل ذو القيمة (‪� )0 ،0 ،0‬سيكون لونه اأ�سود‪.‬‬
‫يف نظ��ام االأل��وان ‪ُ ،RGB‬ترت��ب قي��م البك�س��ل يف �س��بكة ثنائي��ة االأبع��اد‪ ،‬حُتت��وي على �سف��وف واأعمدة ُمت ِّث��ل اإحداثيات ‪ x‬و‪y‬‬
‫للبك�س��الت يف ال�س��ورة‪ ،‬و ُي�س��ار اإىل ه��ذه ال�س��بكة با�س��م م�سفوف��ة ال�س��ور (‪ .)Image Matrix‬عل��ى �س��بيل املث��ال‪� ،‬س��ع‬
‫يف اعتبارك ال�سورة املوجودة يف ال�سكل ‪ 4.2‬واملقطع الربجمي املرتبط بها اأدناه‪:‬‬
‫‪# reads an image file, stores it in a variabe and‬‬
‫‪# shows it to the user in a window‬‬
‫)'‪image = imread('AnimalFace/Image/LionHead/lioni78.jpg‬‬
‫)‪plt.imshow(image‬‬
‫‪image.shape‬‬

‫)‪(169, 169, 3‬‬

‫تك�س��ف طباع��ة �س��كل ال�س��ورة ع��ن م�سفوف��ة ‪ ،169 × 169‬باإجم��ايل‪ :‬ثماني��ة وع�س��رين األ ًف��ا وخم�س��مئة وواح��د و�س��تني‬
‫(‪ )28,561‬بك�سل‪ ،‬ومُيثِّل الرقم ‪ 3‬يف العمود الثالث القنوات الثالث (اأحمر اأخ�سر اأزرق) لنظام االألوان ‪.RGB‬‬
‫على �سبيل املثال‪� ،‬سيطبع املقطع الربجمي التايل قيمة االألوان للبك�سل االأول من هذه ال�سورة‪:‬‬
‫‪# the pixel at the first column of the first row‬‬ ‫‪[102‬‬ ‫‪68‬‬ ‫]‪66‬‬
‫)]‪print(image[0][0‬‬
‫‪200‬‬
‫يوؤدي تغير احلجم اإىل حُتويل ال�سور من تن�سيق ‪ RGB‬اإىل تن�سيق مُ�ستنِد على عدد حقيقي (‪:)Float-based‬‬

‫))‪resized = resize(image, (100, 100‬‬


‫)‪print(resized.shape‬‬
‫)]‪print(resized[0][0‬‬

‫)‪(100, 100, 3‬‬


‫]‪[0.40857161 0.27523827 0.26739514‬‬

‫عل��ى الرغ��م م��ن اأن ال�س��ورة ق��د غُ � ّ�ر حجمه��ا اإىل م�سفوف��ة ذات اأبع��اد ‪ ،100 × 100‬ف�اإن قي��م القن��وات الث��الث ‪RGB‬‬
‫ل��كل بك�س��ل مت ت�س��ويتها (‪ )Normalized‬لتك��ون ذات قيم��ة ب��ني ‪ 0‬و‪ ،1‬ومُيك��ن اإع��ادة حُتويله��ا م��رة اأخ��رى اإىل تن�س��يق‬
‫البايت بدون اإ�سارة من خالل املقطع الربجمي التايل‪:‬‬
‫)‪resized = img_as_ubyte(resized‬‬ ‫)‪(100, 100, 3‬‬
‫)‪print(resized.shape‬‬ ‫]‪[104 70 68‬‬
‫)]‪print(resized[0][0‬‬ ‫]‪[102 68 66‬‬
‫)]‪print(image[0][0‬‬

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


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

‫قبل بدء التدريب على خوارزميات التعلُّم املوجَّ ه‪ ،‬من اجليد التحقق‬
‫�سكل ‪� :4.3‬سورة راأ�س اأ�سد غُ ّر حجمها‬ ‫مم��ا اإذا كان��ت اأي �س��ورة م��ن ال�س��ور املوج��ودة يف جمموعة البيانات‬
‫غر مطابقة للتن�سيق (‪.)100 ،100 ،3‬‬
‫‪violations = [index for index in range(len(resized_images)) if‬‬
‫])‪resized_images[index].shape != (100,100,3‬‬

‫‪violations‬‬

‫]‪[455, 1587‬‬

‫يك�س��ف ه��ذا املقط��ع الربجم��ي ع��ن وج��ود �سورت��ني غ��ر مطابقت��ني لتل��ك ال�سيغ��ة‪ ،‬وه��ذا غ��ر متوق��ع الأن دال��ة‬
‫()‪َّ resize_image‬مت تطبيقه��ا عل��ى جمي��ع ال�س��ور املوج��ودة يف جمموعة البيانات‪ .‬يقوم املقطعان الربجميان التاليان‬
‫بطباعة هاتني ال�سورتني‪ ،‬باالإ�سافة اإىل اأبعادهما وا�سمي ملفيهما‪:‬‬

‫‪201‬‬
‫]‪pos1 = violations[0‬‬
‫]‪pos2 = violations[1‬‬

‫)]‪print(filenames[pos1‬‬
‫)‪print(resized_images[pos1].shape‬‬
‫)]‪plt.imshow(resized_images[pos1‬‬
‫)]‪plt.title(labels[pos1‬‬

‫‪cow1.gif‬‬
‫)‪(100, 100, 4‬‬

‫�سكل ‪� :4.4‬سورة باالأحمر واالأخ�سر واالأزرق واألفا (‪)RGBA‬‬

‫;)]‪print(filenames[pos2‬‬
‫;)‪print(resized_images[pos2].shape‬‬
‫;)]‪plt.imshow(resized_images[pos2‬‬
‫;)]‪plt.title(labels[pos2‬‬

‫‪tiger0000000168.jpg‬‬
‫)‪(100, 100‬‬

‫ال�سورة االأوىل‪ :‬لها �سكل ذو اأبعاد (‪ ،)100 ،100 ،4‬ويد ُّل الرقم‬
‫�دال م�ن تن�س�يق ‪ ، RGB‬و ه�ذا التن�س�يق‬ ‫‪ 4‬اأنه�ا بتن�س�يق ‪ RGBA‬ب ً‬
‫يحت�وي عل�ى قن�اة اإ�سافي�ة رابع�ة تدع�ى قن�اة األف�ا (‪ )Alpha‬الت�ي‬
‫تبني �سفافية كل بك�سل‬
‫�سكل ‪� :4.5‬سورة ّ‬
‫ُمتثِّل �س�فافية كل بك�س�ل‪ .‬على �س�بيل املثال‪:‬‬

‫‪# prints the first pixel of the RGBA image‬‬


‫‪# a value of 255 reveals that the pixel is not transparent‬‬
‫‪at all.‬‬
‫]‪resized_images[pos1][0][0‬‬

‫)‪array([135, 150, 84, 255], dtype=uint8‬‬

‫ال�س��ورة الثاني��ة‪ :‬له��ا �س��كل ذو اأبع��اد (‪ ،)100 ،100‬وي��د ُّل غي��اب‬


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

‫‪202‬‬
‫(بدال من قنوات ‪ RGB‬الثالث)‪ ،‬وقيمة كل بك�سل عبارة عن رقم واحد يرتاوح‬ ‫�سور التدرج الرمادي لها قناة واحدة فقط ً‬
‫من ‪ 0‬اإىل ‪ ،255‬حيث ُمتثِّل قيمة البك�سل ‪ 0‬اللون االأ�سود‪ ،‬بينما ُمتثِّل قيمة البك�سل ‪ 255‬اللون االأبي�س‪ .‬على �سبيل املثال‪:‬‬
‫]‪resized_images[pos2][0][0‬‬

‫‪100‬‬

‫وكاختب��ار اإ�س��ايف جل��ودة البيان��ات‪ ،‬يق��وم املقط��ع الربجم��ي الت��ايل بح�س��اب تك��رار عن��وان كل �س��ورة حي��وان يف جمموعة‬
‫البيانات‪:‬‬
‫‪# used to count the frequency of each element in a list.‬‬ ‫‪Counter({'Bear': 101,‬‬
‫‪from collections import Counter‬‬ ‫‪'Cat': 160,‬‬
‫‪'Chicken': 100,‬‬
‫)‪label_cnt = Counter(labels‬‬ ‫‪'Cow': 104,‬‬
‫‪label_cnt‬‬ ‫‪'Deer': 103,‬‬
‫‪'Duck': 103,‬‬
‫‪'Eagle': 101,‬‬
‫‪'Elephant': 100,‬‬
‫‪'Lion': 102,‬‬
‫‪'Monkey': 100,‬‬
‫هنا يمكنك روؤية القيمة المتطرفة وهي فئة‬ ‫‪'Nat': 8,‬‬
‫‪'Panda': 119,‬‬
‫‪ Nature( Nat‬اأو الطبيعة)‪ ،‬وتحتوي على‬ ‫‪'Pigeon': 115,‬‬
‫ثمانية عنا�سر فقط مقارنة بالفئات االأخرى‪.‬‬ ‫‪'Rabbit': 100,‬‬
‫‪'Sheep': 100,‬‬
‫‪'Tiger': 114,‬‬
‫)}‪'Wolf': 100‬‬

‫حُتت�وي جمموع�ة البيان�ات عل�ى �س�ور حيوان�ات و�س�ور أاخ�رى م�ن الطبيعة؛ وذل�ك بهدف التعرّف عل�ى ال�سور التي ت�س�ذ عن �سور‬
‫احليوان�ات‪ .‬يك�س�ف ‪( Counter‬الع�داد) ع�ن فئ�ة �سغ�رة جدًا عنوانها ‪( Nat‬الطبيع�ة)‪ ،‬وحُتتوي على ثماين �سور فقط‪ ،‬وعندما‬
‫تقوم بك�سف �سريع يت�سح لك اأن هذه الفئة ذات قيم متطرفة (‪ )Outlier‬حُتتوي على �سور ملناظر طبيعية وال يوجد بها اأي وجه‬
‫الأي حيوان‪.‬‬
‫يق�وم املقط�ع الربجم�ي الت�ايل باإزال�ة �سورة ‪ RGBA‬و�سورة الت�درج الرمادي‪ ،‬وكذلك كل ال�سور التي تنتمي لفئة ‪( Nat‬الطبيعة)‬
‫من قوائم اأ�سماء امللفات‪ ،‬والعناوين‪ ،‬وال�سور التي غُ ّر حجمها‪.‬‬

‫)‪N = len(labels‬‬

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


‫]"‪and labels[i] != "Nat‬‬
‫‪filenames = [filenames[i] for i in range(N) if i not in violations and‬‬
‫]"‪labels[i] != "Nat‬‬
‫=! ]‪labels = [labels[i] for i in range(N) if i not in violations and labels[i‬‬
‫]"‪"Nat‬‬

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

‫‪X.shape‬‬

‫)‪(1720, 100, 100, 3‬‬

‫يو�س��ح �س��كل جمموع��ة بيان��ات ‪ X‬النهائي��ة ا�س��تمالها عل��ى األ��ف و�س��بعمئة وع�س��رين �س��ورة بتن�س��يق ‪ ،RGB‬بن��ا ًء عل��ى عدد‬
‫ِّ‬
‫القنوات‪ ،‬وجميعها باأبعاد ‪( 100 × 100‬اأي ع�س��رة اآالف بك�س��ل)‪ .‬اأخرًا‪ ،‬مُيكن ا�س��تخدام دالة ()‪train_test_split‬‬
‫من مكتبة ‪ sklearn‬لتق�سيم جمموعة البيانات اإىل جمموعة تدريب وجمموعة اختبار‪.‬‬

‫‪from sklearn.model_selection import train_test_split‬‬

‫(‪X_train, X_test, y_train, y_test = train_test_split‬‬


‫‪X,‬‬
‫‪y,‬‬
‫‪test_size = 0.20, # uses 20% of the data for testing‬‬
‫‪shuffle = True,‬‬ ‫‪# to randomly shuffle the data.‬‬
‫‪random_state = 42, # to ensure that data is always shuffled in the same way‬‬
‫)‬

‫نظرًا الأن جملدات �سور احليوانات حُ مّلت جملّدً ا تلو االآخر‪ ،‬فاإن ال�سور من كل جملد جُ معت معًا يف القوائم ال�س��ابقة‪،‬‬
‫وقد يوؤدي ذلك اإىل ت�سليل العديد من اخلوارزميات‪ ،‬خا�سة يف جمال روؤية احلا�سب‪ ،‬و�سبط ‪( shuffle=True‬تفعيل‬
‫اإعادة الرتتيب) يف املقطع الربجمي ال�س��ابق يحل هذه امل�س��كلة‪ ،‬وبوجه عام‪ ،‬من اجليد اإعادة ترتيب البيانات ع�س��وائيًا‬
‫قبل اإجراء اأي حُتليل‪.‬‬
‫التنبو بدون هند�سة اخل�سائ�ض ‪re iction without Feature Engineering‬‬
‫عل��ى الرغ��م م��ن اأن اخلط��وات املتَّبع��ة يف الق�س��م ال�س��ابق ق��د ح َّول��ت البيان��ات اإىل تن�س��يق رقم��ي‪ ،‬اإال اأن��ه لي���س بالتن�س��يق‬
‫القيا�س��ي اأح��ادي ال ُبع��د ال��ذي تتوقع��ه العدي��د م��ن خوارزمي��ات تعلُّم االآلة‪ .‬على �س��بيل املثال‪ ،‬و�سفتْ الوح��دة الثالثة كيف‬
‫يج��ب حُتوي��ل كل م�س��تند اإىل متَّجَ ��ه رقم��ي اأح��ادي ال ُبع��د قبل ا�س��تخدام البيانات يف تدريب مناذج تعلُّ��م االآلة واختبارها‪،‬‬
‫بينما حُتتوي كل نقطة بيانات يف جمموعة البيانات املرئية هنا على تن�سيق ثالثي االأبعاد‪.‬‬

‫‪X_train[0].shape‬‬

‫)‪(100, 100, 3‬‬

‫‪204‬‬
‫ ف��كل �س��ورة‬،‫) كل �س��ورة يف متَّجَ ��ه أاح��ادي ال ُبع��د‬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,)

‫مُيكن ا�س��تخدام هذا التن�س��يق امل�س��طح مع اأي خوارزمية ت�سنيف قيا�س��ية دون بذل اأي جهد اإ�سايف لهند�س��ة خ�سائ�س‬
‫ وي�س��تخدم املقط��ع الربجم��ي‬،‫�يو�سح الق�س��م الت��ايل مث� ً�اال عل��ى هند�س��ة اخل�سائ���س لبيان��ات �س��ورة‬
ِّ �‫ و�س‬،‫تنبوؤي��ة اأخ��رى‬
‫أي�س��ا لت�سني��ف البيان��ات الن�س َّي��ة يف الوح��دة‬
ً ‫) ال��ذي ا�س �تُخدم ا‬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

MultinomialNB()

from sklearn.metrics import accuracy_score # used to measure the accuracy

pred = model_MNB.predict(X_test_flat) # gets the predictions for the flat test set
accuracy_score(y_test,pred)

0.36046511627906974

:‫)اخلا�سة بالنتائج الإعطاء روؤية اإ�سافية‬Confusion Matrix( ‫يعر�س املقطع الربجمي التايل م�سفوفة الدقة‬
%%capture
!pip install scikit-plot
import scikitplot

scikitplot.metrics.plot_confusion_matrix(y_test, # actual labels


pred, # predicted labels
title = "Confusion Matrix",
cmap = "Purples",
figsize = (10,10),
x_tick_rotation = 90,
normalize = True # to print percentages
)

205
‫ت�ساعد القيم الم�سوّاة‬
‫(‪)Normalized Values‬‬
‫على روؤية العنا�سر على‬
‫هيئة ن�سب مئوية‪.‬‬

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

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


‫خوارزمية بايز ال�ساذجة متعددة‬ ‫تق�ارب ‪ ،30%‬وعل�ى الرغ�م م�ن اأن ه�ذه الن�س�بة ق�د تب�دو قليل�ة‪ ،‬اإال اأن علي�ك‬
‫احلدود( ‪:) u tino i‬‬ ‫النظ�ر اإليه�ا يف �س�وء اأن جمموع�ة البيان�ات تت�سم�ن ع�س�رين عنوانً�ا ُخمتلف�ا‪.‬‬
‫ه ��ي خوارزمي ��ة تعلُّ ��م اآل ��ة تُ�س ��تخدم لت�سني ��ف‬
‫افرت��س وج�ود جمموعة بيان�ات متوازنة ن�س�بيًا ُيغطي فيها‬ ‫ويعن�ي ذل�ك اأنّ�ه ل�و ُ‬
‫الن�سو� ��س اأو البيان ��ات االأخ ��رى يف فئ ��ات‬ ‫كل عنوان ‪ 20 1‬من البيانات‪ ،‬فاإن املُ�سنِّف الع�سوائي الذي ُيخ�س�س عنوانًا‬
‫ُخمتلف��ة‪ ،‬وتعتم��د عل��ى خوارزمي��ة باي��ز ال�س��اذج‬
‫لكل نقطة اختبار ب�سكل ع�سوائي‪� ،‬سيحقق دقة تبلغ حوايل ‪ ،5%‬ولذلك �ستكون‬
‫(‪ )Naive Bayes‬وه��ي طريق��ة ب�س��يطة وفعّال��ة‬ ‫الدقة بن�سبة ‪ 30%‬اأعلى ب�ست مرات من التخمني الع�سوائي‪.‬‬
‫حلل م�سكالت الت�سنيف‪.‬‬ ‫مو�سح يف االأق�سام التالية‪ ،‬مُيكن حُت�سني هذه الدقة حُت�سينًا‬ ‫ومع ذلك‪ ،‬كما هو َّ‬
‫جماال للتح�س�ني‪ .‬على �س�بيل‬‫أي�س�ا اأن هناك ً‬ ‫ملحوظً �ا‪ ،‬وتوؤك�د م�سفوف�ة الدق�ة ا ً‬
‫خوارزمية مُ�سنِّف األنحدار التَّدرجي‬ ‫املث�ال‪ ،‬غالبً�ا م�ا يخط�ئ من�وذج باي�ز ال�س�اذج وي�سنِّ�ف ‪( Pigeons‬احلَ مَ�ام)‬
‫‪:)S‬‬ ‫الع�سوائي(‪ssi er‬‬ ‫‪Cats‬‬ ‫عل�ى اأنه�ا ‪( Eagles‬ن�س�ور) اأو ي�سنِّ�ف ‪( Wolves‬الذئ�اب) عل�ى اأنه�ا‬
‫ه�ي خوارزمي�ة تعلُّ�م اآل�ة تُ�س�تخدم يف ت�سني�ف‬ ‫(قط�ط)‪ .‬تكم�ن اأ�س�هل طريق�ة ملحاول�ة حُت�س�ني النتائ�ج يف ت�رك البيانات كما‬
‫البيانات يف فئات ُخمتلفة اأو جمموعات‪ ،‬وتعتمد‬ ‫ه�ي‪ ،‬والتجري�ب با�س�تخدام مُ�س ِّنف�ات ُخمتلف�ة‪ ،‬وم�ن النم�اذج الت�ي ثب�ت اأنه�ا‬
‫على اأ�سلوب ي�سمى االنحدار التَّدرجي الع�سوائي‬ ‫تعم�ل ب�س�كل جي�د م�ع بيان�ات ال�س�ورة املح َّول�ة اإىل م َّت َج َه�ات من�وذج‪ :‬مُ�س ِّن�ف‬
‫(‪،)Stochastic Gradient Descent - SGD‬‬ ‫االنحدار التَّدرجي الع�سوائي(‪ )SGDClassifier‬من مكتبة ‪ ،Sklearn‬حيث‬
‫وه�ي طريق�ة فعّال�ة لتح�س�ني ا أالن�واع املتع�ددة‬ ‫يعم�ل من�وذج ‪ SGDClassifier‬اأثن�اء التدريب على �سبط اأوزان النموذج بنا ًء‬
‫للنماذج وتدريبها‪ ،‬مبا فيها املُ�سنِّفات‪.‬‬ ‫على بيانات التدريب‪ ،‬والهدف من ذلك يتمثّل يف العثور على جمموعة االأوزان‬
‫الت�ي تقل�ل م�ن دال�ة اخل�س�ارة(‪ ،)Loss Function‬وه�ي الدال�ة الت�ي تقي��س‬
‫الفرق بني العناوين املتوقَّعة والعناوين احلقيقية يف بيانات التدريب‪.‬‬
‫ي�ستخدم املقطع الربجمي التايل مُ�سنِّف ‪ SGDClassifier‬لتدريب منوذج على جمموعة بيانات م�سطحة‪.‬‬ ‫ِ‬
‫‪206‬‬
‫‪from sklearn.linear_model import SGDClassifier‬‬

‫)(‪model_sgd = SGDClassifier‬‬
‫)‪model_sgd.fit(X_train_flat, y_train‬‬
‫)‪pred=model_sgd.predict(X_test_flat‬‬
‫)‪accuracy_score(y_test,pred‬‬

‫‪0.46511627906976744‬‬

‫يُحقق م�سنِّف ‪ SGDClassifier‬دقة اأعلى ب�س��كل ملحوظ تزيد عن ‪،46%‬‬


‫التح يم القيا�سي‬ ‫عل��ى الرغ��م م��ن تدريب��ه عل��ى البيان��ات نف�س��ها الت��ي ُد ِّرب ُم�س ِّن��ف‬
‫(‪:)Standard scaling‬‬ ‫‪ MultinomialNB‬عليه��ا‪ ،‬وي��دل ذل��ك عل��ى فائ��دة جترب��ة خوارزمي��ات‬
‫ه��و تقني��ة معاجل��ة اأولي��ة تُ�س��تخدم‬ ‫ت�سني��ف ُخمتلف��ة؛ للعث��ور عل��ى اأف�س��ل خوارزمي��ة تتنا�س��ب م��ع اأي جمموع��ة‬
‫يف تعلُّ��م االآل��ة لتحجي��م خ�سائ���س‬ ‫بيان��ات مُعط��اة‪ ،‬وم��ن املهم فهم نقاط القوة وال�سعف لكل خوارزمية‪ ،‬فعلى‬
‫جمموع��ة البيان��ات بحي��ث تك��ون‬ ‫�س��بيل املث��ال‪ :‬م��ن املع��روف اأن خوارزمي��ة ‪ SGDClassifier‬تعم��ل ب�س��كل‬
‫ذات متو�س��ط ح�س��ابي �سف��ري‬ ‫اأف�س��ل عندم��ا ُحُتجّ ��م بيان��ات االإدخ��ال وتوُحّ ��د اخل�سائ���س؛ وله��ذا ال�س��بب‬
‫وتباين اأحادي الوحدة‪.‬‬ ‫�ست�ستخدم التحجيم القيا�سي يف منوذجك‪.‬‬

‫ي�ستخدِ م املقطع الربجمي التايل اأداة ‪( 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‬‬

‫مُيكن االآن تدريب منوذج جديد واختباره با�ستخدام جمموعات البيانات التي مت حُتجيمها‪:‬‬

‫)(‪model_sgd = SGDClassifier‬‬ ‫‪0.4906976744186046‬‬


‫)‪model_sgd.fit(X_train_flat_scaled, y_train‬‬
‫)‪pred=model_sgd.predict(X_test_flat_scaled‬‬
‫)‪accuracy_score(y_test,pred‬‬

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

‫‪207‬‬
‫التنبو بانتقاء اخل�سائ�ض ‪re iction with Feature Se ection‬‬
‫ر َّك��ز الق�س��م ال�س��ابق عل��ى تدري��ب النم��اذج ع��ن طري��ق ت�س��طيح البيان��ات‪ ،‬يف ح��ني �س��ي�سف ه��ذا الق�س��م كيفية حُتويل‬
‫البيان ��ات االأ�سلي ��ة لهند�س ��ة اخل�سائ� ��س الذكي ��ة‬
‫املخططات التكرارية للتدرجات املوجَّ هة‬ ‫الت��ي تلتق��ط ال�سف��ات الرئي�س��ة لبيان��ات ال�س��ورة‪،‬‬
‫(‪:)Histogram of Oriented Gradients -HOG‬‬ ‫يو�س ��ح الق�س ��م تقني ��ة‬
‫وعل ��ى و ج ��ه التحد ي ��د ِّ‬
‫املوجه��ة بتق�س��يم‬ ‫هة‬ ‫املوجَّ‬ ‫للتدرجات‬ ‫التكراري‬ ‫�سائعة ت�سمى املخطط‬
‫تق��وم املخطط��ات التكراري��ة للتدرج��ات َّ‬
‫ال�س��ورة اإىل اأق�س��ام �سغ��رة وحُت ِّل��ل توزي��ع تغ��رات الكثافة‬ ‫(‪.)Histogram of Oriented Gradients -HOG‬‬
‫حُتدد وتفهم �سكل الكائن يف ال�سورة‪.‬‬ ‫يف كل ق�سم حتّى ِّ‬ ‫تتم ّث ��ل اخلط ��وة االأوىل يف هند�س ��ة املخطط ��ات‬
‫املوجه ��ة يف حُتوي ��ل ال�س ��ور‬
‫التكراري ��ة للتدرج ��ات َّ‬
‫م ��ن تن�س ��يق ‪ RGB‬اإىل �س ��ور ذات ت ��درج رم ��ادي‪ ،‬ومُيك ��ن القي ��ام بذل ��ك با�س ��تخدام الدال ��ة ()‪ rgb2gray‬م ��ن مكتب ��ة‬
‫‪:sckit-image‬‬

‫‪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‬‬
‫‪# 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‬‬

‫�سكل ‪� :4.9‬سورة ذات تدرج رمادي‬ ‫�سكل ‪� :4.8‬سورة باالألوان االأ�سا�سية‬

‫بدال من التن�سيق ‪ RGB‬املُ�ستنِد اإىل‪:3×100 × 100‬‬


‫ال�سكل اجلديد لكل �سورة اأ�سبح بتن�سيق ‪ً ،100 × 100‬‬

‫)‪print(X_train_gray[0].shape‬‬
‫)‪print(X_train[0].shape‬‬

‫)‪(100, 100‬‬
‫)‪(100, 100, 3‬‬

‫‪208‬‬
‫تتمثّل اخلطوة التالية يف اإن�ساء خ�سائ�س املخطط التكراري للتدرجات املوجَّ هة لكل �سورة يف البيانات‪ ،‬ومُيكن حُتقيق‬
‫مثاال على ال�س��ورة االأوىل يف‬
‫ويو�س��ح املقط��ع الربجم��ي التايل ً‬
‫ذل��ك م��ن خ��الل دال��ة ()‪ hog‬م��ن مكتب��ة ‪ِّ ،sckit-image‬‬
‫جمموعة بيانات التدريب‪:‬‬

‫‪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‬‬

‫‪# trains a new model‬‬


‫)(‪model_sgd = SGDClassifier‬‬
‫)‪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‬‬

‫‪209‬‬
‫‪scikitplot.metrics.plot_confusion_matrix(y_test, # actual labels‬‬
‫‪pred, # predicted labels‬‬
‫‪title = "Confusion Matrix", # title to use‬‬
‫‪cmap = "Purples", # color palette to use‬‬
‫‪figsize = (10,10), # figure size‬‬
‫‪x_tick_rotation = 90‬‬
‫;)‬

‫�سكل ‪ :4.11‬م�سفوفة الدقة الأداء خوارزمية ‪SGDClassi er‬‬

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

‫‪210‬‬
‫التنبو با�ستخدام ال�سبكات الع�سبية ‪re iction Using Neural Networks‬‬
‫يو�س��ح ه��ذا الق�س��م كيفي��ة ا�س��تخدام ال�س��بكات الع�سبي��ة لت�سميم مُ�س ِّنف��ات خم�س�سة لبيانات ال�س��ور‪ ،‬وكيف مُيكنها‬ ‫ِّ‬
‫يف كث��ر م��ن االأحي��ان اأن تتف�وّق عل��ى التقني��ات عالي��ة الفعالي��ة مث��ل‪ :‬عملي��ة املخط��ط التك��راري للتدرج��ات املوجَّ ه��ة الت��ي‬
‫ُو�سفت يف الق�سم ال�سابق‪ ،‬و ُت�ستخدم مكتبة ‪ TensorFlow‬ومكتبة ‪ Keras‬ال�سهرتان لهذا الغر�س‪.‬‬
‫مكتب��ة ‪ tensorflow‬ه��ي مكتب��ة منخف�س��ة امل�س��توى تُو ِّف��ر جمموع��ة وا�س��عة م��ن اأدوات تعلُّ��م االآل��ة وال��ذكاء اال�سطناعي‪،‬‬
‫�تخدمني بتعري��ف احل�س��ابات العددي��ة الت��ي تت�سم��ن م َّتجَ ه��ات متع��ددة االأبع��اد(‪ )Tensors‬ومعاجلته��ا‪،‬‬ ‫وت�س��مح للم�س� ِ‬
‫وه��ي م�سفوف��ات متع��ددة االأبع��اد م��ن البيانات‪.‬م��ن ناحي��ة أاخ��رى‪ُ ،‬تع� ُّد مكتب��ة ‪ Keras‬ذات م�س��توى اأعل��ى وتُو ِّف��ر واجه��ة‬
‫اأب�س ��ط لبن ��اء النم ��اذج وتدريبه ��ا‪ ،‬وه ��ي مبني ��ة با�س ��تخدام مكتب ��ة ‪( TensorFlow‬اأو مكتب ��ات خلفي ��ة اأخ ��رى) و ُتو ِّف ��ر‬
‫و�سممت مكتبة‬ ‫جمموعة من الطبقات والنماذج املع َّرفة م�س��بقًا والتي مُيكن جتميعها ب�س��هولة لبناء منوذج تعلُّم عميق‪ُ .‬‬
‫�تخدم و�س��هلة اال�س��تخدام؛ مم��ا يجعلها خيارًا رائجً ا للممار�س��ني‪.‬‬ ‫‪ Keras‬لتك��ون �سديق��ة للم�س� ِ‬
‫دوال التن�س��يط (‪ )Activation Functions‬ه��ي دوال ريا�سي��ة تُطَ َّب��ق عل��ى ُخم َرج��ات كل خلي��ة ع�سبي��ة يف ال�س��بكة‬
‫الع�سبية‪،‬كم��ا تتمي��ز باأنه��ا ت�سي��ف خ�سائ� َ��س غ��ر خطي��ة (‪ )Non-linear‬للنم��وذج وت�س��مح لل�س��بكة بتعلُّ��م االأمن��اط‬
‫املعق��دة يف البيان��ات‪ ،‬و ُيع� ُّد اختي��ار دال��ة التن�س��يط اأم�رًا مه ًم��ا ومُيك��ن اأن يوؤث��ر عل��ى اأداء ال�س��بكة‪ ،‬حي��ث تتلق��ى اخلالي��ا‬
‫املُخ َرج‬ ‫دالة التن�سيط‬ ‫متغرات‬ ‫الع�سبي ��ة املُدخَ ��الت وتعاجله ��ا م ��ن خ ��الل‬
‫متغري التح ُّيز‬ ‫دخالت‬
‫املُ َ‬
‫االأوزان‬ ‫متغ��رات االأوزان والتح ُّي��زات وتنت��ج ُخم َرجات‬
‫بن��اء عل��ى دال��ة التن�س��يط كم��ا يظهر يف ال�س��كل‬
‫‪x1‬‬ ‫‪ .4.12‬تُن�س��اأ ال�س ��بكات الع�سبي ��ة م ��ن خ ��الل‬
‫‪x2‬‬ ‫رب ��ط العدي ��د م ��ن اخلالي ��ا الع�سبي ��ة م ًع ��ا يف‬
‫طبق��ات‪ ،‬و ُت��د َّرب عل��ى �سب��ط متغ��رات االأوزان‬
‫والتح ُّيزات وحُت�سني اأدائها مبرور الوقت‪.‬‬
‫‪xn‬‬
‫�سكل ‪ :4.12‬دالة التن�سيط‬
‫يُث ِّب��ت املقط��ع الرب جم��ي الت��ايل مكتب��ة‬
‫‪%%capture‬‬
‫‪!pip install tensorflow‬‬ ‫‪ tensorflow‬ومكتبة ‪:keras‬‬
‫‪!pip install keras‬‬

‫يف الوح��دة ال�س��ابقة‪ ،‬تع ّرف��ت عل��ى اخلالي��ا الع�سبي��ة اال�سطناعي��ة وعل��ى معماري��ات ال�س��بكات الع�سبي��ة‪ ،‬وعل��ى وج��ه‬
‫التحدي��د تع ّرف��ت عل��ى من��وذج الكلم��ة اإىل امل َّتجَ ��ه (‪ )Word2Vec‬ال��ذي َي�س��تخدم طبق��ة خمفي��ة وطبق��ة ُخم َرج��ات؛‬
‫ليتنب�اأ ب�س��ياق الكلم��ات لكلم��ة ُمعط��اة يف جمل��ة‪ .‬وبع��د ذل��ك تُ�س��تخدم مكتب��ة ‪ Keras‬الإن�س��اء معماري��ة ع�سبي��ة م�س��ابهة‬
‫لل�سور‪ .‬ا ًأوال‪ُ :‬حُت َّول العناوين يف ‪ y_train‬اإىل تن�سيق اأعداد �سحيحة‪ ،‬طبقًا ملتطلبات مكتبة ‪.keras‬‬
‫‪# gets the set of all distinct labels‬‬
‫))‪classes=list(set(y_train‬‬
‫)‪print(classes‬‬
‫)(‪print‬‬

‫‪# 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‬‬
‫)]‪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‬‬

‫‪211‬‬
‫‪['Elephant', 'Duck', 'Monkey', 'Cow', 'Sheep', 'Wolf', 'Tiger', 'Deer',‬‬
‫]'‪'Cat', 'Lion', 'Rabbit', 'Panda', 'Pigeon', 'Chicken', 'Eagle', 'Bear‬‬

‫]'‪['Panda' 'Pigeon' 'Monkey' 'Panda' 'Sheep‬‬


‫]‪[11 12 2 11 4‬‬

‫ومُيكن االآن ا�ستخدام اأداة ‪( Sequential‬التتابع) من مكتبة ‪ 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.‬‬
‫‪from keras.layers import Dense‬‬

‫‪# builds a sequential stack of layers‬‬


‫)(‪model = Sequential‬‬
‫‪# adds a dense hidden layer with 200 neurons, and the ReLU activation function.‬‬
‫))'‪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‬‬
‫_________________________________________________________________‬
‫)‪Layer (type‬‬ ‫‪Output Shape‬‬ ‫‪Param #‬‬
‫=================================================================‬
‫)‪dense (Dense‬‬ ‫)‪(None, 200‬‬ ‫‪1620200‬‬

‫)‪dense_1 (Dense‬‬ ‫)‪(None, 16‬‬ ‫‪3216‬‬

‫=================================================================‬
‫‪Total params: 1,623,416‬‬
‫‪Trainable params: 1,623,416‬‬
‫‪Non-trainable params: 0‬‬
‫_________________________________________________________________‬

‫عدد الخاليا الع�سبية في الطبقة المخفية يعتمد على‬


‫الخيار الذي يُتخذ عند الت�سميم‪ ،‬وعدد الفئات يحدِّ د‬
‫عدد الخاليا الع�سبية في طبقة المُخرَجات‪.‬‬

‫للمتغرات التي يجب اأن يتعلّمها النم��وذج من خالل �سبطها على بيانات‬ ‫ِّ‬ ‫يك�س��ف ملخ���س النم��وذج ع��ن الع��دد االإجم��ايل‬
‫دخ��ل‪ ،‬وه��ي اأبع��اد �س��ور املخط��ط التك��راري‬ ‫ُدخ��الت حُتت��وي عل��ى ثماني��ة اآالف ومئ��ة (‪ُ )8,100‬م َ‬ ‫التدري��ب‪ ،‬ومب��ا اأن امل َ‬
‫املوجه��ة ‪ X_train_hog‬وحُتت��وي الطبق��ة املخفي��ة عل��ى مئت��ي خلي��ة ع�سبي��ة‪ ،‬وه��ي طبق��ة كثيف��ة مت�سل��ة‬ ‫للتدرج��ات َّ‬
‫(متغراتها)‪.‬‬ ‫ِّ‬ ‫أوزانها‬ ‫ا‬ ‫م‬‫ُّ‬ ‫ل‬ ‫تع‬ ‫يجب‬ ‫موزونة‬ ‫و�سلة‬ ‫‪1,620,000‬‬ ‫=‬ ‫‪200‬‬ ‫×‬ ‫‪8,100‬‬ ‫املجموع‬ ‫إن‬ ‫ا‬ ‫ف‬ ‫‪،‬‬‫كامال‬
‫ً‬ ‫ات�ساال‬
‫ً‬ ‫باملُدخَ الت‬
‫مت��ت اإ�ساف��ة مئت��ي متغ� ِّ�ر حت ُّي��ز (‪ )Bias‬اإ�س��ايف‪ ،‬بواق��ع متغ� ِّ�ر ل��كل خلي��ة ع�سبي��ة يف الطبق��ة املخفي��ة‪ ،‬ومتغ� ِّ�ر التح ُّي��ز‬
‫دخالت كل خلية ع�سبية يف ال�س��بكة الع�سبية‪ ،‬و ُت�س��تخدم لتوجيه دالة تن�س��يط اخلاليا الع�سبية‬ ‫هو قيمة ُت�ساف اإىل ُم َ‬
‫اإىل اجلان��ب ال�س��لبي اأو االإيجاب��ي‪ ،‬مم��ا ي�س��مح لل�س��بكة بنمذج��ة عالق��ات اأك��ر تعقي��دً ا ب��ني بيان��ات املُدخَ ��الت وعناوي��ن‬
‫املُخرَجات‪.‬‬
‫‪212‬‬
‫ومبا اأن طبقة املُخرَجات حُتتوي على �ستّ ع�سرة خلية ع�سبية مت�سلة بالكامل مبئتي خلية ع�سبية موجودة يف الطبقة‬
‫املخفي��ة‪ ،‬ف�اإن جمم��وع الو�س��الت املوزون��ة يبل��غ ‪ .3,216 = 200 × 16‬و ُي�س��اف �س��تة ع�س��ر متغ� ِّ�ر حُت ُّي��ز اإ�س��ايف‪ ،‬بواق��ع‬
‫متغر واحد لكل خلية ع�سبية يف طبقة املُخرَجات‪ ،‬و ُي�ستخدم ال�سطر الربجمي التايل لتجميع (‪ )Compile‬النموذج‪:‬‬ ‫ِّ‬
‫‪# compiling the model‬‬
‫= ‪model.compile(loss = 'sparse_categorical_crossentropy', metrics‬‬
‫)'‪['accuracy'], optimizer = 'adam‬‬

‫تُ�س��تخدم دال��ة اإع��داد النم��وذج الذك��ي يف مكتب��ة ‪ Keras‬واملعروف��ة بالتجمي��ع (()‪ )model.compile‬يف عملي��ة‬
‫حُتدي��د اخل�سائ���س االأ�سا�س��ية للنم��وذج الذك��ي واإع��داده للتدري��ب والتحق��ق والتنب�وؤ‪ ،‬وتتخ��ذ ثالثة مُعامِ الت رئي�س��ة كما‬
‫مو�سح يف اجلدول ‪.4.2‬‬‫هو َّ‬

‫جدول  ‪ُ :4.2‬معا ِمالت طريقة الت ميع‬

‫ه��ي الدال��ة الت��ي تُ�س��تخدم لتقيي��م اخلط�اأ يف النم��وذج اأثن��اء التدري��ب‪ ،‬وتقي���س م��دى تطاب��ق‬
‫تنب�وؤات النم��وذج م��ع العناوي��ن احلقيقي��ة ملجموع��ة معيّنة من بيانات املُدخَ ��الت‪ .‬الهدف من‬
‫التدريب تقليل دالة اخل�سارة مما يت�سمن يف العادة تعديل اأوزان النموذج ومقدار التح ُّيز‪،‬‬ ‫اخل�سارة‬
‫ويف ه��ذه احلال��ة تك��ون دال��ة اخل�س��ارة ه��ي‪ sparse_categorical_crossentropy :‬وهي‬ ‫(‪)loss‬‬
‫متعددة الفئات؛ حيث تكون العناوين اأعدادًا �سحيحة‬ ‫دالة خ�سارة منا�سبة ملهام الت�سنيف ِّ‬
‫كما يف ‪.y_train_num‬‬
‫ه��ي قائم��ة املقايي���س امل�س��تخدَ مة لتقيي��م النم��وذج اأثن��اء التدري��ب واالختب��ار‪ُ ،‬وحُت�س��ب ه��ذه‬
‫املقايي���س با�س��تخدام ُخم َرج��ات النم��وذج والعناوي��ن احلقيقي��ة‪ ،‬ومُيك��ن ا�س��تخدامها ملراقبة‬ ‫املقايي�س‬
‫اأداء النم��وذج وحُتدي��د املج��االت الت��ي مُيك��ن حُت�س��ينه فيه��ا‪ .‬مقيا���س الدق��ة (‪)Accuracy‬‬ ‫(‪)metrics‬‬
‫هو مقيا�س �سائع ملهام الت�سنيف يقي�س ن�سبة التنبوؤات ال�سحيحة التي قام بها النموذج‪.‬‬
‫ه��و خوارزمي��ة التح�س��ني الت��ي تُ�س��تخدم يف �سب��ط اأوزان النم��وذج ومق��دار التح ُّي��ز اأثن��اء‬
‫املح�سن دالة اخل�سارة واملقايي�س الإر�ساد عملية التدريب‪ ،‬ويقوم ب�سبط‬ ‫التدريب‪ .‬وي�ستخدم ِّ‬
‫متغ� ِّ�رات النم��وذج يف حُماول��ة لتقلي��ل اخل�س��ارة وزي��ادة اأداء النم��وذج اإىل احل��د االأق�س��ى‪.‬‬ ‫امل ُح�سِّ ن‬
‫(‪)optimizer‬‬
‫ويف ه��ذه احلال��ة فق��د مت ا�س��تخدام املُح�سِّ ��ن ‪ ،adam‬ال��ذي ُيع� ُّد خوارزمي��ة �س��ائعة لتدري��ب‬
‫ال�سبكات الع�سبية‪.‬‬

‫واأخرًا‪ ،‬تُ�ستخدم دالة () ‪ fit‬لتدريب النموذج على البيانات املتاحة‪.‬‬


‫‪model.fit(X_train_hog,‬‬ ‫‪# training data‬‬
‫‪y_train_num,‬‬ ‫‪# labels in integer format‬‬
‫= ‪batch_size‬‬ ‫‪80, # number of samples processed per batch‬‬
‫‪epochs = 40,‬‬ ‫‪# number of iterations over the whole dataset‬‬
‫)‬

‫‪213‬‬
‫‪Epoch‬‬ ‫‪1/40‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 1s 16ms/step - loss: 2.2260 - accuracy: 0.3333‬‬
‫‪Epoch‬‬ ‫‪2/40‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 15ms/step - loss: 1.1182 - accuracy: 0.7256‬‬
‫‪Epoch‬‬ ‫‪3/40‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 15ms/step - loss: 0.7198 - accuracy: 0.8155‬‬
‫‪Epoch‬‬ ‫‪4/40‬‬
‫‪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‬‬
‫‪...‬‬
‫‪Epoch‬‬ ‫‪36/40‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 15ms/step - loss: 0.0085 - accuracy: 1.0000‬‬
‫‪Epoch‬‬ ‫‪37/40‬‬
‫‪17/17‬‬ ‫]==============================[‬ ‫‪- 0s 21ms/step - loss: 0.0080 - accuracy: 1.0000‬‬
‫‪Epoch‬‬ ‫‪38/40‬‬
‫‪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‬‬

‫تُ�س��تخدم دال��ة () ‪ fit‬لتدري��ب من��وذج عل��ى جمموع��ة مع ّين��ة م��ن بيان��ات االإدخ��ال والعناوي��ن‪ ،‬وتتخ��ذ اأرب��ع مُعامِ ��الت‬
‫مو�سح يف اجلدول ‪.4.3‬‬ ‫رئي�سة‪ ،‬كما هو َّ‬

‫جدول  ‪ُ :4.3‬معا ِمالت طريقة‬

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

‫ه��و ع��دد العين��ات الت��ي مت��ت معاجلته��ا يف كل دُفع��ة اأثن��اء التدري��ب‪ ،‬ويق��وم النم��وذج‬
‫بتحدي��ث اأوزان��ه ومق��دار التح ُّي��ز بع��د كل ُدفع��ة‪ ،‬ومُيك��ن اأن يوؤث��ر حج��م ال ُدفع��ة عل��ى‬
‫�س��رعة عملي��ة التدري��ب‪ ،‬وا�س��تقراراها‪ ،‬كم��ا مُيك��ن اأن ت�وؤدي اأحج��ام ال ُدفع��ات االأكرب‬ ‫‪batch_size‬‬
‫اإىل تدريب اأ�س��رع‪ ،‬ولكنها قد تكون اأكر تكلفة من الناحية احل�س��ابية وقد توؤدي اإىل‬
‫تدرجات اأقل ا�ستقرارًا‪.‬‬
‫هو عدد املرات التي يتكرر فيها تدريب النموذج با�ستخدام جمموعة البيانات باأكملها‪،‬‬
‫وتتك�ون الف�رتة (‪ )epoch‬م�ن م�رور واح�د ع�رب جمموع�ة البيان�ات باأكمله�ا‪ .‬ويقوم‬
‫النموذج بتحديث اأوزانه ومقدار التح ُّيز بعد كل دورة‪ ،‬كما مُيكن اأن يوؤثر عدد الفرتات‬ ‫‪epochs‬‬
‫متغر مهم‬
‫على قدرة النموذج على التعلُّم والتعميم على البيانات اجلديدة‪ ،‬والفرتة ِّ‬
‫يجب اختياره بعناية‪ ،‬ويف هذه احلالة ُيد َّرب النموذج على اأربعني دورة‪.‬‬
‫‪214‬‬
‫ومُيكن االآن ا�ستخدام منوذج التدريب للتنبوؤ بعناوين ال�سور يف جمموعة االختبار‪.‬‬
‫)‪pred = model.predict(X_test_hog‬‬
‫‪pred[0] # prints the predictions for the first image‬‬

‫‪14/14 [==============================] - 0s 2ms/step‬‬

‫‪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‬العنوان االأكر‬
‫ُر�س��حة‪ .‬يف ه��ذه احلال��ة‪ ،‬مُيك��ن ا�س��تخدام دال��ة ()‪ np.argmax‬الإظه��ار‬
‫يف مكتب��ة ‪ Keras‬احتم��االت كل العناوي��ن امل َّ‬
‫احتماال‪.‬‬
‫ً‬ ‫موؤ�سر العنوان االأكر‬
‫‪# index of the class with the highest predicted probability.‬‬
‫))]‪print(np.argmax(pred[0‬‬
‫‪# 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‬ولك��ن‬
‫ميزة املعماريات الع�سبية تنبع من براعتها‪ ،‬وهو ما ي�سمح لك بتجربة معماريات ُخمتلفة للعثور على اأف�سل ما ينا�سب‬
‫جمموع��ة بيانات��ك‪ .‬مت حُتقي��ق ه��ذه الدق��ة م��ن خ��الل معماري��ة ب�س��يطة ت�سمن��ت طبق��ة خمفي��ة واح��دة حُتت��وي عل��ى مئتي‬
‫خلية ع�سبية‪ ،‬واإ�سافة طبقات اإ�سافية جتعل ال�سبكة اأعمق‪ ،‬بينما توؤدي اإ�سافة املزيد من اخلاليا الع�سبية لكل طبقة‬
‫اإىل جعلها اأو�سع‪ ،‬و ُيع ُّد اختيار عدد الطبقات وعدد اخلاليا الع�سبية لكل طبقة عنا�سر مهمة لت�سميم ال�سبكة الع�سبية‪،‬‬
‫وله��ا تاأث��ر كب��ر عل��ى اأدائه��ا‪ ،‬ولكنه��ا لي�س��ت الطريق��ة الوحي��دة لتح�س��ني االأداء‪ ،‬ويف بع���س احل��االت ق��د يكون ا�س��تخدام‬
‫نوع ُخمتلف من معمارية ال�سبكة الع�سبية اأكر فاعلية‪.‬‬
‫التنبو با�ستخدام ال�سبكات الع�سبية الرت�سيحية‬
‫‪re iction Using on o ution Neural Networks‬‬
‫أاح��د ه��ذه االأن��واع م��ن املعماري��ات الت��ي تنا�س��ب ت�سني��ف ال�س��ور ب�س��كلٍ ج ّي��د يتم ّث��ل يف ال�س��بكة الع�سبي��ة الرت�س��يحية‬
‫(‪ ،)Convolutional Neural Network -CNN‬ومبا اأن ال�س��بكة الع�سبية الرت�س��يحية تعالج بيانات االإدخال‪ ،‬فاإنها‬
‫املر�س� َ�حة الكت�س��اف االأمناط بنا ًء على البيانات التي تراها؛ حتّى تتمكن ب�س��كل‬‫متغرات الفالتر َّ‬ ‫تقوم با�س��تمرار ب�سبط ِّ‬
‫اأف�س��ل م��ن اكت�س��اف اخل�سائ���س املهم��ة‪ ،‬ث��م تنقل ُخم َرج��ات كل طبقة اإىل الطبقة التالية التي يُكت�س��ف فيها خ�سائ�س‬
‫تعقيدا اإىل اأن تُنتج املُخرَجات النهائية‪.‬‬
‫اأكر ً‬
‫‪215‬‬
‫عل��ى الرغ��م م��ن فوائ��د ال�س��بكات الع�سبي��ة املعق��دة مث��ل‪:‬‬
‫ال�سبكة الع�سبية الرت�سيحية‬ ‫ال�س��بكات الع�سبية الرت�س��يحية اإال اأنه من املهم مالحظة‬
‫(‪:) on o ution Neural Network -CNN‬‬ ‫ما يلي‪:‬‬
‫ه��ي �س��بكات ع�سبي��ة عميق��ة تتع ّل��م تلقائ ًي��ا ت�سل�س��ل‬ ‫• تكمن قوة ال�سبكات الع�سبية الرت�سيحية يف قدرتها على‬
‫اخل�سائ���س م��ن البيان��ات اخل��ام‪ ،‬مث��ل ال�س��ور‪ ،‬ع��ن‬ ‫اأن ت�ستخرج اخل�سائ�س املهمة ذات ال�سلة من ال�سور‬
‫طري��ق تطبي��ق �سل�س��لة م��ن الفالت��ر الرت�س��يحية عل��ى‬ ‫ب�س�كل تلقائ�ي ‪ ،‬دون احلاج�ة اإىل هند�س�ة اخل�سائ��س‬
‫بيان��ات االإدخ��ال‪ ،‬الت��ي يت��م ت�سميمه��ا بحي��ث تكت�س��ف‬ ‫اليدوية (‪.)Manual Feature Engineering‬‬
‫خ�سائ�س حُم َّددة‪.‬‬
‫َ‬ ‫اأمناطً ا اأو‬ ‫• حُتت��وي املعماري��ات الع�سبية االأكر تعقيدً ا على املزيد‬
‫م��ن املتغ� ِّ�رات الت��ي يج��ب تعلُّمه��ا م��ن البيان��ات اأثن��اء‬
‫التدري��ب‪ ،‬ويتطل��ب ذل��ك جمموع��ة بيان��ات تدري��ب اأك��رب ق��د ال تك��ون متاح��ة يف بع�س احل��االت‪ ،‬ويف مثل ه��ذه احلاالت‬
‫من غر املحتمل اأن يكون اإن�ساء معمارية معقدة للغاية اأمرًا فع ًَّاال‪.‬‬
‫• عل��ى الرغ��م م��ن اأن ال�س��بكات الع�سبي��ة ق��د حقق��ت بالفع��ل نتائ��ج مبه��رة يف معاجل��ة ال�س��ور واملهام االأخ��رى‪ ،‬اإال اأنها‬
‫ال ت�سمن تقدمي اأف�سل اأداء جلميع امل�سكالت وجمموعات البيانات‪.‬‬
‫• حتّى لو كانت معمارية ال�سبكة الع�سبية اأف�سل حل ممكن ملُهِ مَّة حُمددة‪ ،‬فقد ي�ستغرق االأمر كثرًا من الوقت واجلهد‬
‫وامل��وارد احلا�س��وبية لتجرب��ة خي��ارات ُخمتلف��ة اإىل اأن يتم العث��ور على هذه املعمارية‪ .‬لذلك من االأف�سل البدء بنماذج‬
‫اأب�سط (لكنها ال تزال فعّالة)‪ ،‬مثل‪ :‬منوذج ‪ SGDClassifier‬وغره من النماذج االأخرى الكثرة املتوفرة يف املكتبات‬
‫مث��ل‪ :‬مكتب��ة ‪ ،sklearn‬ومبج��رد ح�سول��ك عل��ى تن ُّب�وؤ اأف�س��ل ملجموع��ة البيان��ات وو�سول��ك اإىل النقط��ة الت��ي ال مُيك��ن‬
‫فيها حُت�سني هذه النماذج اأكر من ذلك‪ ،‬فاإن التجريب على املعماريات الع�سبية االأخرى ُي ُّعد خطوة ممتازة‪.‬‬

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


‫�سكل ‪� :4.13‬سبكة ع�سبية ذات هند�سة خ�سائ�س يدوية‬

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

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

‫التعلُّم املنقول ‪Transfer Learning‬‬


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

‫اإحالل‬
‫التنبوؤ وتقييم‬ ‫تدريب‬ ‫حتميل ال�سبكة‬
‫ن�سر النتائج‬ ‫الطبقات‬
‫دقة ال�سبكة‬ ‫ال�سبكة‬ ‫املدرَّبة م�سبقًا‬
‫النهائية‬

‫تتم اإ�سافة طبقات جديدة‬


‫حت�سني ال�سبكة‬ ‫لكي تتعلّم الخ�سائ�س‬
‫المحددة لبياناتك‪.‬‬

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

‫‪217‬‬
‫مترينات‬
‫‪ 1‬ما حتديّات ت�سنيف البيانات املرئية؟‬

‫لدي��ك م�سفوفت��ا قي��م ‪ ،Numpy‬وهم��ا م�سفوف��ة ‪ X_train‬وم�سفوف��ة ‪ .Y_train‬كل �س��ف يف م�سفوف��ة ‪X_train‬‬ ‫‪2‬‬
‫�س��كله (‪ )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‬سف باخت�سار طريقة عمل ال�سبكات الع�سبية الرت�سيحية واإحدى مميزاتها الرئي�سة‪.‬‬

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

from skimage.color import # used to convert a multi-color (rgb) image to grayscale

from sklearn. import StandardScaler # used to scale the data

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

X_train_gray = np.array([ (img) for img in X_train]) # converts training data

X_train_hog =

scaler = StandardScaler()

X_train_hog_scaled = .fit_transform(X_train_hog)

model_MNB = MultinomialNB()

model_MNB.fit(X_train_flat_scaled, )

.‫اذكر بع�س حتديّات ال�سبكات الع�سبية الرت�سيحية‬ 5

219
‫الدر�ض الثاين‬
‫املوجه لتحليل ال�سور‬
‫التع ُّلم غري َّ‬

‫تو ال�سور‬ ‫فهم‬


‫‪Understanding Image Content‬‬
‫يف �سياق روؤية احلا�سب ُي�ستخدم التعلُّم غر املوجَّ ه يف جمموعة متنوّعة من املهام مثل‪:‬‬
‫اكت�ساف العنا�سر ال�ساذّة‬ ‫تقطي�ع اأو ز ئ�ة ال�س�ورة( ‪ ،)Image Segmentation‬وتقطي�ع الفيد ي�و‬
‫(‪:)Anomaly e ection‬‬ ‫(‪ ،)Video Segmentation‬واكت�ساف العنا�سر ال�ساذّة (‪،)Anomaly Detection‬‬
‫ه��ي عملي��ة تُ�س��تخدم لتحدي��د االأمناط اأو‬ ‫وم�ن اال�س�تخدامات الرئي�س�ة االأخ�رى للتعلُّ�م غ�ر املوجَّ �ه‪ :‬البح�ث ع�ن ال�س�ورة‬
‫ا أالح��داث اأو نق��اط البيان��ات ال�س��اذّة اأو‬ ‫(‪ )Image Search‬ويت�سم�ن البح�ث يف قاع�دة بيان�ات كب�رة م�ن ال�س�ور للعث�ور على‬
‫غ��ر الطبيعي��ة داخل جمموع��ة البيانات‪،‬‬ ‫ال�سورة امل�سابهة لل�سورة املطلوبة‪.‬‬
‫وته��دف اإىل الك�س��ف ع��ن ا حل��االت‬ ‫تتمثّ�ل اخلط�وة االأوىل لبن�اء حُم�رك بح�ث لبيان�ات �س�ورة يف حُتدي�د دال�ة الت�س�ابه‬
‫الغريب��ة الت��ي تختل��ف ع��ن املعي��ار وق��د‬ ‫(‪ )Similarity Function‬والت�ي مُيكنه�ا تقيي�م الت�س�ابه ب�ني �سورت�ني بن�ا ًء عل�ى‬
‫حُتتاج اإىل ا�ستق�ساء اإ�سايف‪.‬‬ ‫خ�سائ�سهم�ا املرئي�ة‪ ،‬مث�ل‪ :‬احل�دود‪ ،‬اأو النق��س‪ ،‬اأو ال�س�كل‪ .‬ومبج�رد اأن ُي ِ‬
‫ر�س�ل‬
‫�تخدم �س�ورة جدي�دة لي�س�تعلم عنه�ا‪ ،‬يق�وم حُم�رك البحث باالط�الع على جميع‬ ‫امل�س ِ‬
‫تقطيع ال�سورة‬ ‫ال�سور املوجودة يف قاعدة البيانات املتاحة‪ ،‬ويعر على ال�سور التي بها اأعلى درجة‬
‫ت�س�ابه‪ ،‬و ُيظهرها للم�س ِ‬
‫�تخدم‪.‬‬
‫(‪:)Image Seg en tion‬‬
‫ه��ي عملي��ة تق�س��يم ال�س��ورة اإىل اأج��زاء‬ ‫وهناك طريقة بديلة تتمثّل يف ا�ستخدام دالة الت�سابه لف�سل ال�سور يف عناقيد؛ بحيث‬
‫اأو مناط��ق متع��ددة تتقا�س��م خ�سائ���س‬ ‫يتك�ون كل عنق�ود م�ن �س�ور مت�س�ابهة ب�سريً�ا مع بع�سها‪ ،‬ث�م ُ َمُيثَّل كل عنق�ود من خالل‬
‫ب�سري��ة م�س��رتكة‪ ،‬وته��دف اإىل جتزئ��ة‬ ‫ب�وؤرة مي�ع (‪ :)Centroid‬وه�ي �س�ورة تق�ع يف مرك�ز العنق�ود ومتتلك اأ�سغر م�س�افة‬
‫ِ‬
‫امل�ستخدم �سورة‬ ‫عامة (اأي اختالف) من ال�سور االأخرى يف العنقود‪ .‬ومبجرد اأن ُي ِ‬
‫ر�سل‬
‫ال�س��ورة اإىل أاج��زاء مرتابط��ة‪ ،‬وذات‬
‫مغ��زى مُيك��ن ا�س��تخدامها يف القي��ام‬ ‫جديدة لال�ستعالم عنها‪ ،‬فاإن حُمرك البحث �سينتقل اإىل جميع العناقيد ويختار العنقود‬
‫بتحليل اإ�سايف‪.‬‬ ‫الذي تكون بوؤرة جتميعه اأكر ت�سابهًا مع ال�سورة املطلوبة من امل�ستخدِ م لتظهر له �سور‬
‫مثاال على هذا‪.‬‬
‫ويو�سح ال�سكل ‪ً 4.16‬‬‫العنقود املحددة‪ِّ ،‬‬

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


‫‪220‬‬
‫العنقود االأول‬

‫‪50%‬‬

‫العنقود الثاين‬

‫‪90%‬‬

‫العنقود الثالث‬
‫‪40%‬‬

‫�سكل ‪ :4.17‬عناقيد التعرّف على ال�سور‬


‫املو�س��ح يف ال�س��كل ‪ ،4.17‬حُتت��وي �س��ورة البح��ث عل��ى ت�س��ابه بن�س��بة‪ 40% :‬و‪ 50%‬و‪ 90%‬م��ع ُب �وؤر التجمي��ع‬ ‫يف املث��ال َّ‬
‫لعناقي��د ال�س��ور الث��الث عل��ى الت��وايل‪ ،‬و ُيفرت���س اأن تك��ون ن�س��بة الت�س��ابه ب��ني ‪ 0%‬و ‪ ،100%‬وح�سل العنق��ود الثاين على‬
‫اأعل��ى ن�س��بة ت�س��ابه؛ اإذ اأن��ه ي�س��تمل عل��ى قط��ط م��ن نف���س �س��اللة ول��ون القطّ ��ة املح��ددة يف �س��ورة البح��ث‪ ،‬كم��ا اأن نتائ��ج‬
‫العنقودين االأول والثالث متقاربة (‪ 40%‬و‪)50%‬؛ اإذ يت�سابه العنقودان مع �سورة البحث بطرائق ُخمتلفة‪ ،‬اأما العنقود‬
‫االأول فيت�سم��ن قططً ��ا يختل��ف من��ط األوانه��ا متامً ��ا ع��ن املطل��وب‪ ،‬وبالرغ��م من اأن العنق��ود الثالث مُيثِّل نوعً ��ا ُخمتلفًا من‬
‫احليوانات وهو النمر‪ ،‬فاإن منط اللون م�سابه ل�سورة البحث‪.‬‬
‫تُ�س��به عملي��ة جتمي��ع البيان��ات املرئي��ة يف عناقيد‪ ،‬عملية جتمي��ع البيانات الرقمية اأو الن�سيَّة‪ ،‬ومع ذلك تتطلب الطبيعة‬
‫متخ�س�س��ة؛ لتقيي��م الت�س��ابه الب�س��ري‪ ،‬وبالرغ��م م��ن اأن االأ�س��اليب االأق��دم كان��ت‬ ‫ّ‬ ‫الفري��دة للبيان��ات املرئي��ة طرائ��ق‬
‫تعتم��د عل��ى خ�سائ���س م�سنوع��ة يدو ًي��ا‪ ،‬فق��د اأدت التطورات احلديثة يف التعلُّ��م العميق اإىل تطوير مناذج قوية مُيكنها‬
‫تلقائ ًي��ا اأن تتع ّل��م خ�سائ���س متطورة من البيان��ات املرئية غر املُعَنوَنة‪.‬‬
‫ي�س��تخدِ م ه��ذا الدر���س ُمهِ َّم��ة خا�س��ة بتجمي��ع ال�س��ور؛ لتو�سي��ح كي��ف مُيك��ن اأن ي�وؤدي ا�س��تخدام خ�سائ���س اأك��ر تعقي��دً ا‬
‫و�سيو�سح هذا الدر�س ‪-‬حُتديدً ا‪ -‬ثالث طرائق ُخمتلفة‪:‬‬ ‫ِّ‬ ‫اإىل تقدمي نتائج اأف�سل ب�سكل ملحوظ‪،‬‬
‫• ت�سطيح البيانات االأ�سلية وجتميعها بدون اأي هند�سة للخ�سائ�س‪.‬‬
‫• حُتوي��ل البيان��ات با�س��تخدام وا�س��ف اخل�سائ���س (‪ )Feature Descriptor‬ال��ذي يعتم��د عل��ى املخط��ط التك��راري‬
‫للتدرجات املوجَّ هة (‪- )HOG‬تعرّفت عليه يف الدر�س ال�سابق‪ -‬ثم جتميع البيانات املح َّولة‪.‬‬
‫• ا�ستخدام منوذج ال�سبكة الع�سبية؛ لتجميع البيانات االأ�سلية يف جمموعات عنقودية بدون هند�سة اخل�سائ�س‪.‬‬
‫جمموع��ة بيان��ات ‪( LHI-Animal-Faces‬وج��وه _احليوان��ات) الت��ي ا�س�تُخدمت يف الدر���س ال�س��ابق و�ست�س��تخدم يف هذا‬
‫أي�سا؛ لتقييم التقنيات املتن ّوعة لتجميع ال�سور‪ ،‬ومت ت�سميم هذه املجموعة يف االأ�سل ملهام الت�سنيف‪ ،‬وتت�سمن‬ ‫الدر�س ا ً‬
‫العن��وان احلقيق��ي (ن��وع احلي��وان الفعل��ي) ل��كل �س��ورة‪ .‬ويف ه��ذا الدر���س‪� ،‬س ُت�س��تخدم ه��ذه العناوي��ن فق��ط للتحق��ق م��ن‬
‫�سحته��ا‪ ،‬ول��ن تُ�س��تخدم لتجمي��ع ال�س��ور‪ .‬يج��ب اأن يك��ون اأي اأ�س��لوب جتمي��ع اأ�س��لوبًا ف ّع� ً�اال وق��ادرًا عل��ى جتمي��ع ال�س��ور مع‬
‫العنوان نف�سه‪ ،‬ويف العنقود نف�سه‪ ،‬وعلى ف�سل ال�سور ذات العناوين املُختلفة‪ ،‬وو�سعها يف عناقيد ُمتباينة‪.‬‬
‫‪221‬‬
Loading and Preprocessing Images ‫تها اأوليًا‬ ‫ميل ال�سور ومعا‬
:‫ي�ستورد املقطع الربجمي التايل املكتبات التي �ستُ�ستخدم لتحميل ال�سور ومعاجلتها اأوليًا‬
%%capture
import matplotlib.pyplot as plt
from os import listdiry

!pip install scikit-image


from skimage.io import imread
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',
'pink','black','brown']

_‫ (جمل��د‬input_folder ‫ (وج��وه _احليوان��ات) م��ن‬LHI-Animal-Faces ‫تق��راأ الدال��ة التالي��ة �س��ور جمموع��ة بيان��ات‬
‫ ثم تقوم بتح�س��ني دالة‬،‫ و ُتع� ِّ�دل حج��م كل منه��ا بحي��ث تك��ون له��ا اأبع��اد الط��ول والعر�س نف�س��ها‬،‫املُدخَ ��الت) اخلا���س به��ا‬
ِ �‫ م��ن الدر���س ال�س��ابق بال�س��ماح للم�س‬resize_images)(
‫�تخدم ب�اأن يح� ِّ�دد قائم��ة فئ��ات احليوان��ات الت��ي يج��ب اأن توؤخذ‬
‫ كم��ا اأنه��ا ت�س��تخدم �س��طرًا واح��دً ا م��ن املقط��ع الربجم��ي بلغ��ة البايث��ون؛ لك��ي تق��راأ كل �س��ورة وتع� ِّ�دل حجمه��ا‬،‫باالعتب��ار‬
:‫وتخزنها‬
ِّ
def resize_images_v2(input_folder:str,
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):

label=subfolder[:-4] # uses the subfolder name without the "Head" suffix


if label not in labels_to_keep: continue
labels.append(label) # appends the label
#loads, resizes, preprocesses, and stores the image.
resized_images.append(img_as_ubyte(resize(imread(path+'/'+file),
(width, height))))
filenames.append(file)

return resized_images,labels,filenames

222
‫البيان��ات غ��ر امل ُنظّ م��ة (‪ )Unstructured Data‬متن ّوع��ة‪ ،‬ومُيك��ن اأن حُتت��اج اإىل كث��ر م��ن الوقت واملوارد احلا�س��وبية‪،‬‬
‫و ُيع� ُّد ه��ذا �سحي ًح��ا ب�س��كلٍ خا���س عن��د معاجلته��ا ع��ن طري��ق اأ�س��اليب تعلُّ��م عميق��ة ومعق��دة‪ ،‬كم��ا �س� ُينفذ الح ًق��ا يف ه��ذا‬
‫الدر���س‪ ،‬ولتقلي��ل الوق��ت احل�س��ابي يت��م تطبي��ق دال��ة ()‪ resize_images_v2‬عل��ى جمموع��ة فرعي��ة م��ن ال�س��ور م��ن‬
‫فئات احليوانات‪:‬‬

‫(‪resized_images,labels,filenames=resize_images_v2‬‬
‫‪"AnimalFace/Image",‬‬
‫‪width = 224,‬‬
‫‪height = 224,‬‬
‫‪labels_to_keep=['Lion', 'Chicken', 'Duck', 'Rabbit', 'Deer',‬‬
‫]'‪'Cat', 'Wolf', 'Bear', 'Pigeon', 'Eagle‬‬
‫)‬

‫‪BearHead‬‬ ‫‪MonkeyHead‬‬
‫‪CatHead‬‬ ‫‪Natural‬‬ ‫هذه العناوين الع�سرة‬
‫‪ChickenHead‬‬ ‫‪PandaHead‬‬ ‫التي �سيتم ا�ستخدامها‪.‬‬
‫‪CowHead‬‬ ‫‪PigeonHead‬‬
‫‪DeerHead‬‬ ‫‪RabbitHead‬‬
‫‪DuckHead‬‬ ‫‪SheepHead‬‬
‫‪EagleHead‬‬ ‫‪TigerHead‬‬
‫‪ElephantHead‬‬ ‫‪WolfHead‬‬
‫‪LionHead‬‬

‫مُيكن��ك ب�س��هولة تعدي��ل املتغ� ِّ�ر ‪( labels_to_keep‬العناوي��ن _ املحتف��ظ به��ا)؛ للرتكي��ز عل��ى فئ��ات معيّنة‪ ،‬و�س��تالحظ‬
‫�دال م��ن ال�س��كل ‪ 100 × 100‬ال��ذي ا�س�تُخدم يف الدر���س‬ ‫اأن عر���س ال�س��ور وارتفاعه��ا مت �سبطهم��ا عل��ى ‪ ،224 × 224‬ب� ً‬
‫ال�س��ابق؛ الأن اإح��دى طرائ��ق التجمي��ع القائم��ة عل��ى التعلُّم العميق ‪-‬الواردة يف هذا الدر���س‪ -‬تتطلب اأن تكون لل�سور هذه‬
‫االأبعاد‪ ،‬ولذا اعتُمد ال�سكل ‪224 × 224‬؛ ل�سمان منح حق الو�سول جلميع الطرائق اإىل املُدخَ الت نف�سها‪.‬‬
‫كم��ا ذُ كِ ��ر يف الدر���س ال�س��ابق ف �اإن القوائ��م االأ�سلي��ة‪( resized_images :‬ال�س��ور _املُع � َّدل حجمه��ا)‪ ،‬و‪labels‬‬
‫(العناوي��ن)‪ ،‬و‪( filenames‬اأ�س��ماء امللف��ات) ت�س��تمل عل��ى ال�س��ور الت��ي تنتم��ي ل��كل فئ��ة ُجم َّمعة معًا‪ .‬على �س��بيل املثال‪،‬‬
‫تظه��ر جمي��ع �س��ور ‪( Lion‬االأ�س��د) م ًع��ا يف بداي��ة القائم��ة املُع� َّدل حجمه��ا‪ ،‬وق��د يُ�س ِل��ل ذل��ك العدي��د م��ن اخلوارزمي��ات‪،‬‬
‫خا�س��ة يف جم��ال ر ؤوي��ة احلا�س��ب‪ ،‬وطامل��ا اأن��ه مُيك��ن فهر�س��ة ال�س��ور ع�س��وائيًا ل��كل قائمة م��ن القوائم الث��الث‪ ،‬فمن املهم‬
‫التاأكد من ا�ستخدام الرتتيب الع�سوائي نف�سه لهذه القوائم‪ .‬وبخالف ذلك‪ ،‬من امل�ستحيل العثور على العنوان ال�سحيح‬
‫ل�سورة مع ّينة اأو ا�سم امللف ال�سحيح لها‪.‬‬
‫يف الدر���س ال�س��ابق‪ ،‬مت اإج��راء اإع��ادة الرتتي��ب (‪ )Shuffling‬با�س��تخدام الدال��ة ()‪ ، train_test_split‬ومب��ا اأن ه��ذه‬
‫الدالة غر قابلة للتطبيق على مهام التجميع‪ ،‬ف�ست�ستخدم املقطع الربجمي التايل الإعادة الرتتيب‪:‬‬

‫‪import random‬‬

‫‪#connects the three lists together, so that they are shuffled in the same order‬‬
‫))‪connected = list(zip(resized_images,labels,filenames‬‬
‫)‪random.shuffle(connected‬‬
‫‪# disconnects the three lists‬‬
‫)‪resized_images,labels,filenames= zip(*connected‬‬
‫‪223‬‬
‫تتم ّث��ل اخلط��وة التالي��ة يف حُتوي��ل قائمت��ي ‪( resized_images‬ال�س��ور _املُع�دَّل حجمه��ا)‪ ،‬و‪( labels‬العناوي��ن) اإىل‬
‫م�سفوف��ات ‪ ،numpy‬وكم��ا ه��و احل��ال يف الدر���س ال�س��ابق ُي�س��تخدم اال�س��مان املتغ� ِّ�ران القيا�س��يان (‪ )X،Y‬لتمثي��ل‬
‫البيانات والعناوين‪:‬‬

‫‪import numpy as np # used for numeric computations‬‬


‫)‪X = np.array(resized_images‬‬
‫)‪Y = np.array(labels‬‬

‫‪X.shape‬‬

‫)‪(1085, 224, 224, 3‬‬

‫يتحق��ق �س��كل البيان��ات م��ن اأنه��ا ت�س��مل ‪� 1,085‬س��ورة‪ ،‬كل �س��ورة منه��ا ذات اأبع��اد ‪ ،224 × 224‬وذات ث��الث قن��وات‬
‫األوان ‪.RGB‬‬
‫ميع من دون هند�سة اخل�سائ�ض ‪Clustering without Feature Engineering‬‬ ‫الت‬
‫�س��رتكز حُماول��ة التجمي��ع االأوىل عل��ى القي��ام بت�س��طيح ال�س��ور؛ لتحوي��ل كل منه��ا اإىل م َّتجَ ��ه اأح��ادي ال ُبع��د اأرقام��ه‬
‫‪ 150,528 = 3 × 224 × 224‬رقمًا‪.‬‬
‫وعل��ى غ��رار خوارزمي��ات الت�سني��ف الت��ي مت تو�سيحها يف الدر���س ال�س��ابق‪ ،‬ف�اإن معظم خوارزمي��ات التجميع تتطلب هذا‬
‫النوع من التن�سيق امل َّتجَ هي‪.‬‬
‫)]‪X_flat = np.array([img.flatten() for img in X‬‬
‫‪X_flat[0].shape‬‬

‫)‪(150528,‬‬

‫‪X_flat[0] # prints the first flat image‬‬

‫‪array([107, 146, 102, ...,‬‬ ‫‪91,‬‬ ‫)‪86, 108], dtype=uint8‬‬

‫كل قيم��ة عددي��ة يف ه��ذا التن�س��يق امل�س��طح ذات قيم��ة األ��وان ‪ RGB‬ت��رتاوح ب��ني ‪ 0‬و‪ ،255‬ويف الدر���س ال�س��ابق‪ّ ،‬مت‬
‫تو�سيح اأن التحجيم القيا�سي والت�سوية يوؤديان اأحيانًا اإىل حُت�سني نتائج بع�س خوارزميات التعلُّم االآيل‪.‬‬
‫مُيكن ا�ستخدام املقطع الربجمي التايل لت�سوية القيم وجعلها ما بني ‪ 0‬و‪:1‬‬
‫‪X_norm = X_flat / 255‬‬
‫]‪X_norm[0‬‬

‫‪array([0.41960784, 0.57254902, 0.4‬‬ ‫‪, ..., 0.35686275, 0.3372549 ,‬‬


‫)]‪0.42352941‬‬

‫‪224‬‬
‫مُيك��ن االآن ت�سوي��ر البيان��ات ب�سر ًي��ا با�س��تخدام اأداة ‪ TSNEVisualizer‬املاألوف��ة م��ن مكتب��ة ‪ ،yellowbrick‬ومت‬
‫أي�سا يف الدر�س الثاين من الوحدة الثالثة؛ لت�سوير العناقيد ب�سريًا يف البيانات الن�سيَّة‪.‬‬
‫ا�ستخدام هذه االأداة ا ً‬
‫‪%%capture‬‬
‫‪!pip install yellowbrick‬‬
‫‪from yellowbrick.text import TSNEVisualizer‬‬

‫‪tsne = TSNEVisualizer(colors = color_palette) # initializes the tool‬‬


‫‪tsne.fit(X_norm, y) # uses TSNE to reduce the data to 2 dimensions‬‬
‫;)(‪tsne.show‬‬

‫�سكل ‪ :4.18‬ت�سوير العناقيد‬

‫الت�سوي��ر التمهي��دي ه��ذا لي���س كم��ا ه��و متو َّق��ع‪ ،‬فيبدو اأن فئ��ات احليوانات املُختلف��ة خمتلطة ببع�سه��ا‪ ،‬دون متييز وا�سح‬
‫بينه��ا وب��دون عناقي��د وا�سح��ة له��ا‪ ،‬وي��دل ذل��ك عل��ى اأن جم��رد القي��ام بت�س��طيح بيانات ال�س��ورة االأ�سلية م��ن املحتمل اأال‬
‫يوؤدي اإىل نتائج ذات جودة عالية‪.‬‬
‫بع��د ذل��ك‪� ،‬ستُ�س��تخدم خوارزمي��ة التجمي��ع التكتل��ي (‪ )Agglomerative Clustering‬نف�س��ها الت��ي ا�س �تُخدمت يف‬
‫الدر���س الث��اين م��ن الوح��دة الثالث��ة؛ لتجمي��ع البيان��ات يف متغ� ِّ�ر ‪ ،X_norm‬وي�س��تورد املقط��ع الربجم��ي الت��ايل جمموعة‬
‫االأدوات املطلوبة‪ ،‬وي�س ِّور الر�سم ال�سجري ملجموعة البيانات‪:‬‬

‫‪225‬‬
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


plt.figure()

# 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
plt.show() ‫طريقة ربط تُ�ستخدم في‬
.‫التجميع التكتلي الهرمي‬

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


‫ و ُي�س��تخدم املقطع الربجمي التايل اأداة‬،‫يك�س��ف الر�س��م ال�س��جري عنقودين كبرين مُيكن تق�س��يمهما اإىل عناقيد اأ�سغر‬
‫ وه��و الع��دد الفعل��ي للعناقي��د املوج��ودة يف‬،‫ (التجمي��ع التكتل��ي)؛ الإن�س��اء ع�س��رة عناقي��د‬AgglomerativeClustering
:‫البيانات‬
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

array([9, 6, 3, ..., 4, 4, 3], dtype=int64)

Adjusted Rand ‫ و‬،)‫ (االكتم��ال‬Completeness‫ و‬،)‫ (التجان���س‬Homogeneity :‫ تُ�س��تخدم موؤ�س��رات‬،‫و أاخ �رًا‬
.‫(راند املُع َّدل) وكلها تع ّرفت عليها يف الدر�س الثاين من الوحدة الثالثة؛ لتقييم جودة العناقيد الناجتة‬
226
‫‪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‬وترتفع اإىل احلد‬
‫االأق�سى عندما تكون جميع نقاط البيانات التي لها العنوان نف�سه يف العنقود نف�سه‪ ،‬وتكون جميع النقاط ذات العناوين‬
‫املُختلفة يف عناقيد متباينة‪ ،‬وكما هو متوقَّع تف�سل اخلوارزمية بعد ت�سوير البيانات يف العثور على عناقيد عالية اجلودة‬
‫تتطابق مع فئات احليوانات الفعلية‪ ،‬حيث اأن قيم املوؤ�سرات الثالث منخف�سة للغاية‪ ،‬وعلى الرغم من اأن جمرد القيام‬
‫بت�سطيح البيانات كان كافيًا للح�سول على نتائج معقولة لت�سنيف ال�سور‪ ،‬اإال اأن جتميع ال�سور يف عناقيد ُمُيثِّل م�سكلة‬
‫اأكر �سعوبة‪.‬‬
‫ميع بانتقاء اخل�سائ�ض ‪Clustering with Feature Se ection‬‬ ‫الت‬
‫يف الدر���س ال�س��ابق مت تو�سي��ح اأنّ ا�س��تخدام حُتوي��ل املخط��ط التك��راري للتدرج��ات املوجَّ ه��ة (‪ )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‬‬
‫;)(‪tsne.show‬‬

‫‪227‬‬
‫�سكل ‪ :4.20‬ت�سوير العناقيد‬
‫ُيع� ُّد ه��ذا الت�سوي��ر اأك��ر م�سداقي��ة م��ن ال��ذي مت اإنتاج��ه للبيانات غ��ر املح َّولة‪ ،‬وعل��ى الرغم من وجود بع�س ال�س��وائب‪،‬‬
‫جيدا‪ ،‬ومُيكن االآن ح�ساب الر�سم ال�سجري ملجموعة البيانات هذه‪.‬‬ ‫فاإن ال�سكل ُيظهر عناقيد وا�سحة ومف�سولة ً‬
‫)(‪plt.figure‬‬
‫)'‪linkage_2 = hierarchy.linkage(X_hog,method = 'ward‬‬
‫)‪hierarchy.dendrogram(linkage_2‬‬
‫)(‪plt.show‬‬

‫املوجهة (‪)HOG‬‬
‫�سكل ‪ :4.21‬الر�سم ال�سجري لفئات وجوه احليوانات املُختلفة با�ستخدام خمطط تكراري للتدرجات َّ‬

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

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


‫)‪AC.fit(X_hog‬‬
‫_‪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.4046340612330986‬‬

‫‪Adjusted Rand score: 0.29990205334627734‬‬

‫‪Completeness score: 0.6306921317302154‬‬

‫تك�ص��ف النتائ��ج أان��ه عل��ى الرغ��م م��ن اأن ع��دد العناقي��د الت��ي مت ا�ص��تخدامها كان اأق��ل بكث��ر م��ن الع��دد ال�صحي��ح‪ ،‬اإال اأن‬
‫النتائج اأف�صل بكثر من النتائج التي ظهرت عند ا�صتخدام الرقم ال�صحيح على البيانات غر املح َّولة‪.‬‬
‫املوجهة‪ ،‬ويُثبت اأنه ميكن اأن يوؤدي اإىل حت�ص��ينات‬ ‫ويو�صح ذلك ذكاء التحويل بوا�ص��طة املخطط التكراري للتدرجات َّ‬ ‫ِّ‬
‫املوج��ه يف روؤي��ة احلا�ص��ب‪ ،‬والإكم��ال التحلي��ل ُيعي��د‬
‫املوج��ه ومه��ام التعلُّ��م غ��ر َّ‬
‫رائع��ة يف االأداء ل��كل م��ن مه��ام التعلُّ��م َّ‬
‫املقط��ع الربجم��ي الت��ايل جُتميع البيانات املح َّول��ة بالعدد ال�صحي��ح للعناقيد‪:‬‬
‫)‪AC = AgglomerativeClustering(linkage = 'ward', n_clusters = 10‬‬
‫)‪AC.fit(X_hog‬‬
‫_‪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.5720932612704411‬‬

‫‪Adjusted Rand score: 0.41243540297103065‬‬

‫‪Completeness score: 0.617016965322667‬‬

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

‫‪229‬‬
‫ميع با�ستخدام ال�سبكات الع�سبية ‪Clustering Using Neural Networks‬‬ ‫الت‬
‫أاح�دث ا�س�تخدام من�اذج التعلُّ�م العمي�ق (ال�س�بكات الع�سبي�ة العميق�ة ذات الطبقات املتعددة) ثورة يف جم�ال جتميع ال�سور من خالل‬
‫توفر خوارزميات قوية وعالية الدقة‪ ،‬ومُيكنها جتميع ال�سور املت�سابهة معًا تلقائيًا دون احلاجة اإىل هند�سة اخل�سائ�س‪ .‬تعتمد العديد‬
‫م�ن الطرائ�ق التقليدي�ة لتجمي�ع ال�س�ور عل�ى خا�سي�ة امل�س�تخرِجات (‪ )Extractors‬ال�س�تخراج معلوم�ات ذات مغ�زى م�ن �س�ورة م�ا‪،‬‬
‫طويال وتتطلب خربة يف املجال لت�سميم‬ ‫وا�ستخدام هذه املعلومات لتجميع ال�سور املت�سابهة معًا‪ ،‬ومُيكن اأن ت�ستغرق هذه العملية وقتًا ً‬
‫خا�سي�ة امل�س�تخرِ جات بخ�سائ��س فعّال�ة‪ .‬باالإ�ساف�ة اإىل ذل�ك ‪-‬وكم�ا مت التو�سي�ح يف الدر��س ال�س�ابق‪ -‬عل�ى الرغ�م م�ن اأن خا�سي�ة‬
‫الوا�سفات (‪ )Descriptors‬مثل‪ :‬حُتويل املخطط التكراري للتدرجات املوجَّ هة مُيكنها بالفعل حُت�سني النتائج‪ ،‬اإال اأنها بعيدة كل ال ُبعد‬ ‫ِ‬
‫ع�ن الكم�ال‪ ،‬وبالتاأكي�د يوج�د جم�ال للتح�س�ني‪ .‬م�ن ناحي�ة اأخ�رى‪ ،‬يتمت�ع التعلُّ�م العمي�ق بالق�درة عل�ى تعلُّ�م متثي�الت اخل�سائ��س م�ن‬
‫البيانات اخلام تلقائيًا‪ ،‬ويتيح ذلك لطرائق التعلُّم العميق معرفة اخل�سائ�س �سديدة التمايز التي تلتقط االأمناط الهامة وراء البيانات‪،‬‬
‫مما يوؤدي اإىل جتميع اأكر دقة وقوة‪ ،‬ولتحقيق ذلك تُ�ستخدم عدة طبقات ُخمتلفة يف ال�سبكة الع�سبية مبا فيها‪:‬‬
‫• الطبقات الكثيفة (‪)Dense Layers‬‬
‫• طبقات التجميع (‪)Pooling Layers‬‬
‫• طبقات االإق�ساء (‪)Dropout Layers‬‬
‫يف ال�سبكة الع�سبية يف الدر�س االأول من الوحدة الثالثة‪ ،‬مت ا�ستخدام طبقة خمفية‬
‫الطبقة الكثيفة (‪:)Dense Layer‬‬ ‫مكون�ة م�ن ث�الث مئ�ة خلية ع�سبي�ة من من�وذج الكلم�ة اإىل امل َّتجَ �ه(‪)Word2Vec‬؛‬
‫ه�ي طبق�ة يف ال�س�بكات الع�سبي�ة ترتب�ط‬ ‫لتمثيل كل كلمة‪ ،‬ويف تلك احلالة ُد ِّرب منوذج الكلمة اإىل امل َّتجَ ه م�سبقًا على جمموعة‬
‫فيها كل ال ُعقد التي يف الطبقة ال�سابقة بكل‬ ‫بيانات كبرة جدًا حُتتوي على ماليني االأخبار من اأخبار قوقل (‪.)Google News‬‬
‫ال ُعق�د الت�ي يف الطبق�ة احلالي�ة‪ ،‬حي�ث يتم‬ ‫أي�سا يف جمال روؤية احلا�س�ب‪،‬‬ ‫تُع ُّد مناذج ال�س�بكات الع�سبية املد َّربة م�س�بقًا �س�ائعة ا ً‬
‫متري�ر االإ�س�ارات م�ن ال ُعق�د يف الطبق�ة‬ ‫وم�ن االأمثل�ة املعه�ودة عل�ى ذل�ك من�وذج ‪ VGG16‬ال�ذي ي�س�يع ا�س�تخدامه يف مه�ام‬
‫ال�س�ابقة يف ال�س�بكة اإىل ال ُعق�د يف الطبق�ة‬ ‫التع�رّف عل�ى ال�س�ور‪ ،‬ويتب�ع من�وذج ‪ VGG16‬معماري�ة عميق�ة قائمة على ال�س�بكات‬
‫احلالي�ة بوا�س�طة وزني�ة حُم� َّددة‪ ،‬وتُط َّب�ق‬ ‫موج ًه�ا ُد ِّرب على‬
‫منوذجا َّ‬
‫ً‬ ‫الع�سبي�ة الرت�س�يحية يوج�د به�ا �س�ت ع�س�رة طبق�ة‪ ،‬و ُيع� ُّد‬
‫دالَّة التن�سيط (‪)Activation Function‬‬ ‫جمموعة بيانات كبرة من ال�سور املُعَنوَنة ت�سمى �سبكة ال�سور(‪ ،)ImageNet‬ومع‬
‫املر�سلة اإىل الطبقة الكثيفة‬‫على االإ�سارات َ‬ ‫ذلك‪ ،‬تتكون جمموعة بيانات التدريب اخلا�سة بنموذج ‪ VGG16‬من ماليني ال�سور‬
‫لتوليد نتائج االإخراج النهائية‪.‬‬ ‫يح�سن ب�سكل كبر من قدرة النموذج على فهم االأجزاء‬ ‫ومئات العناوين املُختلفة‪ ،‬مما ِّ‬
‫املو�سحة‬
‫املُختلف�ة م�ن ال�س�ورة‪ ،‬وعلى غرار ال�س�بكة الع�سبية الرت�س�يحية الب�س�يطة َّ‬
‫أي�س�ا طبق�ة كثيف�ة نهائية حُتتوي على‬ ‫�تخدم من�وذج ‪ VGG16‬ا ً‬ ‫يف ال�س�كل ‪ ،4.22‬وي�س ِ‬
‫طبقة الت ميع (‪:)Pooling Layer‬‬ ‫اأربعة اآالف و�ستة وت�سعني خلية ع�سبية لتمثيل كل �سورة قبل اإدخالها يف طبقة امل ُخرَج‬
‫ه��ي طبق��ة يف ال�س��بكات الع�سبي��ة‬ ‫ويو�سح هذا الق�سم كيف مُيكن تكييف منوذج ‪ VGG16‬لتجميع‬ ‫(‪ِّ ،)Output Layer‬‬
‫تُ�س��تخدم لتقلي��ل ا الأبع��اد الفراغي��ة‬ ‫ال�سور‪ ،‬على الرغم من اأنه ُ�س ِّمم يف االأ�سل لت�سنيف ال�سور‪:‬‬
‫لبيانات املُدخَ الت‪.‬‬ ‫‪ 1‬حمِّل النموذج ‪ VGG16‬الذي ُدرِّب م�سبقًا‪.‬‬
‫‪ 2‬احذف طبقة املُخرَج من النموذج‪ ،‬فذلك يجعل الطبقة االأخرة الكثيفة هي طبقة‬
‫املُخرَج اجلديدة‪.‬‬
‫طبقة األإق�ساء (‪:)Dropout Layer‬‬
‫ه�ي طريق�ة تنظي�م تُ�س�تخدم ملن�ع ف�رط‬ ‫‪ 3‬ا�س�تخدم النم�وذج املقتط�ع (‪- )Truncated Model‬النم�وذج ال�س�ابق ال�ذي‬
‫التخ�سي��س يف من�وذج ملجموعة بيانات يف‬ ‫اقتُطع�ت الطبق�ة ا أالخ�رة من�ه‪ -‬؛ لتحوي�ل كل �س�ورة يف جمموع�ة بيان�ات‬
‫ال�س�بكات الع�سبية عن طريق اإق�ساء عُ قد‬ ‫و�ست وت�سعون‬
‫‪( Animal Faces‬وجوه احليوانات) اإىل م َّتجَ ه عددي له اأرب ُع اآالف ٌ‬
‫موجودة يف الطبقة خالل ك ّل دورة تدريب‪.‬‬ ‫قيمة‪.‬‬
‫‪ 4‬ا�ستخدم التجميع التكتلي ؛ لتجميع امل َّتجَ هات الناجتة عن ذلك‪.‬‬
‫‪230‬‬
‫‪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‬مثل‪ :‬حتجيم قيم األوان‬
‫‪ RGB‬لتكون بني ‪ 0‬و‪.1‬‬
‫‪from keras.applications.vgg16 import preprocess_input‬‬ ‫)‪(1085, 224, 224, 3‬‬
‫)‪X_prep = preprocess_input(X‬‬
‫‪X_prep.shape‬‬

‫الح��ظ اأن �ص��كل البيان��ات يظ��ل كم��ا ه��و‪ ،‬اأي‪ :‬األ��فٌ وخم�� ٌ�ص وثمان��ون �ص��ورة‪ ،‬كل �ص��ورة منها اأبعاده��ا ‪ ،224 × 224‬وثالث‬
‫قنوات األوان ‪ ،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‬‬
‫;)(‪tsne.show‬‬

‫‪231‬‬
‫�صكل ‪ :4.23‬ت�صوير العناقيد املت�صابهه‬
‫تُع ُّدالنتائج مذهلة؛ الأن الت�صوير اجلديد يك�صف عناقيد مف�صولة عن بع�صها بو�صوح وتكاد تكون كاملة‪ ،‬كما اأن الف�صل‬
‫املوجهة‪.‬‬
‫هنا اأف�صل بكثر من الف�صل الذي كان يف البيانات التي ُح ِّولت بوا�صطة املخطط التكراري للتدرجات َّ‬
‫)'‪linkage_3 = hierarchy.linkage(X_VGG16, method = 'ward‬‬
‫)(‪plt.figure‬‬
‫)‪hierarchy.dendrogram(linkage_3‬‬
‫)(‪plt.show‬‬

‫�صكل ‪ :4.24‬الر�صم ال�صجري الهرمي لفئات وجوه احليوانات املُختلفة با�صتخدام منوذج ‪VGG16‬‬

‫يق��رتح الر�ص��م ال�ص��جري اأربع��ة عناقي��د‪ ،‬ويف ه��ذه احلال��ة ميك��ن للممار���ص اأن يتجاهل االقرتاح ب�ص��هولة‪ ،‬وي ّتب��ع الت�صوير‬
‫يبني بو�صوح وجود ع�صرة عناقيد‪.‬‬ ‫بدال منه والذي ّ‬ ‫ال�صابق ً‬
‫‪232‬‬
‫ويو�صح قيم املوؤ�صرات لكل من العناقيد االأربعة والعناقيد الع�صرة‪:‬‬
‫ي�صتخدِ م املقطع الربجمي التايل التجميع التكتلي ِّ‬
‫)‪AC = AgglomerativeClustering(linkage = 'ward',n_clusters = 4‬‬
‫)‪AC.fit(X_VGG16‬‬
‫_‪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‬‬

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


‫)‪AC.fit(X_VGG16‬‬
‫_‪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.8403973102506642‬‬

‫‪Adjusted Rand score: 0.766734821176714‬‬

‫‪Completeness score: 0.8509145102288217‬‬

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

‫‪233‬‬
‫مترينات‬
‫‪ 1‬اذكر امليزة التي تتمتع بها تقنيات التعلُّم غر املوجَّ ه مقارنة بتقنيات التعلُّم املوجَّ ه يف حتليل ال�صور‪.‬‬

‫‪ 2‬لدي��ك م�صفوف��ة قي��م موح��دة ‪ X_flat‬ت�ص��مل �ص��ورًا مُ�ص��طحة‪� ،‬كل �ص��ف يف امل�صفوف��ة مي ِّث��ل �ص��ورة م�ص��طحة ُخُمتلف��ة‬
‫عل��ى هيئ��ة متتالي��ة م��ن اآلأع��داد ال�صحيح��ة ت��را�ح ب��ني ‪ .255� 0‬اأكم��ل املقط��ع الربجم��ي الت��ايل‪ ،‬بحي��ث ي�ص��تخدِ م‬
‫التجميع التكتلي يف ت�صنيف ال�صور التي من ‪ X_flat‬اإىل خم�صة عناقيد ُخُمتلفة‪:‬‬

‫‪from‬‬ ‫‪import AgglomerativeClustering # used for agglomerative clustering‬‬

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

‫= ‪X_norm‬‬ ‫‪# normalizes the data‬‬

‫‪AC.fit(X_norm) # applies the tool to the data‬‬

‫‪pred = AC.‬‬ ‫‪# gets the cluster labels‬‬

‫‪ 3‬عدِّد بع�ش مزايا ا�صتخدام التعلُّم العميق التي ميتاز بها على طرائق جتميع ال�صور التقليدية‪.‬‬

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

‫‪import‬‬ ‫‪as plt‬‬

‫= ‪X_norm‬‬ ‫‪# normalizes the data‬‬

‫‪plt.figure() # creates a new empty figure‬‬

‫(‪linkage_flat=hierarchy.linkage‬‬ ‫'=‪, method‬‬ ‫)'‬

‫‪hierarchy.‬‬ ‫)‪(linkage_flat‬‬

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

‫‪�ِ 5‬صف الطريقة التي يُطبَّق بها التجميع بال�صبكات الع�صبية يف حتليل ال�صور‪.‬‬

‫‪235‬‬
‫الدر�ص الثالث‬
‫توليد البيانات املرئية‬
‫ا�س��تخدام ال��ذكاء األ�سطناع��ي يف تولي��د‬
‫ال�سور ‪Using AI to Generate Images‬‬
‫بينم��ا رك��زت خوارزمي��ات روؤي��ة احلا�ص��ب الت��ي مت تو�صيحه��ا يف الدر�ص��ني‬
‫ال�ص��ابقني م��ن ه��ذه الوح��دة عل��ى فه��م اجلوان��ب املُختلف��ة ل�ص��ورة مع ّين��ة‪،‬‬
‫ُير ّك��ز جم��ال تولي��د ال�ص��ور (‪ )Image Generation‬يف ه��ذا الدر���ص‬
‫على اإن�صاء �صور جديدة‪ .‬فمجال توليد ال�صور (‪)Image Generation‬‬
‫ل��ه تاري��خ طوي��ل يع��ود اإىل اخلم�ص��ينيات وال�ص��تينيات من القرن الع�ص��رين‪،‬‬
‫عندم��ا ب��داأ الباحث��ون الأول م��رة يف اإج��راء جُت��ارب عل��ى مع��ادالت ريا�صي��ة‬
‫الإن�ص��اء ال�ص��ور‪ ،‬ويف ع�صرن��ا احل��ايل من��ا ه��ذا املج��ال لي�ص��مل جمموع��ة‬
‫وا�ص��عة م��ن التقني��ات‪ُ .‬يع� ُّد ا�ص��تخدام الفراكت��الت (‪ )Fractals‬من اأقدم‬
‫واأ�صهر تقنيات اإن�صاء ال�صور‪ ،‬والفراكتل هو �صكل اأو منط هند�صي م�صابه‬
‫لذاته‪ ،‬مما يعني اأنه يبدو مت�ص��ابهًا عند تكبره مبقايي���ص ُخُمتلفة‪ ،‬واأ�ص��هر‬
‫�صكل ‪ :4.25‬فراكتال ماندلربوت‬
‫املو�صح‬
‫فراكت��ل ه��و ال��ذي ي�صم جمموعة ماندل��رب�ت (‪َّ )Mandelbrot‬‬
‫يف ال�صكل ‪.4.25‬‬
‫يف اأواخر القرن الع�صرين‪ ،‬بداأ الباحثون يف ا�صتك�صاف اأ�صاليب اأكر تقدمً ا لتوليد ال�صور مثل ال�صبكات الع�صبية‪.‬‬
‫ن�ش (‪ )Text-to-Image Synthesis‬من اأكر التقنيات �ص��يوعً ا الإن�ص��اء ال�صور با�ص��تخدام ال�ص��بكات الع�صبية‪،‬‬ ‫ُيع ُّد اإن�ص��اء �صورة من ّ‬
‫وتت�صم��ن ه��ذه التقني��ة تدري��ب �ص��بكة ع�صبي��ة عل��ى تولي��د �ص��ور م��ن اأو�صاف ن�ص َّي��ة‪ ،‬فتُد َّرب ال�ص��بكة الع�صبية على جمموع��ة بيانات من‬
‫ال�ص��ور واالأو�ص��اف الن�ص َّي��ة املرتبط��ة به��ا‪ .‬وتتعلّم ال�ص��بكة ربط كلمات اأو عبارات معيّنة بخ�صائ�ص معيّنة لل�صورة مثل‪� :‬ص��كل العن�صر‬
‫اأو لون��ه‪ ،‬ومبج��رد اأن ُت��د َّرب ال�ص��بكة ي�صب��ح م��ن املمك��ن ا�ص��تخدامها يف اإن�ص��اء �ص��ور جدي��دة بن��ا ًء عل��ى االأو�ص��اف ال��واردة يف الن���ص‪،‬‬
‫وتُ�صتخدم هذه التقنية يف اإن�صاء جمموعة وا�صعة من ال�صور ترتاوح ما بني العنا�صر الب�صيطة اإىل امل�صاهد املعقدة‪.‬‬
‫وهن��اك تقني��ة اأخ��رى لتولي��د ال�ص��ورة تتم ّث��ل يف اإن�ص��اء �ص��ورة م��ن �ص��ورة (‪ ،)Image-to-Image Synthesis‬وتت�صم��ن ه��ذه التقني��ة‬
‫تدري��ب �ص��بكة ع�صبي��ة عل��ى جمموع��ة بيان��ات م��ن ال�ص��ور؛ لتتع ّل��م التع�رّف عل��ى اخل�صائ�ص الفري��دة لل�ص��ورة حتّى تولّد �ص��ورًا جديدة‬
‫م�ص��ابهة لل�ص��ورة املوج��ودة‪ ،‬ولك��ن م��ع وج��ود اختالف��ات‪ .‬يف االآون��ة ا أالخ��رة ا�صتك�ص��ف الباحث��ون اإن�ص��اء �ص��ورة م��ن �ص��ورة باآل�صر�ص��اد‬
‫بن�� ّ�ش (‪ ،)Text-Guided Image-to-Image Synthesis‬مم��ا يجم��ع ب��ني نق��اط الق��وة يف طرائ��ق اإن�ص��اء �ص��ورة م��ن ن� ّ��ص‪ ،‬وطرائ��ق‬
‫اإن�ص��اء �ص��ورة م��ن �ص��ورة م��ن خ��الل ال�ص��ماح للم�ص��تخدِ م بتوجي��ه عملي��ة االإن�ص��اء با�ص��تخدام توجيه��ات ن�ص َّي��ة (‪،)Text Prompts‬‬
‫وتُ�ص��تخدم ه��ذه التقني��ة يف تولي��د �ص��ور عالي��ة اجل��ودة تتواف��ق م��ع التوجي��ه الن�ص� ّ�ي ‪ ،‬وتك��ون يف الوق��ت ذات��ه م�ص��ابهة ب�صر ًي��ا لل�ص��ورة‬
‫الطبيعية‪.‬‬
‫و اأ خ � ًر ا‪ ،‬هن��اك تقني��ة اأ خ��رى م��ن اأ ح��دث التقني��ات يف ه��ذا املج��ال تتم ّث��ل يف ر�ص��م �ص��ورة باآل�صر�ص��اد بن�� ّ�ش‬
‫(‪ ،)Text-Guided Image-Inpainting‬ويُر ِّك��ز عل��ى م��لء االأج��زاء املفق��ودة اأو التالف��ة م��ن ال�ص��ورة بن��ا ًء عل��ى و�ص��ف ن�ص��يٍّ مع��ني‪،‬‬
‫ويقدِّ م الو�صف الن�صيّ معلومات عن ال�ص��كل الذي يجب اأن تبدو عليه االأجزاء املفقودة اأو التالفة من ال�صورة‪ ،‬والهدف من خوارزمية‬
‫الر�ص��م ه��ذه اأن تُ�ص��تخدم املعلوم��ات؛ الإن�ص��اء �ص��ورة واقعي��ة ومرتابط��ة‪ .‬يق��دم ه��ذا الدر���ص اأمثل��ة عملي��ة عل��ى تولي��د ال�ص��ور م��ن خ��الل‪:‬‬
‫بن�ص‪ ،‬ور�صم �صور باال�صرت�صاد بن�ص‪.‬‬ ‫ن�ص‪ ،‬واإن�صاء �صورة من �صورة باال�صرت�صاد ّ‬ ‫اإن�صاء �صورة من ّ‬
‫‪236‬‬
‫توليد ال�سور واملوارد احلا�سوبية‬
‫‪Image Generation and Computational Resources‬‬
‫وحدة معاجلة الر�سومات‬ ‫اإن�ص��اء ال�صور م ُِه َّمة مكلِّفة من الناحية احلا�ص��وبيّة؛ الأنها تت�صمن ا�ص��تخدام‬
‫(‪:)Graphics Processing Unit - GPU‬‬ ‫خوارزمي��ات معق��دة تتطل��ب ق��درات عالي��ة م��ن ق��وة املعاجل��ة‪ ،‬وع��اد ًة تت�صم��ن‬
‫املعاجلات م�صمَّم‬
‫هي نوع خا�ص من اأنواع ِ‬ ‫ه��ذه اخلوارزمي��ات معاجل��ة كمي��ات كب��رة م��ن البيان��ات مث��ل‪ :‬من��اذج ثالثي��ة‬
‫للتعامل مع كميات كبرة من العمليات احل�صابية‬ ‫أي�صا اإىل زيادة‬
‫االأبع��اد‪ ،‬والنقو���ص‪ ،‬ومعلوم��ات االإ�صاءة‪ ،‬مما ميك��ن اأن يوؤدي ا ً‬
‫املطلوبة ملعاجلة ال�صور والفيديوهات‪.‬‬ ‫املتطلب��ات احلا�ص��وبية للمُهِ َّم��ة‪ُ .‬يع� ُّد ا�ص��تخدام �ح��دات معاجل��ة الر�ص��ومات‬
‫(‪ )Graphics Processing Units - GPUs‬اأح��د التقني��ات الرئي�ص��ة الت��ي‬
‫تُ�ص��تخدم لت�ص��ريع تولي��د ال�ص��ور‪ .‬وعل��ى عك���ص �ح��دة املعاجل��ة املركزي��ة‬
‫(‪ )Central Processing Unit - CPU‬التقليدي��ة املُ�ص َّمم��ة للتعام��ل م��ع جمموع��ة وا�ص��عة م��ن امله��ام‪ ،‬مت حت�ص��ني وح��دة معاجل��ة‬
‫الر�ص��ومات حتّى تتنا�ص��ب مع اأنواع العمليات احل�ص��ابية املطلوبة ملعاجلة ال�صور واملهام االأخرى املتعلقة بالر�ص��ومات‪ ،‬مما يجعلها اأكر‬
‫كفاءة يف التعامل مع كميات كبرة من البيانات واإجراء عمليات ح�صابية معقدة‪ ،‬و ُيع ُّد هذا �صببًا يف ا�صتخدامها عادة يف توليد ال�صور‬
‫يو�ص��ح ه��ذا الدر���ص كي��ف ميكن��ك ا�ص��تخدام من�ص��ة قوق��ل ك��وآلب (‪ )Google Colab‬ال�ص��هرة‬ ‫وامله��ام االأخ��رى املك ِّلف��ة حا�ص��وبيًّا‪ِّ .‬‬
‫للو�ص��ول اإىل بُني��ة حتتي��ة قوي��ة قائم��ة عل��ى وح��دة معاجل��ة الر�ص��ومات دون اأي تكلفة‪ ،‬وذلك با�ص��تخدام ح�ص��اب عادي عل��ى قوقل‪ ،‬وقوقل‬
‫ك��والب ه��و من�ص��ة جماني��ة تعتم��د عل��ى التقني��ة ال�ص��حابية‪ ،‬وتتيح للم�ص� ِ‬
‫�تخدمني كتاب��ة املقاطع الربجمي��ة‪ ،‬وتنفيذها‪ ،‬و إاج��راء التجارب‪،‬‬
‫وتدريب النماذج يف بيئة مفكرة جوبير (‪.)Jupyter Notebook‬‬
‫للو�سول اإىل من�سة قوقل كوألب‪:‬‬
‫ اذهب اإىل‪.https://colab.research.google.com :‬‬
‫‪1‬‬

‫ �صجِّ ل الدخول بح�صاب ‪( Google‬قوقل) اخلا�ص بك‪2 .‬‬

‫ ا�صغط على ‪( Edit‬حترير)‪ ،‬ثم ‪( Notebook settings‬اإعدادات املفكرة)‪3 .‬‬

‫ اخرت ‪( GPU‬وحدة معاجلة الر�صومات)‪ 4 ،‬ثم ا�صغط على ‪( Save‬حفظ)‪5 .‬‬

‫‪1‬‬ ‫‪2‬‬

‫‪3‬‬

‫‪4‬‬ ‫‪5‬‬

‫�صكل ‪ :4.26‬الو�صول اإىل من�صة قوقل كوالب‬


‫‪237‬‬
‫أل�ستخدام مفكرة البايثون‪:‬‬
‫‪1‬‬‫ ا�صغط على ‪( File‬ملف)‪ ،‬ثم على ‪( New notebook‬مفكرة جديدة)‪.‬‬
‫ ا�صغط على ‪( Files‬ملفات)‪ 2 ،‬ويف املنطقة املجاورة التي �صتظهر لك ا�صحب‬
‫واأفلت ‪( images‬ال�صور) التي �صت�صتخدمها يف الدر�ص‪3 .‬‬

‫‪4‬‬ ‫ ميكنك االآن كتابة مقطعك الربجمي بلغة البايثون داخل خلية املقطع الربجمي‪،‬‬
‫ثم �صغِّله من خالل ال�صغط على الزر املوجود بجانبه‪5 .‬‬

‫‪1‬‬

‫‪4‬‬
‫‪5‬‬
‫‪2‬‬
‫‪3‬‬

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

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


‫‪Diffusion Models and Generative Adversarial Networks‬‬
‫يف ال�ص��نوات االأخ��رة �ص��هد جم��ال تولي��د ال�ص��ور تُقدمً ��ا كب�رًا م��ع تطوي��ر اأ�ص��اليب ومن��اذج ُخُمتلف��ة ميكنه��ا تولي��د �ص��ور‬
‫واقعي��ة وعالي��ة اجل��ودة م��ن م�ص��ادر ُخُمتلف��ة للمعلوم��ات‪ ،‬وهن��اك تقنيت��ان م��ن اأك��ر التقني��ات �ص��يوعً ا وا�ص��تخدامً ا عل��ى‬
‫نط��اق وا�ص��ع لتولي��د ال�ص��ور هم��ا‪ :‬ال�ص��بكة التوليد ي��ة التناف�ص��ية ( ‪ ،)GANs‬و من��وذج اآلنت�ص��ار امل�ص��تقر‬
‫(‪� .)Stable Diffusion‬صتتعرف يف هذا الق�صم على املفاهيم واالأ�صاليب الرئي�صة اخلا�صة بال�صبكة التوليدية التناف�صية‬
‫ومنوذج االنت�ص��ار امل�ص��تقر‪ ،‬كما �ص��يتم تقدمي نظرة عامة على تطبيقاتها يف توليد ال�صور‪ ،‬و�ص��يتم مناق�ص��ة اأوجه الت�صابه‬
‫واالختالف بينهما‪ ،‬ومزايا كل تقنية وعيوبها‪.‬‬
‫‪238‬‬
‫توليد ال�سور بال�سبكة التوليدية التناف�سية‬
‫(‪Generating Images with Generative Adversarial Networks )GANs‬‬
‫ال�ص��بكة التوليدي��ة التناف�ص��ية ه��ي فئ��ة م��ن النم��اذج التوليدي��ة الت��ي تتك��ون م��ن مكون��ني رئي�ص��ني وهم��ا‪ :‬املو ِّل��د (‪� )Generator‬املم ِّي��ز‬
‫(‪ ،)Discriminator‬حي��ث يق��وم املو ِّل��د بتولي��د �ص��ور زائف��ة‪ ،‬بينم��ا يح��اول املم ِّي��ز متيي��ز ال�ص��ور املو َّل��دة م��ن ال�ص��ور احلقيقي��ة‪ ،‬و ُيد َّرب‬
‫هذان املكوِّنان تدري ًبا تناف�ص ًّيا‪ ،‬اإذ يحاول املولِّد اأن "يخدع" املم ِّيز‪ ،‬ويحاول املم ِّيز اأن ي�صبح اأف�صل يف اكت�صاف ال�صور الزائفة‪ .‬تتمثّل‬
‫إاح��دى املزاي��ا الرئي�ص��ة لل�ص��بكة التوليدي��ة التناف�ص��ية يف قدرته��ا عل��ى تولي��د �ص��ور عالي��ة اجل��ودة وواقعي��ة ي�صع��ب متييزه��ا ع��ن ال�ص��ور‬
‫أي�ص��ا بع���ص القي��ود مث��ل‪ :‬ع��دم التق��ارب (‪ )Non-Convergence‬اأو بعب��ارة اأخ��رى‪ ،‬ف�ص��ل �ص��بكتي املو ِّل��د‬ ‫احلقيقي��ة‪ ،‬ولك��ن يوج��د به��ا ا ً‬
‫واملم ِّي��ز يف التح�ص��ن م��ع م��رور الوق��ت‪ ،‬ونق���ش التن��وع (‪ )Mode Collapse‬يف املخرج��ات‪ ،‬حي��ث ينت��ج النم��وذج نف���ص املُخ َرج��ات‬
‫املت�صابهة مرارًا وتكرارًا بغ�ص النظر عن املُدخَ الت‪.‬‬
‫عنا�ين مت التنبوؤ بها‬ ‫املميِّز‬ ‫�صور حقيقية‬ ‫يُطبَّق املولِّد �املميِّز يف ال�صبكة‬
‫التوليدية التناف�صية يف العادة‬
‫با�صتخدام ال�صبكات الع�صبية‬
‫�صور زائفة‬ ‫املولِّد‬ ‫�صو�صاء ع�صوائية‬ ‫الر�صيحية (‪ )CNNs‬اأ� اأي‬
‫معمارية م�صابهة‪.‬‬
‫اخل�سارة‬
‫�صكل ‪ :4.28‬معمارية ال�صبكة التوليدية التناف�صية‬

‫توليد ال�سور باألنت�سار امل�ستقر ‪Generating Images with Stable Diffusion‬‬


‫الن�ش (‪،)Text Encoder‬‬ ‫االنت�صار امل�صتقر هو منوذج تعلُّم عميق لتوليد �صورة من ن�ص‪ ،‬وتتكون هذه الطريقة من مكونني رئي�صني‪ :‬مُرمِّز ّ‬
‫الن�ص ومفكِّك الرميز املرئي معًا على جمموعة بيانات مكونة من بيانات‬ ‫رمز ّ‬ ‫ومفكِّك الرميز املرئي(‪ .)Visual Decoder‬و ُيد َّرب ُم ِّ‬
‫الن�ص هو �صبكة ع�صبية تاأخذ مُدخَ الت‬ ‫ن�صي ب�صورة مقابِلة اأو اأكر‪ .‬مُرمِّ ز ّ‬
‫ن�صو�ص وبيانات �صور مقرتنة ببع�صها؛ حيث يقرتن كل ُمدخَ ل ِّ‬
‫ن�صيَّ�ة مث�ل‪ :‬جمل�ة اأو فق�رة وحتوِّله�ا اإىل ت�صم�ني (‪ ،)Embedding‬والت�صم�ني ه�و م َّتجَ �ه ع�ددي ل�ه ع�دد ثابت من القي�م‪ ،‬ويلتقط متثيل‬
‫الن�ص املُدخَ ل‪ .‬يتم ا�صتخدام نهج م�صابه يف منوذج الكلمة اإىل املتَّجَ ه (‪ )Word2Vec‬و منوذج ترميز اجلُمل ثنائية‬ ‫الت�صمني هذا معنى ّ‬
‫اآلجتاه من املحوآلت (‪ )SBERT‬اللذين مت تو�صيحهما يف الوحدة الثالثة‪ ،‬حيث يولّدان ت�صمينات للكلمات واجلمل الفردية على الرتتيب‪.‬‬
‫الن�ش (‪)Text Embedding‬الذي اأن�صاأه املُرمِّ ز عرب مفكِّك الرتميز املرئي لتوليد �صورة‪ ،‬ومفكِّك الرتميز املرئي‬ ‫ُوميرر بعد ذلك ت�صمني ّ‬
‫أي�صا نوع من ال�صبكات الع�صبية و ُينفذ عاد ًة با�صتخدام �صبكة ع�صبية تر�صيحية (‪ )CNN‬اأو معمارية م�صابهة‪ ،‬و ُتقارن ال�صورة املولَّدة‬‫هو ا ً‬
‫بال�ص�ورة احلقيقي�ة املقابل�ة املوج�ودة يف جمموع�ة البيان�ات‪ ،‬و ُي�ص�تخدم الفرق بينهما حل�ص�اب اخل�ص�ارة (‪ ،)Loss‬ثم تُ�ص�تخدم اخل�ص�ارة‬
‫الن�ص ومفكِّك الرتميز املرئي؛ لتقليل االختالف بني ال�صور التي ُولِّدت وال�صور احلقيقية‪.‬‬ ‫رمز ّ‬
‫متغرات ُم ِّ‬
‫لتحديث ِّ‬

‫جدول  ‪ :4.4‬عملية تدريب األنت�سار امل�ستقر‬


‫الن�ص للح�صول على ت�صمني الن�ص‪.‬‬ ‫‪ .1‬مرِّر املُدخَ الت الن�صيَّة عرب مُرمِّ ز ّ‬
‫الن�ص عرب مفكِّك الرتميز املرئي لتوليد �صورة‪.‬‬‫‪ .2‬مرِّر ت�صمني ّ‬
‫‪ .3‬اح�صب اخل�صارة (االختالف) بني ال�صورة املولَّدة وال�صورة احلقيقية املقابلة لها املوجودة يف جمموعة البيانات‪.‬‬
‫الن�ص ومفكِّك الرتميز املرئي‪ ،‬وعندما يكون امل�صتوى عاليًا يت�صمن‬
‫متغرات مُرمِّ ز ّ‬ ‫ِ‬
‫ا�صتخدم اخل�صارة؛ لتحديث ِّ‬ ‫‪.4‬‬
‫ذل��ك مكاف�اأة(‪ )Rewarding‬اخلالي��ا الع�صبي��ة الت��ي �ص��اعدت عل��ى تقلي��ل اخل�ص��ارة ومعاقب��ة (‪)Punishing‬‬
‫اخلاليا الع�صبية التي �صاهمت يف زيادتها‪.‬‬
‫‪ .5‬كرِّر اخلطوات املذكورة �صابقًا مع اأزواج متعددة من الن�صو�ص وال�صور يف جمموعة البيانات‪.‬‬

‫‪239‬‬
‫حقَّق ك ٌّل من منوذج ال�ص��بكة التوليدية التناف�ص��ية ومنوذج االنت�ص��ار امل�ص��تقر نتائج مبهرة يف جمال توليد ال�صور‪ ،‬ويُركِّز‬
‫اجلزء املتبقي من هذا الدر�ص على تقدمي اأمثلة عملية بلغة البايثون على النهج القائم على اآلنت�صار (‪)Diffusion-Based‬‬
‫وال��ذي ُيع� ُّد حال ًي��ا أاح��دث م��ا تو�صل��ت اإلي��ه التقني��ة‪ .‬كم��ا مت التو�صي��ح م��ن قبل‪ُ ،‬يع� ُّد توليد ال�ص��ور مُهِ مَّة مكلِّفة حا�ص��وبيًّا‪،‬‬
‫ولذل��ك نو�صي��ك ب�ص��دة ب�اأن تطب��ق جمي��ع اأمثل��ة البايث��ون عل��ى نظ��ام قوق��ل ك��والب االأ�صا�ص��ي اأو اأي بني��ة اأ�صا�ص��ية ُخُمتلف��ة‬
‫تدعمها وحدة معاجلة ر�صومات يكون لديك حق الو�صول اإليها‪.‬‬
‫�تخدم ه��ذا الف�ص��ل مكتب��ة ‪ diffusers‬الت��ي تُع ُّد حال ًي��ا اأف�صل مكتبة مفتوحة امل�صدر للنماذج القائمة على االنت�ص��ار‪،‬‬ ‫ي�ص� ِ‬
‫ويقوم املقطع الربجمي التايل بتثبيت املكتبة‪ ،‬وكذلك بع�ص املكتبات االإ�صافية املطلوبة‪:‬‬
‫‪%%capture‬‬
‫‪!pip install diffusers‬‬
‫‪!pip install transformers‬‬
‫‪!pip install accelerate‬‬

‫‪import matplotlib.pyplot as plt‬‬


‫‪from PIL import Image # used to represent images‬‬

‫ن�ص ‪Text-to-Image Generation‬‬


‫توليد ال�سورة من ّ‬
‫يو�ص��ح ه��ذا الق�ص��م الطريق��ة الت��ي ميك��ن به��ا ا�ص��تخدام مكتب��ة ‪ diffusers‬لتولي��د �ص��ور تعتم��د عل��ى التوجي��ه الن�ص� ّ�ي‬
‫ِّ‬
‫ال��ذي يقدم��ه امل�ص��تخدِ م‪ ،‬وتُ�ص��تخدم االأمثل��ة ال��واردة يف ه��ذا الق�ص��م من��وذج ‪( stable-diffusion-v1-4‬االنت�ص��ار‪-‬‬
‫ن�ص‪.‬‬
‫امل�صتقر‪ -‬االإ�صدار ‪ ،) 4-1‬وهو منوذج �صائع مُد َّرب م�صبقًا لتوليد ال�صورة من ّ‬
‫‪# a tool used to generate images using stable diffusion‬‬
‫‪from diffusers import DiffusionPipeline‬‬
‫)"‪generator = DiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4‬‬
‫‪# specifies what GPUs should be used for this generation‬‬
‫)"‪generator.to("cuda‬‬

‫]‪image = generator("A photo of a white lion in the jungle.").images[0‬‬


‫;)‪plt.imshow(image‬‬

‫ي�صتجيب النموذج للتوجيه ‪A photo of a white lion in the jungle‬‬


‫(�ص��ورة اأ�ص��د اأبي���ص يف الغاب��ة) ب�ص��ورة مبه��رة وواقعي��ة ج��دً ا‪ ،‬كم��ا ه��و‬
‫مو�صح يف ال�ص��كل ‪ ،4.29‬و ُيع ُّدالتجريب با�ص��تخدام التوجيهات االإبداعية‬ ‫َّ‬
‫ه��و اأف�ص��ل طريق��ة الكت�ص��اب اخل��ربة وفه��م ق��درات ه��ذا النه��ج ونق��اط‬
‫�صعفه‪.‬‬

‫معلومة‬
‫معمارية اأجهزة احلا�صب املوحد (‪)Compute Unified Device Architecture - CUDA‬‬
‫هي من�صة حو�صبة موازية تتيح ا�صتخدام �حدات معاجلة الر�صومات (‪.)GPUs‬‬
‫�صكل ‪� :4.29‬صورة مولَّدة الأ�صد اأبي�ص يف الغابة‬
‫‪240‬‬
‫ي�صيف التوجيه (‪ )prompt‬التايل بُعدً ا اإ�صافيًّا لعملية التوليد‪ ،‬اإذ يطلب اأن يُر�صم اأ�صد اأبي�ص بطريقة بابلو بيكا�صو‬
‫(‪ ،)Pablo Picasso‬وهو من اأ�صهر الر�صامني يف القرن الع�صرين‪.‬‬
‫‪image = generator("A painting of a white lion in the style of Picasso.").‬‬
‫]‪images[0‬‬
‫;)‪plt.imshow(image‬‬

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


‫امل�ص��تقر‪ ،‬فال�ص��ورة الناجُت��ة ع��ن العملي��ة ه��ي يف الواقع �صورة‬
‫اأ�ص��د اأبي�ص‪ .‬ولكن على عك���ص التوجيه ال�ص��ابق‪ ،‬يوؤدي التوجيه‬
‫�دال م��ن اأن ت�ص��به ال�ص��ور‬
‫اجلدي��د اإىل �ص��ور ت�ص��به الر�ص��م ب� ً‬
‫الفوتوغرافي��ة‪ ،‬باالإ�صاف��ة اإىل ذلك‪ ،‬فاإن اأ�ص��لوب اللوحة ي�ص��به‬
‫بالفعل وب�صكل ملحوظ اأ�صلوب بابلو بيكا�صو‪.‬‬

‫توليد �سورة من �سورة من خالل‬


‫األ�سرت�ساد بن�ص‬
‫‪Image-to-Image Generation‬‬
‫‪with Text Guidance‬‬
‫�تخدم املث��ال الت��ايل مكتب��ة ‪ diffusers‬لتولي��د �ص��ورة بن��ا ًء‬ ‫ي�ص� ِ‬
‫�صكل ‪� :4.30‬صورة مولَّدة الأ�صد على منط بيكا�صو‬ ‫عل��ى ُمدخَ ل��ني هم��ا‪� :‬ص��ورة موج��ودة تعم��ل كاأ�صا���ص لل�ص��ورة‬
‫اجلدي��دة الت��ي �ص��يتم اإن�ص��اوؤها‪ ،‬وتوجي��ه ن�ص��يّ ي�ص��ف ال�ص��كل‬
‫ال��ذي يج��ب اأن تب��دو علي��ه ال�ص��ورة املن َتج��ة‪ .‬مب��ا اأن ُم ِه َّم��ة حتوي��ل الن� ّ��ص اإىل ال�صورة َّ‬
‫املو�صحة يف الق�ص��م ال�ص��ابق كانت‬
‫حم��دودة فق��ط بتوجي��ه ن�ص� ّ�ي‪ ،‬فيج��ب اأن ت�صم��ن املُ ِه َّم��ة اجلديدة اأن تكون ال�صورة اجلديدة م�ص��ابهة لل�ص��ورة االأ�صلية‪،‬‬
‫الن�صي‪.‬‬
‫ّ‬ ‫وممثِّل ًة ب�صكلٍ دقيق للو�صف الوارد يف التوجيه‬ ‫ُ‬

‫‪# pipeline used for image to image generation with stable diffusion‬‬
‫‪from diffusers import StableDiffusionImg2ImgPipeline‬‬
‫‪# loads a pretrained generator model‬‬
‫‪generator = StableDiffusionImg2ImgPipeline.from_pretrained("runwayml/stable-‬‬
‫)"‪diffusion-v1-5‬‬
‫‪# moves the generator model to the GPU (CUDA) for faster processing‬‬
‫)"‪generator.to("cuda‬‬

‫)"‪init_image = Image.open("landscape.jpg‬‬
‫‪init_image.thumbnail((768, 768)) # resizes the image to prepare it as input of the model‬‬
‫;)‪plt.imshow(init_image‬‬

‫‪241‬‬
‫ِ‬
‫ي�صتخدم النموذج‬ ‫املثال املوجود يف ال�صكل ‪1.30‬‬
‫املدرَّب م�صبقًا ‪ stable-diffusion-v1-4‬املنا�صب‬
‫لتوليد �صورة من �صورة من خالل التوجيه الن�صي‪.‬‬

‫�صكل ‪� :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‬‬


‫يف الواق��ع‪ ،‬يو ِّل��د النم��وذج �ص��ورة م�ص��تجيب ًة للتوجي��ه الن�ص� ّ�ي وم�ص��ابهة ب�صر ًي��ا لل�ص��ورة االأ�صلي��ة‪ ،‬و ُي�ص��تخدم متغ� ِّ�ر ‪strength‬‬
‫املتغر قيمًا بني ‪ 0‬و‪ ،1‬وت�ص��مح القيم‬
‫(الق��وة) للتحك��م يف االخت��الف الب�ص��ري ب��ني ال�صورة االأ�صلية وال�صورة اجلديدة‪ ،‬ويتخذ ِّ‬
‫االأعلى للنموذج باأن يكون اأكر مرونة واأقل تق ُّي ًدا بال�صورة االأ�صلية‪ .‬على �صبيل املثال‪ُ ،‬ي�صتخدم املقطع الربجمي التايل لنف�ص‬
‫املتغر ‪ 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‬‬

‫�صكل ‪ :4.33‬اإن�صاء �صورة اأفقية بقوة = ‪1‬‬


‫توؤك��د ال�ص��ورة الناجُت��ة يف �ص��كل ‪ 4.33‬اأن زي��ادة قيم��ة متغ� ِّ�ر الق��وة ت�وؤدي اإىل �ص��كل‬
‫أي�صا اأقل ت�ص��ابهًا اإىل حد‬
‫ب�ص��ري اأف�ص��ل باالإر�ص��اد ال��وارد يف التوجي��ه الن�ص��ي‪ ،‬ولكن��ه ا ً‬
‫كبر مع ال�صورة املُدخَ لة‪.‬‬
‫وهذا مثال منوذجي اآخر‪ ،‬يت�صح ُخُمرَجه يف ال�صكل ‪.4.34‬‬
‫)"‪init_image = Image.open("cat_1.jpg‬‬
‫))‪init_image.thumbnail((768, 768‬‬
‫;)‪plt.imshow(init_image‬‬

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


‫‪242‬‬
‫و�صيُ�صتخدم املقطع الربجمي التايل لتحويل هذه ال�صورة اإىل �صورة ‪( tiger‬منر)‪:‬‬

‫"‪prompt = "A photo of a tiger‬‬


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

‫تتقي��د املحاول��ة االأوىل بقيم��ة املتغ� ِّ�ر ‪ ،strength‬مم��ا اأدّى‬


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

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

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

‫يف الواق��ع‪ ،‬ال�ص��ورة اجلدي��دة املعرو�ص��ة ه��ي �ص��ورة من��ر‪،‬‬


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

‫�صكل ‪� :4.36‬صورة النمر مولَّدة بقوة = ‪0.75‬‬

‫‪243‬‬
‫بن�ص ‪Text-Guided Image-Inpainting‬‬
‫ر�سم �سورة باأل�سرت�ساد ّ‬
‫الن�صي باأجزاء‬
‫ّ‬ ‫يُركِّز املثال التايل على ا�صتخدام منوذج االنت�صار امل�صتقر ال�صتبدال �صكل ب�صري جديد ي�صفه التوجيه‬
‫حم��ددة م��ن �ص��ورة مع ّين��ة‪ ،‬و ُي�ص��تخدم له��ذا الغر���ص النم��وذج امل��د َّرب م�ص��بقًا ‪( stable-diffusion-inpainting‬ر�ص��م‬
‫‪-‬االنت�ص��ار‪ -‬امل�ص��تقر)‪،‬ويقوم املقط��ع الربجم��ي الت��ايل بتحمي��ل �ص��ورة قطّ ��ة عل��ى مقع��د‪ ،‬وهن��اك قن��اع (‪ )Mask‬يع��زل‬
‫االأجزاء املحددة من ال�صورة التي تغطيها القطّ ة‪:‬‬
‫‪# tool used for text-guided image in-painting‬‬
‫‪from diffusers import StableDiffusionInpaintPipeline‬‬
‫))‪init_image = Image.open("cat_on_bench.png").resize((512, 512‬‬
‫;)‪plt.imshow(init_image‬‬
‫))‪mask_image = Image.open("cat_mask.jpg").resize((512, 512‬‬
‫;)‪plt.imshow(mask_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).‬‬
‫]‪images[0‬‬
‫;)‪plt.imshow(image‬‬

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

‫�صكل ‪� :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‬‬

‫�صكل ‪ :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‬صورة مكتب مولَّدة وعليها كتاب‬


‫‪245‬‬
‫مترينات‬
‫‪�ِ 1‬صف باخت�صار عملية ر�صم �صورة باآل�صر�صاد بن�ش‪.‬‬

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

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

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

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


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

‫‪247‬‬
‫الم�سروع‬

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

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

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

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

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

‫‪248‬‬
‫ماذا تع ّلمت‬

‫ اإعداد ال�سور للتعرُّ ف عليها‪.‬‬


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

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

‫‪Computer Vision‬‬ ‫ر�ؤية احلا�صب‬ ‫‪Image‬‬ ‫�صورة‬


‫‪Convolutional Neural‬‬ ‫ال�صبكة الع�صبية‬ ‫‪Image Generation‬‬ ‫توليد ال�صور‬
‫‪Network - CNN‬‬ ‫الر�صيحية‬
‫‪Diffusion Model‬‬ ‫منوذج اآلنت�صار‬ ‫‪Image Preprocessing‬‬
‫املعاجلة اآلأ�ليَّة‬
‫لل�صور‬
‫‪Feature Engineering‬‬ ‫هند�صة اخل�صائ�ش‬
‫‪Feature Selection‬‬ ‫انتقاء اخل�صائ�ش‬ ‫‪Network Layer‬‬ ‫طبقة ال�صبكة‬
‫‪Generative‬‬
‫‪Recognition‬‬ ‫التعرّف‬
‫ال�صبكة التوليدية‬
‫‪Adversarial Network‬‬
‫التناف�صية‬ ‫‪Stable Diffusion‬‬ ‫اآلنت�صار امل�صتقر‬
‫‪- GAN‬‬
‫‪Standard Scaling‬‬ ‫حتجيم قيا�صي‬
‫‪Histogram of Oriented‬‬ ‫خُمطط تكراري‬
‫‪Gradients - HOG‬‬ ‫للتدرجات املوجَّ هة‬ ‫‪Visual Data‬‬ ‫بيانات مرئية‬

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

‫اأهداف التعلُّم‬
‫بنهاية هذه الوحدة �سيكون الطالب قادرًا على اأن‪:‬‬
‫ يُ�سنّف طرائق التح�س ملعاجلة م�سكالت معقدة‪.‬‬
‫ي�سف خوارزميات اتخاذ القرار املُختلفة‪.‬‬
‫ ِ‬
‫ ي�ستخدم البايثون حللّ م�سكالت تخ�سي�ص املوارد املتعلقة بفِر العمل‪.‬‬
‫ يحلّ م�سكالت اجلدولة با�ستخدام خوارزميات التح�س ‪.‬‬
‫ ي�ستخدم البايثون حللّ م�سكالت اجلدولة‪.‬‬
‫ة الريا سية حللّ م�سكالت التح�س ‪.‬‬ ‫ ي�ستخدم ال‬
‫ يُعرّ ف م�سكلة حقيبة ال هر (‪.)Knapsack problem‬‬
‫ يُعرّ ف م�سكلة البائع املُتجوّل (‪.)Traveling Salesman problem‬‬

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

‫‪250‬‬
‫الدر�ص األأول‬
‫م�سكلة تخ�سي�ص املوارد‬

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


‫‪Optimization Algorithms in AI‬‬
‫القيود (‪:)Constraints‬‬ ‫يُ�صتخدم الذكاء اال�صطناعي يف ُخُمتلف ال�صناعات التخاذ قرارات تت�صم بالكفاءة والدقة‪ ،‬و ُيع ُّد‬
‫ه��ي مبثا ب��ة �ص��روط تق ِّي��د‬ ‫ُ�صتخدمة يف اتخاذ القرارات‪.‬‬‫ا�صتخدام خوارزميات تعلُّم االآلة اإحدى طرائق الذكاء اال�صطناعي امل َ‬
‫احل��ل‪ ،‬مث��ل احل��د االأق�ص��ى‬ ‫وكما تعلّمت يف الوحدة ال�صابقة‪ ،‬فاإن خوارزميات تعلُّم االآلة تقوم بتمكني الذكاء اال�صطناعي من‬
‫ل��وزن الط��رد ا ل��ذي ميك��ن‬ ‫التعلُّم بوا�صطة البيانات ومن ثَمّ القيام بالتنبوؤات اأو تقدمي التو�صيات‪ .‬على �صبيل املثال‪ ،‬يف جمال‬
‫�صحنه‪.‬‬ ‫الرعاي�ة ال�صحي�ة‪ُ ،‬ميك�ن ا�ص�تخدام ال�ذكاء اال�صطناعي للتنبوؤ بنتائج املر�ص�ى والتو�صية بخُ طط‬
‫عالجي�ة بن�ا ًء عل�ى البيان�ات الت�ي ُجمعت من ح�االت مماثلة‪ .‬ويف جمال التمويل‪ُ ،‬ميكن ا�ص�تخدام‬
‫ال�ذكاء اال�صطناع�ي يف اتخ�اذ ق�رارات ا�ص�تثمارية بوا�ص�طة حتليل جمموعات كب�رة من البيانات‬
‫الدوال املو سوعية‬ ‫املالي�ة وحتدي�د ا أالمن�اط الت�ي تب ّ�ني املخاط�ر اأو الفر�ص املحتملة‪ .‬وعلى الرغم م�ن اأن خوارزميات‬
‫(‪:)Objective Functions‬‬ ‫تعلُّم االآلة حتظى ب�صعبية متزايدة اإال اأنها لي�صت النوع الوحيد من خوارزميات الذكاء اال�صطناعي‬
‫هي معاير حتدد مدى اقرتاب‬ ‫التي ُميكن ا�صتخدامها يف اتخاذ القرارات‪ ،‬فهناك طريقة اأخرى تتمثل يف ا�صتخدام خوارزميات‬
‫ا حل�ل املق� َّد م م�ن النتا ئ�ج‬ ‫التح�صني التي تُ�صتعمَل بوجه عام الإيجاد اأف�صل ح ّل مل�صكلة حم َّددة بنا ًء على قيود واأهداف معيّنة‪.‬‬
‫املطلوب�ة‪ ،‬مث�ل تقلي�ل م�ص�افة‬ ‫يهدف التح�صني اإىل حتقيق الت�صميم االأف�صل بالن�صبة ملجموعة من املعاير اأو القيود ذات االأولوية‪،‬‬
‫ال�صفر ل�صاحنة تو�صيل‪.‬‬ ‫وت�ص�مل تعزيز عوامل مع ّينة مثل‪ :‬االإنتاجية‪ ،‬واملوثوقية‪ ،‬وطول العمر‪ ،‬والكفاءة‪ ،‬ويف الوقت نف�ص�ه‬
‫تقليل عوامل اأخرى مثل‪ :‬التكاليف‪ ،‬والفاقد‪ ،‬والتوقف عن العمل‪ ،‬واالأخطاء‪.‬‬
‫م�سكالت التخ�سي�ص ‪Allocation Problems‬‬
‫تُع ُّد م�ص��كالت التخ�صي�ص من م�ص��كالت التح�ص��ني ال�ص��ائعة؛ ففيها يتم تخ�صي�ص جمموعة من املوارد مثل‪ :‬العمّال‪ ،‬اأو االآالت‪،‬‬
‫اأو االأموال ملجموعة من املهام اأو امل�صاريع باأعلى كفاءة ممكنة‪ ،‬وتن�صاأ هذه امل�صكالت يف جمموعة وا�صعة من املجاالت مبا فيها‬
‫الت�صني��ع واخلدم��ات اللوج�ص��تية واإدارة امل�ص��اريع والتموي��ل‪ُ ،‬وميك��ن �صياغته��ا بطرائ��ق ُخُمتلف��ة بن��ا ًء على قيوده��ا واأهدافها‪ .‬يف‬
‫هذا الدر�ص �صتتع ّرف على م�صكالت التخ�صي�ص وخوارزميات التح�صني امل�صتخدَ مة حللّها‪.‬‬

‫سوعية (‪)Objective Function‬‬ ‫الدالة املو‬ ‫القيد (‪)Constraint‬‬


‫ُعاجلة واملر�صَ لة‪.‬‬
‫هي زيادة عدد العنا�صر امل َ‬ ‫هو حتديد الوزن‬

‫�صكل ‪ :5.1‬ا�صتخدام خوارزميات‬


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

‫على �صبيل املثال‪ ،‬تخيل �صيناريو ب�صيطً ا يوجد فيه خم�صة عمال‪:‬‬

‫العامل اخلام�ش‬ ‫العامل الرابع‬ ‫العامل الثالث‬ ‫العامل الثاين‬ ‫العامل اآلأ�ل‬
‫املهارات‪ :‬م‪ ،2‬م‪4‬‬ ‫املهارات‪ :‬م‪ ،1‬م‪ ،2‬م‪3‬‬ ‫املهارات‪ :‬م‪ ،2‬م‪3‬‬ ‫املهارات‪ :‬م‪ ،1‬م‪ ،3‬م‪6‬‬
‫املهارات‪ :‬م‪5‬‬

‫القوة املُفرطة (‪:)Brute-force‬‬ ‫تتطل�ب امل ُِه َّم�ة امل�راد اإجنازه�ا كل امله�ارات‪ :‬م‪ ،1‬م‪ ،2‬م‪ ،3‬م‪ ،4‬م‪ ،5‬م‪.6‬‬
‫هي طريقة من طرائق ح ّل امل�صكالت تت�صمن‬ ‫يتمثّ�ل احل� ّل القائ�م عل�ى الق�وة امل ُفرط�ة (‪ )Brute Force‬يف اأخ�ذ كل‬
‫التجري�ب املنهج�ي جلمي�ع احلل�ول املمكن�ة‬ ‫فِ�رق العمّ�ال املُمكن�ة يف االعتب�ار‪ ،‬والرتكي�ز عل�ى ال ِف�رق الت�ي تتوفّر فيها‬
‫للم�ص�كلة به�دف الو�ص�ول اإىل احل� ّل االأمث�ل‪،‬‬ ‫جمي�ع امله�ارات املطلوبة‪ ،‬واختيار الفري�ق االأقل عددًا‪ ،‬وعلى افرتا�ص اأن‬
‫بغ�ص النظر عن التكلفة احلا�صوبية‪.‬‬‫ّ‬ ‫كل فريق يتكون من �ص�خ�ص واحد على االأقل‪ ،‬فيُمكنك اأن تُ�ص�كِّل واحدًا‬
‫وثالثني فريقًا خُمتلفًا يتكون كل منهم من خم�صة ع ّمال‪.‬‬
‫العدد اآلإجمايل للفِرق‬ ‫بالن�صبة للفريق املُكوَّن من عامل واحد‪ ،‬هناك خم�ص طرائق الختيار عامل واحد من بني العمّال اخلم�صة‪.‬‬ ‫•‬
‫امل ُختلفة التي ُميكنك‬ ‫بالن�صبة للفريق املُكوَّن من عاملني اثنني‪ ،‬هناك ع�صر طرائق الختيار عاملني من بني الع ّمال اخلم�صة‪.‬‬ ‫•‬
‫تكوينها هو‪:‬‬ ‫بالن�صبة للفريق املُكوَّن من ثالثة ع ّمال‪ ،‬هناك ع�صر طرائق الختيار ثالثة ع ّمال من بني الع ّمال اخلم�صة‪.‬‬ ‫•‬
‫‪،5 10 10 5 1 31‬‬
‫�ميكن ح�صاب العدد‬ ‫ُ‬ ‫بالن�صبة للفريق املُكوَّن من اأربعة ع ّمال‪ ،‬هناك خم�ص طرائق الختيار اأربعة ع ّمال من بني العمّال اخلم�صة‪.‬‬ ‫•‬
‫أي�صا �فقًا للمعادلة‪:‬‬
‫ا ً‬ ‫بالن�صبة للفريق املُكوَّن من خم�صة ع ّمال‪ ،‬هناك طريقة واحدة الختيار كل الع ّمال اخلم�صة‪.‬‬ ‫•‬
‫‪.25 - 1‬‬
‫يك�ص��ف تقيي��م كل ال ِف��رق االإح��دى والثالثني عن اأف�صل ح ّل ممكن‬
‫يتم ّث��ل يف تكوي��ن فري��ق ي�ص��مل الع ّم��ال‪:‬االأول والراب��ع واخلام���ص‪،‬‬
‫و�ص��يغطي ه��ذا الفري��ق كل امله��ارات ال�ص��ت املطلوب��ة‪ ،‬و�صي�ص��مل‬
‫الفري��ق ثالث��ة ع ّم��ال‪ ،‬وال ُميك��ن تغطي��ة كل املهارات بفريق ي�ص��تمل‬
‫العامل اخلام�ش‬ ‫العامل الرابع‬ ‫العامل اآلأ�ل‬ ‫عل��ى ع��دد ع ّم��ال اأق��ل م��ن ذل��ك‪ ،‬مم��ا يجع��ل ه��ذا احل� ّل ه��و احل� ّل‬
‫املهارات‪ :‬م‪5‬‬ ‫املهارات‪ :‬م‪ ،2‬م‪4‬‬ ‫املهارات‪ :‬م‪ ،1‬م‪ ،3‬م‪6‬‬
‫اآلأمثل (‪.)Optimal Solution‬‬
‫وهناك ح ّل اآخر يتمثّل يف تكوين فريق ي�ص�مل العمّال‪:‬‬
‫االأول والثاين والثالث واخلام�ص‪ ،‬وعلى الرغم من اأن‬
‫هذا الفريق يغطي كل املهارات ال�ص�ت‪ ،‬اإال اأنه يتطلب‬
‫العامل الثالث العامل اخلام�ش‬ ‫العامل الثاين‬ ‫العامل اآلأ�ل‬ ‫أي�صا ع ّم ًاال اأكر‪ ،‬مما يجعل هذا احل ّل ممكنًا‪ ،‬ولكنه‬ ‫ا ً‬
‫املهارات‪ :‬م‪ ،1‬م‪ ،2‬م‪ 3‬املهارات‪ :‬م‪5‬‬ ‫املهارات‪ :‬م‪ ،1‬م‪ ،3‬م‪ 6‬املهارات‪ :‬م‪ ،2‬م‪3‬‬ ‫لي�ص احل ّل االأمثل‪.‬‬
‫‪253‬‬
‫اخلا�ص��ة باأ�ص��لوب الق��وة املُفرط��ة ت�صم��ن دائ ًم��ا اإيج��اد احل� ّل االأمث��ل‪ ،‬مت��ى اأمك��ن ذلك‪ ،‬ولك��نّ فح�ص كل ال ِف��رق املُمكنة‬
‫ّ‬ ‫الطبيع��ة‬
‫فمثال‪:‬‬
‫ُيع ُّد عملية مكلّفة حا�صوبيًا‪ً ،‬‬
‫• اإذا كان لديك �صتة ع ّمال‪ ،‬ف�صيكون عدد ال ِفرق املُمكنة‪.26 - 1 = 63 :‬‬
‫• اإذا كان لديك ع�صرة ع ّمال‪ ،‬ف�صيكون عدد ال ِفرق املُمكنة‪.210 – 1 = 1,023 :‬‬
‫عامال‪ ،‬ف�صيكون عدد ال ِفرق املُمكنة‪.215 – 1 = 32,767 :‬‬ ‫• اإذا كان لديك خم�صة ع�صر ً‬
‫عامال‪ ،‬ف�صيكون عدد ال ِفرق املُمكنة‪.2 – 1 = 1,048,575 :‬‬
‫‪20‬‬
‫• اإذا كان لديك ع�صرون ً‬
‫عامال‪ ،‬ف�صيكون عدد ال ِفرق املُمكنة‪.2 – 1 = 1,125,899,906,842,623 :‬‬
‫‪50‬‬
‫• اإذا كان لديك خم�صون ً‬
‫من الوا�صح يف مثل هذه املواقف اأن ح�صر عدد ال ِفرق لكل احللول املُمكنة لي�ص‬
‫عامال‪،‬‬
‫حتى بالن�صبة لعدد معتدل من ‪ً 50‬‬ ‫خيارًا عمليًّا‪ ،‬ولذلك مت اقرتاح طرائق حت�صني اأخرى ملعاجلة امل�صكالت املعقدة‬
‫فاإن عدد الفرق املحتملة يت�صخم اإىل اأك‬
‫من كوادريليون ( ‪.)Quadrillion 10‬‬
‫‪15‬‬ ‫ع�ن طري�ق البح�ث يف خي�ارات احلل�ول املُمكن�ة باأ�ص�لوب اأكر كفاءة من اأ�ص�لوب‬
‫القوة املُفرطة‪ُ ،‬وميكن بوجه عام ت�صنيف هذه الطرائق يف ثالث فئات‪:‬‬
‫• طرائق اآل�صتدآلل (‪)Heuristic Methods‬‬
‫• الربجمة القيدية (‪)Constraint Programming‬‬
‫• الربجمة الريا�صية (‪)Mathematical Programming‬‬
‫األأمثل ‪Optimal Solution‬‬ ‫احللّ‬
‫م��ن املمك��ن اأن تك��ون هن��اك العدي��د م��ن احلل��ول املُثل��ى‪ ،‬كاأن يك��ون لدي��ك ع��دة ِف��رق ت�ص��مل ثالث��ة ع ّم��ال وباإمكانه��ا اأن ت�ص��تويف كل‬
‫املهارات املطلوبة‪ ،‬كما اأنه من املمكن اأال يوجد ح ّل لبع�ص امل�صكالت‪ ،‬على �صبيل املثال‪ :‬اإذا كانت املُهِ َّمة تتطلب املهارة ال�صابعة‬
‫وهي ال تتُوفّر يف اأي عامل من العمّال‪ ،‬فلن يكون هناك ح ّل للم�صكلة‪.‬‬
‫األإيجابيات‬ ‫طرائق األ�ستدألل (‪)Heuristic Methods‬‬
‫تتميز اال�ص��تدالالت بالكفاءة احلا�ص��وبية‪،‬‬
‫ُوميكنه��ا اأن تتن��اول امل�ص��كالت املعق��دة‪،‬‬ ‫تقوم طرائق اآل�صتدآلل (‪ )Heuristic Methods - HM‬يف العادة على التجربة‪،‬‬
‫�وال ذات ج��ودة‬
‫كم��ا ُميكنه��ا اأن جُت��د حل� ً‬ ‫اأو البديه�ة‪ ،‬اأو الفط�رة ال�ص�ليمة‪ ،‬ولي��ص عل�ى التحلي�ل الريا�ص�ي الدقي�ق‪ُ ،‬وميك�ن‬
‫عالي��ة اإذا ا�ص �تُخدمت له��ا ا�ص��تدالالت‬ ‫ا�ص�تخدامها الإيج�اد حل�ول جي�دة ب�ص�كل �ص�ريع‪ ،‬ولكنه�ا ال ت�صم�ن الو�ص�ول اإىل احل ّل‬
‫معقولة‪.‬‬ ‫االأمثل (اأف�صل حل ميكن احل�صول عليه)‪ ،‬ومن االأمثلة على اخلوارزميات اال�صتداللية؛‬
‫‪ -‬ال�سلبيات‬
‫اخلوارزمي�ات اجل�ص�عة ( ‪ ،)Greedy Algorithms‬و �اكاة التلد ي�ن‬
‫ال ت�صم��ن الو�ص��ول اإىل احل� ّل االأمث��ل‪ ،‬كما‬ ‫(‪ ،)Simulated Annealing‬واخلوارزميات اجلينية (‪،)Genetic Algorithms‬‬
‫اأن بع���ص اال�ص��تدالالت تتطل��ب �صبطً ��ا‬ ‫وحت�صني م�صتعمرة النمل (‪ .)Ant Colony Optimization‬ت�صتخدم هذه الطرائق‬
‫كبرًا حتى ُتوؤدي اإىل نتائج جيدة‪.‬‬ ‫طويال ج� ًّدا‪ ،‬ولكن ال‬
‫يف الع�ادة حل� ّل امل�ص�كالت املعق�دة الت�ي ت�ص�تغرق وقتًا حا�ص�وبيًا ً‬
‫ُميكنها اإيجاد حلول دقيقة‪ ،‬و�صتتعلّم يف الدرو�ص القادمة املزيد عن هذه اخلوارزميات‪.‬‬
‫األإيجابيات‬ ‫ة القيدية (‪)Constraint Programming‬‬ ‫ال‬
‫ُميك��ن للربجم��ة القيدي��ة اأن تتعام��ل م��ع‬
‫الربجم��ة القيدي��ة (‪ )Constraint Programming - CP‬حت � ّل م�ص��كالت قيود معقدة واأن جُتد اأف�صل احللول‪.‬‬
‫التح�ص��ني ع��ن طري��ق منذج��ة القي��ود واإيج��اد ح � ّل يخ�ص��ع جلمي��ع القي��ود‪ ،‬وه��ذا‬
‫االأ�ص��لوب مفي��د ب�ص��كل خا���ص يف امل�ص��كالت الت��ي به��ا ع��دد كبر م��ن القي��ود اأو التي ‪ -‬ال�سلبيات‬
‫ُميك��ن اأن تك��ون ه��ذه الطرائ��ق مك ِّلف��ة‬ ‫تتطلب حت�صني عدة اأهداف‪.‬‬
‫حا�صوبيًا يف امل�صكالت الكبرة‪.‬‬

‫‪254‬‬
‫األإيجابيات‬ ‫ة الريا سية (‪)Mathematical Programming‬‬ ‫ال‬
‫تتعام��ل الربجم��ة الريا�صية مع‬
‫الربجم��ة الريا�صي��ة (‪ )Mathematical Programming - MP‬ه��ي جمموع��ة م��ن جمموع��ة وا�ص��عة من م�ص��كالت‬
‫التقنيات التي تَ�صتخدم مناذج ريا�صية؛ حل ّل م�صكالت التح�صني‪ ،‬وت�صمل‪ :‬الربجمة اخلطية التح�ص��ني وه��ي غال ًب��ا ت�صم��ن‬
‫(‪� ،)Linear Programming‬الربجم��ة الرباعي��ة (‪ ،)Quadratic Programming‬الو�صول اإىل احل ّل االأمثل‪.‬‬
‫�الربجم��ة غ��ر اخلطي��ة (‪� )Nonlinear Programming‬برجم��ة اآلأع��داد ال�صحيح��ة‬
‫املختلط��ة (‪ ،)Mixed-Integer Programming‬وتُ�ص��تخدم ه��ذه التقني��ات عل��ى نط��اق ‪ -‬ال�سلبيات‬
‫وا�ص��ع يف الكث��ر م��ن املج��االت؛ مب��ا فيه��ا عل��م االقت�ص��اد والهند�ص��ة وعملي��ات البح��ث‪ .‬تلع��ب ُيع� ُّد ك ٌّل من التكلفة احلا�ص��وبية‬
‫اأ�ص��اليب الربجم��ة الريا�صي��ة دورًا مه ًّم��ا يف التع ُّل��م العمي��ق (‪ ،)Deep Learning‬ومتتل��ك للم�ص��كالت الكب��رة وتعقي��د‬
‫ُعام��الت الت��ي حتت��اج اأن تتع ّل��م م��ن البيان��ات‪ ،‬حيث اإن�ص��اء ال�صيغ��ة الريا�صي��ة‬
‫من��اذج التعلُّ��م العمي��ق ع��ددًا كب�رًا م��ن امل ِ‬
‫ُعام��الت النم��وذج من اأجل تقليل دال��ة التكلفة التي املنا�ص��بة مرتف َع��ني بالن�ص��بة‬ ‫ُت�ص��تخدم خوارزمي��ات التح�ص��ني لتعدي��ل م ِ‬
‫تقي���ص ال َف��رق ب��ني ُخُم َرج��ات النم��وذج املتن ّب�اأ به��ا واملُخ َرج��ات ال�صحيح��ة‪ .‬مت تطوي��ر العدي��د مل�ص��كالت الع��امَل الواقع��ي‬
‫م��ن خوارزمي��ات التح�ص��ني اخلا�ص��ة بنم��اذج التعلُّ��م العمي��ق مث��ل‪ :‬خوارزمي��ة اآدم (‪ ،)Adam‬املعقدة‪.‬‬
‫وخوارزمي��ة اآل�ص��تقاق التك ُّيف��ي (‪ ،)AdaGrad‬وخوارزمي��ة ن�ص��ر متو�ص��ط اجل��ذر الربيعي‬
‫(‪.)RMSprop‬‬

‫مثال عملي‪ :‬حت�س م�سكلة ت�سكيل الفريق‬


‫‪A Working Example: Optimization for the Team-Formation Problem‬‬
‫�يو�صح ه��ذا الدر���ص ا�ص��تخدام خوارزمي��ة الق��وة امل ُفرط��ة (‪ ،)Brute-Force Algorithm‬واخلوارزمي��ة اآل�ص��تدآللية‬ ‫�ص� ِّ‬
‫اجل�ص��عة (‪ )Greedy Heuristic Algorithm‬حل ّل م�ص��كلة اتخاذ القرار املُرتكزة على م�ص��كلة تخ�صي�ص املوارد القائمة على‬
‫الفريق والتي مت و�صفها �صابقًا‪ ،‬بعد ذلك �صتتم مقارنة نتائج هاتني اخلوارزميتني‪.‬‬
‫ُميك��ن ا�ص��تخدام الدال��ة التالي��ة الإن�ص��اء اأمثل��ة ع�ص��وائية مل�ص��كلة ت�ص��كيل ال ِفرق‪،‬‬
‫اخلوارزمية األ�ستدأللية اجل�سعة‬ ‫عامالت هي‪ :‬العدد االإجمايل‬ ‫حدد اأربعة ُم ِ‬ ‫وت�صمح هذه الدالة للم�صتخدِ م اأن ُي ِّ‬
‫(‪:)Greedy Heuristic Algorithm‬‬ ‫للمه��ارات الت��ي يج��ب اأن توؤخ��ذ بع��ني االعتب��ار‪ ،‬والع��دد االإجم��ايل للع ّم��ال‬
‫ه��ي اأ�ص��لوب ا�ص��تداليل حل� ّل امل�ص��كالت‪،‬‬ ‫املتوفّري��ن‪ ،‬وع��دد امله��ارات الت��ي يج��ب اأن تتو ّف��ر يف اأع�ص��اء الفري��ق ب�ص��كل‬
‫وفي��ه تق��وم اخلوارزمي��ة ب ِبن��اء احل � ّل‬ ‫جماعي حتى ينجزوا املُهِ َّمة‪ ،‬والعدد االأق�صى للمهارات التي ُميكن اأن ميتلكها‬
‫خط��و ًة خط��وةً‪ ،‬وتخت��ار اخلي��ار االأمث��ل‬ ‫كل عامل‪.‬‬
‫حم ِّل ًّي��ا يف كل مرحل��ة‪ ،‬حت��ى ت�ص��ل يف‬ ‫وبع��د ذل��ك‪ ،‬تق��وم الدال��ة باإن�ص��اء واإظهار جمموع��ة ع ّمال لديهم ع��دة مهارات‬
‫النهاية اإىل ح ّل �صامل ونهائي‪.‬‬ ‫ُخُمتلف��ة‪ ،‬وع��دة مه��ارات مطلوب��ة‪ ،‬وتَ�ص��تخدم ه��ذه الدال��ة املكتب��ة ال�ص��هرة‬
‫‪ Random‬الت��ي ُميك��ن ا�ص��تخدامها يف اإخ��راج ع ّين��ة أاع��داد ع�ص��وائية م��ن‬
‫جمموعة اأعداد مع ّينة اأو عنا�صر ع�صوائية من قائمة معيّنة‪.‬‬

‫‪import random‬‬

‫‪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‬‬
‫‪):‬‬

‫‪255‬‬
# creates the global list of skills s1, s2, s3, ...
skills = ['s' + str(i) for i in range(1, skill_number+1)]

worker_skills = dict() # dictionary that maps each worker to their set of skills

for i in range(1, worker_number+1): # for each worker

# makes a worker id (w1, w2, w3, ...)


worker_id = 'w' + str(i)

# 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))

# remembers the skill sampled for this worker


worker_skills[worker_id] = my_skills

# 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


return {'worker_skills':worker_skills, 'required_skills':required_skills}

،‫ ع�صر مهارات اإجمالية‬:‫�صتقوم االآن باختبار الدالة الواردة �صابقًا من خالل اإن�صاء ن�صخة من م�صكلة معطياتها كالتايل‬
.‫كحد اأق�صى لكل عامل‬
ٍّ ‫ وتتطلب خم�ص مهارات‬،‫و�صتة ع ّمال‬

x10
‫حتتاج امل�صكلة اإىل‬
‫ع�صر مهارات‬
‫اإجمالية‬

x5 x5 x6
‫بحدٍّ اأق�صى خم�ص‬ ‫مهارات‬ ‫ع ّمال‬
‫مهارات لكل عامل‬ ‫مطلوبة‬
‫ ر�صم تو�صيحي للمثال اخلا�ص بامل�صكلة‬:5.2 ‫�صكل‬

‫ �صتح�صل‬،‫ب�صبب الطبيعة الع�صوائية للدالة‬


‫على ن�صخة خُمتلفة من امل�صكلة يف كل مرة‬
.‫تقوم فيها بت�صغيل هذا املقطع الربجمي‬

256
# 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']:
print(worker_id, sample_problem['worker_skills'][worker_id])

print()

# prints the required skills that the team has to cover


print('Required Skills:', sample_problem['required_skills'])

w1 {'s10'}
w2 {'s2', 's8', 's5', 's6'}
w3 {'s7', 's2', 's4', 's5', 's1'}
w4 {'s9', 's4'}
w5 {'s7', 's4'}
w6 {'s7', 's10'}

Required Skills: {'s6', 's8', 's7', 's5', 's9'}

‫ وه��ي خوارزمي��ة حت�ص��ني ُميكنه��ا اأن حت��دِّ د اأقل عدد ممكن‬،)Solver( ‫تتمث��ل اخلط��وة التالي��ة يف اإن�ص��اء خوارزمي��ة ح� ّل‬
.‫لفريق الع ّمال الذي ُميكن اعتماده الإ�صتيفاء كل املهارات املطلوبة‬
‫اتخاذ القرار بخوارزمية القوة املُفرطة‬
Decision Making with a Brute-Force Algorithm
‫�ص�تُطبِّق اأول خوارزمي��ة ح� ّل اأ�ص��لوب الق��وة املُفرط��ة ال��ذي يعتم��د عل��ى التع��داد ال�ص��امل ل��كل ال ِف��رق املُمكن��ة واأخذه��ا بعني‬
‫؛ لتولي��د كل ال ِف��رق‬itertools ‫ (توافي��ق) م��ن وح��دة‬combinations ‫ و�صَ تَ�ص��تخدم ه��ذه اخلوارزمي��ة اأدوات‬،‫االعتب��ار‬
.‫املُمكنة ذات العدد املح َّدد‬
:‫�صيتم تو�صيح االأداة باملثال الب�صيط اأدناه‬
# 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

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')]

257
‫ وهذه اخلوارزمية تاأخذ بعني‬، ‫ ُميكن اإن�ص��اء الدالة التالية حل ّل م�ص��كلة تكوين الفريق باأ�ص��لوب القوة املُفرطة‬،‫بعد ذلك‬
‫ ث��م حت�ص��ر ال ِف��رق التي ت�ص��تويف كل‬،‫ و تن�ص��ىء ال ِف��رق بن��ا ًء عل��ى االأع��داد املمكن��ة‬،‫االعتب��ار جمي��ع اأحج��ام الف��رق املمكن��ة‬
:‫وحتدد الفريق االأقل عددًا‬ِّ ‫املهارات املطلوبة‬
def brute_force_solver(problem):

worker_skills = problem['worker_skills']
required_skills = problem['required_skills']

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


worker_num = len(worker_ids) # total number of workers
all_possible_teams = [] # remembers all possible teams
best_team = None # remembers the best (smallest) team found so far

#for each possible team size (singles, pairs, triplets, ...)


for team_size in range(1, worker_num+1):

# creates all possible teams of this size


teams = combinations(worker_ids, team_size)
for team in teams: # for each team of this size

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
skill_union.update(worker_skills[worker_id])

# if all the required skills are included in the union


if required_skills.issubset(skill_union):

# 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):
best_team = team # makes this team the best one

return best_team # returns the best solution

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

# uses the brute-force solver to find the best team for the sample problem
best_team = brute_force_solver(sample_problem)
print(best_team)

('w2', 'w3', 'w4')

258
، ٌ‫ اأق ّل الفرق عددًا طاملا اأن هناك ح ٌّل ممكن‬:‫ اأي‬، ‫من املوؤكد اأن خوارزمية احل ّل بالقوة املُفرطة �صتجد اأف�صل ح ّل ممكن‬
‫ولكن كما مت مناق�صته يف بداية هذا الدر�ص فاإن طبيعة اخلوارزمية ال�صمولية ُتوؤدي اإىل زيادة هائلة يف التكلفة احلا�صوبية‬
.‫كلما زاد حجم امل�صكلة‬
‫ و ُميك��ن ا�ص��تخدام املقط��ع‬،‫ُميك��ن تو�صي��ح ذل��ك م��ن خ��الل اإن�ص��اء نُ�ص��خ مل�ص��كالت متع��ددة م��ن حي��ث تزاي��د ع��دد الع ّم��ال‬
‫ ثم‬،20‫ و‬15‫ و‬10‫ و‬5 :‫ حيث يتن��وع عدد الع ّم��ال ليك��ون‬،‫الربجم��ي الت��ايل لتولي��د نُ�ص��خ متنوع��ة م��ن م�ص��كلة تكوي��ن الفري��ق‬
‫ واخلم���ص‬،‫ واملهارات الثمان املطلوبة‬،‫ وت�ص��مل كل النُ�ص��خ املهارات االإجمالية الع�ص��ر‬،‫ ن�ص��خة بعدد الع ّمال‬100 ‫يتم توليد‬
:‫كحد اأق�صى لكل عامل‬ ٍّ ‫مهارات‬
problems_with_5_workers = [] # 5 workers
problems_with_10_workers = [] # 10 workers
problems_with_15_workers = [] # 15 workers
problems_with_20_workers = [] # 20 workers

for i in range(100): # repeat 100 times

problems_with_5_workers.append(create_problem_instance(10, 5, 8, 5))
problems_with_10_workers.append(create_problem_instance(10, 10, 8, 5))
problems_with_15_workers.append(create_problem_instance(10, 15, 8, 5))
problems_with_20_workers.append(create_problem_instance(10, 20, 8, 5))

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

import time

def gets_solutions(problems,solver):

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
solutions = [] # solutions returned by the solver

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
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))

return solutions

259
‫ي�ص� ِ‬
‫�تخدم املقط��ع الربجم��ي الت��ايل ه��ذه الدال��ة وخوارزمي��ة احل� ّل بالق��وة املُفرط��ة حل�ص��اب احلل��ول املُمكن��ة ملجموع��ات‬
‫البيان��ات الت��ي مت اإن�ص��اوؤها �ص��ابقًا واملُك َّون��ة م��ن ‪( 5-workers‬خم�ص��ة _ع ّم��ال)‪ ،‬و‪( 10-workers‬ع�ص��رة _ع ّم��ال)‪،‬‬
‫عامال)‪:‬‬
‫عامال)‪ ،‬و‪( 20-workers‬ع�صرين _ ً‬ ‫و‪( 15-workers‬خم�صة ع�صر _ ً‬

‫‪brute_solutions_5 = gets_solutions(problems_with_5_workers,‬‬
‫)‪solver = brute_force_solver‬‬

‫‪brute_solutions_10 = gets_solutions(problems_with_10_workers,‬‬
‫)‪solver = brute_force_solver‬‬

‫‪brute_solutions_15 = gets_solutions(problems_with_15_workers,‬‬
‫)‪solver = brute_force_solver‬‬

‫‪brute_solutions_20 = gets_solutions(problems_with_20_workers,‬‬
‫)‪solver = brute_force_solver‬‬

‫‪Solved‬‬ ‫‪23‬‬ ‫‪problems‬‬ ‫‪in‬‬ ‫‪0.0019948482513427734 seconds‬‬


‫‪Solved‬‬ ‫‪80‬‬ ‫‪problems‬‬ ‫‪in‬‬ ‫‪0.06984829902648926 seconds‬‬
‫‪Solved‬‬ ‫‪94‬‬ ‫‪problems‬‬ ‫‪in‬‬ ‫‪2.754629373550415 seconds‬‬
‫‪Solved‬‬ ‫‪99‬‬ ‫‪problems‬‬ ‫‪in‬‬ ‫‪109.11902689933777 seconds‬‬

‫عل��ى الرغ��م م��ن اأن االأع��داد املطلوب��ة �صُ ��جلت بوا�ص��طة الدال��ة ()‪ gets_solutions‬اإال اأنه��ا �ص��تكون متفاوت��ة نظ�رًا للطبيع��ة‬
‫الع�صوائية ملجموعات البيانات‪ ،‬و�صيكون هناك منطان ثابتان على الدوام هما‪:‬‬
‫• زي��ادة ع��دد الع ّم��ال ُت�وؤدي اإىل ع��دد اأك��رب من نُ�ص��خ امل�ص��كالت التي من املمك��ن اإيجاد ح ّل لها‪ ،‬وهذا النم��ط من احللول معقول‬
‫واحد على االأقل ميتلك مه��ارة واحدة مطلوبة �صمن‬ ‫عامل ٍ‬
‫ومتو َّق��ع؛ الأن وج��ود ع��دد كب��ر م��ن الع ّم��ال يزي��د من احتم��ال وجود ٍ‬
‫جمموعة الع ّمال املتاحة‪.‬‬
‫• زي��ادة ع��دد الع ّم��ال ي�وؤدي اإىل زي��ادة كب��رة (اأُ�صِّ �يَّة) يف الزم��ن احلا�ص��وبي‪ ،‬وه��ذا متوق��ع ح�ص��ب التحلي��ل ال��ذي مت اإج��راوؤه يف‬
‫عامال‪ ،‬ف�اإن عدد‬
‫بداي��ة ه��ذا الدر���ص‪ ،‬وبالن�ص��بة ملجم��وع الع ّم��ال مم��ن ه��م بع��دد‪ :‬خم�ص��ة‪ ،‬وع�ص��رة‪ ،‬وخم�ص��ة ع�ص��ر‪ ،‬وع�ص��رون ً‬
‫الفِرق املُمكنة ي�صاوي‪ ،32767 ،1023 ،31 :‬و‪ 1048575‬على الرتتيب‪.‬‬
‫ب�صف� ٍة عام��ة‪ ،‬وبالنظ��ر اإىل ع��دد الع ّم��ال املُعط��ى ‪ ،N‬ف�اإن عدد ال ِفرق املُمكنة ي�ص��اوي ‪ ،2N-1‬وهذا العدد �ص��ي�صبح كبرًا لتقييمه‬
‫حتى بالن�ص��بة للقيم ال�صغرة ل� ‪ .N‬كذلك بالن�ص��بة الأي م�ص��كلة ب�ص��يطة بها قيد واحد (يغطي جميع املهارات املطلوبة) وهدف‬
‫واح��د (تقلي��ل حج��م الفري��ق)‪ ،‬ف�اإن الق��وة املُفرطة قابلة للتطبي��ق فقط على جمموعات البيانات ال�صغرة ج��دً ا‪ ،‬وذلك بالتاأكيد‬
‫حال عمل ًّيا الأي من م�صكالت التح�صني املعقدة التي نواجها يف الواقع والتي اأ�صرنا اإليها يف بداية هذا الدر�ص‪.‬‬ ‫لي�ص ً‬
‫اتخاذ القرار با�ستخدام خوارزمية ا�ستدأللية ج�سعة‬
‫‪Decision Making with a Greedy Heuristic Algorithm‬‬
‫تتعام��ل الدال��ة التالي��ة م��ع ه��ذا القي��د بوا�ص��طة تنفي��ذ خوارزمي��ة حت�ص��ني تعتم��د عل��ى االأ�ص��لوب اال�ص��تداليل اجل�ص��ع‪ ،‬حي��ث تق��وم‬
‫اخلوارزمي��ة تدريجيًابتكوي��ن الفري��ق ع��ن طري��ق اإ�صاف��ة ع�ص��و واح��د يف كل م��رة‪ ،‬فالع�ص��و ال��ذي اأ�صي��ف موؤخرًا يك��ون دائمًا هو‬
‫الع�صو الذي ميتلك معظم املهارات التي مَل توجد يف �صابقه‪ ،‬وت�صتمر العملية حتى ت�صتويف جميع املهارات املطلوبة‪.‬‬
‫الدالة اآل�صتدآللية اجل�صعة (‪ )Greedy Heuristic‬امل�صتخدمة يف هذا املثال هي معيار آلختيار عامل يتوفر فيه اأكرب عدد من املهارات التي‬
‫أ�آل‪.‬‬
‫تُ�صتوفى يف الفريق اإىل اآلآن‪� ،‬ميكن ا�صتخدام دالة ا�صتدآللية اأخرى‪ ،‬مبنية على اإ�صافة العامل الذي يتوفر فيه العدد اآلأكرب من املهارات ا ً‬
‫‪260‬‬
def greedy_solver(problem):

worker_skills = problem['worker_skills']
required_skills = problem['required_skills']

# skills that still have not been covered


uncovered_required_skills = required_skills.copy()
best_team = []
# remembers only the skills of each worker that are required but haven't been covered yet
uncovered_worker_skills = {}

for worker_id in worker_skills:

# remembers only the required uncovered skills that this worker has
uncovered_worker_skills[worker_id] = worker_skills[worker_id].
intersection(uncovered_required_skills)
intersections)( ‫تُظهر الدالة‬
# while there are still required skills to cover ‫مجموعة جديدة تحتوي فقط على‬
while len(uncovered_required_skills) > 0: ‫المهارات الم�صتركة من جميع‬
best_worker_id = None # the best worker to add next
‫مهارات الع ّمال الموجودة في‬
# number of uncovered skills required for the best worker to cover ‫ والمهارات‬،worker_skills
best_new_coverage = 0 ‫ُ�صتوف في‬
َ ‫المطلوبة التي لم ت‬
.uncovered_worker_skills
for worker_id in uncovered_worker_skills:

# uncovered required skills that this worker can cover


my_uncovered_skills = uncovered_worker_skills[worker_id]

# if this worker can cover more uncovered required skills than the best worker so far
if len(my_uncovered_skills) > best_new_coverage:
best_worker_id=worker_id # makes this worker the best worker
best_new_coverage=len(my_uncovered_skills)

if best_worker_id != None: # if a best worker was found


best_team.append(best_worker_id) # adds the worker to the solution

#removes the best worker's skills from the skills to be covered


uncovered_required_skills = uncovered_required_skills -
uncovered_worker_skills[best_worker_id]

for worker_id in uncovered_worker_skills:

# remembers only the required uncovered skills that this worker has
uncovered_worker_skills[worker_id] =
uncovered_worker_skills[worker_id].intersection(uncovered_required_skills)

else: # no best worker has been found and some required skills are still uncovered
return None # no solution could be found

return best_team

261
َّ ‫ ولكنها كما هو‬،‫ال تاأخذ خوارزمية احل ّل اجل�ص��عة كل ال ِفرق املُمكنة بعني االعتبار وال ت�صمن اإيجاد احل ّل االأمثل‬
‫مو�صح‬
‫ هي يف‬،‫�وال جيدة‬
ً �‫ وم��ع ذلك ُميكنه��ا اأن تُنتج حل‬،‫اأدن��اه اأ�ص��رع بكث��ر م��ن خوارزمي��ة احل� ّل الت��ي تعتم��د عل��ى الق��وة املُفرطة‬
.‫حال اإذا كان موجودًا‬ ًّ ‫ ومن املوؤكد اأن جُتد هذه الطريقة‬،‫الغالب حلو ٌل مثلى‬
‫ (خم�ص��ة‬5-workers :‫ي�ص��تخدِ م املقط��ع الربجم��ي الت��ايل خوارزمي��ة احل ّل اجل�ص��عة حل�ص��اب حلول جمموع��ات البيانات‬
‫ (ع�ص��رين‬20-workers‫ و‬،)‫ (خم�ص��ة ع�ص��ر _عام� ً�ال‬15-workers‫ و‬،)‫ (ع�ص��رة _ع ّم��ال‬10-workers‫ و‬،)‫_ع ّم��ال‬
:‫عامال) التي مت ا�صتخدامها �صاب ًقا لتقييم خوارزمية احل ّل بالقوة املُفرطة‬ ً _

greedy_solutions_5 = gets_solutions(problems_with_5_workers,
solver = greedy_solver)

greedy_solutions_10 = gets_solutions(problems_with_10_workers,
solver = greedy_solver)

greedy_solutions_15 = gets_solutions(problems_with_15_workers,
solver = greedy_solver)

greedy_solutions_20 = gets_solutions(problems_with_20_workers,
solver = greedy_solver)

Solved 23 problems in 0.0009970664978027344 seconds


Solved 80 problems in 0.000997304916381836 seconds
Solved 94 problems in 0.001995086669921875 seconds
Solved 99 problems in 0.0019943714141845703 seconds

‫واالآن يت�ص��ح الف��رق يف ال�ص��رعة ب��ني اخلوارزميت��ني؛ حي��ث ُميك��ن تطبي��ق خوارزمي��ة احل� ّل اجل�ص��عة عل��ى النُ�ص��خ املتعلق��ة‬
:‫ كما يف املثال التايل‬،‫بامل�صكالت الكبرة جدً ا‬

# creates 100 problem instances of a team formation problem with 1000 workers
problems_with_1000_workers = []

for i in range(100): # repeats 100 times


problems_with_1000_workers.append(create_problem_instance(10, 1000, 8, 5))

# solves the 100-worker problems using the greedy solver


greedy_solutions_1000 = gets_solutions(problems_with_1000_workers,
solver = greedy_solver)

Solved 100 problems in 0.09574556350708008 seconds

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

‫‪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‬ملقارن��ة فاعلي��ة اخلوارزميت��ني املطبقت��ني عل��ى‪ :‬اخلم�ص��ة ع ّم��ال‪ ،‬والع�ص��رة‬
‫عامال‪.‬‬
‫عامال‪ ،‬والع�صرين ً‬
‫ع ّمال‪ ،‬واخلم�صة ع�صر ً‬

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

‫‪263‬‬
‫مترينات‬
‫‪ 1‬م��ا مزاي��ا �عي��وب ا�ص��تخدام كل م��ن‪ :‬خوارزمي��ة الق��وة املفرط��ة �اخلوارزمي��ة اآل�ص��تدآللية اجل�ص��عة يف ح� ّل م�ص��كالت‬
‫التح�صني؟‬

‫‪ 2‬حلِّل طريقة ا�صتخدام اخلوارزميات اآل�صتدآللية اجل�صعة آلإيجاد احللول امل ُثلى يف م�صكالت التح�صني‪.‬‬

‫‪264‬‬
‫ م��ن خ��الل اإكمال املقطع الربجم��ي التايل بحيث‬،‫ اأن�ص� خوارزمي��ة ح� ّل ج�ص��عة لتح�ص��ني م�ص��كلة تكوي��ن اأع�ص��اء فري��ق‬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

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

265
‫‪ 4‬اذكر ثال م�صكالت حت�صني ُخُمتلفة من العا الواقعي‪� ،‬يف كل م�صكلة‪:‬‬
‫مثاآل على دالة مو�صوعية‪.‬‬‫ا�صرب ً‬ ‫•‬
‫ا�صرب مثالني على القيود اإن �ُجِ دَت‪.‬‬ ‫•‬

‫‪ 5‬اإذا قم��تَ بزي��ادة ع��دد الع ّم��ال يف خوارزمي��ة الق��وة امل ُفرط��ة‪ ،‬كي��ف يوؤث��ر ذل��ك عل��ى امل�ص��كلة من حيث ع��دد احللول �الزمن‬
‫احل�صابي؟‬

‫‪266‬‬
‫الدر�ص الثاين‬
‫م�سكلة جدولة املوارد‬

‫م�سكالت اجلدولة ‪Scheduling Problems‬‬


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

‫األت تلفة بحاجة اإىل حلول اجلدولة‬ ‫جدول  ‪ : .1‬تطبيقات من‬


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

‫يبني جدول م�صروع‬


‫�صكل ‪ :5.3‬خُمطط قانت ّ‬
‫‪267‬‬
‫يف هذا الدر�ص �صتُ�صتخدم م�صكلة التباطُ وؤ املوز�ن لالآلة الواحدة (‪)Single-Machine Weighted Tardiness - SMWT‬‬
‫كمثال عملي لتو�صيح كيف ُميكن خلوارزميات التح�صني اأن حت ّل م�صكالت اجلدولة‪.‬‬
‫م�سكلة التباطُ وؤ املوزون لاللة الواحدة‬
‫‪Single-Machine Weighted Tardiness )SMWT( Problem‬‬
‫لتو�صيح هذه امل�صكلة‪� ،‬صنفرت�ص اأن مَ �صنعًا يرغبُ يف جدولة مهام اإنتاج عدة �صلع على اآلة واحدة‪ ،‬على النحو التايل‪:‬‬
‫• كل مُهِ مَّة لها وقت معاجلة حمدَّد‪ ،‬وموعد حمدَّد البد اأن تكتمل فيه‪.‬‬
‫• كل مُهِ مَّة مرتبطة بوزن ميثل اأهميتها‪.‬‬
‫اإذا كان م��ن امل�ص��تحيل اإجن��از كل امله��ام يف املوع��د النهائ��ي ‪ ،‬ف�ص��يكون ع��دم االلت��زام باإجن��از امله��ام ذات ال��وزن ال�صغر‬
‫يف املوعد النهائي اأقل تكلفة من عدم االلتزام باإجناز املهام ذات الوزن الكبر يف املوعد النهائي‪.‬‬
‫الهدف‬
‫اله��دف (‪ )Goal‬م��ن جدول��ة امله��ام بطريق��ة حم� َّددة ه��و تقلي��ل املجم��وع امل��وزون للتاأخ��ر (التباطُ �وؤ) ل��كل مُهِ َّم��ة‪ ،‬وهكذا‬
‫فاإن جمموع التباطُ وؤ املوزون يكون مبثابة الدالة املو�صوعية خلوارزميات التح�صني امل�ص َّممة حل ّل هذه امل�صكلة‪.‬‬
‫ح�ساب التاأخري‬
‫ح�صب التاأخر (‪ )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‬ح�صاب التباطُ ؤو املوزون‬

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


‫الل��ة الواح��دة؛ الأن تعقُّدَ ها يتزايد‬
‫توج��د �صعوب��ة يف ح� ّل م�ص��كلة التباطُ �وؤ امل��وزون ل آ‬
‫للح�صول على حلول �صبه‬ ‫تزايُدًا اأُ�صِّ يًّا مع عدد املهام‪ ،‬مما يجعل اإيجاد اأف�صل ح ّل ممكن الأحجام املُدخَ الت‬
‫مثالية مل�صكلة دَّدة يف مدة‬ ‫م�صتحيال‪.‬‬
‫ً‬ ‫الكبرة مكلفًا للغاية وعادة ما يكون‬
‫زمنية معقولة‪.‬‬
‫‪268‬‬
‫م�سكلة جدولة األإنتاج ح�سب الطلب ‪Job Shop Scheduling )JSS( Problem‬‬
‫م�ص��كلة جد�ل��ة اآلإنت��اج ح�ص��ب الطل��ب (‪ )JSS‬ه��ي م�ص��كلة اعتيادي��ة اأخ��رى يف اجلدول��ة حَ ِظي��ت بدرا�ص��ات مُو�صَّ ��عة يف‬
‫جم��ال التح�ص��ني‪ ،‬وتت�صم��ن جدول��ة جمموع��ة م��ن امله��ام عل��ى ع��دة اآالت‪ ،‬حي��ث يج��ب معاجل��ة كل ُمهِ َّم��ة برتتي��ب ووق��ت‬
‫معيّنان لكل اآلة بالن�صبة للمهام االأخرى‪.‬‬
‫الهدف‬
‫تقليل زمن االإجناز الكليّ (فرتة الت�صنيع) جلميع املهام‪.‬‬
‫متغريات امل�سكلة‬
‫ِّ‬
‫املتغرات االأخرى من هذه امل�صكلة تفر�ص عدة قيود اإ�صافية مثل‪:‬‬ ‫ِّ‬
‫• وج��وب االلت��زام بتاري��خ اإ�ص��دار كل ُمهِ َّم��ة؛ حي��ث اإن لكل مُهِ مَّة تاريخه��ا اخلا�ص وال ميكن البدء بها قبل ذلك التاريخ‪،‬‬
‫باالإ�صافة اإىل مراعاة املوعد النهائي‪.‬‬
‫• وجوب جدولة بع�ص املهام قبل املهام االأخرى؛ ب�صبب �صوابط االأ�صبقية بينها‪.‬‬
‫• وج��وب اإخ�ص��اع كل اآل��ة لل�صيان��ة الدوري��ة وف ًق��ا ل�صواب��ط ج��دول ال�صيان��ة‪ ،‬حي��ث ال ميك��ن ل�الآالت تاأدي��ة امله��ام اأثن��اء‬
‫ال�صيانة‪ ،‬كما ال ميكن اأن تتوقف املُهِ َّمة مبجرد بدئها‪.‬‬
‫ال ب��د اأن مت��ر كل اآل��ة بف��رتة تو ُّق��ف ع��ن االإنت��اج بع��د اإكم��ال امل ُِه َّم��ة‪ ،‬وق��د يك��ون طول هذه الف��رتة ثابتًا‪ ،‬وقد يتف��اوت من اآلة‬
‫اإىل اأخرى‪ ،‬ومن املمكن اأن يعتمد على الوقت الذي ا�صتغرقته االآلة يف اإكمال املُهِ َّمة ال�صابقة‪.‬‬
‫م��ا ورد اأع��اله لي���ص �ص��وى جمموع��ة فرعي��ة م��ن القي��ود املعق��دة واملتع��ددة‪ ،‬وم��ن متغ� ِّ�رات امل�ص��كلة املوج��ودة يف م�ص��كالت‬
‫متغر خ�صائ�صه وتطبيقاته العملية الفريدة‪ ،‬وقد تكون خوارزميات‬ ‫اجلدولة التي نواجها يف واقع احلياة‪ ،‬حيث اأن لكل ِّ‬
‫متغرات امل�صكلة‪.‬‬
‫متغر من ِّ‬ ‫التح�صني املُختلفة اأكر مالءمة حل ّل كل ِّ‬
‫ا�ستخدام البايثون والتح�س حللّ م�سكلة التباطُ وؤ املوزون لاللة الواحدة‬
‫‪Using Python and Optimization to Solve the SMWT Problem‬‬
‫ُميكن ا�صتخدام املقطع الربجمي التايل الإن�صاء نُ�صَ خ ع�صوائية مل�صكلة التباطُ وؤ املوز�ن لالآلة الواحدة (‪:)SMWT‬‬
‫‪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‬‬

‫‪# generates a random duration, deadline, and weight for each job‬‬
‫])‪durations = [random.randint(*duration_range) for i in range(job_num‬‬
‫])‪deadlines = [random.randint(*deadline_range) for i in range(job_num‬‬
‫])‪weights = [random.randint(*weight_range) for i in range(job_num‬‬

‫‪# returns the problem instance as a dictionary‬‬


‫‪return {'durations':durations,‬‬
‫‪'deadlines':deadlines,‬‬
‫}‪'weights':weights‬‬

‫‪269‬‬
‫تُ�ص��تخدم الدال��ة (‪ random.randint)x,y‬لتولي��د ع��دد �صحي��ح ع�ص��وائي ب��ني ‪ x‬و‪ ،y‬وهناك طريقة ُخُمتلفة ال�ص��تخدام‬
‫ه��ذه الدال��ة تتم ّث��ل يف توف��ر قائم��ة [‪ ]x,y‬اأو جمموع��ة (‪ ،)x,y‬ويف ه��ذه احلال��ة ال ب��د م��ن كتاب��ة الرم��ز * قب��ل القائم��ة‪،‬‬
‫مو�صح يف الدالة ال�صابقة‪ ،‬على �صبيل املثال‪:‬‬ ‫كما هو َّ‬
‫‪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‬‬

‫نطاق الموعد النهائي‪.‬‬


‫‪{'durations': [18, 17, 17, 6, 9, 6, 20, 12, 9, 19],‬‬
‫‪'deadlines': [39, 31, 6, 42, 48, 10, 39, 16, 34, 35],‬‬
‫}]‪'weights': [2, 2, 3, 2, 1, 3, 2, 1, 3, 1‬‬ ‫مدى اأهمية الوزن‪.‬‬

‫ُميك��ن ا�ص��تخدام الدال��ة التالي��ة لتقيي��م ج��ودة اأي جدول اأنتجته اإحدى اخلوارزميات لن�ص��خة م�ص��كلة حم� َّددة‪ ،‬حيث تَقبل‬
‫وجدوال ملهامها‪ ،‬ثم متر على كل املهام برتتيب جدولتها نف�صه حتى َحت�صب اأزمنة اإجنازها وجمموع‬ ‫ً‬ ‫الدالة ن�صخة امل�صكلة‬
‫التباطُ وؤ املوزون لكامل اجلدول‪ ،‬و ُيح�صب هذا التباطُ وؤ بح�صاب تباطوؤ كل مُهِ َّمة (مع مراعاة املوعد النهائي لها) و�صربه‬
‫يف وزن املُهِ َّمة واإ�صافة الناجت اإىل املجموع‪:‬‬
‫‪# computes the total weighted tardiness of a given schedule for a given problem instance‬‬

‫‪def compute_schedule_tardiness(problem, schedule):‬‬

‫‪# gets the information for this problem‬‬


‫‪durations, weights, deadlines=problem['durations'], problem['weights'],‬‬
‫]'‪problem['deadlines‬‬

‫‪job_num = len(schedule) # gets the number of jobs‬‬


‫‪finish_times = [0] * job_num # stores the finish time for each job‬‬
‫‪schedule_tardiness = 0 # initializes the weighted tardiness of the overall schedule to 0‬‬
‫‪for pos in range(job_num): # goes over the jobs in scheduled order‬‬
‫‪270‬‬
‫‪job_id=schedule[pos] # schedule[pos] is the id in the 'pos' position of the schedule‬‬

‫)‪if pos == 0: # if this is the job that was scheduled first (position 0‬‬

‫‪# the finish time of the job that starts first is equal to its run time‬‬
‫]‪finish_times[pos] = durations[job_id‬‬

‫‪else: # for all jobs except the one that was scheduled first‬‬

‫‪# 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‬‬

‫‪# 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] -‬‬
‫)‪deadlines[job_id], 0‬‬

‫‪return schedule_tardiness,finish_times‬‬

‫�صتُ�ص��تخدم الدال��ة ()‪ compute_schedule_tardiness‬لتقيي��م اجل��داول‪ ،‬و�ص��تكون ه��ذه الدال��ة مبثاب��ة اأداة مفي��دة‬
‫لكل اخلوارزميات التي �صيتم تقدميها يف هذا الدر�ص حل ّل م�صكلة التباطُ وؤ املوز�ن لالآلة الواحدة (‪.)SMWT‬‬
‫‪Itertools.Permutations)( Function‬‬ ‫دالة التباديل‬
‫ت�ص ِ‬
‫�تخدم خوارزمي�ة ح� ّل الق�وة املُفرط�ة الدال�ة ()‪ itertools.permutations‬الإن�ص�اء كل اجل�داول املُمكنة (جُتميعات‬
‫املهام)‪ ،‬ثم َحت�صب تباط ؤو كل جدول ممكن وت�صتخرج اأف�صل جدول (اجلدول ذو التباطوؤ الكُليّ االأدنى)‪.‬‬
‫تَقبل الدالة ()‪ itertools.permutations‬عن�صرًا واحدًا متكررًا (مثل‪ :‬قائمة) وتُن�صئ كل تبديل ممكن لقيم املُدخَ الت‪،‬‬
‫ويو�صح املثال الب�صيط التايل ا�صتخدام دالة ()‪ permutations‬ويُظهِ ر التبديالت لكل عناوين املهام املُعطاة‪:‬‬
‫ِّ‬
‫تُ�صتخدم خوارزميات ح ّل القوة امل ُفرطة ب�صكل‬ ‫‪job_ids = [0,1,2] # the ids of 3 jobs‬‬
‫اأف�صل حل ّل امل�صكالت ال�صغرة‪ ،‬فالن�صخة‬ ‫‪for schedule in itertools.permutations(job_ids):‬‬
‫اخلا�صة �صكلة التباط ؤو املوز�ن لالآلة‬ ‫)‪print(schedule‬‬
‫الواحدة ذات عدد ‪ N‬من املهام‪ ،‬لديها عدد !‪N‬‬
‫من اجلدا�ل املمكنة‪ ،‬فعندما يكون ‪،N = 5‬‬ ‫‪(0,‬‬ ‫‪1,‬‬ ‫)‪2‬‬
‫جد�آل‪� ،‬لكن هذا‬
‫ً‬ ‫�صيكون النا ‪5! = 120‬‬ ‫‪(0,‬‬ ‫‪2,‬‬ ‫)‪1‬‬
‫العدد يتزايد ب�صكل كبر عندما يكون ‪N = 10‬‬ ‫‪(1,‬‬ ‫‪0,‬‬ ‫)‪2‬‬
‫اإىل‪� ، 10! = 3,628,800‬عندما يكون ‪N = 11‬‬ ‫‪(1,‬‬ ‫‪2,‬‬ ‫)‪0‬‬
‫‪(2,‬‬ ‫‪0,‬‬ ‫)‪1‬‬
‫اإىل ‪.11! = 39,916,800‬‬ ‫‪(2,‬‬ ‫‪1,‬‬ ‫)‪0‬‬

‫القوة املُفرطة ‪Brute-Force Solver‬‬ ‫خوارزمية حلّ‬


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

def brute_force_solver(problem):

# gets the information for this problem


durations, weights, deadlines=problem['durations'], problem['weights'],
problem['deadlines']

job_num = len(durations) # number of jobs

# Generates all possible schedules


all_schedules = itertools.permutations(range(job_num))

# Initializes the best solution and its total weighted tardiness


best_schedule = None # initialized to None

# '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

for schedule in all_schedules: # for every possible schedule

#evalutes 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 = tardiness
best_schedule = schedule
best_finish_times = finish_times

# returns the results as a dictionary


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

‫ وزمن اإجن��از كل ُم ِه َّمة‬،‫ وزم��ن التباط�وؤ‬،‫خوارزمي��ة احل� ّل تعط��ي اجل��دول االأف�ص��ل‬


،‫ اإذا كان اجل��دول يح��وي ث��الث مهام‬،‫ عل��ى �ص��بيل املث��ال‬.‫مُعط��اة يف ه��ذا اجل��دول‬
‫عدد المهام المراد‬ ‫نطاق الموعد‬ ‫ فذل��ك يعن��ي اأن املُهِ َّمة‬،]10، 14، 20[ ‫وكان��ت اأوق��ات اإجن��از جمي��ع امله��ام ت�ص��اوي‬
.‫اإن�صاوؤها‬ .‫النهائي‬ ‫ واملُهِ َّم��ة الثاني��ة انته��ت بع��د ذل��ك باأرب��ع‬،‫ �ص��اعات‬10 ‫الت��ي ب��داأت ا ًأوال انته��ت بع��د‬
.‫ واملُهِ َّمة االأخرة انتهت بعد �صت �صاعات من اكتمال املُهِ َّمة الثانية‬،‫�صاعات‬

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]}

272
‫األ�ستدأللية اجل�سعة ‪Greedy Heuristic Solver‬‬ ‫خوارزمية احللّ‬
‫ت�صتخدم خوارزمية احل ّل اجل�صعة اأ�صلوبًا ا�صتدالليًا ب�صيطً ا لفرز املهام واتخاذ قرار الرتتيب الذي يجب جدولتها وفقًا‬ ‫ِ‬
‫ل��ه‪ ،‬ث��م تُرت��ب امله��ام حل�ص��اب زم��ن اإكم��ال كل ُم ِه َّم��ة وجمم��وع التباطُ �وؤ امل��وزون لكام��ل اجل��دول‪ ،‬ويف ه��ذا املث��ال اخلا���ص‬
‫تُظهر خوارزمية احل ّل اجل�صعة نوع املُخ َرجات نف�صه الذي اأظهرته خوارزمية ح ّل القوة املُفرطة ‪.‬‬
‫�تخدم (معيار فرز‬ ‫ُعامالن هما‪ :‬ن�ص��خة امل�ص��كلة املراد حلّها‪ ،‬ودالة اال�ص��تدالل التي �صت�ص� ِ‬ ‫تَقبل خوارزمية احل ّل اجل�ص��عة م ِ‬
‫امله��ام)‪ ،‬مم��ا ي�ص��مح للم�ص� ِ‬
‫�تخدم ب�اأن ُيط ِّب��ق اأي دال��ة ا�ص��تدالل يختاره��ا كدال��ة بايث��ون‪ ،‬ث��م مي� ِّرره اإىل خوارزمي��ة احل� ّل‬
‫اجل�صعة باعتباره ُم ِ‬
‫عام ًال‪.‬‬
‫تُطبِّق الدالة التالية خوارزمية حت�صني ت�صتخدم دال ًة ا�صتداللي ًة ج�صع ًة حل ّل امل�صكلة‪:‬‬
‫‪def greedy_solver(problem, heuristic):‬‬

‫‪# gets the information for this problem‬‬


‫‪durations, weights, deadlines = problem['durations'], problem['weights'],‬‬
‫]'‪problem['deadlines‬‬

‫‪job_num = len(durations)# gets the number of jobs‬‬

‫‪# Creates a list of job indices sorted by their deadline in non-decreasing order‬‬
‫))‪schedule = sorted(range(job_num), key = lambda j: heuristic(j, problem‬‬

‫‪# evaluates the schedule‬‬


‫)‪tardiness, finish_times = compute_schedule_tardiness(problem, schedule‬‬

‫‪# returns the results as a dictionary‬‬


‫‪return‬‬ ‫‪{'schedule':schedule,‬‬
‫‪'tardiness':tardiness,‬‬
‫}‪'finish_times':finish_times‬‬

‫يُ�صتخدم بناء الجملة ‪ lambda‬مع‬ ‫يُ�صتخدم يف هذا املثال دالة ا�صتدآللية‬


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

‫تُظهر الدالة التالية املوعد النهائي ملُهِ مَّة حمدَّدة يف ن�صخة م�صكلة مُعطاة‪:‬‬

‫‪# 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‬يعني اأن اخلوارزمية‬
‫�ص�تُجدوِل (تف��رز) امله��ام وف��ق ترتي��ب ت�صاع��دي ح�ص��ب املوعد النهائ��ي‪ ،‬مما يعني اأن املهام التي له��ا اأقرب موعد نهائي‬
‫‪273‬‬ ‫�صتُجَ دوَل ا ًأوال‪.‬‬
‫)‪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):‬‬

‫‪# accesses the deadlines for this problem and returns the deadline for the job‬‬
‫]‪return problem['deadlines'][job] / problem['weights'][job‬‬
‫)‪weighted_greedy_sol=greedy_solver(sample_problem, weighted_deadline_heuristic‬‬
‫‪weighted_greedy_sol‬‬

‫‪{'schedule': [3, 2, 1, 4, 0],‬‬


‫‪'tardiness': 89,‬‬
‫}]‪'finish_times': [15, 24, 35, 41, 57‬‬

‫البحث املحلّي ‪Local Search‬‬


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

‫‪274‬‬
‫البحث املحلّي ‪Local_search_solver)( Function‬‬ ‫دالة خوارزمية حلّ‬
‫تطب��ق الدال��ة التالي��ة ()‪ local_search_solver‬خوارزمي��ة ح� ّل البح��ث املح ّل��ي القائ��م عل��ى املبُادل��ة ملِ �ص��كلة التباطُ �وؤ‬
‫عامالت وهي‪:‬‬ ‫املوز�ن لالآلة الواحدة (‪ ،)SMWT‬حيث تَقبل هذه الدالة اأربعة ُم ِ‬
‫• ن�صخة امل�صكلة‪.‬‬
‫• خوارزمية ا�صتداللية ج�صعة ت�صتخدمها دالة ) (‪ greedy_solver‬حل�صاب ح ّل اأوّيل‪.‬‬
‫• دال��ة ‪ swap_selector‬امل�ص��تخدَ مة النتق��اء مُهِ َّمت��ني �ص��تتبادالن موقعيهم��ا يف اجل��دول‪ .‬عل��ى �ص��بيل املث��ال‪ ،‬اإذا كان‬
‫احل� ّل احل��ايل للم�ص��كلة املُك َّون��ة م��ن اأرب��ع مه��ام ه��و [‪ ،]0، 2، 3، 1‬وق�رَّرت دال��ة ‪ swap_selector‬اأن يح��دث مبادل��ة‬
‫بني املُهِ َّمة االأوىل واملُهِ َّمة االأخرة‪� ،‬صيكون احل ّل املر�صَّ ح هو [‪.]1، 2، 3، 0‬‬
‫• ‪ max_iterations‬ع��دد �صحي��ح ُيح� ِّ�دد ع��دد املب��ادالت التي يجب جُتربتها قب��ل اأن تتو�صل اخلوارزمية للح ّل االأف�صل‬
‫يف حينه‪.‬‬
‫�صلوك خوارزميات التح�صني القائمة‬ ‫جدوال‬
‫يف كل تك��رار‪ ،‬تنتق��ي اخلوارزمي��ة مُهِ َّمت��ني للتبدي��ل بينهم��ا‪ ،‬ث��م تُن�ص��ئ ً‬
‫على البحث املحلي يتاأثر ب�صكل كبر‬ ‫جدي��دً ا تت��م في��ه ه��ذه املبادل��ة‪ ،‬وكل �ص��يء يف اجل��دول اجلدي��د بخ��الف ذلك‬
‫باآل�صراتيجية امل�صتخدَمة بطريقة‬ ‫�ص��يكون ُمطاب ًق��ا للج��دول االأ�صل��ي‪ .‬اإذا كان للج��دول اجلدي��د تباط�وؤ م��وزون‬
‫تكرارية لتعديل احللّ‪.‬‬ ‫اأق��ل م��ن اجل��دول االأف�ص��ل ال��ذي مت اإيج��اده حت��ى االآن‪ ،‬فاإن اجل��دول اجلديد‬
‫�دال من��ه‪ .‬خوارزمي��ة احل� ّل ه��ذه له��ا نف���ص ُخُم َرج��ات‬
‫ُي�صب��ح ه��و االأف�ص��ل ب� ً‬
‫خوارزمية احل ّل اجل�صعة وخوارزمية ح ّل القوة املُفرطة‪.‬‬
‫_‪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(durations) # 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 = greedy_solver(problem, greedy_heuristic) # 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(max_iterations): # for each of the given iterations‬‬

‫‪# chooses which two positions to swap‬‬


‫)‪pos1, pos2 = swap_selector(best_schedule‬‬

‫‪new_schedule = best_schedule.copy() # create a copy of the schedule‬‬

‫‪# swaps jobs at positions pos1 and pos2‬‬


‫‪new_schedule[pos1], new_schedule[pos2] = best_schedule[pos2],‬‬
‫]‪best_schedule[pos1‬‬

‫‪275‬‬
# 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 = new_schedule ‫طريق انتقاء ُم ِهمَّتني داخل‬
best_tardiness = new_tardiness
best_finish_times = new_finish_times
‫احل ّل �مبادلة موقعيهما يف‬
.‫اجلد�ل‬
# 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

pos1 = random.randint(0, job_num - 1) # samples a random position

pos2 = pos1
while pos2 == pos1: # keeps sampling until it finds a position other than pos1
pos2 = random.randint(0, job_num - 1) # samples another random position

return pos1, pos2 # returns the two positions that should be swapped

‫�تخدم الدال��ة التالي��ة ا�ص��رتاتيجية ُخُمتلف��ة وذل��ك باختياره��ا الدائ��م مل ُِه َّمت��ني ع�ص��وائيتني متجاورت��ني يف اجل��دول‬ ِ �‫ت�ص‬
‫ ف�اإن‬،]0، 3، 1، 2[ ‫ اإذا كان اجل��دول احل��ايل لن�ص��خة م�ص��كلة ُمك َّون��ة م��ن اأرب��ع مه��ام ه��و‬،‫ عل��ى �ص��بيل املث��ال‬.‫لتبادلهم��ا‬
.2><1‫ و‬1><3‫ و‬3><0 ‫املبادالت املُر�صحة �صتكون فقط‬

def adjacent_swap(schedule):

job_num = len(schedule) # gets the number of scheduled jobs

pos1 = random.randint(0, job_num - 2) # samples a random position (excluding the last


one)
pos2 = pos1 + 1 # gets the position after the sampled one

return pos1,pos2 # returns the two positions that should be swapped

276
‫ي�ص� ِ‬
‫�تخدم املقطع الربجمي التايل ا�ص��رتاتيجيتي املبادلة مع خوارزمية ح ّل البحث املحلّي حل ّل امل�ص��كلة التي مت اإن�ص��اوؤها‬
‫يف بداية هذا الدر�ص‪:‬‬
‫_‪print(local_search_solver(sample_problem, weighted_deadline_heuristic, random‬‬
‫))‪swap, 1000‬‬

‫‪print(local_search_solver(sample_problem, weighted_deadline_heuristic,‬‬
‫))‪adjacent_swap, 1000‬‬

‫‪{'schedule': [3, 4, 2, 1, 0], 'tardiness': 83, 'finish_times': [15, 21, 30,‬‬


‫}]‪41, 57‬‬
‫‪{'schedule': [3, 4, 2, 1, 0], 'tardiness': 83, 'finish_times': [15, 21, 30,‬‬
‫}]‪41, 57‬‬

‫تُظه��ر النتائ��ج اأف�ص��ل ج��دول [‪ ]3 ،4 ،2 ،1 ،0‬له��ذا املث��ال‪ ،‬واإجم��ايل التباطُ �وؤ ‪ ،83‬واأزمن��ة اإكم��ال امله��ام (�ص��تنتهي‬
‫املُهِ َّمة ‪ 3‬يف الوحدة ‪ 15‬من الزمن‪ ،‬وتنتهي املُهِ َّمة ‪ 4‬يف الوحدة ‪ 21‬منه‪ ،‬وهكذا)‪.‬‬
‫‪Comparing Solvers‬‬ ‫مقارنة خوارزميات احللّ‬
‫ي�صتخدم املقطع الربجمي التايل الدالة ()‪ create_problem_instance‬لتوليد جمموعتي بيانات‪:‬‬ ‫ِ‬
‫• جمموعة بيانات من ‪ 100‬ن�صخة مل�صكلة التباطُ وؤ املوزون لالآلة الواحدة‪ ،‬ويف كل منها ‪ 7‬مهام‪.‬‬
‫• جمموعة بيانات من ‪ 100‬ن�صخة مل�صكلة التباطُ وؤ املوزون لالآلة الواحدة‪ ،‬ويف كل منها ‪ 30‬مُهِ مَّة‪.‬‬
‫املو�صحة يف هذا الدر�ص‪:‬‬ ‫�صيتم ا�صتخدام جمموعة البيانات االأوىل ملقارنة اأداء جميع خوارزميات احل ّل َّ‬
‫‪ .1‬خوارزمية ح ّل القوة املُفرطة ‪.‬‬
‫‪ .2‬خوارزمية احل ّل اجل�صعة املُت�صمنة على ا�صتدالل خا�ص باملوعد النهائي‪.‬‬
‫‪ .3‬خوارزمية احل ّل اجل�صعة املُت�صمنة على ا�صتدالل خا�ص باملوعد النهائي املوزون‪.‬‬
‫‪ .4‬خوارزمية ح ّل البحث املحلّي املُت�صمنة على مبادالت ع�صوائية وخوارزمية احل ّل اجل�صعة ذات ا�صتدالل خا�ص باملوعد‬
‫النهائي الإيجاد احل ّل االأوّيل‪.‬‬
‫‪ .5‬خوارزمية ح ّل البحث املحلّي املُت�صمنة على مبادالت ع�صوائية وخوارزمية احل ّل اجل�صعة ذات ا�صتدالل خا�ص باملوعد‬
‫النهائي املوزون‪.‬‬
‫‪ .6‬خوارزمية ح ّل البحث املحلّي املُت�صمنة على مبادالت متجاورة وخوارزمية احل ّل اجل�صعة ذات ا�صتدالل خا�ص باملوعد‬
‫النهائي‪.‬‬
‫‪.7‬خوارزمية ح ّل البحث املحلّي املُت�صمنة على مبادالت متجاورة وخوارزمية احل ّل اجل�صعة ذات ا�صتدالل خا�ص باملوعد‬
‫النهائي املوزون‪.‬‬
‫�صيتم ا�صتخدام جمموعة البيانات الثانية ملقارنة جميع خوارزميات احل ّل با�صتثناء خوارزمية ح ّل القوة املُفرطة البطيئة‬
‫جدً ا بالن�صبة للم�صكالت امل�صتملة على ‪ 30‬مُهِ َّمة‪.‬‬
‫‪#Dataset 1‬‬
‫][ = ‪problems_7‬‬
‫‪for i in range(100):‬‬
‫))]‪problems_7.append(create_problem_instance(7, [5, 20], [5, 50], [1, 3‬‬

‫‪#Dataset 2‬‬
‫][ = ‪problems_30‬‬
‫‪for i in range(100):‬‬
‫))]‪problems_30.append(create_problem_instance(30, [5,20], [5, 50], [1, 3‬‬

‫‪277‬‬
Compare)( Function ‫دالة املقارنة‬
‫ ثم تُظهر‬،‫ كل خوارزمي��ات احل�لّ؛ حل� ّل كل امل�ص��كالت يف جمموع��ة بيان��ات معيّنة‬Compare)( ‫ت�ص��تخدِ م الدال��ة التالي��ة‬
‫ وتَقبل الدال��ة كذلك املُعامِ ل‬،‫متو�ص��ط التباطُ �وؤ ال��ذي حتقق��ه كل خوارزمي��ة ح� ّل عل��ى كل امل�ص��كالت يف جمموعة البيان��ات‬
:‫ لتحديد اإمكانية ا�صتخدام خوارزمية احل ّل بالقوة املُفرطة اأم ال‬use_brute ‫املنطقي‬

from collections import defaultdict


import numpy

def compare(problems,use_brute):
# comparison on Dataset 1
# maps each solver to a list of all tardiness values it achieves for the problems in the given dataset
results = defaultdict(list)
for problem in problems: # for each problem in this datset

#uses each of the solvers on this problem


if use_brute == True:
results['brute-force'].append(brute_force_solver(problem)
['tardiness'])
results['greedy-deadline'].append(greedy_solver(problem,deadline_
heuristic)['tardiness'])
results['greedy-weighted_deadline'].append(greedy_
solver(problem,weighted_deadline_heuristic)['tardiness'])
results['ls-random-wdeadline'].append(local_search_solver(problem,
weighted_deadline_heuristic, random_swap, 1000)['tardiness'])
results['ls-random-deadline'].append(local_search_solver(problem,
deadline_heuristic, random_swap, 1000)['tardiness'])
results['ls-adjacent-wdeadline'].append(local_search_solver(problem,
weighted_deadline_heuristic, adjacent_swap, 1000)['tardiness'])
results['ls-adjacent-deadline'].append(local_search_solver(problem,
deadline_heuristic, adjacent_swap, 1000)['tardiness'])

for solver in results: # for each solver


# prints the solver's mean tardiness values
print(solver,numpy.mean(results[solver]))

:‫ كلتيهما‬problems_30 ‫ و‬problems_7 ‫ مع جمموعتي البيانات‬compare)( ‫ُميكن االآن ا�صتخدام دالة‬


compare(problems_7,True) brute-force 211.49
greedy-deadline 308.14
greedy-weighted_deadline 255.61
ls-random-wdeadline 212.35
ls-random-deadline 212.43
ls-adjacent-wdeadline 220.62
ls-adjacent-deadline 224.36

compare(problems_30,False) greedy-deadline 10126.18


greedy-weighted_deadline 8527.61
ls-random-wdeadline 6647.73
ls-random-deadline 6650.99
ls-adjacent-wdeadline 6666.47
ls-adjacent-deadline 6664.67

278
‫مترينات‬
‫‪�ِ 1‬صف ا�ص��راتيجيتني ُخُمتلفتني (مبادلة‪ ،‬انعكا���ش‪ ،‬حتويل‪ ،‬اإل ) آلأ�ص��لوب البحث املحلي ِحل ّل م�ص��كلة التباطوؤ املوز�ن‬
‫لالآلة الواحدة‪.‬‬

‫‪ 2‬كم عدد اجلدا�ل امل ُمكنة (احللول) لن�صخة م�صكلة التباطوؤ املوز�ن لالآلة الواحدة �التي ت�صتمل على ت�صع مهام؟‬

‫‪279‬‬
‫ م��ن خ��الل اإكم��ال املقط��ع الربجم��ي‬،‫ اأن�ص� خوارزمي��ة ح� ّل بالق��وة امل ُفرط��ة مل�ص��كلة التباط�وؤ امل��وز�ن لالآل��ة الواح��دة‬3
.‫التايل بحيث ت�صتخدم الدال ُة القو َة امل ُفرطة آلإيجاد تبديل اجلد�لة اآلأمثل‬

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

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


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}

281
‫‪�ِ 5‬صف طريقة عمل البحث املحلّي‪.‬‬

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

‫‪282‬‬
‫الدر�ص الثالث‬
‫م�سكلة حت�س امل�سار‬

‫ة الريا سية يف م�سكالت التح�س‬ ‫ال‬


‫‪Mathematical Programming in Optimization Problems‬‬
‫يف الدر�ص��ني ال�ص��ابقني مت تو�صي��ح كيفي��ة ا�ص��تخدام اخلوارزمي��ات‬
‫ة الريا سية‬ ‫ال‬ ‫اال�ص��تداللية حل� ّل اأن��واع ُخُمتلف��ة من م�ص��كالت التح�ص��ني‪ ،‬وبالرغم من اأن‬
‫(‪:)Mathematical Programming‬‬ ‫حلوال جيدة‪،‬‬‫اال�ص��تدالالت باإمكانها اأن تكون �ص��ريعة جدً ا وتُنتج يف العادة ً‬
‫هي تقنية تُ�ص��تخدم حل ّل م�ص��كالت التح�صني‬ ‫اإال اأنه��ا ال ت�صم��ن دائم��ا اإيج��اد احل� ّل االأمث��ل‪ ،‬وق��د ال تك��ون منا�ص��بة ل��كل‬
‫ع��ن طري��ق �صياغته��ا عل��ى هيئ��ة من��اذج‬ ‫اأن��واع امل�ص��كالت‪ ،‬ويف ه��ذا الدر���ص �ص� ُ�رتكِّز عل��ى اأ�ص��لوب حت�ص��ني ُخُمتل��ف‬
‫ريا�صية‪.‬‬ ‫وهو الربجمة الريا�صية (‪.)Mathematical Programming‬‬
‫ُميك��ن للربجم��ة الريا�صي��ة اأن حت� ّل العدي��د م��ن م�ص��كالت التح�ص��ني مث��ل‪:‬‬
‫تخ�صي���ص امل��وارد‪ ،‬وتخطي��ط االإنت��اج‪ ،‬واخلدم��ات اللوج�ص��تية واجلدول��ة‪ ،‬وتتمي��ز ه��ذه التقني��ة باأنه��ا تُو ّف��ر ح� ًّ�ال مثال ًي��ا م�صمو ًن��ا‬
‫ُوميكنها التعامل مع امل�صكالت املعقدة ذات القيود املتعددة‪.‬‬
‫املتغرات‪ ،‬حيث ُمتثِّل هذه‬ ‫يبداأ ح ّل الربجمة الريا�صية ب�صياغة م�صكلة التح�صني املُعطاة على �صكل منوذج ريا�صي با�صتخدام ِّ‬
‫املتغرات القيم التي يجب حت�صينها‪ ،‬ثم يتم ا�صتخدامها لتحديد الدالة املو�صوعية والقيود‪ ،‬وهما ي�صفان امل�صكلة معًا ُوميكِّنان‬ ‫ِّ‬
‫من ا�صتخدام خوارزميات الربجمة الريا�صية‪.‬‬
‫�تخدم الربجم��ة الريا�صي��ة متغ� ِّ�رات الق��رار (‪ )Decision Variables‬الت��ي ت�ص��اعد ُمت َِّخ��ذ الق��رار يف اإيج��اد احلل املنا�ص��ب‬ ‫ت�ص� ِ‬
‫�تخدم متغ� ِّ�رات احلال��ة (‪ )State Variables‬الت��ي ال يتحك��م فيه��ا‬ ‫ع��ن طري��ق �صبطه��ا والتحك��م فيه��ا‪ ،‬كم��ا ميكنه��ا اأن ت�ص� ِ‬
‫متغرات‬ ‫ُم َّت ِخ��ذ الق��رار وتفر�صه��ا البيئ��ة اخلارجي��ة‪ ،‬وبالت��ايل ال ميك��ن �صب��ط متغ� ِّ�رات احلالة‪ .‬تُو ِّف��ر القوائم التالية اأمثل��ة على ِّ‬
‫ومتغرات احلالة لبع�ص م�صكالت التح�صني ال�صائعة‪:‬‬ ‫القرار ِّ‬

‫ومتغريات احلالة‬‫ِّ‬ ‫جدول  ‪ : .2‬اأمثلة على ِّ‬


‫متغريات القرار‬
‫متغرات احلالة‬‫ِّ‬ ‫متغرات القرار‬
‫ِّ‬
‫الكمي��ة الت��ي يج��ب اإنتاجه��ا م��ن كل تَو ّف��ر امل��واد اخل��ام‪ ،‬و�ص��عة اآالت االإنت��اج‪ ،‬وتَو ّف��ر‬
‫العمالة املطلوبة لالإنتاج‪.‬‬ ‫تخطيط اآلإنتاج مُنتَج‪.‬‬
‫ع��دد ال�ص��لع الت��ي يج��ب نقله��ا م��ن امل�ص��افة ب��ني االأماك��ن الت��ي يج��ب زيارته��ا و�ص��عة‬
‫نقل املوارد‬
‫املركبات‪.‬‬ ‫مكان الآخر‪.‬‬
‫ترتي��ب كل ُمهِ َّم��ة وامل��دة الزمني��ة تَو ّف��ر الع ّم��ال واالآالت‪ ،‬واملواعي��د النهائي��ة‪ ،‬ووزن‬
‫جد�لة املهام‬
‫اأهمية كل ُمهِ َّمة‪.‬‬ ‫الالزمة الإجرائها‪.‬‬
‫تكلي��ف الع ّم��ال وجدولته��م للقي��ام مه ��ارات كل عا م ��ل وتف�صيال ت ��ه‪ ،‬وجاهز ّيت ��ه‪،‬‬ ‫توزيع املو فني‬
‫مبهام ُخُمتلفة يف اأوقات ُخُمتلفة‪ .‬وامله��ارات املطلوب��ة من��ه الإجناز كل ُمهِ َّمة‪.‬‬ ‫ح�صب املهام‬
‫‪283‬‬
‫تت�م �صياغ�ة الدال�ة املو�صوعي�ة كتعب�ر ريا�ص�ي (‪ )Mathematical Expression‬لتح�ص�ينها (بزيادته�ا اأو تقليله�ا) بن�ا ًء عل�ى‬
‫املتغرات املنا�صبة‪ُ ،‬ومتثِّل هذه الدالة الهدف من م�صكلة التح�صني مثل‪ :‬زيادة الربح اأو تقليل التكاليف‪ُ ،‬وحت َّدد يف العادة بنا ًء على‬ ‫ِّ‬
‫املتغرات واملتباينات الريا�صية‪.‬‬‫ِّ‬ ‫با�صتخدام‬ ‫القيود‬ ‫�صياغة‬ ‫كن‬ ‫مي‬
‫ُ‬ ‫وباملثل‬ ‫احلالة‪،‬‬ ‫ات‬‫متغر‬
‫ِّ‬ ‫على‬ ‫ء‬‫ً‬ ‫بنا‬ ‫ًا‬
‫ن‬ ‫أحيا‬ ‫ا‬ ‫د‬‫د‬‫َّ‬ ‫حت‬
‫ُ‬ ‫كما‬ ‫القرار‪،‬‬ ‫ات‬‫متغر‬‫ِّ‬
‫توج��د ع��دة أان��واع م��ن الربجم��ة الريا�صي��ة‪ ،‬مث��ل‪ :‬الربجم��ة اخلطي��ة (‪ ،)Linear Programming - LP‬والربجم��ة الرباعي��ة‬
‫(‪ )Quadratic Programming - QP‬وبرجم��ة اآلأع��داد ال�صحيح��ة املختلط��ة (‪.)Mixed Integer Programming - MIP‬‬
‫متغرات القرار باالأعداد‬ ‫يركِّز هذا الدر���ص على برجمة االأعداد ال�صحيحة املختلطة املُ�ص��تخدَ مة يف امل�ص��كالت التي تتقيّد فيها ِّ‬
‫ال�صحيحة مثل‪ :‬م�صكالت اجلدولة اأو اختيار الطريق‪.‬‬
‫م�سكلة حقيبة ال هر ‪The Knapsack Problem‬‬
‫م�ص��كلة حقيب��ة الظه��ر ‪ 1/0‬ه��ي مث��ال ب�ص��يط عل��ى ا�ص��تخدام برجم��ة االأع��داد ال�صحيح��ة املختلط��ة ل�صياغ��ة الدال��ة املو�صوعية‬
‫والقي��ود‪ ،‬و ُتع� َّرف امل�ص��كلة عل��ى النح��و الت��ايل‪ :‬لدي��ك حقيب��ة ظهر ب�ص��عة ق�صوى تبلغ ‪ C‬وح��دة‪ ،‬وجمموعة م��ن العنا�صر ‪ ،I‬بحيث‬
‫يك��ون ل��كل عن�ص��ر ‪ i‬متغ� ِّ�ران م��ن متغ� ِّ�رات احلال��ة هم��ا وزن العن�ص��ر ‪ wi‬وقيمت��ه ‪ ،vi‬واملطل��وب ه��و تعبئ��ة احلقيب��ة مبجموع��ة‬
‫متغر الق��رار ‪ xi‬لتتبع جُتميعات العنا�صر التي �ص�تُع َّباأ يف‬
‫العنا�ص��ر ذات اأق�ص��ى قيم��ة ممكن��ة يف ح��دود �ص��عة احلقيب��ة‪ُ .‬ي�ص��تخدم ِّ‬
‫حقيب��ة الظه��ر‪ ،‬حي��ث تك��ون ‪ xi = 1‬اإذا مت اختي��ار العن�ص��ر ‪ i‬لالإ�صاف��ة للحقيب��ة‪ ،‬بينم��ا تك��ون ‪ xi = 0‬خ��الف ذل��ك‪ ،‬ويتم ّث��ل‬
‫الهدف يف انتقاء جمموعة فرعية من العنا�صر من ‪ I‬بحيث ت�صمل‪:‬‬
‫• القيد (‪ :)Constraint‬جمموع اأوزان العنا�صر املنتقاة بها ال يزيد عن ال�صعة الق�صوى ‪.C‬‬
‫• الدالة املو�صوعية (‪ :)Objective Function‬جمموع قيم العنا�صر املنتقاة بها هي اأق�صى قيمة ُممكنة‪.‬‬

‫‪v0=20‬‬
‫‪w0=5‬‬ ‫‪w3=8‬‬ ‫‪v3=15‬‬

‫‪v1=10‬‬
‫‪w1=10‬‬ ‫‪v4=7‬‬
‫‪w4=11‬‬

‫‪v2=23‬‬
‫‪7‬‬
‫‪w2=19‬‬ ‫=‪w5=2 v5‬‬
‫�صكل ‪ :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‬‬
‫‪C = 40 # knapsack capacity‬‬

‫‪I = range(len(values)) # creates an index for each item: 0,1,2,3,...‬‬

‫‪solver = Model("knapsack") # creates a knapsack solver‬‬


‫‪solver.verbose = 0 # setting this to 1 will print more information on the progress of the solver‬‬

‫‪x = [] # represents the binary decision variables for each item.‬‬

‫‪# for each items creates and appends a binary decision variable‬‬
‫‪for i in I:‬‬
‫))‪x.append(solver.add_var(var_type = BINARY‬‬

‫‪# creates the objective function‬‬


‫))‪solver.objective = maximize(xsum(values[i] * x[i] for i in I‬‬

‫‪# adds the capacity constraint to the solver‬‬


‫‪solver += xsum(weights[i] * x[i] for i in I) <= C‬‬

‫‪# solves the problem‬‬


‫)(‪solver.optimize‬‬

‫>‪<OptimizationStatus.OPTIMAL: 0‬‬

‫متغرات القرار الثنائية للعنا�صر‪ ،‬وتُوفِّر املكتبة ‪ mip‬يف البايثون ما يلي‪:‬‬ ‫يُن�صئ املقطع الربجمي القائمة ‪ x‬لتخزين ِّ‬
‫املتغرات الثنائية واإ�صافتها اإىل خوارزمية احللّ‪.‬‬ ‫• اأداة (‪ add_var)var_type=BINARY‬الإن�صاء ِّ‬
‫• اأداة ()‪ maximize‬مل�ص��كالت التح�ص��ني الت��ي حتت��اج لزي��ادة دال��ة مو�صوعي��ة‪ ،‬اأم��ا م�ص��كالت التح�ص��ني الت��ي تتطل��ب‬
‫ت�صغر الدالة املو�صوعية‪ ،‬فت�صتخدم االأداة ()‪.minimize‬‬
‫• اأداة ()‪ xsum‬الإن�ص��اء التعب��رات الريا�صي��ة الت��ي تت�صم��ن املجامي��ع(‪ ،)sums‬ويف املث��ال ال�ص��ابق مت ا�ص��تخدام ه��ذه‬
‫ال�صعة وحلّه‪.‬‬
‫االأداة حل�صاب جمموع الوزن االإجمايل للعنا�صر يف اإن�صاء قيد ّ‬
‫يح�ص��ن الدال��ة املو�صوعي��ة يف ظ��ل االلت��زام بالقيود‪ ،‬وتَ�ص��تخدم االأداة برجم َة االأعداد‬
‫• اأداة ()‪ optimize‬الإيج��اد ح� ّل ِّ‬
‫ملتغرات القرار والإيجاد التوليفة التي ُحت ِّ�صن الهدف‪.‬‬ ‫ال�صحيحة املختلطة للنظر بكفاءة يف توليفات القيم املُختلفة ِّ‬
‫• املُعامِ ل = الإ�صافة قيود اإ�صافية اإىل خوارزمية احل ّل املوجودة‪.‬‬
‫متغر‬
‫يف املقط��ع الربجم��ي اأدن��اه حتت��وي القائم��ة ‪ x‬عل��ى متغ� ِّ�ر ثنائ��ي واح��د ل��كل عن�صر‪ ،‬وبعد ح�ص��اب احل ّل �ص��يكون كل ِّ‬
‫م�ص��اويًا للواح��د اإذا اأُدرج العن�ص��ر يف احل� ّل‪ ،‬و�ص ُي�ص��اوي �صف� ًرا بخ��الف ذل��ك‪ .‬تَ�ص��تخدم املكتب��ة ‪ِ mip‬بن��اء اجلمل��ة‬
‫‪ x]i[.x‬الإظه��ار القيم��ة الثنائي��ة للعن�ص��ر ذي الفهر���ص ‪َ ،i‬وحت�ص��ب خوارزمي��ة احل � ّل متغ� ِّ�ر الق��رار ‪ ،x‬ث��م جُت��د القيم��ة‬
‫متغر القرار ‪َ ،x‬وجُتمع االأوزان والقيم لكل عن�صر‬ ‫االإجمالية والوزن االإجمايل للعنا�صر املنتقاة عن طريق التكرار على ِّ‬
‫مو�صح يف املقطع الربجمي التايل‪:‬‬ ‫منتقى ‪ ،i‬ا�صتنادًا اإىل [‪ ،x]i‬وتَعر�صها كما هو َّ‬
‫‪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‬‬

‫‪285‬‬
‫‪for i in I: # for each item‬‬
‫‪if x[i].x == 1: # if the item was selected‬‬
‫)'‪print('item', i, 'was selected‬‬
‫‪# updates the total weight and value of the solution‬‬
‫]‪total_weight += weights[i‬‬
‫]‪total_value += values[i‬‬

‫)‪print('total weight', total_weight‬‬


‫)‪print('total value', total_value‬‬

‫‪item 0 was selected‬‬


‫‪item 2 was selected‬‬
‫‪item 3 was selected‬‬
‫‪item 5 was selected‬‬
‫‪total weight 34‬‬
‫‪total value 65‬‬

‫م�سكلة البائع املُتجوّل‬


‫‪Traveling Salesman Problem‬‬
‫م�صكلة البائع امل ُتجوّل (‪ )Traveling Salesman Problem - TSP‬من امل�صكالت‬
‫اآلأمثلة الواردة يف خُمطط م�صكلة البائع‬ ‫االأخرى التي ُميكن حلّها بربجمة االأعداد ال�صحيحة املختلطة‪ ،‬وهي م�ص�كلة ماألوفة‬
‫ات�صاآل تاما فهناك‬
‫امل ُتجوّل مت�صلة ً‬ ‫مدن معيّنة مرة واحدة‪،‬‬‫تُعنى بتحديد اأق�صر م�صار ميكن اأن ي�صلكه بائع متجوِّل لزيارة ٍ‬
‫حافة ت�صل كل ز�ج من العُقد باآلآخر‪.‬‬
‫دون اأن يك� ّرر زي�ارة اأيٍّ منه�ا‪ ،‬ث ّ�م يع�و َد للمدين�ة االأ�صلي�ة‪ ،‬وي�ص ِّور ال�ص�كل ‪ 5.7‬ن�ص�خ ًة‬
‫من هذه امل�صكلة‪.‬‬
‫‪1‬‬ ‫ُمتثِّل كل دائرة (عقدة) مدينة اأو موقعًا يجب زيارته‪ ،‬وهناك حافة تربط بني موقعني‬
‫اإذا كان من املمكن ال�صفر بينهما‪ُ ،‬وميثِّل الرقم املوجود على احلافة التكلفة (امل�صافة)‬
‫‪20‬‬
‫بني املوقعني‪ .‬يف هذا املثال‪ ،‬مت ترقيم املواقع وفقًا لرتتيبها يف احل ّل االأمثل للم�صكلة‪،‬‬
‫‪10‬‬
‫‪4‬‬
‫‪15‬‬
‫وتكونالتكلفةاالإجماليةللطريق ‪ 1і 3і 4і 2і 1‬ت�صاوي‪،10 25 30 15=80‬‬
‫‪25‬‬ ‫‪30‬‬
‫وهو اأق�صر طريق ممكن لزيارة كل مدينة مرة واحدة فقط والعودة اإىل نقطة البداية‪.‬‬
‫توجد تطبيقات عملية مل�صكلة البائع املُتجوّل يف اخلدمات اللوج�صتية‪ ،‬والنقل‪ ،‬واإدارة‬
‫‪2‬‬ ‫‪3‬‬
‫‪35‬‬
‫ا إالم�دادات واالت�ص�االت‪ ،‬فه�ي تنتم�ي اإىل عائل�ة اأو�ص�ع م�ن م�ص�كالت حتديد الطريق‬
‫�صكل ‪ :5.7‬ن�صخة على م�صكلة البائع املُتجوّل‬ ‫أي�صا م�صكالت �صهرة اأخرى مو�صحة فيما يلي‪:‬‬ ‫التي ت�صمل ا ً‬
‫• تت�صم��ن م�ص��كلة حتدي��د م�ص��ار املركب��ات (‪ )Vehicle Routing Problem‬اإيج��اد الطُ ��رق املُثل��ى الأ�ص��طول م��ن املركب��ات‬
‫لتو�صي��ل ال�ص��لع اأو اخلدم��ات ملجموع��ة م��ن العم��الء يف ظ��ل تقلي��ل امل�ص��افة االإجمالي��ة املقطوع��ة اإىل احل��د االأدن��ى‪ ،‬وت�ص��مل‬
‫تطبيقاتها اخلدمات اللوج�صتية وخدمات التو�صيل وجمع النفايات‪.‬‬
‫• تت�صم��ن م�ص��كلة اآل�ص��تالم �الت�ص��ليم (‪ )Pickup and Delivery Problem‬اإيج��اد الطُ ��رق املُثل��ى للمركب��ات لك��ي ت�ص��تلم‬
‫ُو�صل) الب�صائع اأو االأ�ص��خا�ص اإىل مواقع ُخُمتلفة‪ ،‬وت�ص��مل تطبيقاتها خدمات �ص��يارات االأجرة‪،‬‬ ‫(حتمِّل اأو ُتر ِْكب) وت�ص�لِّم (ت ِ‬ ‫ُ‬
‫واخلدمات الطبية الطارئة‪ ،‬وخدمات النقل اجلماعي‪.‬‬
‫• تت�صم��ن م�ص��كلة جد�ل��ة مواعي��د القط��ارات (‪ )Train Timetabling Problem‬اإيج��اد ج��داول زمني��ة مثالي��ة للقط��ارات‬
‫يف �ص��بكة �ص��كك احلديد يف ظل تقليل ن�ص��بة التاأخر اإىل احلد االأدنى و�صمان اال�ص��تخدام الف ّعال للموارد‪ ،‬وت�ص��مل تطبيقاتها‬
‫النقل بال�صكك احلديدية واجلدولة‪.‬‬
‫‪286‬‬
‫ وتَقب��ل الدال��ة ع��دد املواق��ع امل��راد‬،‫ُميك��ن ا�ص��تخدام املقط��ع الربجم��ي الت��ايل الإن�ص��اء ن�ص��خة م��ن م�ص��كلة البائ��ع املُتج�وّل‬
:‫ ثم تُظهر‬،‫ ونطاق امل�صافة ُميثِّل الفرق بني امل�صافة االأق�صر وامل�صافة االأطول بني موقعني‬،‫زيارتها‬
.‫• م�صفوفة امل�صافة التي ت�صمل امل�صافة املُ�صندة بني كل زوج ممكن من املواقع‬
.)‫• جمموعة عناوين املواقع العددية (عنوان لكل موقع‬
.)‫ (االنطالق والتوقف‬startstop ‫ و ُي�صار اإليه با�صم موقع‬،‫• املوقع الذي يكون مبثابة بداية الطريق ونهايته‬
import random
import numpy
from itertools import combinations

def create_problem_instance(num_locations, distance_range):


# initializes the distance matrix to be full of zeros
dist_matrix = numpy.zeros((num_locations, num_locations))
# creates location ids: 0,1,2,3,4,...
location_ids = set(range(num_locations))
# creates all possible location pairs
location_pairs = combinations(location_ids, 2)
for i,j in location_pairs: # for each pair
distance = random.randint(*distance_range) # samples a distance within range
# the distance from i to j is the same as the distance from j to i
dist_matrix[j,i] = distance
dist_matrix[i,j] = distance

# returns the distance matrix, location ids and the startstop vertix
return dist_matrix, location_ids, random.randint(0, num_locations - 1)

8 ‫ بحي��ث يت�صم��ن‬،‫ي�ص��تخدِ م املقط��ع الربجم��ي الت��ايل الدال��ة ال��واردة �ص��ابقًا الإن�ص��اء ن�ص��خة م��ن م�ص��كلة البائ��ع املُتج�وّل‬
:20‫ و‬5 ‫ وم�صافات ثنائية ترتاوح بني‬،‫مواقع‬
dist_matrix, location_ids, startstop = create_problem_instance(8, (5, 20))
print(dist_matrix)
print(startstop)

[[ 0. 19. 17. 15. 18. 17. 7. 15.]


[19. 0. 15. 18. 11. 6. 20. 5.]
[17. 15. 0. 17. 15. 7. 5. 11.]
[15. 18. 17. 0. 19. 7. 7. 16.]
[18. 11. 15. 19. 0. 17. 20. 17.]
[17. 6. 7. 7. 17. 0. 15. 14.]
[ 7. 20. 5. 7. 20. 15. 0. 14.] ‫الحظ اأن الخط القُطري يُمثَّل الم�صافات‬
[15. 5. 11. 16. 17. 14. 14. 0.]] ،)dist_ matrix]i،i[( ‫من العُقد اإلى نف�صها‬
3
.‫وبالتالي فاإن الم�صافات ت�صاوي اأ�صفارًا‬

287
‫اإن�ساء خوارزمية حلّ القوة املُفرطة مل�سكلة البائع املُتجوّل‬
Creating a Brute-Force Solver for the Traveling Salesman Problem
‫ وتَقبل هذه الدالة‬،‫ت�صتخدِ م الدالة التالية خوارزمية ح ّل القوة املُفرطة لتعداد جميع الطُ رق املُمكنة (التباديل) واإظهار اأق�صر م�صار‬
‫ الحظ اأن احلل املمكن لن�صخة‬.create_problem_instance)( ‫م�صفوفة امل�صافة وموقع االنطالق والتوقف الذي ُتظهره الدالة‬
.‫ (االنطالق والتوقف) ثم ينتهي اإليها‬startstop ‫ يبداأ من مدينة‬،‫) هي تبديل مدن‬TSP(‫م�صكلة البائع امل ُتجوّل‬

from itertools import permutations

def brute_force_solver(dist_matrix, location_ids, startstop):


# excludes the starstop location
location_ids = location_ids - {startstop}
# generate all possible routes (location permutations)
all_routes = permutations(location_ids)
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 = startstop # current location

for next_loc in route:


distance += dist_matrix[curr_loc,next_loc] # adds the distance of this step
curr_loc = next_loc # goes to the next location
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
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

ِ
startstop ‫ الحظ اأن موقع‬.‫ الإن�صاء كل الطُ رق املُمكنة‬permutations)( ‫ت�صتخدم خوارزمية ح ّل القوة املُفرطة اأداة‬
،‫ فعلى �ص��بيل املثال‬،‫(االنط��الق والتوق��ف) ُي�ص��تبعد م��ن التبادي��ل؛ الأن��ه يج��ب اأن يظه��ر دائ ًم��ا يف بداية ك ّل طري��ق ونهايته‬
‫ �ص��تكون‬،)‫ (االنط��الق والتوق��ف‬startstop ‫ ه��و موق��ع‬0 ‫ وكان املوق��ع‬،3‫ و‬،2‫ و‬،1‫ و‬،0 ‫اإذا كان��ت لدي��ك اأربع��ة مواق��ع‬
:‫قائمة التباديل املُمكنة كما يلي‬
for route in permutations({1,2,3}):
print(route)

(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)

288
‫َحت�ص��ب خوارزمي��ة ح� ّل الق��وة املُفرط��ة امل�ص��افة االإجمالي��ة ل��كل طري��ق‪ ،‬وتُظه��ر يف النهاي��ة الطري��ق ذا امل�ص��افة االأق�ص��ر‪.‬‬
‫ُيط ِّبق املقطع الربجمي التايل خوارزمية احل ّل على ن�صخة م�صكلة البائع املُتجوّل التي مت اإن�صاوؤها �صابقًا‪:‬‬
‫)‪brute_force_solver(dist_matrix, location_ids, startstop‬‬

‫)‪([3, 5, 2, 7, 1, 4, 0, 6, 3], 73.0‬‬

‫عل��ى غ��رار خوارزمي��ات ح� ّل الق��وة املُفرط��ة الت��ي مت تو�صيحه��ا يف الدرو���ص ال�ص��ابقة‪ ،‬ال تُط َّب��ق ه��ذه اخلوارزمي��ة اإال عل��ى‬
‫نُ�ص��خ م�ص��كلة البائ��ع املُتج�وّل ال�صغ��رة؛ الأن ع��دد الطُ ��رق املُمكن��ة يتزاي��د اأ�صعا ًف��ا م�صاعف��ة كلم��ا زاد العدد ‪ ، N‬وي�ص��اوي‬
‫!(‪ ، )N−1‬وعلى �صبيل املثال‪ ،‬عندما يكون ‪ ،N = 15‬فاإن عدد الطُ رق املُمكنة ي�صاوي ‪.14! = 87,178,291,200‬‬
‫ا�ستخدام بر ة األأعداد ال�سحيحة املختلطة حللّ م�سكلة البائع املُتجوّل‬
‫‪Using MIP to Solve the Traveling Salesman Problem‬‬
‫ال�ص��تخدام برجم��ة اآلأع��داد ال�صحيح��ة املختلط��ة (‪ )MIP‬حل� ّل م�ص��كلة البائ��ع امل ُتج�وّل (‪ ،)TSP‬يج��ب اإن�ص��اء �صيغ��ة‬
‫كال من الدالة املو�صوعية وقيود م�صكلة البائع املُتجوّل‪.‬‬ ‫ريا�صية تُغطي ً‬
‫تتطل��ب ال�صيغ��ة متغ� ِّ�ر ق��رار ثنائ��ي ‪ xij‬ل��كل انتق��ال حمتم��ل ‪ i→j‬م��ن موق��ع ‪ i‬اإىل موق��ع اآخ��ر ‪ ،j‬واذا كان��ت امل�ص��كلة‬
‫به��ا ع��دد ‪ N‬م��ن املواق��ع‪ ،‬ف�اإن ع��دد االنتق��االت املُمكن��ة ي�ص��اوي (‪ .N×)N−1‬اإذا كان��ت ‪ xij‬ت�ص��اوي ‪ ،1‬ف�اإن احل� ّل يت�صم��ن‬
‫االنتقال من املوقع ‪ i‬اإىل املوقع ‪ ،j‬وخالف ذلك اإذا كانت ‪ xij‬ت�صاوي ‪ ،0‬فلن يُدرج هذا االنتقال يف احللّ‪.‬‬
‫ُميك��ن الو�ص��ول ب�ص��هولة اإىل العنا�ص��ر يف م�صفوف��ة ‪ numpy‬ثنائي��ة االأبع��اد ع��رب ال�صيغ��ة الربجمي��ة [‪ ]i,j‬فعل��ى �ص��بيل‬
‫املثال‪:‬‬
‫‪arr = numpy.full((4,4), 0) # creates a 4x4 array full of zeros‬‬ ‫‪[[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫)‪print(arr‬‬ ‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]]‪0‬‬
‫‪arr[0, 0] = 1‬‬
‫‪arr[3, 3] = 1‬‬ ‫‪[[1‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫)(‪print‬‬ ‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]‪0‬‬
‫)‪print(arr‬‬ ‫‪[0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫]]‪1‬‬

‫ي�ص� ِ‬
‫�تخدم املقط��ع الربجم��ي االأداة ()‪ product‬م��ن املكتب��ة ‪ itertools‬حل�ص��اب جمي��ع انتق��االت املواق��ع املحتمل��ة‪ ،‬فعل��ى‬
‫�صبيل املثال‪:‬‬
‫}‪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‬‬
‫‪2‬‬ ‫‪0‬‬
‫‪2‬‬ ‫‪1‬‬
‫‪2‬‬ ‫‪2‬‬

‫‪289‬‬
،‫ الإن�ص��اء خوارزمي��ة ح� ّل برجم��ة ا أالع��داد ال�صحيح��ة املختلط��ة‬mip ‫ي�ص��تخدِ م املقط��ع الربجم��ي الت��ايل مكتب��ة البايث��ون‬
:‫متغر قرار ثُنائي لكل انتقال ممكن يف ن�صخة م�صكلة البائع املُتجوّل التي مت اإن�صاوؤها �صابقًا‬ ِّ ‫ثم ي�صيف‬
from itertools import product # used to generate all possible transition
from mip import BINARY
from mip import Model,INTEGER

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
transitions = list(product(location_ids, location_ids))

N = len(location_ids) # number of locations

# creates a square numpy array full of 'None' values


x = numpy.full((N, N), None)

# 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)

‫ لتخزي�ن املتغ ِّ�رات‬NxN ‫ بحج�م‬numpy ‫ الإن�ص�اء م�صفوف�ة‬numpy.full)( ‫ي�ص�تخدِ م املقط�ع الربجم�ي ال�ص�ابق اأداة‬
.x ‫الثنائية‬
‫ ُميك�ن ا�ص�تخدام املقط�ع الربجم�ي الت�ايل ل�صياغ�ة وح�ص�اب الدال�ة املو�صوعي�ة مل�ص�كلة‬،x ‫بع�د اإ�صاف�ة متغ ِّ�رات الق�رار‬
‫متغر‬
ِّ ‫ مع‬dist_matrix]i,j[ ‫ وتُ�صرب م�صافتها‬j і i ‫ حيث تقوم الدالة بالتكرار على كل انتقال ممكن‬،‫البائع املُتجوّل‬
‫ وبخ�الف ذل�ك‬،‫ بع�ني االعتب�ار‬dist_matrix]i,j[ ‫ و‬x]i,j[=1 ‫ واإذا مت اإدراج االنتق�ال يف احل� ّل �ص�يوؤخذ‬،x]i,j[ ‫قراره�ا‬
:‫ يف �صفر ليتم جُتاهُ لُها‬dist_matrix]i,j[ ‫�صتُ�صرب‬
# the minimize tool is used then the objective function has to be minimized
from mip import xsum, minimize

# objective function: minimizes the distance


solver.objective = minimize(xsum(dist_matrix[i,j]*x[i][j] for i,j in
transitions))

،‫ته��دف اخلط��وة التالي��ة اإىل التاأك��د ب�اأن اخلوارزمي��ة تُظه��ر احلل��ول الت��ي ت�صم��ن زي��ارة كل املواق��ع مل�رَّة واح��دة فق��ط‬
‫ وزي ��ارة كل موق ��ع م ��رة‬،‫ (االنط ��الق والتوقف)ح�ص ��ب م ��ا تتطلب ��ه م�ص ��كلة البائ ��ع املُتج �وّل‬startstop ‫با�ص ��تثناء موق ��ع‬
:‫واحدة تعني اأن الطريق ال�صحيح ُميكن اأن‬
.‫• ي�صل اإىل كل موقع مرة واحدة فقط‬
.‫• يغادر من كل موقع مرة واحدة فقط‬
:‫ُوميكن اإ�صافة قيود الو�صول واملغادرة هذه ب�صهولة كما يلي‬
# for each location id
for i in location_ids:
solver += xsum(x[i,j] for j in location_ids - {i}) == 1 # exactly 1 arrival
solver += xsum(x[j,i] for j in location_ids - {i}) == 1 # exactly 1 departure
290
‫ت�ص��مل ال�صيغة الكاملة مل�ص��كلة البائع املُتجوّل نوعً ا اإ�صافيًا اآخرًا من القيود ل�صمان ح�ص��اب الطُ رق املت�صلة‪ ،‬ففي ن�ص��خة‬
‫م�صكلة البائع املُتجوّل الواردة يف ال�صكل ‪ُ 5.8‬يفرت�ص اأن املوقع ‪ 0‬هو موقع االنطالق والتوقف‪.‬‬
‫يف ه�ذا املث�ال‪ ،‬اأق�ص�ر طري�ق ممك�ن ه�و ‪،2 і 1 і 4 і 3 і 0‬‬
‫‪2‬‬ ‫مب�ص�افة �ص�فر اإجمالي�ة قدره�ا ‪ ،24‬ولك�ن عند عدم وج�ود قيد ات�صال‬
‫‪5‬‬
‫�ص�يكون هن�اك ح� ّل �صحي�ح اآخ�ر ي�ص�مل طريق�ني غ�ر مت�صل�ني هم�ا‪:‬‬
‫‪ 0 і 4 і 3 і 0‬و ‪ ،1 і 2 і 1‬وهذا احل ّل املتمثل يف وجود طريقني‬
‫‪5‬‬ ‫‪6‬‬
‫‪1‬‬ ‫ميتث�ل لقي�ود الو�ص�ول واملغ�ادرة الت�ي مت تعريفه�ا يف املقط�ع الربجم�ي‬
‫‪4‬‬ ‫ال�ص�ابق؛ الأن كل موق�ع يدخ�ل ل�ه ويخ�رج من�ه م�رة واح�دة فق�ط‪ ،‬ولكن‬
‫‪7‬‬ ‫‪5‬‬ ‫هذا احل ّل غر مقبول مل�صكلة البائع املُتجوّل‪.‬‬
‫‪0‬‬ ‫‪3‬‬ ‫‪3‬‬ ‫ُميك�ن فر��ص ح� ّل ي�ص�مل طريقً�ا واح�دً ا مت�ص ً�ال باإ�صافة متغ ِّ�ر القرار‬
‫‪ yi‬ل�كل موق�ع ‪ ،i‬و�ص�تحافظ ه�ذه املتغ ِّ�رات عل�ى ترتيب زي�ارة كل موقع‬
‫�صكل ‪ :5.8‬ن�صخة م�صكلة البائع املُتجوّل‬ ‫يف احللّ‪.‬‬

‫‪# adds a decision variable for each location‬‬


‫]‪y = [solver.add_var(var_type = INTEGER) for i in location_ids‬‬

‫عل��ى �ص��بيل املث��ال‪ ،‬اإذا كان احل� ّل ه��و‪ ،0 і 2 і 1 і 4 і 3 і 0 :‬ف�ص��تكون قي��م ‪ y‬كم��ا يل��ي‪y3=0، y4=1، y1=2، :‬‬
‫‪ ،y2=3‬واملوقع ‪ 0‬هو موقع االنطالق والتوقف‪ ،‬ولذلك ال توؤخذ قيمة ‪ y‬اخلا�صة به بعني االعتبار‪.‬‬
‫ُميك��ن ا�ص��تخدام متغ� ِّ�رات الق��رار اجلدي��دة ه��ذه ل�صم��ان االت�ص��ال م��ن خ��الل اإ�صاف��ة قي��د جدي��د ل��كل انتق��ال ‪ j і i‬ال‬
‫ي�صمل موقع ‪( startstop‬االنطالق والتوقف)‪.‬‬

‫‪# adds a connectivity constraint for every transition that does not include the startstop‬‬
‫‪for (i, j) in product(location_ids - {startstop}, location_ids - {startstop}):‬‬
‫‪# ignores transitions from a location to itself‬‬
‫‪if i != j:‬‬
‫‪solver += y[j] - y[i] >= (N+1) * x[i, j] - N‬‬

‫اإذا كان��ت ‪ xij=1‬النتق��ال ‪ j і i‬ومت اإدراج ه��ذا االنتق��ال يف احل � ّل‪ ،‬ف �اإن املتباين��ة ال��واردة يف االأعل��ى ت�صب��ح‬
‫‪ ،y]j[ <= y]i[ 1‬ومعن��ى ذل��ك اأن املواق��ع الت��ي �ص�تُزا ُر الح ًق��ا ال ب��د اأن تك��ون قيم��ة ‪ y‬اخلا�ص��ة به��ا اأعل��ى‪ ،‬باالإ�صاف��ة اإىل‬
‫قيود الو�صول واملغادرة‪ ،‬و�صيكون الطريق الذي ال ي�صمل موقع االنطالق والتوقف �صحيحً ا فقط اإذا‪:‬‬
‫• بداأ وانتهى باملوقع نف�صه؛ ل�صمان اأن يكون لكل موقع و�صو ٌل واح ٌد ومغادرة واحدة فقط‪.‬‬
‫• خُ �ص�ص��ت قي��م ‪ y‬اأعل��ى ل��كل املواق��ع الت��ي �ص�تُزا ُر الح ًق��ا؛ الأن [‪ y]j‬يج��ب اأن تك��ون اأك��رب م��ن [‪ y]i‬ل��كل االنتق��االت الت��ي‬
‫أي�ص��ا اإىل جُتن��ب اإ�صاف��ة احلاف��ة نف�ص��ها م��ن اجُت��اه ُخُمتل��ف‪ ،‬عل��ى �ص��بيل املث��ال‪:‬‬‫مت اإدراجه��ا يف الطري��ق‪ ،‬وي�وؤدي ه��ذا ا ً‬
‫‪ jіi‬و‪iіj‬‬
‫ولك��ن اإذا كان املوق��ع ميث��ل بداي��ة الطري��ق ونهايت��ه‪ ،‬ف��ال ب� ّد اأن تك��ون قيم��ة ‪ y‬اخلا�ص��ة ب��ه ه��ي اأك��رب واأ�صغ��ر م��ن قي��م كل‬
‫املواقع الباقية يف الطريق‪ ،‬ونظرًا ال�ص��تحالة هذا االأمر‪ ،‬ف�ص� ُتوؤدي اإ�صافة قيد االت�صال اإىل ا�ص��تبعاد اأية حلول بها طُ رق‬
‫ال ت�صمل موقع االنطالق والتوقف‪.‬‬

‫‪291‬‬
‫ ال��وارد يف احل� ّل املُك�وَّن م��ن طريق��ني لن�ص��خة م�ص��كلة البائ��ع املُتج�وّل‬1 і 2 і 1 ‫ ف ِّك��ر يف الطري��ق‬،‫عل��ى �ص��بيل املث��ال‬
،‫ وه��ذا م�ص��تحيل‬،y1 ш y2 1 ‫ واأن تك��ون‬y2 ш y1 1 ‫ حي��ث يتطل��ب قي��د االت�ص��ال اأن تك��ون‬،‫املو�صح��ة يف ال�ص��كل ال�ص��ابق‬
.ّ‫فلذلك �صيتم ا�صتبعاد احلل‬
،y1 ш y4 1 ‫ واأن تك��ون‬y4 ш y3 1 ‫ اأن تك��ون‬0 і 2 і 1 і 4і 3 і 0 ‫ يتطل��ب احل � ّل ال�صحي��ح‬،‫يف املقاب��ل‬
‫ وال تنطب��ق‬،y2=3 ‫ و‬y1=2 ‫ و‬y4=1 ‫ و‬y3=0 :‫ كم��ا ي أات��ي‬y ‫ ُوميك��ن حتقي��ق ذل��ك ب�صب��ط قي��م‬،y2 ш y1 1 ‫واأن تك��ون‬
.)‫ (االنطالق والتوقف‬startstop ‫قيود االت�صال على االنتقاالت التي ت�صمل موقع‬
:‫َجُتمع الدالة التالية كل االأ�صياء معًا الإن�صاء خوارزمية ح ّل برجمة االأعداد ال�صحيحة املختلطة مل�صكلة البائع املُتجوّل‬
from itertools import product
from mip import BINARY,INTEGER
from mip import Model
from mip import xsum, minimize

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
# creates every transition from every location to every other location
transitions = list(product(location_ids,location_ids))
N = len(location_ids) # number of locations
# create 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:
x[i, j]=solver.add_var(var_type = BINARY)
# objective function: minimizes the distance
solver.objective = minimize(xsum(dist_matrix[i,j]*x[i][j] for i,j in transitions))
# Arrive/Depart Constraints
for i in location_ids:
solver += xsum(x[i,j] for j in location_ids - {i}) == 1 # exactly 1 arrival
solver += xsum(x[j,i] for j in location_ids - {i}) == 1 # exactly 1 departure
# adds a binary decision variable for each location
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}):
if i != j: # ignores transitions from a location to itself
solver += y[j] - y[i] >=(N+1)*x[i,j] - N
solver.optimize() #solves the problem
# prints the solution
if solver.num_solutions: # if a solution was found
best_route = [startstop] # stores the best route
curr_loc = startstop # the currently visited location
while True:
for next_loc in location_ids:# for every possible next location
if x[curr_loc,next_loc].x == 1: # if x value for the curr_loc->next_loc transition is 1
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
‫يولِّد املقطع الربجمي التايل ‪ 100‬ن�ص��خة من م�ص��كلة البائع املُتجوّل ت�ص��مل ‪ 8‬مواقع وترتاوح امل�ص��افات فيها بني ‪ 5‬و‪،20‬‬
‫كم��ا اأن��ه ي�ص� ِ‬
‫�تخدم خوارزمي��ة ح� ّل الق��وة املُفرط��ة‪ ،‬وخوارزمي��ة ح� ّل برجم��ة االأع��داد ال�صحيح��ة املختلط��ة حل� ّل كل حالة‪،‬‬
‫و ُيظهِ ر الن�صبة املئوية لالأ�صلوبني اللذين اأظهرا طريقني لهما امل�صافة نف�صها‪:‬‬
‫‪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):‬‬
‫)]‪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‬طري ًق��ا ُخُمتل ًف��ا‪ ،‬ومث��ل ه��ذا الع��دد الكب��ر من الطُ رق يفوق بكثر قدرات اأ�ص��لوب القوة‬
‫املُفرط��ة‪ ،‬وم��ع ذل��ك فاإن��ه ع��ن طري��ق البح��ث الف ّع��ال يف ه��ذه امل�ص��احة الهائل��ة اخلا�ص��ة بجميع احلل��ول املُمكنة ُميك��ن خلوارزمية‬
‫ح ّل برجمة االأعداد ال�صحيحة املختلطة اأن جُتد الطريق االأمثل ب�صرعة‪.‬‬
‫أي�ص��ا‪ ،‬فهي تتطلب فه ًم��ا قويًا للنمذج��ة الريا�صية وقد‬ ‫وعل��ى الرغ��م م��ن مزاي��ا الربجم��ة الريا�صي��ة اإال اأنه��ا متل��ك قي��ودًا خا�صة ا ً‬
‫ال تك��ون منا�ص��بة للم�ص��كالت املعق��دة الت��ي ي�صع��ب فيه��ا التعبر عن الدالة املو�صوعية والقيود بوا�ص��طة ال�صي��غ الريا�صية‪ ،‬وعلى‬
‫الرغم من اأن الربجمة الريا�صية اأ�صرع بكثر من اأ�صلوب القوة املُفرطة اإال اأنها قد تظل بطيئة جدً ا بالن�صبة ملجموعات البيانات‬
‫بديال اأكر �صرعة‪.‬‬‫املو�صح يف الدر�صني ال�صابقني ً‬ ‫يقدم االأ�صلوب اال�صتداليل َّ‬ ‫الكبرة‪ ،‬ويف مثل هذه احلاالت ِّ‬

‫‪293‬‬
‫مترينات‬
‫‪ 1‬ا�صرح طريقة ا�صتخدام الربجمة الريا�صية حل ّل م�صكالت التح�صني املعقدة‪.‬‬

‫‪ 2‬ما مزايا �عيوب اأ�صلوب برجمة اآلأعداد ال�صحيحة املختلطة يف ح ّل م�صكالت التح�صني؟‬

‫‪294‬‬
‫متغرات احلالة‬
‫‪ 3‬قم بتحليل م�ص��كلتني من م�ص��كالت التح�ص��ني ُميكن حلهما با�ص��تخدام الربجمة الريا�صية‪ ،‬ثم حدِّد ِّ‬
‫�متغرات القرار اخلا�صة بهما‪.‬‬
‫ِّ‬

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

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

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

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
‫ من خالل اإكمال املقطع الربجمي‬،‫ اأن�ص خوارزمية ح ّل برجمة اآلأعداد ال�صحيحة املختلطة مل�صكلة البائع امل ُتجوّل‬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
# 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:

x[i, j] = solver. (var_type= )

# objective function: minimizes the distance

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


i, j in transitions))

# Arrive/Depart Constraints
for i in location_ids:

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

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]

# 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

297
‫الم�سروع‬

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

‫‪1‬‬
‫�ص��تقوم باإن�ص��اء اأمثل��ة متع��ددة على م�ص��كلة البائع املُتجوّل ت�ص��مل مواق��ع عددها من ‪3‬‬
‫اإىل ‪ ،12‬و�صترتاوح امل�صافة يف كل مثال من ‪ 5‬وحدات اإىل ‪ 20‬وحدة‪.‬‬

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

‫‪3‬‬
‫اأن�ص��ئ دال��ة ر�ص��م نق��اط با�ص��تخدام مكتب��ة ‪ matplotlib‬تر�ص��م نق��اط اأداء كل م��ن‬
‫خوارزمي��ة ح� ّل الق��وة املُفرط��ة وخوارزمي��ة ح� ّل برجم��ة االأع��داد ال�صحيح��ة املختلطة‬
‫باملقارنة بينهما‪.‬‬

‫‪4‬‬
‫اكت��ب تقري�رًا موج��زً ا تناق���ص في��ه النتائ��ج الت��ي تو�صل��ت اإليه��ا بخ�صو���ص كف��اءة اأداء‬
‫خوارزميتي احللّ‪ ،‬ومزايا وعيوب كل منهما‪.‬‬

‫‪298‬‬
‫ماذا تع ّلمت‬

‫ حتديد اأ�ساليب التح�س املالئمة حللّ امل�سكالت املعقدة‪.‬‬


‫ ح ��لّ م�س ��كالت تخ�سي� ��ص امل ��وارد ع ��ن طري ��ق تطبي ��ق مقط ��ع بر ��ي بلغ ��ة‬
‫البايثون‪.‬‬
‫ حلّ م�سكالت اجلدولة عن طريق تطبيق مقطع بر ي بلغة البايثون‪.‬‬
‫ حلّ م�سكلة حقيبة ال هر با�ستخدام خوارزميات التح�س املختلفة‪.‬‬
‫ حلّ م�سكلة البائع املُتجوّل با�ستخدام خوارزميات التح�س املختلفة‪.‬‬

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

‫‪Brute-Force‬‬ ‫خوارزمية ح ّل القوة‬ ‫‪Mat ematical‬‬


‫الربجمة الريا�صية‬
‫‪Solver‬‬ ‫امل ُفرطة‬ ‫‪Programming‬‬

‫‪Constraint‬‬
‫‪Mixed Integer‬‬ ‫برجمة اآلأعداد ال�صحيحة‬
‫‪Programming‬‬
‫الربجمة القيدية‬ ‫‪Programming‬‬ ‫املختلطة‬
‫‪ptimi ation‬‬
‫‪Greed euristic‬‬ ‫خوارزمية ا�صتدآللية‬ ‫‪Problem‬‬
‫م�صكلة التح�صني‬
‫‪Algorithm‬‬ ‫ج�صعة‬ ‫‪uadratic‬‬
‫الربجمة الرباعية‬
‫‪Greedy Solver‬‬ ‫خوارزمية ح ّل ج�صعة‬ ‫‪Programing‬‬
‫‪Scheduling‬‬
‫‪Problem Team‬‬
‫جد�لة م�صكلة تكوين‬
‫‪Integer‬‬
‫برجمة اآلأعداد ال�صحيحة‬ ‫‪Formation‬‬ ‫فريق‬
‫‪Programming‬‬
‫‪Traveling‬‬
‫‪Knapsack‬‬ ‫خوارزمية ح ّل م�صكلة‬ ‫‪Salesman‬‬ ‫م�صكلة البائع امل ُتجوّل‬
‫‪Problem Solver‬‬ ‫حقيبة الظهر‬ ‫‪Problem‬‬

‫‪299‬‬
‫‪ .6‬ال��ذكاء األ�سطناعي واملجتمع‬
‫�سيتعرّ ف الطالب يف هذه الوحدة على اأخالقيات الذكاء األ�سطناعي وتاأ ريها على تطوير‬
‫اأن مته املتقدمة وحتديد توجهاتها‪ ،‬و�سيُقيِّم مدى تاأ ري اأن مة الذكاء األ�سطناعي وا�سعة‬
‫النطا على املجتمعات والبي ة‪ ،‬وكيفية تن يم مثل هذه األأن مة لال�س�تخدام األأخالقي‬
‫ُ�س�رية على‬
‫ة طائرة م َّ‬ ‫املُ�س�تدام‪ ،‬و�سي�س�تخدِ م بعد ذل ُحماكي ويبوت��ص (‪ )Webots‬ل‬
‫احلركة الذاتية وا�ستك�ساف منطقة ما من خالل حتليل ال�سور‪.‬‬

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

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

‫‪300‬‬
‫الدر�ص األأول‬
‫مقدمة يف اأخالقيات الذكاء األ�سطناعي‬
‫ن رة عامة على اأخالقيات الذكاء األ�سطناعي‬
‫اأخالقيات الذكاء األ�سطناعي‬ ‫‪Overview of AI Ethics‬‬
‫(‪:)AI Ethics‬‬ ‫مع ا�ص�تمرار تق ُّدم الذكاء اال�صطناعي تزايدت اأهمية التفكر يف االآثار االأخالقية املرتتبة‬
‫ت�ص��ر اأخالقيات ال��ذكاء اال�صطناعي‬ ‫عل�ى ا�ص�تخدام ه�ذه التقني�ة‪ ،‬وم�ن امله�م اأن يفه�م املواط�ن يف عَ املَ ن�ا احلدي�ث ال�دور اله�ام‬
‫اإىل املب��اد ‪ ،‬والقي��م‪ ،‬واملعا ي��ر‬ ‫الأخالقيات الذكاء اال�صطناعي اإذا اأردنا تطوير اأنظمة ذكاء ا�صطناعي م�صوؤولة وا�صتخدامها‪.‬‬
‫االأخالقي��ة الت��ي تُنظّ ��م تطوي��ر اأنظم��ة‬ ‫اإن أاح�د االأ�ص�باب الرئي�ص�ة للتاأكي�د عل�ى اأهمي�ة اأخالقي�ات ال�ذكاء اال�صطناع�ي ه�و التاأثر‬
‫ا ل��ذكاء اال�صطنا ع��ي وانت�ص��ارها‬ ‫الكبر الأنظمة الذكاء اال�صطناعي على حياة االن�ص�ان‪ .‬على �ص�بيل املثال‪ُ ،‬ميكن ا�ص�تخدام‬
‫وا�صتخدامها‪.‬‬ ‫خوارزمي�ات ال�ذكاء اال�صطناعي التخ�اذ قرارات التوظيف والعالج الطبي‪ ،‬واإذا كانت هذه‬
‫اخلوارزميات ُمتح ِّيزة اأو متييزية‪ ،‬فقد ُتوؤدي اإىل نتائج غر عادلة ُت�صر باالأفراد واملجتمعات‪.‬‬
‫ال الذكاء األ�سطناعي‬ ‫اأمثلة من العا الواقعي على املخاوف األأخالقية يف‬
‫‪Real-World Examples of Ethical Concerns in AI‬‬
‫اخلوارزميات التمييزية‬
‫هناك مواقف تدل على اأن اأنظمة الذكاء اال�صطناعي متيل اإىل التح ُّيز والتمييز �صد فئات معيّنة من الب�ص�ر‪ .‬على �ص�بيل املثال‪،‬‬
‫وج�دت درا�ص�ة اأجراه�ا املعه�د الوطن�ي للمعاي�ر �التقني�ة (‪ )National Institute of Standards and Technology‬اأن‬
‫ِن�صب اخلطاأ يف تقنية التع ُّرف على الوجه تكون اأعلى عند التع ُّرف على وجوه االأ�صخا�ص ذوي الب�صرة الداكنة؛ مما قد ُيوؤدي اإىل‬
‫حتدي�د هوي�ات خاطئ�ة واعتق�االت خاطئ�ة‪ .‬وم�ن االأمثل�ة االأخ�رى عل�ى ذلك ا�ص�تخدام خوارزميات ال�ذكاء اال�صطناع�ي يف نظام‬
‫العدالة اجلنائية‪ ،‬اإذ اأظهرت الدرا�صات اأن هذه اخلوارزميات ُميكن اأن تكون ُمتح ِّيزة �صد االأقليات مما ُيوؤدي اإىل عقوبات اأق�صى‪.‬‬
‫اخل�سو�سية‬
‫ُ‬ ‫انتها‬
‫للخ�صو�صية ال�ص��خ�صية‪ .‬على‬ ‫ُميكن اأن تكون اأنظمة الذكاء اال�صطناعي التي جُتمع البيانات ُوحتلِّلها م�صدر تهديد ُ‬
‫�تخدمي في�ص��بوك‬ ‫�ص��بيل املث��ال‪ :‬جمع��ت �ص��ركة ا�صت�ص��ارات �صيا�ص��ية يف ع��ام ‪ 2018‬م بيان��ات املالي��ني م��ن م�ص� ِ‬
‫(‪ )Facebook‬دون موافقته��م وا�ص��تخدمتها للتاأث��ر عل��ى احلم��الت ال�صيا�ص��ية‪ ،‬و أاث��ار ه��ذا احل��ادث املخ��ا ِوف ب�ص�اأن‬
‫ا�صتخدام الذكاء اال�صطناعي وحتليالت البيانات يف التالعب بالراأي العام‪ ،‬وانتهاك حقوق خ�صو�صية االأفراد‪.‬‬
‫األأ�سلحة ذاتية التحكم‬
‫تطوي��ر االأ�ص��لحة ذاتي��ة التحك��م الت��ي ُميك��ن اأن تعم��ل دون تدخ��ل ب�ص��ري ل��ه خُم��اوف اأخالقية ب�ص�اأن ا�ص��تخدام الذكاء‬
‫اال�صطناع��ي يف احل��روب‪ ،‬حي��ث ي��رى فري��ق م��ن املنتقدي��ن اأن ه��ذه االأ�ص��لحة ُميك��ن اأن تتخ��ذ ق��رارات م�صري��ة دون‬
‫اإ�ص��راف ب�ص��ري ُوميكن برجمتها ال�ص��تهداف جمموعات معيّنة من النا���ص‪ ،‬مما قد ينتهك القانون االإن�ص��اين الدويل‪،‬‬
‫و ُيوؤدي اإىل وقوع اإ�صابات يف �صفوف املدنيني‪.‬‬
‫الت�سريح من الوظائف‬
‫اأثاراال�ص��تخدام املتزاي��د لل��ذكاء اال�صطناع��ي واآلأ ت��ة (‪ )Automation‬يف خُمتل��ف ال�صناع��ات املخ��ا ِوف ب�ص�اأن‬
‫ت�ص��ريح الب�ص��ر م��ن وظائفه��م وتاأث��ره عل��ى ُ�ص��بل عي���ص العامل��ني‪ ،‬فعل��ى الرغ��م م��ن اأن ال��ذكاء اال�صطناع��ي ُميكن��ه اأن‬
‫أي�صا اإىل فقدان الب�صر لوظائفهم وتزايد عدم امل�صاواة‬ ‫ُيوؤدي اإىل حت�صني الكفاءة واالإنتاجية‪ ،‬اإال اأنه ُميكن اأن ُيوؤدي ا ً‬
‫يف الدخل؛ مما قد يكون له عواقب اجتماعية واقت�صادية �صلبية‪.‬‬
‫‪301‬‬
‫التح ُّيز واألإن�ساف يف الذكاء األ�سطناعي ‪Bias and Fairness in AI‬‬
‫ُميكن اأن يظهر التحيُّز (‪ )Bias‬يف اأنظمة الذكاء اال�صطناعي عندما تكون البيانات‬
‫حتيُّز الذكاء األ�سطناعي (‪:)AI Bias‬‬ ‫�تخدمة لتدري�ب اخلوارزم ّي�ة ناق�ص�ة التمثي�ل اأو حتت�وي على حت ُّيزات اأ�صا�ص�ية‪،‬‬ ‫امل�ص َ‬
‫يف جم��ال ال��ذكاء اال�صطناع��ي‪ ،‬ي��دل التح ُّيز‬ ‫ُوميكن اأن يظهر يف اأية بيانات ُمتثِّلها ُخُم َرجات النظام‪ ،‬فعلى �صبيل املثال ال احل�صر‪:‬‬
‫عل��ى مي��ل خوارزميات التعلُّم االآيل اإىل اإنتاج‬ ‫املُنتَجات واالآراء واملجتمعات واالجُتاهات كلها ميكن اأن يظهر فيها التح ُّيز‪.‬‬
‫نتائ��ج حتاب��ي بدائ��ل‪ ،‬اأو فئ��ات مع ّين��ة‪ ،‬اأو‬ ‫�تخدم ال�ذكاء اال�صطناع�ي لفح��ص املر�ص�حني‬ ‫ُيع� ُّد نظ�ام التوظي�ف االآيل ال�ذي ي�ص ِ‬
‫تظلمه��ا باأ�ص��لوب منهج��ي؛ مم��ا ي �وؤدي اإىل‬ ‫للوظائف من اأبرز االأمثلة على اخلوارزم ّية املُتح ِّيزة‪ .‬افرت�ص اأن اخلوارزم ّية مُدرَّبة‬
‫القي��ام بتنب �وؤات خاطئ��ة واإىل احتمالي��ة‬ ‫ُف�ص�ل جمموع�ات‬ ‫عل�ى بيان�ات ُمتح ِّي�زة‪ ،‬مث�ل أامن�اط التوظي�ف التاريخي�ة الت�ي ت ِّ‬
‫التميي��ز �ص��د مُنتَجات معيّنة اأو فئات ب�ص��رية‬ ‫دميوغرافية معيّنة‪ ،‬ففي هذه احلالة قد يعمل الذكاء اال�صطناعي على ا�صتمرار تلك‬
‫حم َّددة‪.‬‬ ‫متجاهال‬
‫ً‬ ‫التح ُّيزات وي�صتبعد املر�صّ حني املو ّؤهلني ب�صكل غر عادل من بني املجموعات‬
‫الفئات غر املمثَّلة جيدًا يف جمموعة البيانات‪ .‬على �صبيل املثال‪ ،‬افرت�ص اأن اخلوارزم ّية تُف�صل املر�صحني الذين التحقوا بجامعات النخبة‪،‬‬
‫اأو عملوا يف �صركات مرموقة‪ ،‬ففي هذه احلالة قد يلحق ذلك ال�صرر باملر�صحني الذين مَل يحظوا بتلك ال ُفر�ص‪ ،‬اأو الذين ينتمون اإىل بيئات‬
‫أاق�ل حظًّ �ا‪ُ ،‬وميك�ن اأن ُي�وؤدي ذل�ك اإىل نق��ص التن�وع يف م�كان العم�ل واإىل ا�ص�تمرارية ع�دم امل�ص�اواة‪ ،‬ولذل�ك م�ن امله�م تطوي�ر وا�ص�تخدام‬
‫خوارزميات توظيف للذكاء اال�صطناعي تَ�صت ِند على معاير عادلة و�صفافة‪ ،‬وغر مُتح ِّيزة‪.‬‬
‫ي�صر اآلإن�صاف (‪ )Fairness‬يف الذكاء اال�صطناعي اإىل كيفية تقدمي اأنظمة الذكاء اال�صطناعي لنتائج غر ُمتح ِّيزة وعلى معاملتها جلميع‬
‫ُن�صفة‪ ،‬ولتحقيق االإن�صاف يف الذكاء اال�صطناعي يتطلب ذلك حتديد التح ُّيزات يف البيانات واخلوارزميات‬ ‫عاملة م ِ‬
‫االأفراد واملجموعات ُم َ‬
‫وعملي�ات اتخ�اذ الق�رار ومعاجلته�ا‪ .‬عل�ى �ص�بيل املثال‪ ،‬تتمثّ�ل اإحدى طرائق حتقيق االإن�ص�اف يف الذكاء اال�صطناعي يف ا�ص�تخدام عملية‬
‫تُ�صمى اإلغاء اآلنحياز (‪ ،)Debiasing‬حيث يتم حتديد البيانات املُتحيِّزة واإزالتها اأو تعديلها مبا ي�صمن و�صول اخلوارزم ّية اإىل نتائج اأكر‬
‫دقة دون حت ُّيز‪.‬‬

‫جدول  ‪ : .1‬العوامل التي ُحتدِّ د حت ُّيز اأن مة الذكاء األ�سطناعي‬


‫تتع ّل��م خوارزمي��ات ال��ذكاء اال�صطناع��ي م��ن البيانات التي ُتد َّرب عليها؛ ف�اإذا كانت البيانات‬
‫ُمتح ِّي��زة اأو ناق�ص��ة التمثي��ل‪ ،‬فق��د ت�ص��ل اخلوارزم ّي��ة اإىل نتائ��ج ُمتح ِّي��زة‪ .‬عل��ى �ص��بيل املثال ‪،‬‬
‫بيانات التدريب‬
‫اإذا مت تدري��ب خوارزم ّي��ة التع� ُّرف عل��ى ال�ص��ور عل��ى جمموع��ة بيانات حتت��وي يف الغالب على‬
‫اأف��راد ذوي ب�ص��رة فاحت��ة‪ ،‬فرمب��ا تُواج��ه �صعوب��ة يف التع� ُّرف بدق��ة عل��ى االأفراد ذوي الب�ص��رة‬ ‫املُتح ِّيزة‬
‫الداكنة‪.‬‬
‫اإذا مَل يك��ن فري��ق التطوي��ر متنوعً ��ا وال ُمي ِّث��ل نطاقًا وا�ص�عًا من الفئ��ات الثقافية والتقنية‪ ،‬فقد‬
‫ال يتع�رَّف عل��ى التح ُّي��زات املوج��ودة يف البيان��ات اأو اخلوارزم ّي��ة‪ ،‬وي�وؤدي الفري��ق ال��ذي يتكون‬ ‫االفتق��ار اإىل التن �وُّع‬
‫من اأفراد من منطقة جغرافية اأو ثقافة معيّنة اإىل عدم مراعاة املناطق اأو الثقافات االأخرى‬ ‫يف فِرق التطوير‬
‫التي قد تكون ُممثَّلة يف البيانات املُ�صتخدَ مة لتدريب منوذج الذكاء اال�صطناعي‪.‬‬
‫ُميكن اأن ُيوؤدي االفتقار اإىل الرقابة وامل�صوؤولية يف تطوير اأنظمة الذكاء اال�صطناعي ون�صرها‬
‫اإىل ظهور التح ُّيز‪ ،‬فاإذا مَل تُطبِّق ال�ص��ركات واحلكومات اآليات رقابة و ُم�ص��اءلة منا�ص��بة‪ ،‬فاإنّ‬ ‫االفتق��ار اإىل الرقاب��ة‬
‫ذل��ك ق��د ي�وؤدي اإىل ع��دم تنفي��ذ اختب��ار التح ُّيز يف اأنظم��ة الذكاء اال�صطناع��ي ورمبا ال يكون‬ ‫وامل�صوؤولية‬
‫هناك جمال الإن�صاف االأفراد اأو املجتمعات املت�صررة من النتائج املُتح ِّيزة‪.‬‬
‫ق��د ال ُحت� ِّ�دد ِف��رق التطوي��ر الت��ي تفتق��ر اإىل اخل��ربة موؤ�ص��رات التح ُّي��ز يف بيان��ات التدري��ب اأو‬ ‫االفتق��ار اإىل اخل��ربة‬
‫املعرف��ة يف ت�صمي��م من��اذج ال��ذكاء اال�صطناع��ي واختبا ِره��ا‬ ‫تُعاجله��ا‪ ،‬كم��ا اأن االفتق��ار اإىل ِ‬ ‫واملعرف��ة ل��دى فري��ق‬
‫التحيزات القائمة‪.‬‬ ‫لتحقيق العدالة رمبا ُيوؤدي اإىل ا�صتمرارية ُّ‬ ‫التطوير‬
‫‪302‬‬
‫احلدّ من التحيُّز وتعزيز األإن�ساف يف اأن مة الذكاء األ�سطناعي‬
‫‪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‬‬ ‫روؤى عن التح ُّيز املحتمل اأف�صل مما ُميكن اأن تقدمه خوارزميات الذكاء اال�صطناعي‪.‬‬
‫والت�صوي�ص عليها‪.‬‬ ‫�تخدمون تغذية راجعة عن روؤيتهم الأداء نظام‬ ‫يقدم املُ�ص� ِ‬ ‫على �ص��بيل املثال‪ُ ،‬ميكن اأن ِّ‬
‫الذكاء اال�صطناعي اأو تقدمي اقرتاحات مفيدة لتح�صني النظام وجعله اأقل حت ُّيزً ا‪.‬‬
‫‪303‬‬
‫م�سكلة امل�سوؤولية األأخالقية يف الذكاء األ�سطناعي‬
‫‪The Problem of Moral Responsibility in AI‬‬
‫ُتع ُّد م�ص�كلة امل�ص�وؤولية االأخالقية عند ا�ص�تخدام اأنظمة الذكاء اال�صطناعي املتقدمة ق�صية مُعقَّدة‬
‫ومتعددة اجلوانب‪ ،‬وقد حظيت باهتمام كبر يف ال�صنوات االأخرة‪.‬‬
‫تتمثّ�ل إاح�دى التحدي�ات الرئي�ص�ة الأنظم�ة ال�ذكاء اال�صطناع�ي املتقدم�ة يف قدرته�ا عل�ى اتخ�اذ‬
‫الق�رارات والقي�ام باإج�راءات ُميك�ن اأن يك�ون له�ا عواق�ب اإيجابي�ة اأو �ص�لبية كب�رة عل�ى االأف�راد‬
‫واملجتم�ع‪ ،‬ورغ�م ذل�ك‪ ،‬ال يك�ون الط�رف ال�ذي يج�ب حتميله امل�ص�وؤولية االأخالقية عن ه�ذه النتائج‬
‫حم ّددًا دائمًا‪.‬‬
‫هناك راأي يقول‪ :‬اإن مطوِّري وم�صمِّمي اأنظمة الذكاء اال�صطناعي يجب اأن يتحملوا امل�صوؤولية عن‬
‫اأي نتائ�ج �ص�لبية تَنتُ�ج ع�ن ا�ص�تخدامها‪ ،‬و ُيوؤكِّ�د هذا ال�راأي على اأهمية �صمان ت�صمي�م اأنظمة ذكاء‬
‫ا�صطناع�ي ُتراع�ي االعتب�ارات االأخالقي�ة ُوحت ِّم�ل املط ِّوري�ن امل�ص�وؤولية ع�ن اأي �ص�رر ق�د ت�ص�ببه‬
‫اخرتاعاتهم‪.‬‬
‫وي��رى اآخ��رون اأن امل�ص�وؤولية ع��ن نتائ��ج ال��ذكاء اال�صطناع��ي ه��ي م�ص�وؤولية م�ص��رتكة بني‬
‫�تخدمي التقني��ة‪،‬‬ ‫اأ�صح��اب امل�صلح��ة مب��ا فيه��م ُ�ص ّن��اع ال�صيا�ص��ات‪ ،‬واملنظم��ني و ُم�ص� ِ‬
‫وي�ص��لط هذا الراأي ال�صوء على اأهمية �صمان ا�ص��تخدام اأنظمة الذكاء اال�صطناعي‬
‫بطرائ��ق تتما�ص��ى م��ع املب��اد االأخالقي��ة‪ ،‬وتقيي��م املخاط��ر املرتبطة با�ص��تخدامها‬
‫واإدارتها بعناية‪.‬‬
‫وهن��اك راأي ثال��ث يق��ول‪ :‬اإن اأنظم��ة ال��ذكاء اال�صطناع��ي ه��ي"ذاتٌ م�ص �وؤولة"‬
‫لديه��ا ح�� ٌّ�ص اأخالق��ي وم�ص�وؤولة ع��ن اأفعاله��ا‪ ،‬وتق��ول ه��ذه النظري��ة‪ :‬اإنّ اأنظم��ة‬
‫ُتقدم��ة ُميك��ن اأن تتمت��ع بالفاعلي��ة واال�ص��تقاللية؛ مم��ا‬
‫ال��ذكاء اال�صطناع��ي امل ِّ‬
‫يجعلها اأكر من جمرد اأدوات‪ ،‬كما تتطلب منها اأن تكون م�صوؤولة عن اأفعالها‪،‬‬
‫اإال اأن لهذه النظرية عدة م�صكالت‪.‬‬
‫ت�ص��تطيع اأنظم��ة ال��ذكاء اال�صطناع��ي اأن ت ُْ�ص��دِ ر اأحكامً ��ا واأن تت�ص��رف‬
‫ح�ص اأخالقي‬ ‫من تلقاء نف�صها‪ ،‬ولكنها لي�صت "ذاتًا م�صوؤولة" لديها ٌّ‬
‫وذلك لالأ�صباب التالية‪:‬‬
‫ا ًأوال‪ :‬اأن اأنظمة الذكاء اال�صطناعي تفتقر اإىل الوعي واخلربات‬
‫الذاتية؛ مما ُيع ُّد �ص�مة اأ�صا�ص�ية من �ص�مات "الذات امل�ص�وؤولة"‬
‫ح�ص اأخالقي‪ ،‬ويف العادة تت�صمن الفاعلية االأخالقية‬ ‫التي لديها ٌّ‬
‫القدرة على التفكر يف املُثُل العليا للفرد واأفعاله‪.‬‬
‫ثان ًي��ا‪ :‬يقوم االأ�ص��خا�ص بتدري��ب اأنظمة الذكاء اال�صطناعي على‬
‫اتب��اع قواع��د واأهداف حم َّددة؛ مما يح ُّد من حكمها االأخالقي‪،‬‬
‫ُوميك��ن الأنظم��ة ال��ذكاء اال�صطناع��ي تك��رار اتخ��اذ الق��رارات‬
‫حل��رة واال�ص��تقاللية‬ ‫االأخالقي��ة‪ ،‬م��ع افتقاره��ا ل �الإرادة ا ُ‬
‫ال�صخ�صية‪.‬‬
‫ُن�ص��ئي اأنظم��ة ال��ذكاء اال�صطناع��ي والقائم��ني‬ ‫واأخ�رًا‪ ،‬ف�اإن م ِ‬
‫على ن�صرها هم امل�صوؤولون عن اأفعالهم‪ُ ،‬وميكن الأنظمة الذكاء‬
‫اال�صطناع��ي اأن تُ�ص��اعد يف اتخ��اذ الق��رارات االأخالقي��ة‪ ،‬عل��ى‬
‫ح�ص اأخالقي‪.‬‬ ‫الرغم من اأنها لي�صت "ذاتًا م�صوؤولة" لديها ٌّ‬ ‫‪304‬‬
‫ال�سفافية وقابلية التف�سري يف الذكاء األ�سطناعي وم�سكلة ال�سندو األأ�سود‬
‫‪Transparency and Explainability in AI and the Black-Box Problem‬‬
‫ن ام ال�سندو األأ�سود‬ ‫تكم��ن م�ص��كلة ال�صن��دوق االأ�ص��ود يف ال��ذكاء اال�صطناع��ي يف التح��دي املُتم ِّث��ل يف فه��م كيفي��ة‬
‫(‪:)Black-Box System‬‬ ‫عم��ل نظ��ام قائ��م عل��ى ال��ذكاء اآل�صطناع��ي (‪ )AI-Based System‬باتخ��اذ الق��رارات اأو‬
‫�صطناعي يف الرع‬
‫هو نظام ال يك�صف عن طرائق عمله‬ ‫اإنت ��اج املُخ َرج ��ات؛ مم ��ا ق ��د ُي�ص ِّع ��ب الوث ��وق بالنظ ��ام اأو تف�ص ��ره اأو حت�ص ��ينه‪ ،‬ورمب ��ا ي ؤوث ��ر‬
‫عل��ى جودة احلياة‪ ،‬و‬ ‫الداخلي�ة للب�ص�ر؛ اإذ تت�م التغذي�ة‬ ‫االفتق ��ار اإىل االنفت ��اح واإىل قابلي ��ة التف�ص ��ر عل ��ى ثق ��ة النا� ��ص يف النم ��وذج‪ .‬تتزاي ��د ه ��ذه‬
‫��تخدَ م‬ ‫ُدخ�الت‪ ،‬ليتم اإنتاج املُخرَجات‬‫بامل َ‬ ‫التحدي��ات بوج��ه خا���ص يف جم��ال الت�ص��خي�ص الطب��ي‪ ،‬واالأح��كام الت��ي ت�صدره��ا املركب��ات‬
‫معرفة طريقة عملها‪ ،‬كما هو‬ ‫دون ِ‬ ‫ذاتي��ة القي��ادة‪ُ .‬تع� ُّد التح ُّي��زات يف من��اذج تعلُّم االآلة اإحدى املخ��اوف االأخرى املتعلقة بنماذج‬
‫مو�صح يف ال�صكل ‪.6.1‬‬ ‫َّ‬ ‫ال�صن��دوق االأ�ص��ود‪ ،‬كم��ا اأن التح ُّي��زات املوج��ودة يف البيان��ات الت��ي يت��م تدري��ب ه��ذه النماذج‬
‫عليه��ا ُميك��ن اأن ُت�وؤدي اإىل نتائ��ج غ��ر عادل��ة اأو عن�صري��ة‪ .‬باالإ�صاف��ة اإىل ذل��ك‪ ،‬رمب��ا يك��ون‬
‫م��ن ال�صع��ب حتدي��د امل�ص�وؤولية ع��ن الق��رارات التي يتخذها من��وذج ال�صندوق االأ�ص��ود؛ حيث‬
‫امل ُدخَ الت‬ ‫ي�صع��ب حتمي��ل اأي �ص��خ�ص امل�ص�وؤولية ع��ن تل��ك الق��رارات ال �ص��يما م��ع وج��ود احلاج��ة اإىل‬
‫الرقابة الب�صرية‪ ،‬كما هو احلال يف اأنظمة االأ�صلحة ذاتية التحكم‪ .‬اإن االفتقار اإىل ال�صفافية‬
‫يف عملي��ة اتخ��اذ القراربا�ص��تخدام ال��ذكاء اال�صطناع��ي ُي�ص ِّع��ب حتدي��د م�ص��كالت النم��وذج‬
‫وح ّله��ا‪ ،‬كم��ا اأن ع��دم معرف��ة الطريق��ة الت��ي يتخ��ذ به��ا النم��وذج قرارات��ه جُتع��ل م��ن ال�صع��ب‬
‫?‬

‫‪ox‬‬ ‫إاج��راء التح�ص��ينات والت أاك��د م��ن اأنه��ا تعمل بطريق��ة �صحيحة‪ ،‬وهناك ا�ص��رتاتيجيات عديدة‬
‫‪a‬‬ ‫‪c‬‬‫‪k-B‬‬ ‫ملعاجلة م�صكلة ال�صندوق االأ�صود يف الذكاء اال�صطناعي‪ .‬تتمثّل اإحدى تلك اال�صرتاتيجيات‬
‫‪Bl‬‬
‫?‬ ‫يف ا�ص��تخدام تقني��ات ذكاء ا�صطناع��ي قابل��ة للتف�ص��ر جلع��ل من��اذج تعلُّ��م االآلة اأكر �ص��فافية‬
‫واأك ��ر قابلي ��ة للتف�ص ��ر‪ ،‬وق ��د ت�ص ��مل ه ��ذه التقني ��ات‪ :‬مُف�ص ��رات اللغ ��ات الطبيعي ��ة‬
‫)‬ ‫(‪ )Natural Language Explanation‬اأو ت�صوي ��ر البيان ��ات للم�ص ��اعدة يف فه ��م عملي ��ة‬
‫اتخاذ القرار‪ ،‬وهناك اأ�صلوب اآخر يتمثل يف ا�صتخدام مناذج تعلُّم االآلة االأكر قابلية للتف�صر‬
‫امل ُخرَجات‬ ‫مث ��ل‪ :‬اأ�ص ��جار الق ��رار (‪ )Decision Trees‬اأو اآلنح ��دار اخلط ��ي (‪،)Linear Regression‬‬
‫�صكل ‪ :6.1‬نظام ال�صندوق االأ�صود‬ ‫ورمب��ا تك��ون ه��ذه النم��اذج اأق��ل تعقي��دًا واأ�ص��هل يف الفهم‪ ،‬ولكنها قد ال تكون قوي��ة اأو دقيقة مثل‬
‫النم��اذج االأك��ر تعقي��دًا‪ .‬تعترب معاجلة م�ص��كلة ال�صندوق االأ�ص��ود يف ال��ذكاء اال�صطناعي اأم ًرا‬
‫مه ًّما لبناء الثقة يف مناذج تعلُّم االآلة و�صمان ا�صتخدامها باأ�صلوب اأخالقي وعادل‪.‬‬
‫طرائق تعزيز �سفافية مناذج الذكاء األ�سطناعي وقابليتها للتف�سري‬
‫‪Methods for Enhancing the Transparency and Explainability of AI Models‬‬
‫النموذج املحايد املحلي القابل للتف�سري وال�سر‬
‫النم��وذج املحاي��د املحل��ي القاب��ل للتف�ص��ر �ال�ص��رح (‪ )Local Interpretable Model-Agnostic Explanations -LIME‬مت‬
‫ا�صتخدامه م�صبقًا يف مهام معاجلة اللغات الطبيعية(‪ ،)NLP‬وتقوم هذه التقنية بتوليد تف�صرات حملية لتنبوؤات مفردة يتم اإجراوؤها‬
‫وقابال للتف�ص��ر يقارب منوذج ال�صندوق االأ�ص��ود املُعقَّد حول تنبوؤ حم َّدد‪ ،‬ثم‬
‫بوا�ص��طة منوذج‪ ،‬و ُتن�ص��ئ هذه التف�ص��رات منوذجً ا اأب�ص��ط ً‬
‫تو�صل اإىل قراره ب�ص�اأن هذا التنبوؤ املحدَّد‪ .‬تتمثّل ميزة هذه التقنية يف اأنها ُتوفر تف�ص��رات‬
‫ُي�ص��تخدم هذا النموذج الب�ص��يط ل�ص��رح كيف ّ‬
‫ُميك��ن لالإن�ص��ان قراءته��ا‪ ،‬وبالت��ايل ُميك��ن الأ�صحاب امل�صلحة غر املتخ�ص�صني فهمها ب�ص��هولة؛ حتى فيم��ا يتعلق بالنماذج املُع َّقدة مثل‪:‬‬
‫ال�صبكات الع�صبية العميقة (‪.)Deep Neural Networks‬‬
‫تف�سيرات �سابلي األإ سافية‬
‫تف�ص��رات �ص��ابلي اآلإ�صافي��ة (‪ )SHapley Additive exPlanations - SHAP‬ه��ي طريق��ة اأخ��رى لتف�ص��ر ُخُم َرج��ات من��اذج تعلُّ��م‬
‫ُخ�ص���ص قيم��ة (اأو وَز ًن��ا) ل��كل خا�صي��ة‬
‫االآل��ة‪ ،‬وتعتم��د عل��ى املفه��وم اخلا���ص بقي��م �ص��ابلي م��ن نظري��ة اآلألع��اب (‪ )Game Theory‬وت ِّ‬
‫‪305‬‬
‫تبني اأهميّة اخل�صائ�ص‪،‬‬ ‫تف�صرات يف �صكل درجات ّ‬ ‫ٍ‬ ‫م�صاهمة يف التنبوؤ‪ُ .‬ميكن ا�صتخدام الطريقة مع اأي منوذج‪ ،‬كما تقدم‬ ‫صخة‪،‬‬
‫مما ُميكن اأن ي�صاعد يف حتديد اخل�صائ�ص االأكر تاأثرًا يف ُخُم َرجات النموذج‪.‬‬ ‫إج��راء‬
‫وهن��اك تقني��ة أاخ��رى لتح�ص��ني قابلي��ة تف�ص��ر الذكاء اال�صطناعي مثل‪ :‬اأ�ص��جار القرار وقواعد الق��رار‪ ،‬وهي مناذج قابلة‬ ‫ميكن‬
‫للتف�ص��ر ُميك��ن ت�صويره��ا ب�ص��هولة‪ ،‬حي��ث تق��وم اأ�ص��جار الق��رار بتق�ص��يم ف�ص��اء اخل�صائ���ش (‪ )Feature Space‬بن��ا ًء‬ ‫صعه��ا‬
‫عل��ى اخلا�صي��ة االأك��ر دالل��ة‪ ،‬وتق� ِّ�دم قواع��د وا�صح��ة التخ��اذ القرارات‪ ،‬و ُتع ُّد اأ�ص��جار الق��رار مفيدة ب�ص��كل خا�ص عندما‬ ‫عاية ال�صحية‬
‫أي�صا؛ الأن قابلية‬
‫تتخذ البيانات �صكل اجلداول ويكون هناك عدد حمدود من اخل�صائ�ص‪ .‬ولكن هذه النماذج حمدودة ا ً‬ ‫الآث��ار‬
‫تف�ص��ر �ص��جرة القرار التي مت اإن�ص��اوؤها تتنا�ص��ب تنا�ص� ًبا عك�ص� ًّيا مع حجم ال�ص��جرة‪ .‬على �ص��بيل املثال‪ ،‬من ال�صعب فهم‬ ‫وم��ن ثمّ تتخذ‬
‫ي�صتخدم تقنيات مثل‪� :‬كالء الذكاء‬ ‫ِ‬ ‫االأ�صجار التي تتكون من اآالف العقد ومئات امل�صتويات‪ .‬واأخرًا‪ ،‬هناك اأ�صلوب اآخر‬ ‫مة يف التموي��ل‬
‫اآل�صطناع��ي (‪ )Artificial Intelligence Agents‬اأو حتلي��ل احل�صا�ص��ية (‪ )Sensitivity Analysis‬للم�ص��اعدة‬
‫يف فه��م كيفي��ة تاأث��ر تغي��ر املُدخَ ��الت اأو االفرتا�ص��ات عل��ى ُخُم َرج��ات النم��وذج‪ُ ،‬وميك��ن اأن يك��ون ه��ذا االأ�ص��لوب مفي��دً ا‬ ‫صوؤول‬
‫ب�صكل خا�ص يف حتديد م�صادر الغمو�ص يف النموذج ويف فهم حدوده‪.‬‬
‫األ�ستدألل القائم على ال ِقيم يف اأن مة الذكاء األ�سطناعي‬
‫‪Value-Based Reasoning in AI Systems‬‬
‫األ�ستدألل القائم على ال ِقيم‬
‫(‪:)Value-Based Reasoning‬‬ ‫يتمثّل الهدف من ذلك يف اإن�صاء اأنظمة ذكاء ا�صطناعي اأكر ات�صاقًا مع القيم‬
‫واالأخالقي��ات الب�ص��رية؛ بحي��ث تتعام��ل ه��ذه االأنظم��ة بطرائ��ق مفي��دة ومن�صف��ة‬
‫اال�ص�تدالل القا ئ�م عل�ى ال ِقي�م يف‬
‫اأنظم�ة ال�ذكاء اال�صطناع�ي ي�ص�ر اإىل‬ ‫وم�صوؤولة‪ .‬تت�صمن اخلطوة االأوىل يف اال�صتدالل القائم على ال ِقيم‪َ ،‬‬
‫فهم ومتثيل‬
‫العملي�ة التي ي�ص ِ‬ ‫ال ِقي��م االأخالقي��ة داخ��ل اأنظم��ة ال��ذكاء اال�صطناع��ي‪ ،‬حي��ث يج��ب اأن تك��ون هذه‬
‫�تخدمها وكالء الذكاء‬ ‫االأنظم��ة ق��ادرة على تف�ص��ر وتوطني القي��م اأو املباد التوجيهية االأخالقية التي‬
‫اال�صطنا ع�ي التخ�اذ ق�رارات اأو‬ ‫ُيقدمه��ا من�ص�وؤها الب�ص��ريون اأو اأ�صح��اب امل�صلح��ة‪ ،‬وق��د تت�صم��ن ه��ذه العملي��ة‬
‫ا�ص�تخال�ص نتائ�ج بن�ا ًء عل�ى جمموع�ة‬ ‫التعلُّ��م م��ن االأمثل��ة اأو التغذي��ة الراجع��ة الب�ص��رية اأو القواع��د الوا�صحة‪ ،‬وعندما‬
‫حم� َّددة م�ص�بقًا م�ن القي�م اأو املب�اد‬ ‫تفه��م اأنظم��ة ال��ذكاء اال�صطناعي هذه القيم بو�ص��وح‪ُ ،‬ميكنها اأن تقوم مبواءمة‬
‫اأو االعتب�ارات االأخالقية‪.‬‬ ‫اأفعالها بطريقة اأف�صل مع املباد االأخالقية املن�صودة‪.‬‬
‫ا‬
‫امل ُخرَجات‬ ‫امل‬ ‫لقيم‬ ‫منوذج الذكاء اآل�صطناعي‬ ‫امل ُدخَ الت‬
‫م‬ ‫ح َّددة‬
‫�صب ًقا‬

‫�صكل ‪ :6.2‬متثيل لال�صتدالل القائم على القيمة‬


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

‫الذكاء األ�سطناعي وت أا ريه على البي ة ‪AI and Environmental Impact‬‬


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

‫‪307‬‬
‫ألُطر التن يمية ومعايري ال�سناعة‬
‫ا أ‬
‫‪Regulatory Frameworks and Industry Standards‬‬
‫تلعب االأُطر التنظيمية ومعاير ال�صناعة دورًا مهمًّا يف تعزيز تطبيقات الذكاء اال�صطناعي االأخالقية‪ ،‬فباإمكان التنظيمات امل ِ‬
‫ُ�صاعدة‬
‫اأن ت�صم��ن َحت ُّم��ل املنظم��ات الت��ي تق��وم بتطوي��ر وا�ص��تخدام اأنظم��ة الذكاء اال�صطناعي امل�ص�وؤولية عن اأفعالها عن طري��ق حتديد توقُّعات‬
‫وعواق��ب وا�صح��ة لع��دم االمتث��ال‪ ،‬وباإم��كان التنظيم��ات واملعاي��ر اأن ُحتف��ز املنظم��ات عل��ى اإعط��اء االأولوي��ة لالعتب��ارات االأخالقي��ة عن��د‬
‫تطوير وا�صتخدام اأنظمة الذكاء اال�صطناعي‪.‬‬
‫ال�سفافية‬
‫ُميكن اأن تعزِّ ز التنظيمات واملعاير ال�صفافية يف اأنظمة الذكاء اال�صطناعي مبطالبة املوؤ�ص�صات بالك�صف عن كيفية عمل اأنظمتها وعن‬
‫ِ‬
‫ت�صتخدمها‪ُ ،‬وميكن اأن ي�صاعد ذلك يف بِناء الثقة مع اأ�صحاب امل�صلحة وتقليل املخاوف من التح ُّيزات املحتملة اأو التمييز‬ ‫البيانات التي‬
‫املحتمل يف اأنظمة الذكاء اال�صطناعي‪.‬‬
‫تقييم املخاطر‬
‫ُميكن تقليل خُماطر العواقب غر املق�صودة اأو النتائج ال�ص��لبية الناجُتة عن ا�ص��تخدام الذكاء اال�صطناعي بو�صع التنظيمات واملعاير‬
‫املنا�صبة‪ ،‬وذلك مبطالبة املنظمات باإجراء تقييمات للمخاطر‪ ،‬وهذا يعني حتديد املخاطر واالأخطار املحتملة وتنفيذ �صمانات منا�صبة‪،‬‬
‫مما ُميكِّن التنظيمات واملعاير من امل�صاعدة يف تقليل االأ�صرار املحتملة على االأفراد واملجتمع‪.‬‬
‫تطوير ون�سر اأُطر عمل وا سحة للذكاء األ�سطناعي‬
‫ُميكن اأن ت�صجِّ ع التنظيمات واملعاير االبتكار بتوفر اإطار عمل وا�صح لتطوير اأنظمة الذكاء اال�صطناعي وا�صتخدامها؛ اإذ اأن ا�صتخدام‬
‫التنظيم��ات واملعاي��ر لتاأ�صي���ص فر���ص متكافئ��ة وتقدمي التوجيه بخ�صو�ص االعتبارات االأخالقية ُميكن اأن ي�ص��اعد املنظمات على تطوير‬
‫اأنظم��ة ال��ذكاء اال�صطناع��ي ون�ص��رها بطرائ��ق تتف��ق م��ع القي��م االأخالقي��ة واالجتماعي��ة‪ .‬تلع��ب االأُطر التنظيمي��ة ومعاي��ر ال�صناعة دو ًرا‬
‫مه ًّم��ا يف تعزي��ز تطبيق��ات ال��ذكاء اال�صطناع��ي االأخالقي��ة‪ ،‬وذل��ك بتوف��ر اإر�ص��ادات وحواف��ز وا�صح��ة للموؤ�ص�ص��ات حت��ى ُتعط��ي االأولوي��ة‬
‫لالعتب��ارات االأخالقي��ة والتنظيم��ات واملعاي��ر؛ مم��ا ي�صم��ن تطوير اأنظمة الذكاء اال�صطناعي وا�ص��تخدامها بطرائق تتما�ص��ى مع القيم‬
‫االجتماعية واالأخالقية‪.‬‬
‫التنمية امل�ستدامة للذكاء األ�سطناعي يف اململكة العربية ال�سعودية‬
‫‪Sustainable AI Development in the Kingdom of Saudi Arabia‬‬
‫م��ن املتو َّق��ع اأن ت�صب��ح تقني��ات ال��ذكاء اال�صطناع��ي واأنظمت��ه اأح��د العوامل الرئي�ص��ة‬
‫الت��ي ُت�وؤدي اإىل اإح��داث خل��ل يف القطاع��ات املالي��ة يف العدي��د من البل��دان‪ ،‬وقد توؤثر‬
‫ب�ص��كل كب��ر عل��ى �ص��وق العم��ل‪ ،‬وم��ن املتو َّق��ع يف ال�ص��نوات القادم��ة اأن ي�صب��ح ح��وايل‬
‫‪ 70 %‬م��ن االأعم��ال الروتيني��ة الت��ي يق��وم به��ا العم��ال موؤمتت��ة بالكام��ل‪ .‬كم��ا اأن��ه م��ن‬
‫املتو َّق��ع اأن تخل��ق �صناع��ة ال��ذكاء اال�صطناع��ي �ص��بعة وت�ص��عني ملي��ون وظيف��ة جدي��دة‬
‫وت�صيف �صتة ع�صر تريليون دوالر اأمريكي اإىل الناجت املحلي االإجمايل العَاملَ ي‪.‬‬
‫لقد طوَّرت الهيئة ال�صعودية للبيانات �الذكاء اآل�صطناعي (‪)Saudi Data and Artificial Intelligence Authority - SDAIA‬‬
‫اأهدافًا ا�صرتاتيجية للمملكة ال�صتخدام تقنيات الذكاء اال�صطناعي املُ�صتدامة يف تنمية اململكة‪ ،‬و�صتكون اململكة العربية ال�صعودية‬
‫مركزً ا عامليًا للبيانات والذكاء اال�صطناعي‪ ،‬كما اأن اململكة ا�صت�صافت اأول قمة عاملية لهُ‪ ،‬حيث ُميكن للقادة واملبتكرين مناق�صة‬
‫م�ص�تقبل الذكاء اال�صطناعي وت�ص�كيله ل�صالح املجتمع‪ .‬اأما الهدف االآخر فيتمثل يف حتويل القوى العاملة يف اململكة من خالل‬
‫تطوي�ر البيان�ات املحلي�ة ودع�م املواه�ب يف ال�ذكاء اال�صطناع�ي‪ .‬ومبا اأن الذكاء اال�صطناعي يقوم بتحويل اأ�ص�واق العمل عامليًا‪،‬‬
‫ف�اإن معظ�م القطاع�ات حتت�اج اإىل تكيي�ف البيان�ات وال�ذكاء اال�صطناعي ودجمه�ا يف التعليم والتدريب املهن�ي واملعرِ فة العامة‪،‬‬
‫وبذلك ُميكن اأن تكت�صب اململكة العربية ال�صعودية ميزة تناف�صية من حيث التوظيف واالإنتاجية واالبتكار‪.‬‬

‫‪308‬‬
‫اأم��ا اله��دف النهائ��ي فيتم ّث��ل يف ج��ذب ال�ص��ركات وامل�ص��تثمرين ع��ن طري��ق اأُط��ر عم��ل وحواف��ز تنظيمي��ة مرن��ة وم�ص��تقرة‪،‬‬
‫حيث �ص��رتكز االأنظمة على تطوير �صيا�ص��ات ومعاير للذكاء اال�صطناعي‪ ،‬مبا فيها ا�ص��تخدامه ب�ص��كل اأخالقي‪ .‬و�ص��يعمل‬
‫اإط��ار العم��ل عل��ى تعزي��ز التطوي��ر االأخالق��ي الأبح��اث وحلول ال��ذكاء اال�صطناعي ودعمه يف ظل توفر اإر�ص��ادات ومعاير‬
‫حلماية البيانات واخل�صو�صية؛ مما �ص ُيوفر اال�صتقرار والتوجيه الأ�صحاب امل�صلحة العاملني يف اململكة‪.‬‬
‫مثال‬
‫تُخط��ط المملك��ة العربي��ة ال�ص��عودية آل�ص��تخدام اأنظم��ة �تقني��ات ال��ذكاء اآل�صطناع��ي كاأ�صا���ش‬
‫لم�ص��ر�عي المدينتين العمالقتين نيوم (‪� )NEOM‬ذا آلين (‪ .)THE LINE‬م�ص��ر�ع نيوم هو‬
‫مدينة م�صتقبلية �صيتم ت�صغيلها بالطاقة النظيفة‪� ،‬بها اأنظمة نقل متطورة‪� ،‬تقدِّم خدمات ذات‬
‫ِ‬
‫��صت�صتخدم‬ ‫تقنية عالية‪�� ،‬صتكون من�صة للتقنيات المتطورة‪ ،‬بما في ذلك الذكاء اآل�صطناعي‪،‬‬
‫حل��ول الم��دن الذكي��ة لتح�ص��ين ا�ص��تهالك الطاق��ة �اإدارة حرك��ة الم��ر�ر �الخدم��ات المتقدم��ة‬
‫اآلأخ��رى‪�� .‬ص��يتم ا�ص��تخدام اأنظم��ة ال��ذكاء اآل�صطناع��ي فيه��ا لتح�ص��ين ج��ودة الحي��اة لل�ص��كان‬
‫�لتعزيز اآل�ص��تدامة‪.‬‬
‫�بالمث��ل‪� ،‬ص��تكون مدين��ة ذا آلي��ن مدين��ة خطي��ة خالي��ة م��ن الكرب��ون مبني��ة بتقني��ات ال��ذكاء‬
‫اآل�صطناع��ي‪�� ،‬صت�ص� ِ‬
‫�تخدم اأنظم��ة ال��ذكاء اآل�صطناع��ي آلأتمت��ة بنيته��ا التحتي��ة �اأنظم��ة النق��ل‬
‫فيها مما يجعل حياة المقيمين فيها تت�ص��م بال�صال�ص��ة �الكفاءة‪�� ،‬ص��تكون الطاقة التي �صتُ�ص�غِّل‬
‫المدينة طاقة نظيفة‪ ،‬كما اأن اآلأ�لوية �ص��تكون للمعي�ص��ة الم�ص��تدامة‪�� ،‬ص��يتم ا�ص��تخدام اآلأنظمة‬
‫الت��ي تعم��ل بال��ذكاء اآل�صطناع��ي لمراقب��ة ا�ص��تخدام الطاقة �تح�ص��ينه �ان�ص��يابية حركة المر�ر‬
‫�الخدم��ات المتقدم��ة اآلأخ��رى‪.‬‬
‫�بوجه عام‪� ،‬صتلعب اأنظمة الذكاء اآل�صطناعي �تقنياته د�رًا حا�صمًا في تطوير م�صر�عي هاتين‬
‫المدينتي��ن العمالقتي��ن‪� ،‬تمكينهم��ا م��ن اأن ت�صبح��ا مدينتي��ن م�ص��تدامتين م��ن م��دن الم�ص��تقبل‬
‫تت�صمان بالكفاءة �اآلبتكار‪.‬‬

‫األإر�سادات العاملية ألأخالقيات الذكاء األ�سطناعي ‪International AI Ethics Guidelines‬‬


‫مو�ص��ح يف اجل��دول الت��ايل‪ ،‬ط� َّورت منظم��ة اليون�ص��كو (‪ )UNESCO‬وثيق��ة اإر�ص��ادية تو�ص��ح بالتف�صي��ل القي��م‬
‫كم��ا ه��و َّ‬
‫واملباد التي يجب االلتزام بها عند تطوير اأنظمة وتقنيات الذكاء اال�صطناعي اجلديدة‪.‬‬

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


‫املباد‬ ‫القيم‬
‫• احرتام كرامة االإن�ص��ان وحمايتها وتعزيزها‪ • ،‬التنا�صب وعدم االإ�صرار‪.‬‬
‫• ال�صالمة واالأمن‪.‬‬ ‫وحفظ حريته وحقوقه االأ�صا�صية‪.‬‬
‫• االإن�صاف وعدم التمييز‪.‬‬ ‫• ازدهار البيئة والنظام البيئي‪.‬‬
‫• اال�صتدامة‪.‬‬ ‫• �صمان التنوع وال�صمولية‪.‬‬
‫• اخل�صو�صية‪.‬‬ ‫• العي�ص يف ان�صجام و�صالم‪.‬‬
‫• الرقابة الب�صرية والعزمية‪.‬‬
‫• ال�صفافية وقابلية التف�صر‪.‬‬
‫• امل�صوؤولية وامل�صاءلة‪.‬‬
‫• الوعي والتثقيف‪.‬‬
‫• احلوكمة والتعاون القائمان على تع ُّدد اأ�صحاب امل�صلحة‪.‬‬
‫‪309‬‬
‫مترينات‬
‫‪1‬‬
‫خاطئة‬ ‫�صحيحة‬ ‫حَ دِّد اجلملة ال�صحيحة �اجلملة اخلاطئة فيما يلي‪:‬‬
‫‪ .1‬تهتم اأخالقيات الذكاء اال�صطناعي بتطوير اأنظمة الذكاء اال�صطناعي فقط‪.‬‬
‫‪ .2‬من املحتمل اأن ُيوؤدي الذكاء اال�صطناعي واالأمتتة اإىل ت�صريح الب�صر من الوظائف‪.‬‬
‫‪ُ .3‬ميكن اأن ُيوؤدي االفتقار اإىل التنوع يف فِرق تطوير الذكاء اال�صطناعي اإىل عدم روؤية‬
‫التح ُّيزات اأو عدم معاجلتها‪.‬‬
‫‪ُ .4‬ميكن اأن ي�صاعد دمج املباد االأخالقية يف اأنظمة الذكاء اال�صطناعي يف �صمان‬
‫تطويرها وا�صتخدامها بطريقة م�صوؤولة‪.‬‬
‫‪ .5‬يتطلب الت�صميم املعتمد على اإ�صراك االإن�صان اأن تعمل اأنظمة الذكاء اال�صطناعي دون‬
‫اأي تدخل ب�صري‪.‬‬
‫‪ .6‬تدل م�صكلة ال�صندوق االأ�صود يف الذكاء اال�صطناعي على �صعوبة فهم كيفية و�صول‬
‫خوارزميات الذكاء اال�صطناعي اإىل قراراتها اأو تنبوؤاتها‪.‬‬
‫‪ُ .7‬ميكن ت�صميم مناذج الذكاء اال�صطناعي لتكييف قراراتها اأو نتائجها وفقًا للقيم‬
‫االأخالقية الرا�صخة‪.‬‬
‫‪ .8‬ا�صتخدام الذكاء اال�صطناعي على نطاق وا�صع له اآثار اإيجابية فقط على البيئة‪.‬‬

‫‪�ِ 2‬صف كيف يوؤدي الذكاء اآل�صطناعي �اآلأ تة اإىل ت�صريح الب�صر من � ائفهم‪.‬‬

‫‪310‬‬
‫‪ 3‬ا�صرح كيف ميكن اأن ت�صاهم بيانات التدريب امل ُتحيِّزة يف حتقيق نتائج ذكاء ا�صطناعي مُتحيِّزة‪.‬‬

‫‪ 4‬عرِّف م�صكلة ال�صند�ق اآلأ�صود يف اأنظمة الذكاء اآل�صطناعي‪.‬‬

‫‪ 5‬قارن بني اآلآثار اآلإيجابية �ال�صلبية آلأنظمة الذكاء اآل�صطناعي على البيئة‪.‬‬

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

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


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

‫ويبوت�ص ‪Webots‬‬
‫ويبوت���ص اأداة برجمي��ة قوي��ة ُميكن ا�ص��تخدامها يف حماكاة الروبوت��ات وبيئاتها‪ ،‬وهي من�صة ممتازة‬
‫ت�ص��تحق اإدخاله��ا يف عَ � َ�امَل الروبوت��ات وال��ذكاء اال�صطناعي‪ ،‬حيث ي�ص��تطيع الطلب��ة ت�صميم االأنظمة‬
‫واخلوارزمي��ات الروبوتي��ة وحماكاته��ا واختباره��ا با�ص��تخدام ه��ذه االأداة‪ ،‬دون احلاج��ة اإىل مع��دات‬
‫حا�صوبية باهظة الثمن‪.‬‬
‫ُيع� ُّد ا�ص��تخدام اأداة ويبوت���ص يف ال��ذكاء اال�صطناع��ي مفي��دً ا ب�ص��كل خا���ص؛ الأنها تتي��ح للطلبة جُتربة‬
‫خوارزمي��ات تعلُّ��م االآل��ة واختب��ار اأدائه��ا يف بيئ��ة تعتم��د عل��ى املُح��اكاة‪ ،‬فم��ن خ��الل اإن�ص��اء روبوت��ات‬
‫وبيئات افرتا�صية ي�ص��تطيع الطلبة اأن ي�صتك�ص��فوا اإمكانيات وقيود الذكاء اال�صطناعي‪ ،‬واأن يتعلَّموا‬
‫كيفية برجمة االأنظمة الذكية التي ُميكِ نها اتخاذ القرارات بنا ًء على بيانات الزمن الواقعي‪.‬‬
‫ُميكنك تنزيل اأداة ويبوت�ص من الرابط التايل‪:‬‬
‫‪https://github.com/cyberbotics/webots/releases/download/R2023a/webots-R2023a_setup.exe‬‬

‫ُ�صرة با�صتخدام اأداة ويبوت�ص‬


‫�صكل ‪ :6.6‬م�صروع طائرة م َّ‬
‫‪313‬‬
‫مراقبة املنطقة ‪Area Surveillance‬‬
‫�تخدم اأداة ويبوت��ص لعم�ل ُحم�اكاة لطائ�رة‬‫يف ه�ذا الدر��ص والدر��ص الت�ايل �صت�ص ِ‬
‫نقطة الطريق (‪:)Waypoint‬‬ ‫ُم�ص َّ�رة ُحتل�ق ف�وق أاح�د املن�ازل ث�م �ص�تقوم برتقيته�ا لتكت�ص�ف احل�دود الب�ص�رية‬
‫نقط��ة الطري��ق ه��ي موق��ع جغ��رايف‬ ‫ك ُمرا ِقب�ة‪ ،‬حي�ث تتك�ون املُح�اكاة م�ن طائ�رة ُم�ص َّ�رة تُقل�ع م�ن و�صع ال�ص�كون على‬
‫حم �دَّد يف ف�ص��اء ثالث��ي االأبع��اد تت��م‬ ‫االأر��ص وتب�داأ يف ال�دوران ح�ول املن�زل‪ .‬ويف الدر��ص الت�ايل‪� ،‬ص�تُ�صيف مي�زة روؤية‬
‫برجم��ة الطائ��رة املُ�ص� َّ�رة لتط��ر اإليه��ا‬ ‫ُ�صرة با�صتخدام الكامرا اخلا�صة بها با�صتخدام مكتبة اأ�بن‬ ‫احلا�صب للطائرة امل َّ‬
‫اأو مت��ر م��ن خالله��ا‪ .‬وتُ�ص��تخدم نق��اط‬ ‫�صي يف (‪ ،)OpenCV‬وهذا �صيمكنك من حتليل ال�صور التي التقطتها الكامرا‪.‬‬
‫الطر ي��ق الإن�ص��اء م�ص��ارات ط��ران‬ ‫ن�ص برجمي بلغة البايثون وهو م�صوؤول‬ ‫ُ�صرة بوا�صطة ٍّ‬
‫مع َّر ف��ة م�ص��بقًا لتتبعه��ا الطا ئ��رات‬ ‫يتم التحكم يف الطائرة امل َّ‬
‫ُ�صرة مبا فيها ُحمركات املراوح والكامرا ونظام‬ ‫َّ‬ ‫مل‬‫ا‬ ‫أجهزة‬ ‫عن التحكم يف جميع اال‬
‫املُ�ص� َّ�رة‪ ،‬وميك��ن �صبطه��ا با�ص��تخدام‬ ‫حتدي�د املواق�ع العامل�ي (‪ )Global Positioning System - GPS‬وم�ا اإىل‬
‫اإحداثي��ات نظ��ام حتدي��د املواقع العاملي‬ ‫ذلك‪ ،‬كما اأنه يحتوي على مقطع برجمي ملزامنة جميع املُحركات لتحريك الطائرة‬
‫اأو اأنظمة اأخرى قائمة على املواقع‪.‬‬ ‫ُ�صرة اإىل نقا الطريق (‪ )Waypoints‬املتنوعة وجعلها م�صتقرة يف الهواء‪.‬‬ ‫امل َّ‬

‫البدء مع ويبوت�ص ‪Starting with Webots‬‬


‫�صتتعرَّف يف هذا الدر�ص على اأداة ويبوت�ص وبيئتها‪ ،‬حيث تتكون حماكاة ويبوت�ص من عن�صرين‪:‬‬
‫• التعريف بروبوت واحد اأو اأكر وبيئاتها يف ملف عَا َ �يبوت�ش (‪.)Webots World‬‬
‫• برنامج مُتحكِّم واحد اأو اأكر للروبوتات املذكورة‪.‬‬
‫َع��ا َ �يبوت���ش (‪ )Webots World‬ه��و و�ص��ف ثالث��ي االأبع��اد خل�صائ���ص الروب��وت‪ ،‬حي��ث يت��م تعري��ف كل كائ��ن مب��ا يف ذل��ك‬
‫موقع��ه‪ ،‬واجُتاه��ه‪ ،‬وهند�ص��ته‪ ،‬ومظه��ره مث��ل‪ :‬لون��ه اأو �ص��طوعه ‪ ،‬وخ�صائ�ص��ه املادي��ة‪ ،‬ونوع��ه وم��ا اإىل ذلك‪ ،‬كما ُميك��ن اأن حتتوي‬
‫الكائن��ات عل��ى كائن��ات اأخ��رى يف االأنظم��ة الهرمي��ة الت��ي تُ�ص��كل الع��وامَل‪ .‬عل��ى �ص��بيل املث��ال‪ ،‬ق��د يحت��وي الروب��وت عل��ى عجلت��ني‪،‬‬
‫وم�صت�ص��عر م�ص��افة‪ ،‬ومف�ص��ل يحت��وي عل��ى كام��را‪ ،‬ونحوه��ا‪ .‬يح� ِّ�دد مل��ف ال َع��ا (‪ )World File‬فق��ط ا�ص��م املُتح ِّك��م ال��الزم‬
‫�وامَل يف ملف��ات بتن�ص��يق‬ ‫ل��كل روب��وت‪ ،‬وال يحت��وي عل��ى املقط��ع الربجم��ي للمُتح ِّك��م (‪ )Controller‬يف الروبوت��ات‪ُ ،‬وحتف��ظ ال َع� ِ‬
‫َوامَل) تُخ َّزن فيه امللفات بتن�صيق "‪.".wbt‬‬ ‫"‪ ،".wbt‬ويحتوي كل م�صروع ويبوت�ص على جملد فرعي بعنوان ‪( worlds‬الع ِ‬
‫مُتحكِّم �يبوت���ش (‪ )Webots Controller‬هو برنامج حا�ص��ب يتحكم يف روبوت حمدَّد يف ملف الع ََامَل‪ُ ،‬وميكن ا�ص��تخدام اأي‬
‫لغ��ة م��ن لغ��ات الربجم��ة الت��ي يدعمه��ا ويبوت���ص لتطوي��ر املُتح ِّك��م مث��ل‪ :‬لغ��ة �ص��ي بل���ش بل���ش( ‪ )C‬ولغ��ة جاف��ا (‪ ،)Java‬ولكن��ك‬
‫�صت�ص��تخدِ م يف ه��ذا امل�ص��روع لغ��ة البايث��ون‪ .‬يُط ِل��ق ويبوت���ص كل برنام��ج م��ن برام��ج املُتح ِّك��م املُعط��اة كعملية منف�صل��ة عندما تبداأ‬
‫املُح��اكاة‪ ،‬ويق��وم برب��ط عملي��ات املُتح ِّك��م بالروبوت��ات الت��ي مت��ت حماكاته��ا‪ ،‬وعل��ى الرغ��م م��ن اأن العدي��د من الروبوت��ات ُميكنها‬
‫م�ص��اركة املقط��ع الربجم��ي نف�ص��ه لربنام��ج املُتح ِّك��م‪ ،‬اإال اأن كل روب��وت �صي�ص�غِّل العملي��ة اخلا�ص��ة ب��ه‪ُ .‬يخ�زَّن مَ �ص��در كل برنام��ج‬
‫مُتح ِّك��م وملفات��ه الثنائي��ة م ًع��ا يف جمل��د امل ُتح ِّك��م (‪ ،)Controller Directory‬حي��ث يحت��وي كل م�ص��روع ويبوت���ص عل��ى جمل��د‬
‫مُتحكِّم داخل املجلد الفرعي الذي يتخذ ا�صم ‪( controllers‬املُتحكِّمات)‪.‬‬
‫بي ة الويبوت�ص ‪The Webots Environment‬‬
‫عندما تفتح الربنامج‪� ،‬صتالحظ عدة حقول ونوافذ‪ ،‬حيث ت�صمل املُكوِّنات الرئي�صة لواجهة ويبوت�ص ما يلي‪:‬‬
‫�ص��ريط القائم��ة (‪:)Menu Bar‬يق��ع يف اجل��زء العل��وي م��ن الواجه��ة‪ ،‬ويُوف��ر �ص��ريط القوائ��م اإمكاني��ة الو�ص��ول اإىل اأوام��ر وخي��ارات‬
‫متنوعة للعمل على املُحاكاة مثل‪ :‬اإن�صاء منوذج روبوت اأو ا�صتراده‪ ،‬وتهيئة بيئة املُحاكاة‪ ،‬وت�صغيل عمليات املُحاكاة‪.‬‬
‫�صريط اآلأد�ات (‪:)Toolbar‬هو جمموعة من االأزرار املوجودة اأ�صفل �صريط القائمة ويُوفر الو�صول ال�صريع اإىل الوظائف املُ�صتخدَ مة‬
‫ب�صكل متكرر مثل‪ :‬اإ�صافة كائنات اإىل امل�صهد‪ ،‬وبدء املُحاكاة واإيقافها‪ ،‬وتغير عر�ص الكامرا‪.‬‬
‫‪314‬‬
‫�صجرة امل�صهد (‪ :)Scene Tree‬هي متثيل هرمي للكائنات يف بيئة املُحاكاة‪ ،‬حيث تتيح للم ِ‬
‫ُ�صتخدمني التنقل يف امل�صهد‬
‫والتعامل معه مثل‪ :‬اإ�صافة اأو حذف الكائنات‪ ،‬وتغير خ�صائ�ص الكائن‪ ،‬وجُتميع الكائنات واإدارتها ب�صكل اأ�صهل‪.‬‬
‫ُ �رِّر احلق�ل (‪ :)Field Editor‬ه�و واجه�ة ر�ص�ومات لتحري�ر خ�صائ��ص الكائن�ات يف بيئ�ة املُح�اكاة‪ ،‬حي�ث ُميك�ن‬
‫عامالت الكائن مثل‪ :‬مو�صعه‪ ،‬واجُتاهه‪ ،‬وحجمه‪ ،‬ومادته‪ ،‬وخ�صائ�صه الفيزيائية‪.‬‬ ‫للمُ�صتخدِ مني ا�صتخدامه ل�صبط ُم ِ‬
‫ناف�ذة ثالثي�ة اآلأبع�اد (‪ :)3D Window‬ه�ي ناف�دة العر��ص الرئي��ص لبيئ�ة املُحاكاة‪ ،‬وتعر��ص الكائنات وتفاعالتها يف‬
‫�تخدمني التنق�ل يف الناف�ذة الثالثية االأبعاد با�ص�تخدام عنا�ص�ر حتكم الكامرا‬ ‫ف�ص�اء ثالث�ي االأبع�اد‪ ،‬حي�ث ُميك�ن للمُ�ص ِ‬
‫املختلفة مثل‪ :‬التحريك‪ ،‬والتكبر اأو الت�صغر‪ ،‬والتدوير‪.‬‬
‫الن�صي�ة االأخ�رى املُ�ص�تخدَ مة يف‬
‫ُ �رِّر الن� ّ�ش (‪ :)Text Editor‬ه�و اأداة لتحري�ر م�ص�در املقط�ع الربجم�ي اأو امللف�ات ّ‬
‫املُح�اكاة‪ ،‬ويق ِّ�دم يي�زًا ل ِبن�اء اجلم�ل (‪ )Syntax Highlighting‬وخ�صائ��ص مفي�دة اأخ�رى لكتابة املقاطع الربجمية‬
‫�ت�صحيحها (‪ ،)Debugging‬مثل‪ :‬اآلإكمال التلقائي (‪ )Auto-Completion‬واإبراز اآلأخطاء (‪.)Error Highlighting‬‬
‫�ح�دة التحك�م (‪ :)Console‬ه�ي ناف�ذة تعر��ص ُخُم َرج�ات قائم�ة عل�ى الن� ّ�ص من املُحاكاة‪ ،‬مبا يف ذلك ر�ص�ائل اخلطاأ‬
‫ومعلومات الت�صحيح‪ ،‬وهي مفيدة يف ا�صتك�صاف االأخطاء التي حتدث اأثناء املُحاكاة واإ�صالحها‪.‬‬
‫�صريط القائمة (‪.)Menu bar‬‬ ‫�صريط االأدوات (‪.)Toolbar‬‬ ‫الن�ص (‪.)Text editor‬‬
‫مُحرِّر ّ‬

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

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

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


‫(‪.)3D window‬‬

‫�صكل ‪ :6.7‬نافذة ويبوت�ص‬


‫وحدة التحكم (‪.)Console‬‬

‫‪315‬‬
‫اأوال‪ :‬علي��ك اأن تق��وم بتثبي��ت املكتب��ات الالزم��ة الت��ي �صت�ص� ِ‬
‫�تخدمها يف م�ص��روعك‪ .‬ميكن��ك تثبي��ت مكتب��ة اأ�ب��ن �ص��ي يف‬
‫(‪ )OpenCV‬عن طريق باي ت�صارم (‪:)PyCharm‬‬
‫لتن�سيب مكتبة اأوبن �سي يف (‪:)OpenCV‬‬
‫‪1‬‬ ‫ يف نافذة ‪( PyCharm‬باي ت�صارم)‪ ،‬ا�صغط على ‪( Packages‬حِ زم)‪.‬‬
‫ اكتب "‪( "opencv‬اأوبن �صي يف) يف �صريط البحث‪2 .‬‬

‫‪4‬‬ ‫ اخرت ‪( opencv-python‬اأوبن �صي يف‪ -‬بايثون)‪ 3 ،‬ثم ا�صغط على ‪( install‬تثبيت)‪.‬‬
‫ �صتظهر لك ر�صالة تخربك باكتمال التن�صيب‪5 .‬‬

‫‪5‬‬

‫‪2‬‬ ‫‪4‬‬

‫‪3‬‬

‫‪1‬‬

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

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


‫من خالل البحث عن كلمة "‪."pillow‬‬

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

‫‪1‬‬

‫‪2‬‬

‫‪3‬‬

‫�صكل ‪ :6.9‬فتح عَ َامَل ويبوت�ص‬

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

‫‪1‬‬

‫‪2‬‬

‫‪3‬‬

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


‫�صكل ‪ :6.10‬فتح ّ‬

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


‫تُ�ص��تخدم االإحداثي��ات ثالثي��ة االأبع��اد ‪ X‬و‪ Y‬و‪ Z‬لتمثي��ل مو�ص��ع كائ��ن يف الف�ص��اء‪ ،‬حي��ث ُمي ِّث��ل ‪ X‬املح��ور االأفق��ي‪ ،‬و‪ Y‬املح��ور الراأ�ص��ي‪،‬‬
‫وخط الطول واالرتفاعات املُ�صتخدَمة لو�صف املواقع على االأر�ص‪.‬‬ ‫خلط العر�ص ّ‬ ‫و‪ Z‬حمور العمق‪ ،‬وتُ�صبه اإحداثيات الع ََامَل احلقيقي ّ‬
‫اآلنح��دار (‪ )Pitch‬واآللتف��اف (‪ )Roll‬واآلنع��راج (‪ )Yaw‬توجيه��ات دوراني��ة ُميك��ن ا�ص��تخدامُها لو�ص��ف حرك��ة كائ��ن ما بالن�ص��بة‬
‫الط��ار املرجع��ي كم��ا يظه��ر يف ال�ص��كل ‪ ،6.11‬فاآلنح��دار (‪ )Pitch‬ه��و دوران الكائ��ن ح��ول حم��وره ‪X‬؛ مم��ا يجعل��ه ميي��ل الأعل��ى اأو‬ ‫ل إ‬
‫الأ�ص��فل بالن�ص��بة للم�ص��توى االأفق��ي‪ ،‬اأم��ا اآللتف��اف (‪ )Roll‬فه��و دوران الكائ��ن ح��ول حموره ‪Y‬؛ مما يجعل اجل�ص��م ميي��ل جانبًا اأو من‬
‫جان��ب اإىل اآخ��ر‪ ،‬واآلنع��راج (‪ )Yaw‬ه��و دوران الكائ��ن ح��ول حم��وره ‪Z‬؛ مم��ا يجع��ل اجل�ص��م يلت��ف اإىل الي�ص��ار اأو اليم��ني بالن�ص��بة‬
‫لالإطار املرجعي‪.‬‬
‫ُميك�ن ا�ص�تخدام ه�ذه القي�م ال�ص�ت معً�ا (‪ ،X، Y، Z‬االنحدار‪،‬االلتف�اف‪ ،‬االنع�راج) لو�ص�ف مو�ص�ع كائ�ن يف الف�ص�اء ثالث�ي االأبع�اد‬
‫واجُتاهه‪ ،‬حيث ُت�صتخدم ب�صكل �صائع يف الروبوتات‪ ،‬واأنظمة املالحة‪ ،‬والتطبيقات االأخرى التي تتطلب حتديد املواقع والتحكم بدقة‪.‬‬ ‫ّ‬
‫‪318‬‬
‫حمور االنحدار‬ ‫ُ�سرية ‪Drone Devices‬‬
‫اأجهزة الطائرة امل َّ‬
‫ُ�صرة (‪ )Drone‬بعدة مُ�صت�صعرات‬ ‫مت جُتهيز الطائرة امل َّ‬
‫(‪ )Sensors‬تتيح لها اأن جُتمع املُدخَ الت من بيئتها‪ ،‬ويوفّر‬
‫املُحاكي الدّالتني()‪ getDevice‬و()‪ enable‬للتفاعل مع‬
‫املُ�صت�صعرات وامل ُ�صغِّالت (‪ )Actuators‬املختلفة لروبوت‬
‫املُحاكاة‪.‬‬
‫تُ�صتخدم دالة ()‪ getDevice‬للح�صول على قراءات جهاز‬
‫مثل‪ :‬املُ�صت�ص�عر اأواملُ�ص�غِّل من منوذج روبوت ويبوت�ص‪ ،‬وتاأخذ‬
‫وحتدد ا�صم اجلهاز املراد الو�صول اإليه‪.‬‬
‫ن�صيًّا ِّ‬ ‫ُم ِ‬
‫عام ًال ّ‬
‫تُ�ص�تخدم الدال�ة ()‪ enable‬لتن�ص�يط جه�از‪ ،‬بحي�ث ُميكن�ه‬
‫حمور االلتفاف‬ ‫حمور االنعراج‬ ‫البدء يف تقدمي البيانات اأو تنفيذ اإجراء حم َّدد‪.‬‬
‫�صكل ‪ :6.11‬حماور الدوران‬

‫ُميكن لوحدة القيا�ش بالق�صور الذاتي (‪)Inertial Measurement Unit - IMU‬‬ ‫وحدة القيا�ص بالق�صور‬
‫الكاميرا‬
‫قيا���ص الت�ص��ارع اخلط��يّ للطائ��رة املُ�ص� َّ�رة و�ص��رعتها الزاو ّي��ة‪ ،‬وقيا���ص الق��وى مث��ل‬ ‫(‪.)Camera‬‬ ‫الذاتي (‪.)IMU‬‬
‫اجلاذبي��ة‪ ،‬باالإ�صاف��ة اإىل ق��وى ال��دوران املوؤث��رة على الطائرة املُ�ص� َّ�رة‪ ،‬كما ُميكنها اأن‬
‫توف��ر معلوم��ات ع��ن و�ص��ع الطائ��رة املُ�ص� َّ�رة (االنح��دار‪ ،‬وااللتفاف‪ ،‬واالنع��راج)‪ ،‬وهو‬
‫اأمر بالغ االأهمية لتحقيق اال�صتقرار والتحكم‪.‬‬
‫نظ��ام حتدي��د املواق��ع العَا َمل��ي (‪ )Global Positioning System - GPS‬ه��و نظ��ام‬
‫مالح��ة يعتم��د عل��ى القم��ر ال�صناع��ي ويُوف��ر للطائ��رة املُ�ص� َّ�رة معلوم��ات دقيق��ة ع��ن‬
‫املواق��ع‪ ،‬ومي ِّك��ن نظ��ام حتدي��د املواق��ع العَاملَ ��ي الطائ��رة املُ�ص� َّ�رة م��ن معرف��ة موقعه��ا‬
‫احل��ايل وارتفاعه��ا و�ص��رعتها بالن�ص��بة اإىل االأر���ص‪ ،‬وه��ذه املعلوم��ات مهم��ة؛ للتنق��ل‬
‫ُ�صرة‪.‬‬
‫والتحكم يف الطائرة امل َّ‬
‫امل�صت�صعرات (‪ )Sensors‬هي اأجهزة تك�صف الكميات الفيزيائية اأ� اآلأحوال البيئية‬
‫�تقي�صها‪� ،‬حتوّلها اإىل اإ�صارة كهربائية للمراقبة اأ� التحكم‪.‬‬

‫امل�صغِّالت (‪ )Actuators‬هي اأجهزة حتوِّل اآلإ�صارات الكهربائية اإىل حركة ميكانيكية‬


‫معني اأ� ُم ِهمَّة معيّنة‪.‬‬
‫آلأداء عمل ّ‬

‫بينما تقي�ش ال�صرعة اخلطية امل�صافة التي يقطعها اجل�صم خالل الثانية‪ ،‬ف إا َّن �صرعة‬ ‫نظام تحديد‬
‫الزا�ية تقي�ش �صرعة د�ران اجل�صم حول نقطة مركزية اأ� ور‪ ،‬حيث تقي�ش مقدار‬ ‫المواقع العالمي‬ ‫الجيرو�صكوب‬
‫التغر يف الزا�ية املركزية جل�صم خالل �حدة الزمن‪� ،‬عاد ًة ما تُقا�ش بالراديان يف‬ ‫(‪.)GPS‬‬ ‫(‪.)Gyroscope‬‬
‫الثانية (‪ )rad/s‬اأ� الدرجات يف الثانية (‪.)° /s‬‬
‫ُ�صرة مبُ�صت�صعرات وكامرا‬
‫�صكل ‪:6.12‬طائرة م َّ‬

‫‪319‬‬
‫معني‪ ،‬و ُيع ُّد اجلرو�ص��كوب مفيدً ا‬ ‫اجلر��ص��كوب (‪ )Gyroscope‬ه��و م�صت�ص��عر يقي���ص ال�ص��رعة الزاو َّي��ة‪ ،‬اأو مع��دل ال��دوران ح��ول حم��ور ّ‬
‫ب�ص��كل خا���ص يف اكت�ص��اف التغ��رات ال�صغ��رة يف اجُت��اه الطائرة املُ�ص� َّ�رة وت�صحيحه��ا‪ ،‬وهو اأمر مهم للحفاظ على اال�ص��تقرار والتحكم‬
‫اأثناء الطران‪.‬‬
‫كام��را الطائ��رة امل ُ�ص� َّ�رة (‪ )Drone's Camera‬تُ�ص��تخدم اللتق��اط ال�ص��ور اأثن��اء الط��ران‪ُ ،‬وميك��ن تثبيته��ا عل��ى الطائ��رة املُ�ص� َّ�رة‪،‬‬
‫بحي��ث تتم ّك��ن م��ن التق��اط �ص��و ٍر م��ن جه��ات وزواي��ا خُمتلف��ة ع��ن طري��ق �صب��ط زاوي��ة انح��دار الكام��را (‪ )Camera Pitch‬با�ص��تخدام‬
‫الدالة ()‪ .setPosition‬ويف هذا امل�صروع‪�ُ ،‬صبط املو�صع على ‪ ،0.7‬اأي حوايل ‪ 45‬درجة بالنظر اإىل االأ�صفل‪.‬‬
‫المروحيات‬ ‫ُ�صرة هي مُ�صغِّالت تتحكم‬
‫اأجهزة املر�حيات اآلأربعة (‪ )Four Propeller‬يف الطائرة امل َّ‬
‫(‪.)Propellers‬‬ ‫�صرة‬ ‫م‬
‫ُ َّ‬ ‫طائرات‬ ‫وهي‬ ‫واجُتاهها‪،‬‬ ‫يف �صرعة دوران املر�حية الرباعية (‪)Quadcopter‬‬
‫ُجمهزة باأربعة د�َّارات (‪ ،)Rotors‬اثنان منهما يدوران يف اجُتاه عقارب ال�صاعة واالثنان‬
‫االآخران يدوران عك�ص اجُتاهها‪ ،‬حيث يولِّد دوَران هذه الد َّوارات قوة رفع (‪ )Lift‬وي�صمح‬
‫للطائرة املُ�ص َّ�رة باالإقالع واملناورة يف الهواء‪ .‬وكما هو احلال مع باقي االأجهزة‪ ،‬تُ�ص�رتد‬
‫املح�رِّكات وتو�ص�ع يف مو�صعه�ا‪ ،‬ولك�ن الدال�ة ()‪ُ setVelocity‬ت�ص�تخدم كذل�ك ل�صب�ط‬
‫ال�صرعة االأولية لالأجهزة املروحية‪.‬‬
‫ُ�صرة باأربع مروحيات‬
‫�صكل ‪ :6.13‬طائرة م َّ‬

‫نحو الهدف ‪Moving to a Target‬‬ ‫التحرُّ‬


‫لالنتق��ال م��ن موق��ع اإىل اآخ��ر‪ ،‬ت�ص��تخدِ م الطائرة املُ�ص� َّ�رة دالة ()‪ move_to_target‬التي حتت��وي على منطق التحكم‬
‫عامل‪ ،‬يف �صكل اأزواج [‪ ]X، Y‬؛ ال�صتخدامها كنقاط طريق‪.‬‬ ‫(‪ ،)Control Logic‬حيث تاأخذ قائمة االإحداثيات ك ُم ِ‬
‫يف البداي��ة‪ ،‬تتحق��ق الدال��ة ممّ ��ا اإذا ّمت��ت تهيئ��ة (‪ )Initialized‬مو�ص��ع امل�ص��تهدَف (‪ )Target Position‬اأم ال‪ ،‬ويف‬
‫تل��ك احلال��ة ت�صبط��ه عل��ى نقط��ة الطري��ق االأوىل‪ ،‬ث��م تتحق��ق مم��ا اإذا كان��ت الطائ��رة املُ�ص� َّ�رة ق��د و�صل��ت اإىل املو�ص��ع‬
‫امل�ص��تهدف بالدق��ة املُح� َّددة يف املُتغ� ِّ�ر ‪ .target_precision‬واإذا كان االأم��ر كذل��ك‪ ،‬تنتق��ل الدال��ة اإىل نقط��ة الطري��ق‬
‫امل�صتهدفة التالية‪.‬‬
‫ويج��ب ح�ص��اب الزاوي��ة ب��ني املو�ص��ع احل��ايل للطائ��رة املُ�ص� َّ�رة ومو�صعها امل�ص��تهدف؛ ملعرفة مدى قوة ال��دوران التي يجب‬
‫اأن تكون عليه يف اخلطوة التالية‪ ،‬حيث متت معايرة هذه القيمة و�صبطها على النطاق [‪.]-ʋ͕ ʋ‬‬
‫وبع��د ذل��ك‪ ،‬تق��وم الدال��ة بح�ص��اب ا�صطراب��ات االنع��راج واالنحدار املطلوبة لتوجيه الطائرة املُ�ص� َّ�رة نح��و نقطة الطريق‬
‫ُ�صرة على التوايل‪.‬‬
‫امل�صتهدفة و�صبط زاوية انحدار الطائرة امل َّ‬
‫ح�سابات املحرِّ كات ‪Motor Calculations‬‬
‫اأخرًا‪ ،‬يجب ح�ص��اب ال�ص��رعة التي ت�صبط بها املحرِّكات (‪ ،)Motors‬وذلك بقراءة القيم املبدئية لل ُم�صت�ص��عرات ‪ ،‬اأي‬
‫ق��راءة‪ :‬قي��م االلتف��اف واالنح��دار‪ ،‬واالنع��راج م��ن وح��دة القيا���ص بالق�ص��ور الذاتي‪ ،‬ويت��م احل�صول على قي��م موا�صع ‪ X‬و‬
‫‪ Y‬و‪ Z‬من نظام حتديد املواقع العَاملَ ي‪ ،‬بينما يتم احل�صول على قيم ت�صارع االلتفاف واالنحدار من اجلرو�صكوب‪.‬‬
‫ويت��م ا�ص��تخدام الثواب��ت (‪ )Constants‬املختلف��ة الت��ي مت تعريفه��ا يف املقط��ع الربجم��ي م�ص��بقًا الإج��راء احل�ص��ابات‬
‫دخالت املُ�صت�صعرات‪ ،‬ويف النهاية يتم �صبط الدفع (‪ )Thrust‬ال�صحيح‪.‬‬ ‫والتعديالت بالتزامن مع ُم َ‬
‫معلومة‬
‫ميكن للمر�حية اأن تتحرك يف اأي اجتاه �اأن ُحتاف على طرانها مُ�صتقرًا من خالل التحكّم يف �صرعة‬
‫�اجتاهها‪ ،‬فعلى �صبيل املثال‪ ،‬عند زيادة �صرعة الد�َّارين املوجودين على جانب �احد‬‫املر�حيات اآلأربع ّ‬
‫معني‪.‬‬
‫ُ�صرة با�صتطاعتها امليالن �التحرك يف اجتاه ّ‬
‫�تقليل �صرعة الد�َّارين اآلآخرين‪ ،‬فاإن الطائرة امل َّ‬

‫‪320‬‬
from controller import Robot
import numpy as np # used for mathematic operations
import os # used for folder creation
import cv2 # used for image manipulation and human detection ‫تحتوي مكتبة برنامج المُتحكِّم على‬
from PIL import Image # used for image object creation ‫ (روبوت) التي �صتُ�صتخدم‬Robot ‫فئة‬
from datetime import datetime # used for date and time .‫طرائقها للتحكم في الطائرة المُ�صيَّرة‬
# auxiliary function used for calculations
def clamp(value, value_min, value_max):
return min(max(value, value_min), value_max)

class Mavic (Robot):


‫ا�صتيراد المكتبات المطلوبة‬
.‫للح�صابات والمعالجة‬
# constants of the drone used for flight
# thrust for the drone to lift
K_VERTICAL_THRUST = 68.5
# vertical offset the drone uses as targets for stabilization
K_VERTICAL_OFFSET = 0.6
K_VERTICAL_P = 3.0 # P constant of the vertical PID )Constants( ‫تُ�صتخدم الثوابت‬
K_ROLL_P = 50.0 # P constant of the roll PID
K_PITCH_P = 30.0 # P constant of the pitch PID ‫الموجودة ب�صكل تجريبي لح�صاب‬
.‫الطيران واال�صتقرار‬
MAX_YAW_DISTURBANCE = 0.4
MAX_PITCH_DISTURBANCE = -1
# precision between the target position and the drone position in meters
target_precision = 0.5

def __init__(self):
# initializes the drone and sets the time interval between updates of the simulation
Robot.__init__(self)
self.time_step = int(self.getBasicTimeStep())

# gets and enables devices


self.camera = self.getDevice("camera")
self.camera.enable(self.time_step)

self.imu = self.getDevice("inertial unit")


self.imu.enable(self.time_step)

self.gps = self.getDevice("gps")
self.gps.enable(self.time_step)

self.gyro = self.getDevice("gyro")
self.gyro.enable(self.time_step)

self.camera_pitch_motor = self.getDevice("camera pitch")


self.camera_pitch_motor.setPosition(0.7)

self.front_left_motor = self.getDevice("front left propeller")


self.front_right_motor = self.getDevice("front right propeller")
self.rear_left_motor = self.getDevice("rear left propeller")
self.rear_right_motor = self.getDevice("rear right propeller")
motors = [self.front_left_motor, self.front_right_motor,
self.rear_left_motor, self.rear_right_motor]
for motor in motors: # mass initialization of the four motors
motor.setPosition(float('inf'))
motor.setVelocity(1)

321
self.current_pose = 6 * [0] # X, Y, Z, yaw, pitch, roll
self.target_position = [0, 0, 0] ‫) ودورانه‬x، y، z( ‫تهيئة مو�صع المُ�صيَّرة‬
self.target_index = 0 .)‫ االنعراج‬،‫ االنحدار‬،‫(االلتفاف‬
self.target_altitude = 0

def move_to_target(self, waypoints):

# Moves the drone to the given coordinates


# Parameters:
# waypoints (list): list of X,Y coordinates
# Returns:
# yaw_disturbance (float): yaw disturbance (negative value to go on the right)
# pitch_disturbance (float): pitch disturbance (negative value to go forward)

if self.target_position[0:2] == [0, 0]: # initialization


self.target_position[0:2] = waypoints[0]

# if the drone is at the position with a precision of target_precision


if all([abs(x1 - x2) < self.target_precision for (x1, x2)
in zip(self.target_position, self.current_pose[0:2])]):

self.target_index += 1
if self.target_index > len(waypoints) - 1:
self.target_index = 0
self.target_position[0:2] = waypoints[self.target_index]

# computes the angle between the current position of the drone and its target position
# and normalizes the resulting angle to be within the range of [-pi, pi]
self.target_position[2] = np.arctan2(
self.target_position[1] - self.current_pose[1],
self.target_position[0] - self.current_pose[0])
angle_left = self.target_position[2] - self.current_pose[5]
angle_left = (angle_left + 2 * np.pi) % (2 * np.pi)
if (angle_left > np.pi):
angle_left -= 2 * np.pi

# turns the drone to the left or to the right according to the value
# and the sign of angle_left and adjusts pitch_disturbance
yaw_disturbance = self.MAX_YAW_DISTURBANCE * angle_left / (2 * np.pi)
pitch_disturbance = clamp(
np.log10(abs(angle_left)), self.MAX_PITCH_DISTURBANCE, 0.1)

return yaw_disturbance, pitch_disturbance

def run(self):

# time intevals used for adjustments in order to reach the target altitude
t1 = self.getTime()

roll_disturbance = 0
pitch_disturbance = 0
yaw_disturbance = 0

322
# specifies the patrol coordinates
waypoints = [[-30, 20], [-60, 30], [-75, 0], [-40, -10]]
# target altitude of the drone in meters
self.target_altitude = 8
)‫ (نقاط الطريق‬waypoints
while self.step(self.time_step) != -1: ‫الخا�صة بالم�صار الذي �صتطير‬
# reads sensors .‫فيه الطائرة المُ�صيَّرة‬
roll, pitch, yaw = self.imu.getRollPitchYaw()
x_pos, y_pos, altitude = self.gps.getValues()
roll_acceleration, pitch_acceleration, _ = self.gyro.getValues()
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(
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)
vertical_input = self.K_VERTICAL_P *
pow(clamped_difference_altitude, 3.0)

# calculates the motors' input values based on the


# 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
+ 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()
robot.run()

323
‫ُ�صرة وت�صغيل املُحاكاة‪:‬‬
‫الن�ص الربجمي يف الطائرة امل َّ‬
‫حان الوقت االآن الإدراج ّ‬
‫ألإدراج برنامج املُتحكِّم وت�سغيل املُحاكاة‪:‬‬
‫ثم ا�صغط‬ ‫‪1‬‬‫ من ‪�( Scene tree‬صجرة امل�صهد)‪ ،‬ا�صغط على "‪،Mavic2Pro "Mavic 2 Pro‬‬
‫على "‪2 .controller "mavic2pro‬‬

‫عند اإجراء تغيرات‬ ‫(حمرِّر احلقل)‪ ،‬ا�صغط على ‪( Select ...‬اختيار)‪3 .‬‬ ‫ من ‪ُ Field editor‬‬
‫على الن�صو�ش‬ ‫ُ�صرة)‪ 4 ،‬ثم ا�صغط على ‪( OK‬موافق)‪5 .‬‬‫ حدِّ د ‪( drone_controller‬مُتحكِّم_الطائرة امل َّ‬
‫تن�ش اأن‬
‫الربجمية‪ ،‬آل َ‬
‫ت�صغط على ‪.Ctrl S‬‬ ‫ من ‪�( Toolbar‬صريط االأدوات)‪ ،‬ا�صغط على ‪�( Run the simulation in real-time‬صغّل‬
‫املحاكاة ب�صكل فوري)‪6 .‬‬

‫‪6‬‬

‫‪4‬‬

‫‪1‬‬ ‫‪5‬‬

‫‪2‬‬

‫‪3‬‬

‫الن�ص الربجمي لربنامج املُتحكِّم وت�صغيل املُحاكاة‬


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

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


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

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

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

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

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

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

‫‪ 5‬ج �رِّب ا�ص��تخدام قي��م خُمتلف��ة لثواب��ت ‪ PID‬يف برنام��ج امل ُتح ِّك��م (‪.)K_VERTICAL_P، K_ROLL_P، K_PITCH_P‬‬
‫�آلح� كيفي��ة تاأث��ر ه��ذا التغ��رات عل��ى ا�ص��تقرار الطائ��رة امل ُ�ص� َّ�رة �ا�ص��تجابتها‪ ،‬ث��م ناق���ش املوازن��ات ب��ني اآل�ص��تقرار‬
‫�اآل�صتجابة‪.‬‬

‫‪327‬‬
‫الدر�ص الثالث‬
‫التطبيقات الروبوتية ‪2‬‬

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


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

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

‫‪328‬‬
‫ُ�صرة‪.‬‬
‫لن�صتعر�ص التغيرات التي �صتُجريها الإ�صافة وظائف روؤية احلا�صب للطائرة امل َّ‬
‫سافة املوؤقِّ ت ‪Adding a Timer‬‬ ‫اإ‬
‫ُميك��ن اأن يك��ون التق��اط �ص��ورة ومعاجلته��ا وحفظه��ا مكل ًف��ا م��ن الناحي��ة احلا�ص��وبية اإذا ُح�ص��ب ل��كل اإط��ار م��ن اإط��ارات‬
‫خم�ص ثوانٍ فقط‪.‬‬ ‫املُحاكاة‪ ،‬ولذلك �صت�صيف موؤ ِّقتًا زمنيًا ال�صتخدامه؛ لتنفيذ هذه االإجراءات كل ِ‬
‫‪# time intervals used for adjustments in order to reach the target altitude‬‬
‫)(‪t1 = self.getTime‬‬
‫‪# time intervals between each detection for human figures‬‬
‫)(‪t2 = self.getTime‬‬

‫لد ‪Creating a Folder‬‬ ‫اإن�ساء‬


‫�ص��يتم حفظ ال�صور املُلتَقطة التي يتم فيها اكت�ص��اف ال�صّ ��خو�ص الب�ص��رية يف جملد‪ ،‬حيث يُع ّد جزءًا من اأر�ص��يف املراقبة‬
‫االأمنية الذي �صي�صاعد على فح�ص ال�صور يف امل�صتقبل‪.‬‬
‫ا ًأوال‪ :‬علي��ك اأن ت�ص� ِ‬
‫�تخدم الدال��ة ) (‪ getcwd‬لت�ص��رتد م�ص��ار دلي��ل العم��ل احل��ايل لربنام��ج املُتح ِّك��م (وه��و املجل��د ال��ذي‬
‫يت�ص ّم��ن برنام��ج املُتح ِّك��م) حت��ى يتع��رف الربنام��ج عل��ى امل��كان ال��ذي ي�ص��ع في��ه املجل��د اجلدي��د با�ص��م‪( detected :‬مت‬
‫الن�صي��ة‪ ،‬وتتم ّث��ل اخلط��وة‬
‫االكت�ص��اف)‪ ،‬بحي��ث تُ�ص��تخدم الدال��ة ) (‪ path.join‬لرب��ط ا�ص��م امل�ص��ار ب�صل�ص��لة ا�ص��م املجل��د ّ‬
‫االأخرة يف التحقق مما اإذا كان املجلد موجودًا بالفعل اأم ال‪ ،‬ويف تلك احلالة يتم اإن�صاء جملد جديد‪.‬‬
‫‪# gets the current working directory‬‬
‫)(‪cwd = os.getcwd‬‬
‫‪# sets the name of the folder where the images‬‬
‫‪# with detected humans will be stored‬‬
‫"‪folder_name = "detected‬‬
‫‪# joins the current working directory and the new folder name‬‬
‫)‪folder_path = os.path.join(cwd, folder_name‬‬

‫‪if not os.path.exists(folder_path):‬‬


‫‪# creates the folder if it doesn't exist already‬‬
‫)‪os.makedirs(folder_path‬‬
‫)"!‪print(f"Folder \"detected\" created‬‬
‫‪else:‬‬
‫)"!‪print(f"Folder \"detected\" already exists‬‬

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


‫يف ه��ذا التوقي��ت ميكن��ك االآن ا�ص��رتداد (ق��راءة) ال�ص��ورة م��ن اجله��از ملعاجلته��ا قب��ل حماول��ة الك�ص��ف‪ .‬الح��ظ اأن كل‬
‫�وال اإىل حفظه ��ا يح ��دث كل خم� � ِ�ص ث ��وانٍ فق ��ط‪ ،‬كم ��ا ه ��و مب � َّ�ني يف ال�ص ��رط‬
‫م ��ا يتعل ��ق مبعاجل ��ة ال�ص ��ورة و�ص � ً‬
‫"‪."self.getTime)( - t2> 5.0‬‬
‫‪# initiates the image processing and detection routine every 5 seconds‬‬
‫‪if self.getTime() - t2 > 5.0:‬‬

‫‪# retrieves image array from camera‬‬


‫)(‪cameraImg = self.camera.getImageArray‬‬

‫‪329‬‬
‫بعد التحقق من ا�صرتداد ال�صورة بنجاح‪ ،‬تنتقل اخلوارزم ّية اإىل تعديل بع�ص خ�صائ�صها‪ ،‬بحيث تكون ال�صورة ثالثية‬
‫االأبعاد‪ ،‬ولها اأبعاد طول وعر�ص وقنوات األوان‪ ،‬حيث تلتقط كامرا الطائرة املُ�ص َّ�رة �صورًا بارتفاع ‪ 240‬بك�ص�ل وعر�ص‬
‫ت�صتخدم ‪ 3‬قنوات األوان حلفظ معلومات ال�صورة وهي‪ :‬االأحمر واالأخ�صر واالأزرق‪.‬‬ ‫ِ‬ ‫‪ 400‬بك�صل‪ ،‬كما اأنها‬
‫يج�ب معاجل�ة ال�ص�ورة ا ًأوال حت�ى يت�م ا�ص�تخدامها يف الك�ص�ف‪ ،‬ولك�ي يت�م تطبيق الدوال ب�ص�كل �صحي�ح يف وقت الحق‪ ،‬ال‬
‫ُب ّد اأن حتقق ال�صورة تركي ًبا مع ّينًا‪ .‬يف هذا املثال‪ ،‬يجب اأن يتغر ت�صل�صل االأبعاد من (الطول‪ ،‬والعر�ص‪ ،‬وقنوات االألوان)‬
‫اإىل (قنوات االألوان‪ ،‬والطول‪ ،‬والعر�ص) با�صتخدام الدالة ()‪ ،transpose‬حيث تُقدَّم �صورة الكامرا (‪،)CameraImg‬‬
‫عامالت لهذه الدالة‪ ،‬بافرتا�ص اأن الرتتيب االأ�صلي كان (‪.)0 ،1 ،2‬‬ ‫والت�صل�صل اجلديد (‪ )2 ،0 ،1‬ك ُم ِ‬
‫كم��ا يج��ب تعدي��ل اأحج��ام االأبع��اد بع��د تغي��ر الت�صل�ص��ل‪ ،‬حي��ث تُ�ص��تخدم الدال��ة ()‪ reshape‬بالطريق��ة نف�ص��ها‪ ،‬ولك��ن‬
‫عامل الثاين منها تكون (‪.)3 ،240 ،400‬‬ ‫اأحجام االأبعاد املعنيّة كاملُ ِ‬

‫‪# reshapes image array to (channels, height, width) format‬‬


‫))‪cameraImg = np.transpose(cameraImg, (2, 0, 1‬‬
‫))‪cameraImg = np.reshape(cameraImg, (3, 240, 400‬‬

‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬

‫الطول ‪240‬‬ ‫العر�ش ‪400‬‬ ‫قنوات اآلألوان ‪3‬‬

‫قنوات اآلألوان ‪3‬‬ ‫الطول ‪240‬‬ ‫العر�ش ‪400‬‬

‫‪2‬‬ ‫‪0‬‬ ‫‪1‬‬

‫�صكل ‪ :6.17‬تغير ت�صل�صل االأبعاد‬

‫م�صفوفة ‪RGB‬‬ ‫�صورة ملونة اأ�صلية‬


‫‪240‬‬
‫‪240‬‬

‫الطول‬
‫‪400‬‬
‫‪3‬‬

‫‪400‬‬
‫قنوات اآلألوان‬ ‫العر�ش‬
‫�صكل ‪ :6.18‬اأبعاد ال�صورة‬
‫‪330‬‬
‫بعد ذلك‪ ،‬يجب تغيري ال�صورة اإىل التدرج الرمادي حيث اأن األكت�ص��اف ي�ص��تلزم ذلك‪ ،‬مع وجوب تخزينها ا ًأوأل يف كائن‬
‫�صورة ووجوب اجلمع بن قنوات األوانها الثالثة‪ ،‬وهنا يجب دمج قنوات األألوان وتخزينها با�صتخدام الدالة ()‪merge‬‬
‫�دأل م��ن (اأحم��ر‪ ،‬اأخ�ص��ر‪ ،‬اأزرق)‪ ،‬واأن يك��ون‬
‫يف ت�صل�ص��ل عك�ص��ي‪ :‬اأي اأن يك��ون ت�صل�ص��ل األأل��وان (اأزرق‪ ،‬اأخ�ص��ر‪ ،‬اأحم��ر) ب� ً‬
‫بدأل من (‪ )0 ،1 ،2‬على الرتتيب‪.‬‬ ‫ت�صل�صلها الرقمي (‪ً )2 ،1 ،0‬‬
‫‪# creates RGB image from merged channels‬‬
‫))‪img = Image.new('RGB', (400, 240‬‬
‫))]‪img = cv2.merge((cameraImg[2], cameraImg[1], cameraImg[0‬‬

‫واأخ �ريًا‪ ،‬يت��م حتوي��ل ال�ص��ورة اإىل الت��درج الرم��ادي با�ص��تخدام الدال��ة ()‪ cvtColor‬الت��ي ت�ص� ِ‬
‫�تخدم ُم ِ‬
‫عام��ل‬
‫‪ COLOR_BGR2GRAY‬لتغيري األألوان من األأزرق واألأخ�صر واألأحمر اإىل التدرج الرمادي‪.‬‬
‫‪# converts image to grayscale‬‬
‫)‪gray = cv2.cvtColor(np.uint8(img), cv2.COLOR_BGR2GRAY‬‬

‫‪Human Silhouette Detection‬‬ ‫اكت�صاف �صور احلدود الب�صرية‬


‫لك�ي تكت�ص�ف ال�ص�ورة‪ ،‬علي�ك اأن ت�ص�تخدِ م م�س ِّن�ف ه�ار كا�س�كيد (‪ ،)Haar Cascade Classifier‬وه�و خوارزم ّي�ة‬
‫ألكت�ص�اف الكائن�ات تعتم�د عل�ى تعلُّ�م األآل�ة‪ ،‬وتُ�ص�تخدم لتحديد الكائن�ات يف ال�صور اأو مقاطع الفيديو‪ .‬وأل�ص�تخدام هذا‬
‫املُ�صنِّف حتتاج اأن تُدرِّب منوذج تعلُّم األآلة على جمموعة من ال�صور التي حتتوي على الكائن الذي تريد البحث عنه‪،‬‬
‫وعل�ى �ص�ور اأخ�رى أل حتت�وي عل�ى ه�ذا الكائ�ن‪ ،‬حي�ث تق�وم اخلوارزم ّي�ة بالبح�ث ع�ن اأمناط مع ّين�ة يف ال�ص�ور لتحديد‬
‫م�كان الكائ�ن‪ .‬ويف الع�ادة تُ�ص�تخدم ه�ذه اخلوارزم ّي�ة للعث�ور على اأ�ص�ياء حم َّددة مثل‪ :‬الوجوه‪ ،‬اأو اأ�ص�خا�ص ي�ص�ريون يف‬
‫مقط�ع فيدي�و‪ .‬وم�ع ذل�ك ق�د أل تعم�ل ه�ذه اخلوارزم ّي�ة ب�ص�كل جي�د يف بع��ص املواق�ف الت�ي يك�ون فيه�ا الكائ�ن حمجوبً�ا‬
‫خا�ص�ا عل�ى اكت�ص�اف الب�ص�ر‪،‬‬ ‫معر�ص�ا ألإ�ص�اءة منخف�ص�ة‪ .‬مت تدري�ب امل�صنِّ�ف يف م�ص�روعك تدريبً�ا ًّ‬
‫جزئ ًّي�ا اأو كل ًّي�ا اأو ً‬
‫وعلي�ك اأن ت�ص�تخدِ م مل�ف ‪ haarcascade_fullbody.xml‬ال�ذي �ص�تُزود ب�ه‪ ،‬وه�و من�وذج تعلُّ�م آال�ة مُ�درَّب م�ص�بقًا‬
‫وي�ص�كِّل ج�زءًا م�ن مكتب�ة اأوب�ن �س�ي يف (‪ ،)OpenCV‬و ُيق� َّدم كمُعامِ �ل لكائ�ن ()‪ ،CascadeClassifier‬ث�م تَ�ص�تخدم‬
‫الدالة ()‪ detectMultiScale‬للقيام بعملية األكت�ص�اف‪.‬‬
‫‪# loads and applies the Haar cascade classifier to detect humans in image‬‬
‫)'‪human_cascade = cv2.CascadeClassifier('haarcascade_fullbody.xml‬‬
‫)‪humans = human_cascade.detectMultiScale(gray‬‬

‫�سورة احلدود امل�ستخرجة‬ ‫ال�سورة األأ�سلية‬

‫‪331‬‬ ‫�صكل ‪ :6.19‬مثال على اإكت�صاف �صور احلدود الب�صرية‬


‫ُ�صرية وحفظ ال�صور املُكت�صَ فة‬
‫تقرير الطائرة امل َّ‬
‫(‪)x, y‬‬ ‫‪Drone Report and Saving of the Detected Images‬‬
‫األإ�صاف��ة النهائي��ة لرنام��ج املُتح ِّك��م اخلا���ص ب��ك ه��و نظ��ام تقري��ر‬
‫ُقدمه الطائرة املُ�ص� َّ�رية عن طريق طباعة ر�ص��الة على وحدة‬ ‫ب�ص��يط ت ِّ‬
‫التحك��م (‪ )Console‬عن��د اكت�ص��اف �ص��كل ب�ص��ري‪ ،‬وحف��ظ ال�ص��ورة‬
‫يف املجلد الذي اأن�صاأتَه من قبل‪.‬‬
‫يق��وم املُتغ� ِّ�ري ‪( humans‬الب�ص��ر) بحم��ل امل�ص��تطيالت األإطاري��ة‬
‫التي ُيكت�صف الب�صر بداخلها يف حال ُعرث عليهم‪ُ .‬تع َّرف امل�صتطيالت‬
‫‪h‬‬

‫تغريات‪ :‬وهي الزوج ‪ x‬و ‪ y‬اللذان مُيثِّالن األإحداثين‬ ‫بوا�صطة اأربعة ُم ِّ‬
‫اللذي��ن يف ال�ص��ورة وذل��ك يف الزاوي��ة العُلي��ا م��ن اجله��ة اليُ�ص��رى‬
‫للم�ص��تطيل‪ ،‬وكذل��ك ال��زوج ‪ w‬و ‪ ،h‬ال��ذي مُي ِّث��ل عر���ص امل�ص��تطيل‬
‫وارتفاع��ه‪ .‬يف جمي��ع األكت�ص��افات املوج��ودة يف ال�ص��ورة ُحت� ِّ�دد الدال��ة‬
‫()‪ rectangle‬الب�ص��ر مب�ص��تطيل اأزرق‪ ،‬حي��ث تنظ��ر الدال��ة اإىل‬
‫مُتغ� ِّ�ريات ال�ص��ورة عل��ى اأنه��ا تتم ّث��ل يف الزاوي��ة الي�ص��رى العُلوي��ة‬
‫(‪)x+w, y+h‬‬ ‫ال�ص��فلية (‪ )x+w، y+h‬م��ن امل�ص��تطيل‪،‬‬ ‫(‪ )x، y‬والزاوي��ة اليمن��ى ُ‬
‫‪w‬‬ ‫املو�صح��ة تالح��ظ اأن ل��ون‬ ‫ول��ون امل�ص��تطيل وعر�ص��ه‪ ،‬ويف ال�ص��ورة َّ‬
‫امل�صتطيل اأزرق (‪ )B=255، G=0، R=0‬وعر�صه ‪.2‬‬
‫ُتغريات امل�صتطيل‬
‫�صكل ‪ :6.20‬م ِّ‬ ‫�صيقوم نظام التقرير با�صرتجاع التاريخ والوقت احلالين با�صتخدام‬
‫الدال��ة ) (‪ datetime.now‬وطباعته��ا عل��ى وح��دة التحك��م‪ ،‬باألإ�صاف��ة اإىل اإحداثي��ات الطائ��رة املُ�ص� َّ�رية يف وق��ت التقري��ر‪ ،‬ويت��م‬
‫ال�ص��فلية (_) أل�ص��تخدامها‬ ‫تعديل تن�ص��يق التاريخ والوقت بطريقة ب�ص��يطة عن طريق اإدراج ال�ص��رطات العُلوية (‪ )-‬وال�ص��رطات ُ‬
‫كج��زء م��ن ا�ص��م املل��ف املحف��وظ‪ ،‬ث��م يت��م حفظه��ا يف املجلد با�ص��تخدام الدال��ة ) (‪ ،imwrite‬وعند اكتمال كل �ص��يء تقوم الدالة‬
‫) (‪ getTime‬باإعادة �صبط املوؤقِّت‪.‬‬
‫‪# loop, through detected human images, annotates them with a bounding box‬‬
‫‪# and prints a timestamp and an info message on the console‬‬
‫‪for (x, y, w, h) in humans:‬‬

‫‪# the image, the top left corner, the bottom right corner, color and width of the rectangle‬‬
‫)‪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‬‬
:‫ اخلا�صة برنامج املُتحكِّم كما يلي‬run)( ‫بعد اإ�صافة كل هذه الوظائف يجب اأن تظهر الدالة‬

def run(self):

# time intervals used for adjustments in order to reach the target altitude
t1 = self.getTime()
# time intervals between each detection for human figures
t2 = self.getTime()

roll_disturbance = 0
pitch_disturbance = 0
yaw_disturbance = 0

# specifies the patrol coordinates


waypoints = [[-30, 20], [-60, 30], [-75, 0], [-40, -10]]
# target altitude of the drone in meters
self.target_altitude = 8

# gets the current working directory


cwd = os.getcwd()
# sets the name of the folder where the images
# with detected humans will be stored
folder_name = "detected"
# joins the current working directory and the new folder name
folder_path = os.path.join(cwd, folder_name)

if not os.path.exists(folder_path):
# creates the folder if it doesn't exist already
os.makedirs(folder_path)
print(f"Folder \"detected\" created!")
else:
print(f"Folder \"detected\" already exists!")

while self.step(self.time_step) != -1:

# reads sensors
roll, pitch, yaw = self.imu.getRollPitchYaw()
x_pos, y_pos, altitude = self.gps.getValues()
roll_acceleration, pitch_acceleration, _ = self.gyro.getValues()
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(
waypoints)
t1 = self.getTime()

# initiates the image processing and detection routine every 5 seconds


if self.getTime() - t2 > 5.0:

# retrieves image array from camera


cameraImg = self.camera.getImageArray()

# checks if image is successfully retrieved


if cameraImg:

333
# reshapes image array to (channels, height, width) format
cameraImg = np.transpose(cameraImg, (2, 0, 1))
cameraImg = np.reshape(cameraImg, (3, 240, 400))

# creates RGB image from merged channels


img = Image.new('RGB', (400, 240))
img = cv2.merge((cameraImg[2], cameraImg[1], cameraImg[0]))

# converts image to grayscale


gray = cv2.cvtColor(np.uint8(img), cv2.COLOR_BGR2GRAY)

# loads and applies the Haar cascade classifier to detect humans in image
human_cascade = cv2.CascadeClassifier('haarcascade_fullbody.xml')
humans = human_cascade.detectMultiScale(gray)

# loop, through detected human images, annotates them with a bounding box
# and prints a timestamp and an info message on the console
for (x, y, w, h) in humans:

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()

# 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)
vertical_input = self.K_VERTICAL_P * pow(clamped_difference_altitude, 3.0)

# calculates the motors' input values based on the 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 + 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)

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

‫�صكل ‪:6.21‬‬

‫تم اإن�صاء المجلد‪.‬‬

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

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

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

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

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

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

‫‪337‬‬
‫الم�صروع‬

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

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

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

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

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

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


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

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

‫اأخاًلقيات الذكاء‬ ‫‪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