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

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

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

الدرس: تحليل خوارزمية البحث بأولوية الاتساع الموزون

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

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

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

نوع المحتوى: درس تعليمي

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

📝 ملخص الصفحة

تقدم هذه الصفحة شرحًا تفصيليًا لتنفيذ خوارزمية البحث بأولوية الاتساع الموزون (Weighted BFS) لحل المتاهات باستخدام لغة بايثون. يبدأ المحتوى بشرح دالة `neighbors` التي تحدد الخلايا المجاورة للخلية الحالية في المتاهة، مع تمييز بين الحركات الأفقية/الرأسية والحركات القطرية من خلال أوزان مختلفة.

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

يتضمن القسم التطبيقي كود برمجي يوضح استخدام الدالة `bfs_maze_solver` مع معلمات محددة مثل الخلية البداية `(2,0)` والخلية الهدف `(1,2)` في متاهة صغيرة، مع تمرير دالة الجوار الموزونة. النتائج تُظهر المسار الأقصر المكون من 4 خلايا بمسافة إجمالية 7 وعدد زيارات الخلايا 6، مما يبرز كفاءة الخوارزمية في إيجاد الحلول المثلى في بيئات موزونة.

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

--- SECTION: دالة neighbors --- 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+1,y), (x,y+1)]: # 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)، فإن النتائج ستكون كما يلي:--- SECTION: تنفيذ خوارزمية البحث بأولوية الاتساع الموزون --- 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)--- SECTION: النتائج --- Shortest Path: [(2, 0), (1, 0), (0, 1), (1, 2)] Cells on the Shortest Path: 4 Shortest Path Distance: 7 Number of cell visits: 62023 - 1447--- VISUAL CONTEXT ---X-axis: EMPTY Y-axis: EMPTY Data: EMPTY Context: Indicates the source or publisher of the educational material.

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

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

ما هي وظيفة الدالة `neighbors` في سياق البحث في الشبكات (مثل المتاهات)؟

الإجابة: تحدد الدالة `neighbors` جميع الخلايا المجاورة (الأفقية، الرأسية، والقطرية) لخلايا معينة، مع الأخذ في الاعتبار الأوزان المخصصة لأنواع مختلفة من الحركات (أفقية/رأسية مقابل قطرية).

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

تلميح: فكر في الغرض من إيجاد الخلايا القريبة من الخلية الحالية في خوارزميات البحث.

ما الفرق الرئيسي بين الأوزان المخصصة للحركات الأفقية/الرأسية والحركات القطرية في الدالة `get_accessible_neighbors_weighted`؟

الإجابة: الحركات الأفقية والرأسية لها وزن مخصص واحد (`horizontal_vertical_weight`)، بينما الحركات القطرية لها وزن مخصص مختلف (`diagonal_weight`). هذا يسمح بتخصيص تكلفة مختلفة لكل نوع من أنواع الانتقال.

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

تلميح: لاحظ كيف يتم استخدام متغيرين مختلفين لتحديد تكلفة الحركات.

ما هو الهدف من استخدام `functools.partial` عند استدعاء `bfs_maze_solver`؟

الإجابة: يُستخدم `functools.partial` لتثبيت بعض وسائط الدالة `get_accessible_neighbors_weighted` (وهي `horizontal_vertical_weight` و `diagonal_weight`)، مما يسمح بتمرير دالة مخصصة تحتوي بالفعل على هذه الأوزان إلى `bfs_maze_solver`.

الشرح: بدلاً من تمرير جميع الوسائط بشكل متكرر، يقوم `partial` بإنشاء نسخة جديدة من الدالة مع وسائط ثابتة محددة مسبقًا. هذا يجعل الكود أكثر نظافة وقابلية للقراءة، خاصة عند استخدام دوال تتطلب العديد من الوسائط.

تلميح: فكر في كيفية تبسيط تمرير الوسائط المعقدة إلى الدوال.

ما هي النتائج التي تم الحصول عليها من تنفيذ خوارزمية البحث بأولوية الاتساع الموزون (Weighted BFS) في المثال المقدم؟

الإجابة: المسار الأقصر هو `[(2, 0), (1, 0), (0, 1), (1, 2)]`، ويحتوي على 4 خلايا. المسافة الإجمالية لهذا المسار هي 7، وتم زيارة 620 خلية أثناء البحث.

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

تلميح: راجع قسم 'النتائج' في النص المقدم.

كيف تؤثر قيمة `diag_w=3` مقارنة بـ `horz_vert_w=1` على طول المسار في خوارزمية البحث؟

الإجابة: القيمة الأعلى لـ `diag_w` (3) تعني أن الحركة القطرية أكثر تكلفة من الحركة الأفقية أو الرأسية (1). لذلك، ستحاول الخوارزمية تجنب المسارات القطرية قدر الإمكان لتفضيل المسارات التي تعتمد على الحركات الأفقية والرأسية، حتى لو بدت أطول من حيث عدد الخلايا.

الشرح: هذا يؤثر مباشرة على حساب 'المسافة' الإجمالية. في المثال، على الرغم من أن المسار المذكور يحتوي على 4 خلايا، إلا أن المسافة الموزونة هي 7، مما يشير إلى أن الخوارزمية قد اتخذت مسارات أفقية ورأسية لتجنب الحركة القطرية المكلفة. على سبيل المثال، الانتقال من (2,0) إلى (1,0) بتكلفة 1، ثم (1,0) إلى (0,1) بتكلفة 3، ثم (0,1) إلى (1,2) بتكلفة 3، المجموع 7. لو كانت الحركة القطرية من (2,0) إلى (1,2) مباشرة، فقد تكون تكلفتها 3 فقط.

تلميح: تذكر أن قيمة الوزن تعكس التكلفة أو الأولوية. قيمة أعلى تعني تكلفة أعلى.