📄 النص الكامل للصفحة
يحدث الأمر نفسه إذا تم فحص الدالة المجاورة من قبل، ولكن فقط إذا كان المسار إلى هذه الخلية المجاورة من خلال cell_best أقصر من المسار السابق. إذا عثرت الدالة بالفعل على مسار أفضل، فسيتم تعيين expansion_candidates إلى مجموعة الخلايا المجاورة لها. يستخدم المقطع البرمجي التالي (astar_maze_solver) لحل الحالة غير الموزونة (Unweighted Case) للغز المتاهة 3x3:--- SECTION: Unweighted A* Maze Solver Code ---
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)--- SECTION: Output of Unweighted A* Maze Solver ---
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) عن المسار المحتمل الأقصر والأفضل بعد فحص 12 خلية. وهذا أكثر قليلاً من أداة الحل في البحث بأولوية الاتساع (BFS solver) التي وجدت الحل بعد فحص 10 خلايا فقط. وهذا يعود إلى بساطة الاستدلال الثابت المستخدم لإرشاد (astar_maze_solver). وكما سيتضح لاحقاً في هذا القسم، يمكن استخدام دالة استدلال أخرى لتمكين الخوارزمية من إيجاد الحل بشكل أسرع. الخطوة التالية هي تقييم ما إذا كانت خوارزمية البحث بأولوية الأفضل (A* search) قادرة على حل المتاهة الموزونة التي فشلت خوارزمية البحث بأولوية الاتساع (BFS) في العثور على أقصر مسار لها أم لا:--- SECTION: Weighted A* Maze Solver Code ---
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)--- VISUAL CONTEXT ---Context: Publisher/source identification for the textbook.
🎴 بطاقات تعليمية للمراجعة
عدد البطاقات: 4 بطاقة لهذه الصفحة
ماذا يحدث في خوارزمية A* إذا تم فحص الخلية المجاورة من قبل، ولكن المسار الجديد إليها أقصر من المسار السابق؟
الإجابة: إذا كان المسار الجديد إلى الخلية المجاورة أقصر، يتم تعيين expansion_candidates إلى مجموعة الخلايا المجاورة لهذه الخلية.
الشرح: تسمح هذه الآلية لخوارزمية A* بالتحسين المستمر لمساراتها، مما يضمن إيجاد المسار الأمثل.
تلميح: فكر في الشرط الذي يجعل تحديث المسار ضرورياً في خوارزمية البحث.
في مثال حل المتاهة غير الموزونة باستخدام A*، كم عدد الخلايا التي تم فحصها للعثور على الحل؟
الإجابة: تم فحص 12 خلية.
الشرح: يشير عدد الزيارات إلى مدى عمق البحث الذي قامت به الخوارزمية لإيجاد الحل.
تلميح: ارجع إلى قسم 'Output of Unweighted A* Maze Solver' واستخرج الرقم الخاص بـ 'Number of cell visits'.
لماذا قد يكون عدد الزيارات في البحث بأولوية الأفضل (A* search) أكثر قليلاً من البحث بأولوية الاتساع (BFS) في حالة المتاهة غير الموزونة؟
الإجابة: يعود ذلك إلى بساطة دالة الاستدلال المستخدمة في A*، والتي قد لا توجه البحث بنفس كفاءة BFS في هذه الحالة المحددة.
الشرح: في حين أن A* أقوى بشكل عام، فإن اختيار دالة الاستدلال المناسبة أمر بالغ الأهمية لكفاءتها. دالة الاستدلال الثابتة في هذا المثال لم تكن مثالية للمتاهة غير الموزونة.
تلميح: ما هي المكونات الرئيسية التي تستخدمها خوارزمية A* لتوجيه بحثها؟
ما هو الغرض من استخدام 'partial' مع 'get_accessible_neighbors_weighted' في حل المتاهة الموزونة؟
الإجابة: يُستخدم 'partial' لتثبيت بعض الوسائط (مثل الأوزان الأفقية والرأسية والأقطرية) لدالة 'get_accessible_neighbors_weighted' وإنشاء دالة جديدة يمكن تمريرها مباشرة إلى 'astar_maze_solver'.
الشرح: هذه تقنية برمجة مفيدة تسمح بإعادة استخدام الدوال وتكييفها مع سياقات مختلفة، مما يجعل الكود أكثر مرونة.
تلميح: فكر كيف يمكن تعديل دالة موجودة لتناسب متطلبات دالة أخرى بدون إعادة كتابتها بالكامل.