📄 النص الكامل للصفحة
--- 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 فقط.
تلميح: تذكر أن قيمة الوزن تعكس التكلفة أو الأولوية. قيمة أعلى تعني تكلفة أعلى.