יסודות בינה מלאכותית ויישומיה (096210)
Transcription
יסודות בינה מלאכותית ויישומיה (096210)
יסודות בינה מלאכותית ויישומיה ()096210 תרגיל בית -2פתרון בעיות MDP תאריך הגשה :ראו באתר הקורס תרגיל בית 2אינו תלוי בתרגיל מספר .1 מטרה: מטרת התרגיל היא להתנסות בבניית פותר בעיית תכנון סטוכסטי ספציפית ,תוך שימוש הן ביסודות של השיטות הסטנדרטיות לפתרון MDPוהן ברעיונות יצירתיים שלכם. העיקרון של כל לוח משחק הוא זהה Bomberman ,צריך "להרוג" את כל המפלצות שעל גבי הלוח מבלי להיאכל על ידי אחת מהן. לוח המשחק מורכב מ – NxMמשבצות ומכיל: 4 סוגים של אובייקטים :קירות ,שחקן ,פצצה ומפלצות. 2 סוגים של קירות: oקירות שניתנים לפיצוץ. oקירות שאינם ניתנים לפיצוץ. על גבי הלוח ,נמצא שחקן אחד ,Bomberman -ומספר כלשהו של מפלצות (שימו לב, בניגוד לת"ב 1יכולות להיות יותר מארבע מפלצות). המערכת אותה תממשו תתקשר בצורה איטרטיבית עם הקוד אותו אנחנו מספקים .הקוד שלנו מסמלץ את הסביבה של ,Bombermanכלומר לוח המשחק .לאחר יצירת אובייקט מהמחלקה שתבנו ,הקוד שלכם יקבל את המצב הנוכחי של הלוח ויחזיר את הפעולה שעל ה Bomberman -לבצע. המשחק רץ מספר מוגדר של צעדים ומחולק לתת-משחקים כאשר כל תת-משחק מתחיל במצב ההתחלתי של הלוח ,ויכול להסתיים בשני אופנים: הצלחה – Bombermanפוצץ את כל המפלצות. כשלון – אחת המפלצות "אוכלת" את ( Bombermanיכול להגרם על ידי כניסה של Bombermanלמשבצת בה יש מפלצת ,או כניסה של מפלצת אל המשבצת של ,)Bombermanאו Bombermanפוצץ את עצמו (גם אם המפלצות הנותרות פוצצו עמו). אם תת-משחק מסתיים ,הלוח חוזר למצב ההתחלתי והכל חוזר חלילה עד ש- Bombermanיסיים את צעדיו. המדיניות שעליכם לספק לאו דווקא חייבת להיות סטציונרית ,כלומר אתם לא חייבים להחזיר כל פעם את אותה הפעולה כאשר המערכת מגיעה למצב נתון כלשהו. תיאור כללי של הבעיה: הסוכן בבעיה שלנו הוא שחקן .Bombermanמטרתו היא "לפוצץ" את כל המפלצות על לוח המשחק .בכל עת ,מצבו של המשחק מיוצג ע"י מטריצה ) (gameבגודל NxMשמייצגת את לוח המשחק ,הכניסות במטריצה מסמנות את המצב של האובייקטים בו. ייצוג הלוח ופעולות הקלט שמתאר את הבעיה מועבר למחלקה Controllerכאשר: - gameמטריצה MxNשמייצגת את לוח המשחק .כל כניסה במטריצה מקבלת את אחד מהערכים הבאים: – 99 קיר שלא ניתן לפוצץ ( – firewallחומת אש). – 90 קיר שניתן לפוצץ. Bomberman – 18 במשבצת ריקה. Bomberman – 88 במשבצת עם פצצה. – 80 משבצת עם פצצה. – 12 מפלצת במשבצת. – 10 משבצת ריקה. שימו לב :לא תקבלו מצב בו " Bombermanמת" .במקום זה יתחיל תת-משחק חדש. לדוגמא המטריצה: )(12, 99, 18 )(10, 99, 10 )(10, 90, 10 מתארת משחק .Bomberman 3X3שיש בו 2חומות אש ,קיר רגיל 4 ,משבצות ריקות, מפלצת אחת ,ואת .bomberman חוקים לתזוזה בכל צעד יש לבחור פעולה של .Bombermanבביצוע -ראשית Bombermanפועל (ראה רשימת הפעולות בהמשך) ,ולאחר מכן כל אחת מן המפלצות זזה משבצת אחת (המפלצות מוזזות ע"י המערכת). בכל פעולה ,אם Bombermanנכנס למשבצת בה יש מפלצת זה נחשב לכישלון במשחק. אחרי כל תזוזה של מפלצת ,אם היא נכנסה למשבצת בה נמצא Bombermanזה נחשב לכישלון במשחק .יתר על כן ,המצב יחשב ככשלון אם Bombermanבעצמו נפגע מהפיצוץ. כל פעולה מיוצגת על ידי מחרוזת .המחרוזת מייצגת את המהלך של .Bomberman הזזה של Bombermanלמעלה – מיוצג על ידי “”U הזזה של Bombermanלמטה – מיוצג על ידי “”D הזזה של Bombermanימינה – מיוצג על ידי “”R הזזה של Bombermanשמאלה – מיוצג על ידי “”L חוסר תזוזה של – Bombermanמיוצג על ידי “”W הטמנת פצצה ע"י – Bombermanמיוצג על ידי “”S פיצוץ פצצה ע"י – Bombermanמיוצג על ידי “”B אלו הן הפעולות היחידות המותרות ל – .Bomberman חוקים .1 .2 .3 .4 .5 לפצצות: בכל זמן נתון על הלוח יכולה להימצא לכל היותר פצצה אחת. Bombermanמטמין את הפצצה במשבצת שהוא נמצא בה. גם Bombermanוגם המפלצות לא יכולים להיכנס למשבצת בה יש פצצה. פצצה מפוצצת את המשבצת בה היא נמצאת ובנוסף את כל המשבצות הסמוכות אליה (למעלה ,למטה ,ימינה ושמאלה) .סך הכל ,פיצוץ משפיע על חמש משבצות לכל היותר. פיצוץ משמיד את כל הנמצא במשבצות פרט לחומות אש (המסומנות במספר .)99 שימו לב שאם הפעולה של Bombermanהיא פיצוץ פצצה ,המפלצות זזות לאחר שהפצצה התפוצצה (והשמידה את כל מה שברדיוס הפיצוץ) – כלומר קירות שפוצצו כבר לא קיימים, ומפלצות שהתפוצצו כבר לא זזות (כי הן כבר מתו). במסגרת התרגיל אתם יכולים לנסות להזיז את Bombermanלתוך ,לפוצץ פצצה לא קיימת או לנסות לשים פצצה שנייה ,זה לא יזיז את Bombermanאך יגרע נקודה אחת מסכום כל הנקודות .לדוגמה :בהינתן ו Bomberman -מפוצץ מפלצת ו"-מת" ,ה"פרס" עבור מהלך זה הוא ( 5 – 10 = -5ראו פירוט ניקוד בהמשך). חוקים לתזוזת המפלצות: .1 .2 .3 .4 בכל מהלך כל מפלצת זזה משבצת אחת ,באחד מארבעת הכיוונים :למעלה ,למטה, שמאלה ,או ימינה. סדר תזוזת המפלצות נקבע באקראי ואין עדיפות לאחת המפלצות. כמובן יש לזכור כי מפלצות אינן יכולות להימצא אחת על השנייה או לזוז אל משבצת שיש בה קיר או פצצה. בכל מהלך כל מפלצת זזה משבצת אחת אל המשבצת שהכי מקרבת אותה אל ,Bombermanכאשר הקרבה אל Bombermanנמדדת במרחק מנהטן (בשיטה זו מדידת המרחק נעשית רק במקביל לצירים ,המרחק בין 2נקודות הוא הסכום של ההפרש בציר ה – Xוההפרש בציר ה – .)Yאם יש יותר ממשבצת אחת עם מרחק מנהטן מינימלי אל ,Bombermanהמפלצת בוחרת אחת מהן בהתפלגות אחידה (יוניפורמית) .לדוגמה :אם יש שלוש משבצות באותו מרחק מנהטן ,המפלצת תבחר כל אחת מהן בהסתברות .1/3 .5אם אין למפלצת משבצות פנויות לזוז אליהם היא נשארת במקום. ניקוד הניקוד המצטבר במשחק יחולק באופן הבא: הטמנת פצצה – מפחית נקודה אחת. פיצוץ מפלצות – חמש נקודות לכל מפלצת שהוסרה מהלוח. סיום המשחק בהצלחה – חמישים נקודות. ניסיון לפעולה לא חוקית – מפחית נקודה אחת. כישלון במשחק – מפחית עשר נקודות. ארכיטקטורה כללית של המערכת: בכל מהלך ה controller-שבניתם בוחר פעולה לביצוע של ,Bombermanמעביר אותה לקוד הסביבה (שאנו מספקים) .לאחר שהסביבה מעדכנת את לוח המשחק בהתאם למהלך שקיבלה (והסתברויות שכתובות לעיל) היא מחזירה את המצב המעודכן של הלוח ל- .controllerלתשומת לבכם ,אם Bombermanמת או כל המפלצות "פוצצו" המערכת תחזיר את המצב ההתחלתי של הלוח( .כזכור ,מצב מיוצג ע"י מטריצה (טופל של טופלים) עם הקידוד שניתן למעלה ,ופעולה תיוצג ע"י מחרוזת בעלת תו אחד מבין התווים: '.'U', 'D', 'R', 'L', 'W', 'S', 'B מימוש עליכם לממש מחלקה בשם Controllerבתוך קובץ בשם .ex2.pyמחלקה זו צריכה להכיל את שתי הפונקציות הבאות (לפחות): )__init__(self, board, steps פונקצית אתחול ה .controller-מקבלת כפרמטר , boardמטריצה מייצגת את המצב ההתחלתי של המשחק כרשום למעלה .ו steps-מספר הצעדים שהמערכת תרוץ על המשחק .פונקציה זו צריכה לחשב מדיניות ( )policyלבחירת התזוזה של Bomeberman בהתחשב במצב הנוכחי של הלוח .שימו לב :פונקציה זו תורץ עם הגבלת זמן של 60שניות, והיא חייבת לסיים עד אז. קבלת השעה הנוכחית בפייתון (מיוצגת כמספר שניות מאז )1.1.1970מתבצעת ע"י קריאה ל )( .time.timeמומלץ בחום לקרוא לפונקציה זו בתחילת הקריאה ל__ ,__initובמקומות אסטרטגיים בזמן הריצה ,לקרוא לה שוב ,ולבדוק כמה זמן עבר .אנחנו נריץ את הקוד שלכם על בעיות שבהן value iterationלא מסיים את הריצה בתוך 60שניות ,ולכן תצטרכו לממש פתרון מתוחכם יותר. )choose_next_move(self, board, steps, reward פונקציה זו משמשת לעדכון המצב הנוכחי ובחירת פעולה .תכנית הבדיקה תקרא לפונקציה זו ,כאשר boardהוא המצב הנוכחי של המשחק steps ,הוא מספר הצעדים שנשארו ל ,Bombermanו rewardהוא סכום הפרסים שנצבר עד כה .פונקציה זו צריכה להחזיר את הפעולה לביצוע במצב הנתון .הפעולה מיוצגת ע"י מחרוזת בעלת תו אחד ( 'U', 'D', 'R', 'L', ' .)'W', 'S', 'Bשימו לב :פונקציה זו תורץ עם הגבלת זמן של 1שנייה ,והיא חייבת לסיים עד אז. בנוסף ,הקובץ ex2.pyצריך להכיל משתנה בשם ,idsשמכיל רשימה עם מספרי הזהות שלכם. קבצים נוספים הקובץ bomberman.pyמכיל את המחלקה .Game מחלקה Gameמייצגת משחק בלוח הנתון ,ומכילה את בשדות הבאים: – stepsמספר הצעדים. – initהמצב ההתחלתי של הלוח. – boardהמצב הנוכחי של הלוח. – locationsמיקום הנוכחי של המפלצות Bomberman ,ופצצה. – doneהאם תת-המשחק הנוכחי הסתיים. – actionsהפעולות האפשריות. המתודה: )__init__(self, steps, board מאתחלת את המחלקה. )set_locations(self מאתחלת את המילון .locations )reset(self מאתחל את ההמשחק. )there_is_cell(self, move מחזירה Trueאם ורק אם המהלך אינו חורג מהלוח. )move_bomberman (self, act מזיזה את ( Bombermanאם אפשר) ומחזירה את התגמול על כך. )set_bomb (self מטמין פצצה במשבצת בה נמצא ) Bombermanאם אין פצצה אחרת על הלוח). )blowup (self מפוצץ פצצה בהינתן והיא נטמנה. )choose_monster_move (self, monster_location בוחרת באופן אקראי את אחת המשבצות שהכי מקרבות את המפלצת אל ,Bomberman Bombermanנמדדת במרחק מנהטן. )move_monster (self, monster_location מזיזה את המפלצת על משבצות שנבחרה ע"י .choose_monster_move )move_all_monster s(self מזיזה את כל המפלצות בסדר שרירותי. )update_board(self, move מבצעת את המהלך הנתון .מזיזה את ,Bombermanומפלצות בסדר הזה ומחזירה את התגמול. )play_game(self, policy, visualize = True מריצה את המשחק מספר צעדים נתון. )evaluate_policy(self, policy, times, visualize = True מבצעת הערכה של ה Controller-שבניתם ע"י הרצה של 30 play_gameפעם ,ומחזירה את הממוצע החשבוני. בנוסף למחלקה ,Gameאנו מספקים לכם קוד למימוש MDPושיטות פתרון שונות שלו, בקובץ .mdp.pyשימו לב שכנראה תצטרכו לשנות חלקים מקובץ זה .אם שיניתם פונקציה מסוימת ,עליכם להעתיק אותה לקובץ – ex2.pyאתם מגישים רק קובץ זה. הסבר על הקובץ :mdp.py המחלקה MDPהיא מחלקת בסיס עבור .MDPוהיא מכילה את הפונקציות הבאות: )__init__(self, init, actlist, terminals, gamma מאתחל MDPעם מצב התחלתי ,initרשימת פעולות ,actlistקבוצת מצבים סופיים ( terminalsאובייקט מסוג ,setשמכיל מצבים) ,ופרמטר gammaעבור discount factor (גורם מהוון). )R(self, state מחזיר את ה reward-המידי במצב state )T(self, state, action מחזיר רשימה של המצבים שאליהם ניתן לעבור לאחר הפעלת הפעולה actionבמצב .stateהרשימה צריכה להכיל זוגות מהצורה )’ (pr, sכאשר ’ sהוא מצב שניתן לעבור אליו בהסתברות .pr )actions(self, state מחזיר את רשימת הפעולות שניתן להפעיל במצב .state שימו לב :על מנת להשתמש במחלקת ,MDPעליכם לרשת ממחלקה זו ,ולדרוס (לפחות) את הפונקציה .Tבנוסף ,בפונקצית ה __ __initעליכם למלא את קבוצת המצבים של ה- ,MDPהנמצאת ב self.states .self.statesהוא אובייקט מסוג setשל מצבים .מצב יכול להיות כל אובייקט שהוא ( hashableכמו בתרגיל בית .)1 תיעוד על setניתן למצוא ב .http://docs.python.org/library/stdtypes.html#set-דוגמא למימוש של MDPניתן למצוא באותו קובץ ,במחלקה ,GridMDPשמתארת MDPשל ניווט ב grid-ע"י פעולות תנועה למעלה/למטה/ימינה/שמאלה. בנוסף ,יש בקובץ mdp.pyמימוש של value_iterationושל ,policy_iterationיחד עם פונקציות עזר .מותר להיעזר בקוד שמסופק שם על מנת לבנות את ה policy-שלכם. בדיקה אנחנו נשתמש בקוד שלכם ,ונבנה policyלמספר לוחות משחק שונים .על כל תכניות נריץ את ה policy-שבניתם 30פעמים ,ונחשב את הרווח הממוצע שלכם .זה מתבצע בקובץ .check.pyעל מנת שתוכלו לראות את כל המצבים שה policy-שלו מוביל אליהם ,אתם יכולים להחליף את הערך של visualizeל True-בקריאה לbomberman. - )…(.run_evaluate_policy התחרות בתרגיל זה תהיה ע"פ הניקוד הממוצע הגדול ביותר ,כאשר הניקוד של כל לוח משחק מנורמל ל( 1-כלומר ,מי שקיבל את הרווח הגבוה ביותר בכל מסלול יקבל ניקוד של 1 עבור המשחק הזה ,מי שקיבל רווח נמוך פי 2יקבל ניקוד של 0.5עבור המשחק ,וכן הלאה). דרישות מהעבודה המוגשת והוראות הגשה .1 .2 .3 .4 .5 .6 הגשה בזוגות או בודדים בלבד! אין הגשה עם יותר משני אנשים – אין טעם לשאול. ההגשה היא אלקטרונית בלבד ותתבצע דרך אתר ה moodle-של הקורס בלבד. יש להגיש אך ורק את קובץ ex2.pyשלכם .אין להגיש את קבצי העזר המצורפים, הבדיקה תדרוס קבצים עם שמות זהים .אין להגיש קובץ zip/rar/7z/ace/whatever – הגישו את הקובץ ex2.pyלא מכווץ. אל תשכחו לכתוב את מספרי ת"ז שלכם במשתנה ( idsכמפורט למעלה) ,אחרת לא נוכל לדעת מי הגיש את התרגיל. אם יש מגיש בודד – idsצריך להיות רשימה באורך אחד (]”,)ids = [“000000000 לא רשימה באורך 2עם מחרוזת ריקה. מספיק שאחד מבני הזוג יגיש – אין צורך ששני בני הזוג יגישו. עצור האם קראת את הוראות ההגשה? האם פעלת על פי הוראות ההגשה?