ABA


"קצת הסבר על האלגוריתם A STAR"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15871 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15871
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   14:55   05.05.10   
אל הפורום  
  קצת הסבר על האלגוריתם A STAR  
 
   ערכתי לאחרונה בתאריך 05.05.10 בשעה 15:19 בברכה, ronen333
 
אחת המטרות היותר נעלות שבונים משחקים בבינה מלאכותית היא למצוא את המסלול האופטימלי מנקודה אחת לאחרת(כמעט כל משחק שתחשבו עליו דורש את זה- במיוחד שמדובר על משחקים בזמן אמת).
בקיצור,אלגוריתם זה מאוד שימושי שבונים משחקים בבינה מלאכותית, או בכללי שרוצים למצוא את המסלול הקצר ביותר מנקודה אחת לאחרת ביעילות גבוהה.

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

אלגוריתם זה מוכר בשם A Star (או A *), מה שמיוחד באלגוריתם זה שהוא מוצא את המסלול הקצר ביותר על גרף מנקודה לנקודה ביעילות גבוה מאוד של | h(x) − h * (x) | = O(logh * (x)).
הוא מתבסס על האלגוריתם דייאקסטרה (DIJKSTRA), אך יעיל יותר מימנו מהסיבה שהוא מוצא את המסלול מקודקוד מסוים לקודקוד אחר, ולא כמו דייאקסטרה מקודקוד אחד לכול הקודקודים ובנוסף A STAR מסתמך על הערכה.
כדי לפשט את העניינים בהרבה יש קודם להגדיר את העולם בצורת GRID,
לכל תא בגריד נקרא "צומת"(Node).
ובשביל למצוא את המסלול דרושים לנו 3 דברים:
1.צומת התחלה
2.צומת סיום
3.כל הצמתים בעולם.

את כל הצמתים בעולם קל ויעיל לייצג באמצעות מערך דו מימדי של צמתות.
כדי למצוא את המסלול הקצר ביותר דרושים לנו קצת "כלי עזר",
מבני נתונים שיאפשרו לאחסן ולגשת למידע באופן יעיל.
1.תור קדימויות (ערימת מנימום).
2.רשימה על מנת לשמור את הצמתים שהם מחלק מהמסלול(נקרא לרשימה זו רשימה סגורה).
3.מחסנית לשמירת המסלול הסופי.
שלושת מבני נתונים אלה יהיו מטיפוס צומת.
את האובייקט צומת נייצג באמצעות 6 שדות:
עמודה,שורה,מרחק הצומת מההתחלה (נסמן בG), מרחק אווירי לסיום (נסמן בH, מרחק משוער סופי (נסמן בF),והפניה לצומת אב.

בעת הסריקה של הצמתות בעולם שלנו נוסיף את הצמתות לרשימה הסגורה(2) שלנו שהן חלק מהמסלול הסופי.
כל צומת שאנו לא בטוחים שהיא חלק מהיעד נשים בתור הקדימויות , הרשימה הפתוחה(1).

כדי לדעת איזה צומת הכי כדאית על מנת להגיע למסלול הקצר אנו נחשב את F (המסלול המשוער הסופי) ע"י חיבור המרחק של הרחק מצומת ההתחלה עד הנוכחי (G)+ פונקציה לחישוב מרחק משוער לסיום(למה כתבתי משוער? מכיוון שאנחנו לא יודעים מה המרחק האמיתי ליעד.. קו אווירי זה לא מרחק אמיתי, מכיוון שהוא לא מתחשב בתנאי הדרך, ולכן נצטרך לחשב מרחק שהוא לא אמיתי מהצומת הנסרקת ליעד), היוריסטיקה (H).
כלומר F=G+H.
אנחנו נרצה שהצומת עם הערך (F) הכי קטן ישלף בכל פעם מן התור קדימויות, על מנת שנקבל את המסלול הקצר ביותר.
לכן חשוב שלכל צומת שלא סרקנו עדיין יהיה ערך סופי(עבור G) אינסופי, כדי שנוכל רק לשפר בכל פעם את מציאת המסלול!

בפרויקט שלי בבינה מלאכותית חישבתי את המרחק המשוער (H) ע"י 2 שיטות, האחת נקראת מרחק מנהטן והשנייה היא מרחק אוקלידי- עשיתי בחירה אקראית עבור כל אויב במציאת המסלול כדי שלא כל האויבים יעשו את אותו המסלול ויהיו "מונטונים".

כעת מה שנותר לעשות הוא לדחוף לתור קדימויות (1) את צומת ההתחלה. ואח"כ לעבור על כל השכנים של הצומת הזו ונעדכן להן את הערך F אם מצאנו אחד קטן יותר.

עכשיו מספיק עם הדיבורים, נעבור לקצת קוד (כתבתי אותו בC#)-


openSet.Clear();
closeSet.Clear();
//Initialize start node

start.Father = null;
start.CostSoFar = 0;
start.EstimateCost = heuristic.Estimate(start);
//Add the start node to the openSet
openSet.Enqueue(start);

Node currentNode;
while(!openSet.IsEmpty)
{
//Extract(get and remove) the min Node (by TotalEstimateCost) from openSet
currentNode = openSet.Dequeue();
//Check if CurrentNode is the goal
if (currentNode.Row == end.Row && currentNode.Col == end.Col)
return GetPath(end);
//Not goal:
//Add the currentNode to the closeSet
closeSet.Add(currentNode);
//Gets all the legal neighboors of the currentNode
neighboors = GetNeighboors(currentNode);

int newCost = currentNode.CostSoFar + 1;
foreach(Node neighboor in neighboors)
{

//if neighbor is in openSet
if (openSet.Contains(neighboor))
{
//if we have better costSoFar(grade) than we update the Node
if(neighboor.CostSoFar>newCost)
{

neighboor.CostSoFar = newCost;
neighboor.Father = currentNode;
neighboor.EstimateCost = heuristic.Estimate(neighboor);

//need to update his priority
openSet.Update(neighboor);

}
}
else
{
//if neighboor is in closeSet
if(closeSet.Contains(neighboor))
{
//if we have better CostSoFar(grade) in our track,
//than it can no longer be in our track and we test it again by adding it to openSet
if (neighboor.CostSoFar > newCost)
{
closeSet.Remove(neighboor);

neighboor.CostSoFar = newCost;
neighboor.Father = currentNode;
neighboor.EstimateCost = heuristic.Estimate(neighboor);

openSet.Enqueue(neighboor);
}
}
else //A completely new node, Add it to openSet
{
//newCost must be better than infinity, update it

neighboor.CostSoFar = newCost;
neighboor.Father = currentNode;
neighboor.EstimateCost = heuristic.Estimate(neighboor);

openSet.Enqueue(neighboor);
}

}

}

}
throw new PathNotFoundException("A Star Fail to found path");


הפעולה Estimate היא הפונקצית הערכה... (כפי שהוסבר להעיל).
הפעולה GetNeighboors נועדה להחזיר רשימה של כל השכנים של הצומת שבה אתם מבקרים.
הפעולה GetPath מחזירה את המסלול ב"רברס" מהצומת האחרונה להתחלה.
לשחזור המסלול נחזיק מחסנית של צמצות ולא רשימה של צמתות
הסיבה שנחזיר מחסנית היא בגלל שבונים את המסלול מהסוף להתחלה.
בנוסף, חשוב לי להוסיף כי כאשר נגשים למאפיין TotalEstimateCost , זה למעשה מחזיר את החיבור של EstimateCost וCostSoFar .

את הקוד המלא של הפרויקט שלי שמכיל את האלגוריתם A STAR ניתן להוריד כאן:
https://rotter.name/nor/prog/15846.shtml

לאלה שלא יודעים C#, או בכללי אנשים שרוצים את הרעיון הכללי בפסדוקוד הנה מסמך PDF שמכיל פסדוקוד עם דוגמאות על איך האלגוריתם עובד-

https://rotter.name/User_files/nor/4be15c6b33c44019.pdf
(תודה לעידן התותח שהביא לי את הקובץ הזה).
מידע נוסף ניתן כמובן למצוא בוויקיפדיה (אם כי אני לא הייתי מרוצה מהפסדוקוד שלהם):
http://en.wikipedia.org/wiki/A*_search_algorithm

אני מקווה שכיסתי את הכל, והכל ברור.. תהנו!


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  תודה רבה, נושא מעניין hm10 05.05.10 15:27 1
  נראה טוב..נקרא בהזדמנות.. VeNom  05.05.10 22:13 2
     מה.. למה? ronen333  05.05.10 22:54 4
     אני מחכה לתשובה חבר.. ronen333  06.05.10 11:14 5
         כי ראיתי את הסילבוס של הקורס VeNom  06.05.10 11:22 6
             יש עוד הרבה נושאים מעניינים בבינה מלאכותית ronen333  06.05.10 11:24 7
                 לא למדתי תורת הגרפים VeNom  06.05.10 11:32 8
                     כל הבשר והבעיות המעניינות ronen333  06.05.10 11:39 9
                         קצת על תורת הגרפים, Deuce  07.05.10 05:10 12
                             לא אמרתי שזה כל מה שלומדים שם VeNom  07.05.10 10:04 14
  כל הכבוד שהרמת את הכפפה ! Net_Boy  05.05.10 22:32 3
  בהחלט נושא מעניין: ) ldan192  06.05.10 13:12 10
  סחטיין, כל הכבוד... מעניין מאוד :) Sn00py  06.05.10 22:03 11
  מאמר נחמד. Deuce  07.05.10 05:17 13
     מכתב ronen333  07.05.10 10:53 15

       
hm10
חבר מתאריך 24.9.09
322 הודעות
   15:27   05.05.10   
אל הפורום  
  1. תודה רבה, נושא מעניין  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   22:13   05.05.10   
אל הפורום  
  2. נראה טוב..נקרא בהזדמנות..  
בתגובה להודעה מספר 0
 
   נתת לי סיבה לא ללכת לקורס של מבוא לבינה מלאכותית..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   22:54   05.05.10   
אל הפורום  
  4. מה.. למה?  
בתגובה להודעה מספר 2
 
   תלך אחד המעניינים.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   11:14   06.05.10   
אל הפורום  
  5. אני מחכה לתשובה חבר..  
בתגובה להודעה מספר 2
 
   אני ציפתי לעשות את העבודה ההפוכה.. לא לגרום לך לסלוד מהתחום אלא לעודד אותך לחקור עליו.

ותקרא, זה בקושי חצי דף. זה רק נראה הרבה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   11:22   06.05.10   
אל הפורום  
  6. כי ראיתי את הסילבוס של הקורס  
בתגובה להודעה מספר 5
 
   ומה שבאמת עניין אותי זה ה A STAR..
וגם יש מספיק קורסי בחירה שווים שאפשר לקחת במקום..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   11:24   06.05.10   
אל הפורום  
  7. יש עוד הרבה נושאים מעניינים בבינה מלאכותית  
בתגובה להודעה מספר 6
 
   למרות שאם למדת את תורת הגרפים אתה יכול ללמוד הכל לבד יחסית בקלות.
אם לא למדת תורת הגרפים לך על הקורס הזה כי שם ילמדו אותך את זה- וגרפים זה הרבה מעבר לתכנון משחקים וזה אחד המעניינים.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   11:32   06.05.10   
אל הפורום  
  8. לא למדתי תורת הגרפים  
בתגובה להודעה מספר 7
 
   למדתי אלגוריתמים שזה מאין קורס שעוסק בעיקר באלגוריתמים שתלויים בגרפים..כאילו עם ADT של גרף..
תורת הגרפים הוא יותר מתמטי ופחות נוגע לאלגוריתמים במדעי המחשב..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   11:39   06.05.10   
אל הפורום  
  9. כל הבשר והבעיות המעניינות  
בתגובה להודעה מספר 8
 
   פתורים עם גרפים.. אבל תעשה מה בראש שלך.. אני רק המלצתי .


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   05:10   07.05.10   
אל הפורום  
  12. קצת על תורת הגרפים,  
בתגובה להודעה מספר 9
 
רק כי הוא הוזכר פה
בתור מי שכן עשה את הקורס בתורת הגרפים אז הוא הרבה יותר מתקדם מתכונות הגרפים שמשתמשים בהם באלגוריתמים של A STAR או דייקסטרה או אלגוריתמי זרימה למיניהם בקורס אלגוריתמים.

הקורס בתורת הגרפים הוא מאוד תיאורטי ומאוד מעניין. מדבר על המון תכונות יפות שמתקיימות בגרפים ואין לו ממש קשר לאלגוריתמים בסיסיים במדעי המחשב.

לגבי בינה מלאכותית, לא הולכים לקורס הזה כדי ללמוד על A STAR - אין בזה הגיון.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   10:04   07.05.10   
אל הפורום  
  14. לא אמרתי שזה כל מה שלומדים שם  
בתגובה להודעה מספר 12
 
   אבל האלגוריתם הזה ספציפי הוא מה שעניין אותי במיוחד בקורס הזה..ומוזר לי שאם הוא כ"כ חשוב והוא סוג של דייקסטרה יעיל ושמיש שהוא לא נכנס אצלנו לפחות לסילבוס של קורס אלגוריתמים..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   22:32   05.05.10   
אל הפורום  
  3. כל הכבוד שהרמת את הכפפה !  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   13:12   06.05.10   
אל הפורום  
  10. בהחלט נושא מעניין: )  
בתגובה להודעה מספר 0
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   22:03   06.05.10   
אל הפורום  
  11. סחטיין, כל הכבוד... מעניין מאוד :)  
בתגובה להודעה מספר 0
 
  

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   05:17   07.05.10   
אל הפורום  
  13. מאמר נחמד.  
בתגובה להודעה מספר 0
 
ככלל כאשר מציגים אלגוריתם - בפרט אלגוריתם שקשור לגרפים - מקובל לתת פסודו קוד קצרצר (או מלא) ויותר לחפור על נכונות האלגוריתם ועל הסיבוכיות שלו.

לי באופן אישי למשל לא יצא להתקל באלגוריתם הזה ומהפוסט שלך לא הוכחת לי את הנכונות שלו וגם בתיאור הסיבוכיות בהתחלה רשמת למשל | h(x) − h * (x) | = O(logh * (x)) לפני שהגדרת מי זה h ומי זה h*. אני מניח ש-h זה המרחק האמיתי ו-h* זאת היוריסטיקה.

בכל מקרה ואני חושב שזה משהו חשוב שתיקח לעצמך - יותר חשוב באלגוריתמים האלה למה הם עובדים מאשר קוד שמממש אותם. אף אחד לא נהנה לתכנת את האלגוריתמים האלה (ואם נהנית בתכנות הספציפי הזה אז אתה מיוחד), אבל כן מעניין זה למה הם עובדים ולהוכיח שהם עובדים.

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

אני ממש אשמח למשל אם:
א. תסביר את היוריסטיקה ומה עומד מאחוריה.
ב. עד כמה היוריסטיקה טובה - לפעמים יורסטיקות עובדות תחת הגבלות מסויימות.
ג. ניתוח נכונות האלגוריתם בעקבות הנחת היוריסטיקה.
ד. כבונוס אשמח לניתוח הסיבוכיות.
להחלטתך

בכל מקרה תודה רבה על המאמר.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   10:53   07.05.10   
אל הפורום  
  15. מכתב  
בתגובה להודעה מספר 13
 
   א.כן הבאתי פסדוקוד.
ב.לא חפרתי על סיבוכיות כי אני לא חשבתי שצריך, יש אנשים שרוצים לפתור בעיה והם לא רוצים שיחפרו להם בשכל על דברים שלא צריך. זה לא הרצאה באונ'...
ג.כל שאר הדברים שאתה רוצה לדעת שלא כוללים את הבנת הרעיון אלא הוכחת נכונות האלגוריתם, וכו' יש די ויותר מידע בוויקיפדיה. לכן השארתי לינק למי שמעוניין..



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net