# خوارزمية البحث بأولوية الأفضل

خوارزمية البحث بأولوية الأفضل، (بالإنجليزية: A* search algorithm)‏ هي تبسيط عن خوارزمية *A التي قدمها بيتر هارت في العام 1968. تستخدم هذه الخوارزمية الأدوات التالية:
* قائمة (OPEN) للعقد التي ولدت وطبقت دالة الكشف (Heuristic Function) عليها ولكن لم تفحص بعد أي لم يتم توليد عقد تابعة منها. هذه القائمة هي من نوع صف تفضيل للأولوية (Priority Queue) حيث العقد ذات القيم الأعلى في دالة الكشف لها أولوية أكبر.
* قائمة (CLOSED) للعقد التي فحصت وتم توليد العقد التابعة منها. هذه القائمة تبقى في الذاكرة لفحصها عند توليد عقد جديدة لمعرفة إن كانت مولدة سابقاً وتم المرور بها.
* دالة الكشف (Heuristic Function) التي تخمن أحقية كل عقدة يتم توليدها. هذه الدالة تمكن الخوارزمية من البحث في الطرق الواعدة في الوصول للهدف أولاً.
* الدالة g التي تقيس التكلفة للوصول من العقدة الابتدائية إلى العقدة الحالية. هذه الدالة تعطي قيم حقيقية وليست تقدير.
* الدالة 'h التي تخمن التكلفة الإضافية للوصول من العقدة الحالية إلى العقدة الهدف. هي إذن قياس لتكلفة الوصول للحل أي العقد الأفضل تأخذ قيماً دنيا والعقد الأسوء تأخذ قيماً عليا، وليست قياس لجودة العقد أي العقد الأفضل تأخذ قيماً أعلى.
* الدالة 'f التي تعرف كحاصل جمع للدالتين السابقتين أي ('g + h) و قيمتها إذن تمثل تخمين للوصول من الحالة الابتدائية إلى الحالة الهدف عن طريق العقدة الحالية.

## الخوارزمية

* نبدأ بالقائمة OPEN تحتوي فقط على عقدة للحالة الابتدائية قيمتها للدالة g صفر، إذن قيمة الدالة 'f هي 0 +'h أو فقط 'h , و القائمة CLOSED تكون خالية من العقد.
* إلى أن نجد العقدة للحالة الهدف نكرر الإجراء التالي:
* نختار العقدة في القائمة OPEN ذات القيمة الأدنى للدالة 'f و نسميها العقدة الأفضل (BESTNODE) ثم ننقلها من القائمة OPEN إلى القائمة CLOSED.
* نفحص إن كانت BESTNODE هي العقدة الهدف، فإن كانت وجدنا الحل وإلا نولد العقدة التابعة (SUCCESSOR) لها.
* لكل عقدة تابعة نقوم بالآتي:
* نجعل SUCCESSOR تشير رجعياً إلى BESTNODE , و هذه الإشارة ستساعد في استرجاع الطريق إن وجدنا العقدة الهدف.
* نحسب g(SUCCESSOR) = g(BESTNODE) + the cost from BESTNODE to SUCCESSOR أي التكلفة للوصول لSUCCESSOR هو مقدار التكلفة BESTNODE إضافة للتكلفة من BESTNODE إلى SUCCESSOR .
* إن كانت SUCCESSOR موجودة في القائمة OPEN , أي مولدة ولكن لم يتم توليد عقد منها، نسمي العقدة الموجودة في القائمة ب OLD و نقارن بين OLD و طريق الوصول إليها وبين SUCCESSOR و طريق الوصول إليها من BESTNODE ,أي نقارن قيمة g لكل منهما فإن كانت (g(OLD أقل لا نفعل شيئاً وإن كانت (g(SUCCESSOR أقل نجعل الرابط الرجعي ل OLD يشير إلى BESTNODE و نجعل القيمة الأدنى محفوظة في (g(OLD و نعدل قيمة (f'(OLD .
* إن لم تكن SUCCESSOR في القائمة OPEN نرى أن كانت موجودة في CLOSED , أي تم فحصها سابقاً وإن كانت موجودة نسميها OLD و نكرر عملية المقارنة بين SUCCESSOR و OLD . هنا علينا أن ننقل التعديلات إلى توابع OLD و هذا معقد لأن OLD تشير إلى توابعها والتوابع بدورهم يشيرو إلى توابعهم إلى أن ينتهي كل فرع عند عقدة في القائمة OPEN لديها قيمة g مكافئة أو أقل أو أن لا يكون لديها توابع إي نستخدم خوارزمية المسح بأولوية العمق عند العقدة OLD و نغير قيمة g و 'f لكل عقدة نمر بها. بهذه الطريقة كل رابط رجعي لعقدة يشير إلى أفضل عقدة سابقة، ومن انتشار قيمة g باتجاه الأسفل أصبح من الممكن أن يصبح الطريق الذي نتبعه أفضل من الطريق من خلال العقدة السابقة الحالية فإن كانت الحالة هكذا نغير العقدة السابقة ونكمل المسح.

## ملاحظات على الخوارزمية

* إن دور الدالة g يدعنا نختار أي عقدة نتوسع بعد ذلك ليس فقط على أساس قيمة 'h بل أيضاً على جودة الطريق إلى العقدة كان، فإن أردنا إيجاد الحل بأقل عدد من الخطوات نضع التكلفة من الانتقال من عقدة إلى عقدة كثوابت، وإن أردنا إيجاد الطريق الأرخص وكانت التكلفة مختلفة للانتقال من عقدة إلى أخرى فعلينا أن نأخذ هذه القيم بالاعتبار. إذن يمكن استخدام هذه الخوارزمية إن كنا مهتمين لإيجاد الطريق الأكثر تكلفة أو الأسرع وصولاً.
* المسافة من عقدة إلى الهدف الذي يقدر عن طريق الدالة 'h يعتمد على خوارزمية التخمين، فإن كانت القيمة أقرب للحقيقة فإن الخوارزمية ستلتقي حالاً بالهدف بطريقة مباشرة ولكن كلما ابتعدت 'h عن الواقع أي أصبحت قيمتها 0 اعتمد البحث أكثر على قيمة g. فإن كانت قيمة g هي ,0 أصبحت استيراجية البحث عشوائية. و إن كانت دائماً 1, أصبح البحث بأولوية العمق. أما إن كانت قيمة 'h معتدلة فإن طريقاً أمثل للهدف سيكتشف.
* الخوارزمية يمكن أن تمثل في أفضل حالة إذا طبقت باستعمال السم البياني (GRAPHS) , و يمكن أن تكون تبسط بتطبيق الرسم الشجري (TREES)إن لم نقم بفحص إذا ما كانت العقدة الجديدة في قائمة OPEN أو CLOSED, هذا يجعل توليد العقد أسرع ولكن يمكن أن ينتج عن توالي البحث عدة مرات إذا تكررت العقد.

## مراجع

* ↑ وصلة مرجع: https://cs.stanford.edu/people/eroberts/courses/soco/projects/2003-04/intelligent-search/astar.html. الوصول: 27 سبتمبر 2024. الاقتباس: A* is a best-first search algorithm that relies on an open list and a closed list to find a path that is both optimal and complete towards the goal..
* ↑ وصلة مرجع: https://ieeexplore.ieee.org/document/10050009. الوصول: 27 سبتمبر 2024. الاقتباس: The A* algorithm is a well-known example of heuristic-based algorithms that is guaranteed to find the least-cost path to a goal state if the heuristic used is admissible, which means that it never overestimates the real cost from the current state to the goal..
* 1 2 وصلة مرجع: https://www.baeldung.com/cs/a-star-algorithm. الوصول: 27 سبتمبر 2024.
* ↑ Pearl، Judea (1984). Heuristics: Intelligent Search Strategies for Computer Problem Solving. Addison-Wesley. ISBN:0-201-05594-5. مؤرشف من الأصل في 2020-05-18.
* ↑ ARA*: Anytime A* search with provable bounds on sub-optimality". In S. Thrun, L. Saul, and B. Schölkopf, editors, Proceedings of Conference on Neural Information Processing Systems (NIPS), Cambridge, MA, 2003. MIT Press. نسخة محفوظة 24 أغسطس 2017 على موقع واي باك مشين.
* ↑ Zeng، W.؛ Church, R. L. (2009). "Finding shortest paths on real road networks: the case for A*". International Journal of Geographical Information Science. ج. 23 ع. 4: 531–543. DOI:10.1080/13658810801949850. مؤرشف من الأصل في 2018-10-08.
* بوابة علم الحاسوب
* بوابة رياضيات
* بوابة ذكاء اصطناعي
* بوابة خوارزميات