**אלגוריתם חיפוש \*A** (באנגלית: **A\* Search Algorithm**, מבוטא "A-Star", "איי-סטאר") הוא אלגוריתם חיפוש מונחה היוריסטיקה על צומתי גרף ממושקל, תוך חיפוש צומת המקיים תכונה מסוימת (צומת היעד) במרחק הקצר ביותר מן המקור. האלגוריתם תואר לראשונה ב-1968 על ידי פיטר הרט, נילס נילסון וברטהם רפאל ממרכז המחקר של אוניברסיטת סטנפורד.

אלגוריתם \*A נפוץ ביותר ונעשה בו שימוש נרחב לבעיות הדורשות מציאת מסלולים בגרפים.

\*A הוא שלם, כלומר הרצת אלגוריתם החיפוש מבטיחה מציאת מסלול בין צומת המקור לצומת היעד אם קיים מסלול כזה, בתנאי שמרחב החיפוש סופי.

במקרה של מרחב חיפוש אין־סופי, \*A שלם שבתנאי שמחיר הקשתות חסום מלמטה על ידי קבוע חיובי ושההיוריסטיקה אי־שלילית.

תיאור
-----

האלגוריתם הוא מסוג אלגוריתם חיפוש לרוחב ומוצא את המסלול הזול ביותר מצומת המקור לאחד מצומתי היעד. כאשר \*A עובר על הגרף הוא מנסה לפתח בכל פעם את המסלול שנראה הזול ביותר תוך כדי שימוש בתור עדיפויות ממוין.
האלגוריתם משתמש בפונקציית עלות {\displaystyle f(x)} המשלבת היוריסטיקה ({\displaystyle h(x)}) בצירוף מידע ידוע ({\displaystyle g(x)}) כדי לבחור איזה צומת לפתח. פונקציית העלות היא הסכום של שתי הפונקציות:

* {\displaystyle g(x)} שהיא המרחק הידוע בין צומת ההתחלה לצומת הנוכחי x.
* {\displaystyle h(x)} שהיא הערכה למרחק בין x לבין צומת היעד.

כדי שהאלגוריתם יחזיר פתרון אופטימלי, פונקציית ההיוריסטיקה, {\displaystyle h(x)}, צריכה להיות אדמיסיבלית (קבילה), כלומר לא יותר יקרה מהמרחק האמיתי לצומת היעד. בניתוב היא יכולה להיות מרחק אווירי, מכיוון שהוא מהווה את המרחק המינימלי בין כל שני צמתים. בנוסף אם ההיוריסטיקה מונוטונית (קונסיסטנטית), כלומר מקיימת את התנאי {\displaystyle h(x)\leq d(x,y)+h(y)} לכל קשת **(x,y)** בגרף (d מסמן את אורך הקשת), האלגוריתם ירוץ מהר יותר מכיוון שאין צורך לבדוק בשנית צמתים בהם האלגוריתם כבר עבר.

אפשר להסתכל על האלגוריתם כהרחבה של אלגוריתם דייקסטרה עם היוריסטיקה (בדייקסטרה הפונקציה ההיוריסטית תהיה תמיד שווה ל-0).

פסאודו-קוד
----------

להלן פסאודו-קוד של האלגוריתם:

```
function A\*(start,goal)
 closedset := the empty set // The set of nodes already evaluated.
 openset := {start} // The set of tentative nodes to be evaluated, initially containing the start node
 came\_from := the empty map // The map of navigated nodes.

 g\_score[start] := 0 // Cost from start along best known path.
 // Estimated total cost from start to goal through y.
 f\_score[start] := g\_score[start] + heuristic\_cost\_estimate(start, goal)
 
 while openset is not empty
 current := the node in openset having the lowest f\_score[] value
 if current = goal
 return reconstruct\_path(came\_from, goal)
 
 remove current from openset
 add current to closedset
 for each neighbor in neighbor\_nodes(current)
 tentative\_g\_score := g\_score[current] + dist\_between(current,neighbor)
 if neighbor in closedset or tentative\_g\_score >= g\_score[neighbor] // See remark below
 continue
 if neighbor not in openset or tentative\_g\_score < g\_score[neighbor] 
 came\_from[neighbor] := current
 g\_score[neighbor] := tentative\_g\_score
 f\_score[neighbor] := g\_score[neighbor] + heuristic\_cost\_estimate(neighbor, goal)
 if neighbor not in openset
 add neighbor to openset

 return failure

 function reconstruct\_path(came\_from, current\_node)
 if current\_node in came\_from
 p := reconstruct\_path(came\_from, came\_from[current\_node])
 return (p + current\_node)
 else
 return current\_node

```

**הערה:** מימוש האלגוריתם מניח שפונקציית ההיוריסטיקה היא מונוטונית, ולכן מדלג על צמתים שנמצאים ב-`closedset`. אם ההיוריסטיקה אינה מונוטונית, יש למחוק את בדיקה זו, מאחר שערך ה-g שניתן לצומת שפותח בשלב קודם יכול להיות גדול יותר מערך ה-g האמיתי של הצומת, ולכן יש לפתח אותו מחדש (להחזיר את הצומת ל-`openset`).

סיבוכיות
--------

סיבוכיות הזמן של \*A תלויה בהיורסטיקה, במקרה הגרוע ביותר, מספר הצמתים שיפותחו יהיה מעריכי ביחס לאורך הפתרון (המסלול הקצר ביותר). הסיבוכיות תהיה פולינומית אם מתקיימים התנאים הבאים: מרחב המצבים הוא עץ, קיים מצב מטרה יחיד והפונקציה ההיוריסטית h מקיימת:

{\displaystyle |h(x)-h^{\*}(x)|=O(\log h^{\*}(x))}
כאשר {\displaystyle h^{\*}} היא ההירוסטיקה האופטימלית, כלומר העלות המדויקת בין x למטרה.

קישורים חיצוניים
----------------

ויקישיתוף מדיה וקבצים בנושא **אלגוריתם חיפוש A\*** בוויקישיתוף