📄 النص الكامل للصفحة
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وكما الحال في الدالة bfs_maze_solver()، تُستخدم الدالة الموضحة بالأعلى كذلك القاموسين shortest_distance و parent لحفظ طول المسار الأقصر من خلية البداية إلى أي خلية أخرى، وحفظ عقدة أصل الخلية في هذا المسار الأقصر.
ورغم ذلك، تتبع الدالة astar_maze_solve() منهجية مختلفة لفحص الخلايا وتوسيعها، فهي تستخدم expansion_candidates لتتبع كل الخلايا التي يمكن توسيعها بعد ذلك. في كل تكرار، تُستخدم دالة get_best_candidate() لتحديد أي من الخلايا المرشحة ستوسعها بعد ذلك.
بعد اختيار الخلية المرشحة best_cell، تُستخدم حلقة التكرار For لفحص كل الخلايا المجاورة لها. إذا كانت الخلية المجاورة تُفحص للمرة الأولى، فستصبح best_cell عقدة الأصل للخلية المجاورة في المسار الأقصر.2023 - 1447
🎴 بطاقات تعليمية للمراجعة
عدد البطاقات: 4 بطاقة لهذه الصفحة
ما الغرض الرئيسي من استخدام القاموسين `shortest_distance` و `parent` في خوارزميات البحث عن المسار الأقصر (مثل A* أو BFS)؟
الإجابة: يُستخدم قاموس `shortest_distance` لتخزين طول المسار الأقصر المعروف حاليًا من خلية البداية إلى كل خلية أخرى. ويُستخدم قاموس `parent` لتخزين العقدة التي تسبق الخلية الحالية في المسار الأقصر، مما يسمح بإعادة بناء المسار لاحقًا.
الشرح: تساعد هذه القواميس في تتبع حالة البحث. `shortest_distance` يضمن أننا دائمًا نسعى للمسار الأقصر، بينما `parent` يسمح لنا بتحديد الخطوات التي اتخذناها للوصول إلى العقدة الحالية، وهو أمر ضروري لإعادة بناء المسار الفعلي.
تلميح: فكر فيما تحتاج لتتبعه لتحديد أفضل طريق، وماذا تحتاج لكي تتمكن من الرجوع للخلف لمعرفة كيف وصلت إلى هناك.
كيف تختلف خوارزمية A* (الموضحة في النص) عن BFS (المشار إليها) فيما يتعلق بتحديد الخلية التالية للفحص؟
الإجابة: بينما تستخدم BFS نهجًا منظمًا لفحص الخلايا (عادةً بشكل صفّي)، فإن A* تستخدم دالة `get_best_candidate()` لاختيار الخلية المرشحة التي سيتم فحصها بعد ذلك، بناءً على معايير محددة (مثل التكلفة التقديرية الإجمالية).
الشرح: A* تكون أكثر كفاءة في العديد من الحالات لأنها لا تفحص جميع الخلايا بنفس الأولوية. بدلاً من ذلك، توجه بحثها نحو الخلايا التي يُحتمل أن تؤدي إلى الحل الأقصر باستخدام دالة تقديرية (heuristic).
تلميح: ما هي المعيار الرئيسي الذي يميز اختيار الخلية في A* مقارنة بـ BFS؟
ما هو دور `expansion_candidates` في خوارزمية A* كما وصفها النص؟
الإجابة: يُستخدم `expansion_candidates` لتتبع جميع الخلايا التي يمكن توسيعها (فحص جيرانها) في الخطوة التالية. يتم اختيار الخلية الأفضل من هذه المجموعة باستخدام `get_best_candidate()`.
الشرح: هذه المجموعة هي قلب عملية البحث في A*، حيث تحتوي على جميع الخلايا التي تم الوصول إليها ولكن لم يتم بعد فحص جميع جيرانها بشكل كامل. اختيار الخلية الأنسب منها هو ما يميز A*.
تلميح: هذه المجموعة تمثل 'الخيارات' المتاحة للخطوة التالية في البحث.
متى يتم إضافة خلية مجاورة إلى `expansion_candidates` في خوارزمية A*، ومتى يتم إزالتها من `fully_expanded`؟
الإجابة: تُضاف الخلية المجاورة إلى `expansion_candidates` إذا لم يتم فحصها من قبل (أي أنها ليست في `expansion_candidates` ولا في `fully_expanded`)، أو إذا تم العثور على مسار أقصر إليها. عندما تتم معالجة خلية ما بشكل كامل (تم فحص جميع جيرانها)، فإنها تُزال من `expansion_candidates` وتُضاف إلى `fully_expanded`.
الشرح: هذه الآلية تضمن أن الخوارزمية تستمر في البحث عن المسارات الأقصر حتى لو اكتشفت طريقًا جديدًا أفضل إلى خلية كانت قد اعتبرتها 'منتهية' سابقًا. هذا يمنع الخوارزمية من التوقف مبكرًا عند مسار غير أمثل.
تلميح: فكر في الحالات التي قد تحتاج فيها إلى إعادة النظر في خلية تم فحصها مسبقًا.