Transcript הרצאה 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
)