הרצאה 3
Transcription
הרצאה 3
Adversarial Search Most of the material is based on the lectures of Prof. Jonathan Schaeffer from the University of Alberta, Canada 1 Why “Adversarial”? Why Search? 2 מדוע "מול יריב" (תחרותי) משחקים הם מהתוכנות הראשונות שנכתבו ב AI את תוכנה ראשונה של שחמט הריצו בשנת !1957 http://www.fzibi.com/cchess/cchess.txt משחקים הם סביבות תחרותיות טכניקות לסביבות תחרותיות היו מהראשונות ב AI טכניקות רבות שפותחו עבור סביבות תחרותיות אפשר ליישם גם עבור סביבות לא תחרותיות 3 מדוע חיפוש? נתבונן באופן בו אנשים פותרים בעיות לעומת האופן שבו מחשבים פותרים בעיות לדוגמה נשתמש בשחמט 4 מדוע חיפוש? נתבונן לדוגמה בשחמט: בכל מצב יש מהלכים אפשריים רבים שחקן מומחה בעל מוח אנושי מסתכל רק על מספר אפשרויות מה עם השאר? הם כאילו לא קיימים! אינטואיציה המבוססת על ניסיון למחשב אין אינטואיציה יש יכולת להביט על מיליוני אפשרויות המשך ולהעריך כל אחד בנפרד הערכת אפשרויות באופן סיסטמתי נקרא חיפוש שימו לב שחיפוש אפשרי גם בסביבות לא תחרותיות (כגון בפאזלים) 5 מה נלמד היום כיצד עורכים חיפוש בסביבה תחרותית שמתקיימים בה גם התנאים הבאים: בדידה ()discreet ניתן להבחין בה ()fully observable דטרמיניסטית ()deterministic חיפוש בסביבות תחרותיות אקראיות 6 Minimax Search 7 מצב מצב (באנגלית )State :של משחק (כמו )Ataxxכולל: מיקום של כלי המשחק של מי התור לעשות מהלך הנה מצב התחלתי של :Ataxx תרגיל :תארו מצב זה מספר מהלכים אפשריים במצב נקרא פקטור הסתעפות באנגליתBranching Factor (BF) : תרגיל :מה הוא BFשל המצב ההתחלתי ב ?Ataxx 8 איך סוכן מחליט מה לעשות בתור שלו? הלוח נמצא במצב מסוים בשיטת ,Minimaxהסוכן מעריך מצבים אליהם אפשר להגיע על ידי בחירה בקווים מסוימים של המשחק על פי רוב ,לא ניתן לדעת את הערך האמתי של כל מצב נתון לכן מבססים הערכה כזאת על פונקציית תועלת utility function בתחום חיפוש לפונקציית תועלת קוראים פונקציה יוריסטית או יוריסטיקה מטרתו של הסוכן הוא להוביל את המשחק למצבים עם ערך מקסימלי של הפונקציה לעומתו מטרתו של היריב הוא להוביל את המשחק למצבים עם ערך מינימלי של אותה הפונקציה תהליך חשיבה זה אפשר להציג כבניית עץ חיפוש כמו שנלמד בהמשך 9 דוגמא לפונקציה יוריסטית במשחק שחמט בשחמט ,אפשר לבסס פונקציה יוריסטית פשוטה על שווי של כלים שונים ,כגון :מלכה שווה ,9אביר שווה 3וכו' היוריסטיקה תהיה סכום לינארי משוקלל: )h(s) = w1 f1(s) + w2 f2(s) + … + wn fn(s 10 ( w1 = 9משקל) )f1(s) = (number of white queens) – (number of black queens עץ חיפוש עץ חיפוש הנו מבנה לוגי להצגת חיפוש כל קדקוד מקביל למצב השורש של העץ מקביל למצב הנוכחי סימונים לשקופיות הבאות: – שחקן הנוכחי בוחר מהלך – השחקן השני בוחר מהלך – שינוי מצב על ידי מהלך 3 -1 -4 2 " – "7הערכת מצב (ע' להלן) המצבים למטה הנם עלים אם עלה מופיע dמהלכים מהשורש ,אזי dהנו עומק העלה 11 0 -3 -2 4 2 3 4 -2 תרגיל :מה הוא ה BFשל המצבים בחיפוש זה? באיזה עומק נמצאים העלים? אנחנו אומרים שזה החיפוש לעומק 3 באיזה עומק נמצא השורש? דוגמת עץ חיפוש 12 איך מעריכים את העלים? משתמשים בפונקציה יוריסטית כדי להעריך עלה באנגליתHeuristic : יוריסטיקה הינה הערכה עד כמה המצב טוב עבור השחקן שהוא בתור לעשות מהלך (כלומר ,השורש) תרגיל: תציעו יוריסטיקה פשוטה עבור Ataxx מה יהיה ערך של היוריסטיקה שלכם עבור מצב זה (התור הוא של השחור) 13 3 -1 -4 2 0 -3 -2 4 2 3 4 -2 חיפוש Minimax המטרה שלנו היא לבחור מהלך מהשורש 3 צריכים להעריך את כל הבנים של השורש נתחיל חיפוש לעומק 2 תרגיל :איך הייתם מעריכים 2 3 מצב זה? מצאנו Principal Variation – האסטרטגיה הטובה ביותר 3 -1 -4 2 עבור שני הצדדים ביצעתם חיפוש !Minimax השורש תמיד MAX יריבו תמיד MIN 14 3 0 4 0 0 -3 -2 4 4 3 2 3 4 -2 האם יש צורך להסביר למה האלגוריתם נקרא ?Minimax Minimax חיפוש Call: result = MiniMax( s, depth, MAX ); int MiniMax( state s, int depth, int type ) { if( end_of_game || depth == 0 ) return( Heuristic( s ) ); if( type == MAX ) { for( score = -∞, child = 1; child <= NumbSuccessors( s ); child++ ) { value = MiniMax( Successor( s, child ), depth-1, MIN ); if( value > score ) score = value; } } else { for( score = +∞, child = 1; child <= NumbSuccessors( s ); child++ ) { value = MiniMax( Successor( s, child ), depth-1, MAX ); if( value < score ) score = value; } כיצד לשנות קוד זה כדי: תרגיל } ?שיחזיר המהלך הטוב ביותר return( score ); } 15 חיפוש Minimaxהנו חישוב מקורב של Nash Equilibrium תזכורת :אסטרטגיה הנה ( Nash Equilibriumשיווי משקל נאש) אם אף שחקן לא יכול להרוויח על ידי בחירת אסטרטגיה אחרת אלא אם כן הוא מניח הנחות לגבי אסטרטגיה של היריב חיפוש Minimaxהנו חישוב מקורב (אפרוקסימציה) של Nash Equilibrium 16 עד איזה עומק לחפש נניח שבמשחק פלוני ה BFהוא תמיד b אם נחפש עד עומק ,dכמה עלים נצטרך להעריך? bd דוגמה :במצב אפייני בשחמט30 ~ BF , אז ,כדי לחפש לעומק ( 6שלוש מהלכים לכל צד) צריך להעריך ~ 1,000,000,000מצבים זה יכול לקחת זמן ממושך... בדרך כלל לסוכן נקצב זמן מוקבל על הסוכן לבחור את עומק חיפוש בהתאם לזמן העומד לרשותו בהמשך נלמד יותר על הנושא 17 תרגיל :תסבירו את הפורמולה bdע"י שימוש בעץ החיפוש זה Expectimax Search: Stochastic Adversarial Environments 18 Expectimax חיפוש Minimax האלגוריתם הבסיסי עבור סביבות נגד יריב הוא Expectimax אזי האלגוריתם הבסיסי הוא, אם יש אקראיות Minimax יש רק חלק אחד שלא היה קיים בExpectimax ל Call: result = ExpectiMax( s, depth, MAX ); int ExpectiMax( state s, int depth, int type ) { if( end_of_game || depth == 0 ) return( Heuristic( s ) ); score = -∞ if (s is deterministic) if (type == MAX) score = MAX(Minimax(successor, depth-1, MIN)) else score = MIN(Minimax(successor, depth-1, MAX)); else if (type == MAX) score = EXP(Minimax(successor, depth-1, MIN)) else score = EXP(Minimax(successor, depth-1, MAX)); return( score ); } 19 דוגמת חיפוש Expectimax 3 2 2 3 2 3 3 -1 -4 2 0.5 0.5 4 0 0 -3 -2 4 4 3 2 3 4 -2 מעכשיו נתרכז בסביבות תחרותיות דטרמיניסטיות 20 Negamax Search 21 חיפוש בלי Minו Max משחקים עם סכום אפס ()Zero-Sum Game משחק שבו הרווח של שחקן אחד הוא בדיוק ההפסד של השחקן השני תכונה זו מאפשרת לפשט את Minimax מבחינת הקוד חיפוש למשחקי סכום אפס נקרא Negamax 22 חיפוש Negamax בחיפוש Minimax היוריסטיקה העריכה עד כמה המצב טוב עבור השורש (כלומר עבור השחקן שתורו לבצע את המהלך בשורש) ב Negamaxההערכה היא תמיד עבור השחקן שתורו לעשות מהלך בקדקוד הנוכחי 3 -2 2 0 3 -3 1 4 -2 שימו לב שכל הקדקודים כאן הם !MAX 23 4 -3 0 0 3 2 -4 4 3 -2 -3 -4 2 תרגיל :איך הייתם מעריכים מצב זה? תרגיל :השוו ערכים של עלים בדוגמה זאת ובדוגמה של .Minimaxמה השתנה? מדוע? Negamax חיפוש Call: result = NegaMax( s, depth); int NegaMax( state s, int depth) { if( end_of_game || depth == 0 ) return( Heuristic( s ) ); score = -∞; for( child = 1; child <= NumbSuccessors( s ); child++ ) { value = -NegaMax( Successor( s, child ), depth-1); if( value > score ) score = value; } return( score ); } 24 Minimax Search With Alpha-Beta Pruning 25 זוכרים את החשבון? נניח שבמשחק פלוני ה BFהוא תמיד b אם נחפש עד עומק ,dכמה עלים נצטרך להעריך? bd אמרנו שעל הסוכן לבחור עומק חיפוש בהתאם לזמן העומד לרשותו האם ישנה אפשרות לחפש יותר לעומק? רעיון הכי פשוט (אבל הוא לא כללי – לא תמיד ניתן ליישם אותו): אולי יש מהלכים שאין צורך לשקול אותם? לפעמים אפילו לוקחים סיכון שנחמיץ מהלך טוב כדי לחפש יותר לעומק כן! אפשר לחתוך ענפים מסוימים של עץ חיפוש מבלי להתפשר איכות המהלך! 26 הרעיון של החיתוך אפשר להוכיח שיש ענפים של עץ חיפוש שלא יתרמו לתוצאה של החיפוש נציג את הרעיון בעזרת דוגמה קטנה שחקן זה יכול להשיג לפחות 2 • שחקן זה יכול להשיג לפחות -1 • זה מקביל ל 1עבור היריב שלו. • אבל היריב יכול להשיג ,2לכן הוא לא יבחר מהלך ששם הוא לא יכול להשיג יותר מ .1 • לכן אפשר לא להמשיך עם ענף זה. • זה נקרא חיתוך (באנגלית)Cut-Off : • בדוגמה זאת חתכנו שני ענפים. • שימו לב שאפשר לחתוך תת-עץ גדול! 27 2 -1 -2 XX 1 2 5 חיפוש עם חיתוך Alpha-Beta רעיון זה של חיתוך הנו בסיס לאלגוריתם "חיפוש עם חיתוך "Alpha-Betaאו פשוט "חיפוש "Alpha-Beta שמשתמשים בו בסוכני משחק מקצועיים אפשר לממש חיתוך Alpha-Betaגם ב Minimaxוגם ב Negamax אנחנו נלמד ב Negamax נתחיל בדוגמה שלנו ואז נכתוב את האלגוריתם 28 חיפוש עם חיתוך Alpha-Beta 3 3 -3 -3 0 0 X X 3 3 -3 -3 4 4 0 0 2 3 X -3 1 0 3 -2 -3 -4 ערך של קדקודים בצבע כחול לא משפיע על ההחלטה הסופית 29 הרעיון של החיתוך במושגים של αו β ביתא ( – )βהערך הנמוך ביותר שהיריב יכול להכריח עבור הקדקוד הנוכחי α=2 2 β=-2 score=-1 -2 XX 1 2 5 אלפא ( – )αהערך המקסימלי שהשחקן הנוכחי יכול להכריח עבור עצמו למה צריכים את ?αכי -αהוא נהיה βעבור היריב! 30 חיפוש עם חיתוך Alpha-Beta α=3 3 α=-3 -3 )X(β=-3 α=0 0 )X(β=-3 α=3 3 α= 4 4 α=3 0 α= -3 -3 α= 2 3 )X(β=3 -3 1 0 3 -2 -3 -4 ערך של קדקודים בצבע כחול לא משפיע על ההחלטה הסופית 31 Alpha-Beta חיפוש עם חיתוך Call: result = AlphaBeta( s, depth, -∞, +∞); int AlphaBeta( state s, int depth, int alpha, int beta ) { if( end_of_game || depth == 0 ) return( Heuristic( s ) ); score = -∞; for( child = 1; child <= NumbSuccessors( s ); child++ ) { value = -AlphaBeta( Successor( s, child ), depth-1, -beta, -alpha ); if( value > score ) score = value; if( score > alpha ) alpha = score; if( score >= beta ) break; } return( score ); } 32 יש להיזהר! אלפא-ביתא מורכב מכמה שורות קוד בלבד ,אבל הוא לא אלגוריתם פשוט! (במיוחד אחרי שיפורים המתוארות בהמשך) באג יכול להסתתר זמן רב ,עד שפתאום נבחר מהלך גרוע (כלומר ערך של עלה לא נכון עולה עד לשורש) 33 Performance Enhancements for Alpha-Beta 34 נתחיל בציטוט ) לא רק על משחקים,(אמרו אותו על חיפוש בכלל “If the search algorithm is really 20 lines of code, then why is my search routine over 20 pages of code?” M. Newborn, 1985 (http://www.cs.mcgill.ca/~newborn) 35 אלגוריתם מול שיפורים בהינתן בעיה (כל מין סביבה) ,בדרך כלל קל יחסית לבחור אלגוריתם מתאים למשל ,אם אני צריך סוכן שישחק שחמט ,אני יכול להשתמש ב Minimax פעמים רבות האלגוריתם הבסיסי חלש מדי ,כלומר אינו יכול לתת פתרון של איכות הרצוי בזמן העומד לרשותנו במקרים כאלו רוב הכוח של הפתרון יכול לבוא דווקא משיפורים חיתוך אלפא-ביתא הנו שיפור עבור חיפוש Minimax 36 אבל כולם משתמשים בו ולכן קוראים לאלגוריתם אלפא ביתא דוגמה של כוח שיפורים15-puzzle : (שנת )2004 37 רעיון בסיס של משפרי אלפא-ביתא מה היה קורה לו היינו שוקלים קודם את המהלך הגרוע יותר? 3 3 0 3 3 -5 -3 -3 X 5 0 4 3 0 5 4 חסכנו הערכה של מצב זה (וכל תת העץ שלו)! הרעיון המרכזי של משפרי אלפא ביתא הוא שאנחנו צריכים לשקול את המהלכים הטובים מוקדם ככל האפשר 38 3 עד כמה זה חשוב נגדיר שני טיפוסי קדקודים: – ALL צריכים לשקול את כל המהלכים – CUT קיים אפשרות לחיתוך הנה העץ שנקבל אם תמיד נשקול את המהלך הטוב ביותר לפני כל המהלכים האחרים: all all all cut … cut cut … cut cut … cut cut 39 … cut all all cut … cut all עד כמה זה חשוב ?b הואBF אם הd כמה עלים שקלנו בעומק bd/2 ~ bd/2 + bd/2 - 1 אז,9 ומחפשים לעומק10 הואBF אם, למשל Minimax: Alpha-beta: all all 109 105 + 104 all = 1,000,000,000 = 110,000 … all cut cut … cut all all cut … cut cut … cut cut … cut cut 40 אנו לא יודעים איזה מהלך טוב יותר אנו לא יודעים איזה מהלך טוב יותר לו היינו יודעים ,הרי מלכתחילה לא היינו צריכים לערוך חיפוש! לכן: קיימות הרבה דרכים כדי לשער את יעילותה של כל מהלך ממיינים את המהלכים בהתאם לשיעור זה להלן בקצרה כמה דרכים כדי לשער את טיב המהלך: חיפוש Minimaxרדוד (כגון לעומק 1או )2 טבלת טרנספוזיציות הינה טבלת Hashששומרת את המצבים שפגשנו במהלך החיפוש עבור כל מצב שומרים :הערכה ,המהלך הטוב ביותר ,עד איזה עומק היה החיפוש ממצב זה ,האם ההערכה הייתה מדויקת או היה חיתוך לפרטים נוספים (כי רוצים ליצור הסוכן הטוב ביותר בכיתה!) יש ללמוד http://webdocs.cs.ualberta.ca/~jonathan/PREVIOUS/Courses/657/Notes/4.DAGs.pdfו http://webdocs.cs.ualberta.ca/~jonathan/PREVIOUS/Courses/657/Notes/5.IDandMO.pdf 41 Iterative Deepening 42 עד איזה עומק לחפש אמרנו קודם לכן שאנחנו צריכים לבחור עומק חיפוש בהתאם לזמן העומד לרשותנו אנחנו יכולים לעשות הערכה כזאת עבור ,Minimaxכי אנחנו יודעים בערך מה היא כמות העבודה ()bd אבל עם חיתוך אלפא-ביתא הכול תלוי בהצלחתנו לשקול בהקדם מהלכים טובים ( ) מה הם האפשרויות? אם נחפש מדי לעומק ,לא תהיה לנו החלטה בזמן אם נחפש עד עומק קטן מדי ,אז לא נשתמש בזמן העומד לרשותנו איזה אפשרות יותר טובה? העמקה איטרטיבית אומרת לבחור לכתחילה באפשרות השנייה 43 העמקה איטרטיבית מחפשים עד עומק 1 נשאר זמן? מחפשים עד עומק 2 וכו' עד שנשתמש בכל הזמן 44 יתרונות וחסרונות העמקה איטרטיבית חסרונות: רק את האיטרציה האחרונה היינו באמת צריכים – הפסד זמן על איטרציות הקודמות יתרונות: 45 משתמשים בכל הזמן מקבלים החלטה טובה עד כמה שניתן בזמן העומד לרשותנו יש סיכוי גבוה שהמהלך שהיה הכי טוב באיטרציה הקודמת יהיה הכי טוב באיטרציה הנוכחית – נשקול אותו ראשון ונחתוך! אם השתמשנו בטבלת טרנספוזיציות ( ) ומילאנו אותה ,נחסוך עבודה רבה באיטרציה הנוכחית ! חיפוש הנו שיטה מאד חשובה ב AI בהינתן בעיה ,קל יחסית לבחור אלגוריתם מתאים פעמים רבות רוב הכוח של הפתרון בא ממשפרי ביצועים למדנו כמה אלגוריתמים: Minimax ו Negamax ) ( Expectimax הצגנו כמה משפרי ביצוע ( העמקה איטרטיבית חיתוך אלפא-ביתא 46 )