Ron Famini, Lior Bar,

Similar documents
קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות.

Practical Session No. 13 Amortized Analysis, Union/Find

ASP.Net MVC + Entity Framework Code First.

מבוא לתכנות ב- JAVA תרגול 7

עץ תורשה מוגדר כך:שורש או שורש ושני בנים שכל אחד מהם עץ תורשה,כך שערך השורש גדול או שווה לסכום הנכדים(נכד-הוא רק בן של בן) נתון העץ הבא:

A JEW WALKS INTO A BAR: JEWISH IDENTITY IN NOT SUCH JEWISH PLACES

Hebrew Ulpan HEB Young Judaea Year Course in Israel American Jewish University College Initiative

A Long Line for a Shorter Wait at the Supermarket

Reflection Session: Sustainability and Me

A R E Y O U R E A L L Y A W A K E?

Patents Basics. Yehuda Binder. (For copies contact:

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 102 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 5

ANNEXURE "E1-1" FORM OF IRREVOCABLE STANDBY LETTER OF CREDIT PERFORMANCE OF CONTRACT (WHERE PRICES ARE NOT LINKED TO AN ESCALATION FORMULA)

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

טכנולוגיית WPF מספקת למפתחים מודל תכנות מאוחד לחוויית בניית יישומיי

תצוגת LCD חיבור התצוגה לבקר. (Liquid Crystal Display) המערכת.

Depth-First Search DFS

תרגול 8. Hash Tables

מושגים בסיסיים תלמידים והורים יקרים,

המבנה הגאומטרי של מידה

מכונת מצבים סופית תרגול מס' 4. Moshe Malka & Ben lee Volk

Rules Game (through lesson 30) by Nancy Decker Preparation: 1. Each rule board is immediately followed by at least three cards containing examples of

יסודות מבני נתונים. תרגול :9 ערימה - Heap

THINKING ABOUT REST THE ORIGIN OF SHABBOS

Name Page 1 of 6. דף ט: This week s bechina starts at the two dots in the middle of

חידת קופרניקוס: למה חלפו 0222 שנה עד לגילוי שכדור הארץ מסתובב סביב השמש? הרצאה של ד"ר בועז כץ

מבוא לרשתות - תרגול מס' 11 Transparent Bridges

תרגול מס' 01 אלגוריתם דיניץ

דיאלוג מומחז בין מרטין בובר וקרל רוג'רס

Genetic Tests for Partners of CF patients

הקיטסיגול הרבחה יעדמל בלושמה גוחה

Checkers Cheaters Eliran Moyal & Moti Berger


תרגול 11 תור עץ חיפוש בינארי

תוכן העניינים: פרק סדרות סיכום תכונות הסדרה החשבונית:... 2 תשובות סופיות:...8 סיכום תכונות הסדרה ההנדסית:...10

בוחן בתכנות בשפת C בצלחה

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

ניפוי שגיאות )Debug( מאת ישראל אברמוביץ

WALTZ WITH BASHIR Brian J. Arnold Adaptation script for DVD Plus - English & Hebrew February 10, 2009

הגדרה: משפחת עצים תקרא מאוזנת אם (n.h(t) = O(log

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

FAIL CONFR URE ONTING

סוטמה ףא ןוויכ תיתימא ריוא תוריהמ סוטמה ביתנ תיעקרק תוריהמ

שאלות חזרה לקראת מבחן מפמ"ר אינטרנט וסייבר

Chofshi.

Yetzer Shalom: Inclinations of Peace

מבני נתונים תרגיל 4 פתרון

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 134 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 37

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

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

B E N D, S T R A I G H T E N, B A L A N C E

מבוא למחשב בשפת פייתון

NATIONAL COUNCIL OF YOUNG ISRAEL. Shavuot Nation JEWISH EDITION. Compiled by Gabi Weinberg Teen Program Director

Summing up. Big Question: What next for me on my Israel Journey?

לצפייה בפתרון בווידאו לתרגילים שבחוברת, כנסו ל "סטטיסטיקה והסתברות" בשאלון 802 שבאתר

ראש השנה דף. 1. A) Our משנה says,... שנראה בעליל בין שלא נראה בעליל.בין Based on this,פסוק what does the word עליל mean?

סילבוס הקורס "דוקטורט בטקסס הולדם - קאש"

שבות תחום מצוות עשה שזמן גרמא סמיכה תקיעה, שברים, תרועה. The אי ור of performing any מלאכה on Rosh HaShanah שופר in preparation of the

The Connection between Town Planning, Public Taking (Appropriation) and Land Appraisal

WHAT IS THE PSHAT OF A METAPHORICAL MITZVAH?

4...Informed Search Strategies Partial Order Planning 29...Hierarchical Decomposition Reenforcement Learning 40...Unsupervised Learning

***Place an X if Closed גמרא (if no indication, we ll assume Open חזרה (גמרא of the :דף times

Apple, keys, pen, pencils, pencilbox,(toy)elephant,( toy) boy, (toy) girl, ball

WHAT ATHEISM HAS LEARNED FROM RELIGION

מ ש ר ד ה ח י נ ו ך ה פ ד ג ו ג י ת א ש כ ו ל מ ד ע י ם על ה ו ר א ת ה מ ת מ ט י ק ה מחוון למבחן מפמ"ר לכיתה ט', רמה מצומצמת , תשע"ב טור א'

Information The marks for questions are shown in brackets. The maximum mark for this paper is 50. You must not use a dictionary.

מבנה ההרצאה חלק א' 1 (הסבר על הסימולטור.Torcs 2 (הסבר על תחרות EvoStar 2010 ביחד עם הדגמה של.GA חלק ב' הסבר על המאמר

בראשית פרק טו פסוק א אחר הדברים האלה היה דבר ה' אל אברם במחזה לאמר אל תירא אברם אנכי מגן לך שכרך הרבה מאד:

כנס את תבואתו - He harvested the produce of his grapevine

הוראות בעברית 40'

.וייח לש ןקחשהו יאמיבה,יאטירסתה אוה םדאה

Advisor Copy. Welcome the NCSYers to your session. Feel free to try a quick icebreaker to learn their names.

Teaching Halakha and Respecting Student Autonomy Source Sheet Rahel Berkovits

ביצה דף. ***Place an X if Closed גמרא (if no indication, we ll assume Open חזרה (גמרא of the :דף times

פתרון בעיית צביעת הגרפים בעזרת אלגוריתם גנטי ואלגוריתמי Beam-Search

תוצאות סקר שימוש בטלפון

DNS פרק 4 ג' ברק גונן מבוסס על ספר הלימוד "רשתות מחשבים" עומר רוזנבוים 1

CML כנס שנתי של מודעות ל- CML 4-6 לאוקטובר 2018, מלון רמדה, חדרה

JUDAISM AND INDIVIDUALITY

םימתירוגלאו םינותנ ינבמ המירעו תינס, חמ רות רקצול הנילופ

תכנות בטוח חלק ב ' מאת עידו קנר

הקדמה בדיקת תמיכה ב- SSL מאת עידו קנר

תושירדהו הדובעה תרדגה

A-level MODERN HEBREW 7672

Name Page 1 of 7. This week s bechina starts on 26b, 29 lines from the bottom and ends at the end of 27b.

The Power of Words. (Holding Koren Mahzor aloft) How many words are we going to say today? How many?

Female Combat Soldiers in the Israeli Defense Forces: Use of Force within the Israeli-Palestinian conflict

Airspeed Velocity of an Unladen Swallow When Rabbi Jeremiah met his holy grail

חוק זכויות הסוכן חוק חוזה סוכנות )סוכן מסחרי וספק(

ביטקוין: מערכת שיתופית לכסף אלקטרוני

May 26, 1967 Minutes of an Extended Meeting of the Ministerial Committee on Security Issues

תורשכ ירפס לכ ץבוק " ב י קלח יללכ רעש

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

Debunking the Myth of the Jewish Afterlife The Olami Resources Chaburah October 24, 2018

sharing food intro price & extra drinks * ניתן להזמין מנות כשרות בתאום מראש for good memories

State Pattern מימוש מכונת מצבים (FSM) מבוא בעיה תמיכה ועדכונים עדכון מס' 48 מאי 2002

קריאת גרפים. לצפייה בפתרון בווידאו לתרגילים שבחוברת, כנסו ל "קריאת גרפים" בשאלון 801 שבאתר 116

סוגי פניות בתוכנית הלימודים עיוני משולב מעשי 180 דקות 4 שיעורים

Name Page 1 of 5. דף ז. This week s bechina begins with the fifth wide line at the top of

Transcription:

פרויקט סיום בקורס מבוא לבינה מלאכותית : מרצה : פרופ' ג'ף רוזנשיין מתרגל : לירון כהן מגישים : רון פמיני וליאור בר Ron Famini, ronfamini@gmail.com, 371214103 Lior Bar, lior656@gmail.com, 377323340 עמוד 0

עניינים תוכן הקדמה... 1 כללי המשחק... 4 אלגוריתם מינמקס... 3 ההתחלה - מינמקס נאיבי... 2 צמצום הפעולות האפשריות... 1 מקס צעד לפני מינמקס... 3 הערכת מצב... 3-0 מבחן 2 הכוכבים... 8 שני כוכבים מנהיגים... 9 לחזות את היריב... 17 יותר זה לא תמיד יותר טוב... 11 פקטור פונקצית המרחק... 11 ניתוח תוצאות ורנדומאליות... 14 דברים שעוד ניתן לעבוד עליהם... 13 סיכום... 13 הקדמה העבודה מתארת את תהליך הפיתוח שעברנו על מנת ליצור שחקן AI שמשחק במשחק האסטרטגיה,Planet Wars מטרת העבודה הייתה לבדוק את אופי השימוש באלגוריתם המינמקס ולחקור את התוצאות שהוא נותן. לעבודה מצורף קובץ README ובו הוראות ההרצה למשחק ולשחקנים שיצרנו עבורו. לדוגמא, על מנת להריץ את המשחק שבתמונת השער יש להשתמש בפקודה: java -jar tools/playgame.jar maps/map72.txt 0555 0555 log.txt "python MaxMinMax2.py" "python MaxMinMax2LeaderAttack.py" java -jar tools/showgame.jar עמוד 1

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

אלגוריתם מינמקס המשחק הוא משחק סכום אפס, רק אחד יכול לנצח והשני מפסיד. לכן, החלטנו להשתמש באלגוריתם מינמקס )או למעשה בשיפור שלו - אלפא בטא(. מטרת השחקן שלנו )שחקן ה- )max היא להשיג תוצאה מקסימאלית, ומניחים שמטרת האויב היא להשיג תוצאה מינימאלית )באופן עקרוני, תוצאה של תור מסוים היא ההפרש בין מספר החלליות שלנו לזה של היריב, וההפרש בין צפי הייצור שלנו לזה של היריב(. בכל תור, השחקן שלנו יוצר עץ שהשורש שלו זה המצב הנוכחי. עבור כל פעולה שהוא שוקל לעשות הוא יוצר פיצול בעץ )פעולה היא רשימה של פקודות כשכל פקודה מבצעת שליחה של צי מכוכב מסוים לכוכב אחר(. לאחר מכן השחקן שלנו מניח שהאויב יכול לעשות סט מסוים של פעולות, ומבצע פיצול של כל אחד מהפיצולים שלו ע"פ פעולות היריב. הפעולות חוזרות שוב ושוב ע"פ העומק שעליו קבענו להגיע, כל זוג פיצולים )אחד שלנו ואחד של האויב( הוא תור. לאחר הגעתנו לעומק הרצוי מתחיל תהליך - DFS תחילה יורדים לכיוון מסוים עד הסוף. כשמגיעים לסוף מחשבים את תוצאת המצב אליו הגענו ומתחילים לחזור אחורה. כשחוזרים לצומת מסוים ממשיכים לבדוק את בניו ואז ניתן לו ערך. הערך הוא המקסימום או המינימום של ערכי בניו, בהתאם להאם הצומת שלנו )max( או של האויב.)min( כשצומת שייך לשחקן מסוים, הוא זה שיכול לבחור איזו תוצאה לקחת מבין בניו, כי התוצאה נקבעת ע"י הצעד אותו הוא יבחר לעשות. שיפור אלפא בטא: השיפור אומר שבמידה שרואים שאחד מהבנים יוביל בהכרח לתוצאה פחות טובה מבן אחר אז אין סיבה להמשיך לבדוק אותו )הבדיקה נעשתה גם לרמת ה- min וגם לרמת ה.)max המימוש שלו הוא ע"י שני משתנים אלפא ובטא שמחזיקים ערכים מקסימאליים ומינימאליים בהתאמה, לכל שחקן. השיפור משפיע רק על זמן הריצה ולא על התוצאה )התוצאה זהה לתוצאת מינמקס רגיל(. באפור צמתים שלא יבדקו ע"י האלגוריתם, כתוצאה משיפור ה-אלפא בטא עמוד 3

ההתחלה - מינמקס נאיבי כהכנה, לפני שנגשנו לפיתוח אלגוריתמים חכמים אשר בוחרים את הפעולות, היה עלינו לכתוב מספר פונקציות אשר יודעות לסמלץ משחק: 1. פונקציה שמעתיקה את המשחק.)createPlanetWarsState( 4. פונקציה שמקדמת את המשחק אחרי הפעולות שלנו רק מוסיפה את הפעולות שבחרנו לעשות.)advanceStateFirst( 3. פונקציה שמקדמת את המשחק אחרי הפעולות של היריב מוסיפה את הפעולות של היריב, ומקדמת את התור,advanceStateSecond( שלושת הפונקציות נמצאות בקובץ.)utils היכולת להריץ את המשחק קדימה היא קריטית כאשר בוחרים באלגוריתם מינמקס מאחר ואחרת אין דרך להשוות בין החלופות. בהתחלה רצינו שרוב ההחלטה תנבע ישירות מאלגוריתם המינמקס. היה ברור לנו שלעשות מינמקס על כל המצבים )שליחה של כל מספר חלליות מכל כוכב לכל כוכב( תהיה לא אפשרית, לכן תכננו לעדן את אפשרויות ולתת לכל כוכב לשלוח אחוז חלליות מסוים )7-177 בקפיצות של 47%(, כשכל כוכב יכול לשלוח לכל היותר צי אחד בתור. הדבר מדמה את השליטה שיש לשחקן האנושי במשחק galcon )שהוא דומה למשחק שלנו אבל מאפשר משחק של שחקן אנושי(. אפילו תחת ההנחות האלו הבנו די מהר שאין סיכוי שנעמוד בזמן חישוב סביר לכל תור במשחק. חישוב מקורב של זמני ריצה עבור המקרה הנאיבי: כשמשחקים תחת ההנחות הבאות: - מפה של 11 כוכבים )מפות התחרות הן של 47(. - עומק עץ 4 תורות קדימה )4 Min ו- 4.)max - השחקן יכול לשלוח מקסימום צי אחד מכל כוכב. - הצי של השחקן יכול להיות 7.4.7.2.7.3.7.8.1 ממספר החלליות שבכוכב )1 מצבים( - במצב הנוכחי, לכל שחקן 4 כוכבים לכל שחקן יש לפחות =10*5*2 120 אפשרויות שליחה בתור )ללא הכללת אי שליחה(. יוצא שיהיו 207360k צמתים בעץ ה- )^(depth) )4^120= min-max אפשרויות שליחה((. חישוב המספר הנ"ל של צמתים לוקח למחשב זמן רב. כיוון שלכל שחקן בכל תור יש שניות בודדות לצורך חישובים, יוצא שאפילו תחת ההנחות המקלות מאוד האלו לא נוכל להשתמש באלגוריתם המינמקס. שיפור ה-אלפא ביתא משפר את הסיבוכיות בשורש במקרה הטוב ביותר, שזה כ 14k צמתים, אבל לא ניתן להסתמך על כך שזה המקרה הטוב ביותר ובנוסף חישוב מספר כזה של צמתים, גם הוא בעייתי. דרך אחת להתמודד עם הבעיה יכלה להיות הוספת זמן לחישוב כל תור, או חישוב מקבילי, ע"י מספר מעבדים, עם זאת בגלל דרישת החישוב הגדולה שעליה מדובר היה נידרש זמן רב או מספר גדול מאוד של מעבדים, ולכן בחרנו בדרך אחרת, החלטנו להכניס בחירה חכמה יותר של פעולות, שתהפוך את עלות החישוב לאפשרית. עמוד 4

צמצום הפעולות האפשריות כפי שציינו, מהר מאוד הבנו שלבנות מינמקס מלא לכל הכוכבים הוא בלתי אפשרי, וגם הגבלה של הפעולות מכל כוכב ל- 5 אפשרויות מתבדרת מהר מאוד. לכן חיפשנו דרכים לצמצם את מספר הפעולות האפשריות שאנחנו יכולים לעשות בתור. מהר מאוד זיהינו שיש פעולות שמראש אנחנו יודעים שאין טעם להוציא אותן. למשל, לתקוף כוכב ניטראלי עם מספר חלליות הקטן מזה שצריך כדי לכבוש אותו. לכן החלטנו לכתוב פונקציה שמחשבת על סמך המצב הקיים, כולל החלליות באוויר )שלנו כמו גם של היריב(, מהו המספר המינימאלי של חלליות שעלינו לשלוח מכוכב מוצא כלשהו לכוכב יעד אחר על מנת שאחרי שכל החלליות יגיעו ליעדן הכוכב יהיה בשליטתנו )הפונקציה,shipsNeededForControl בקובץ.)utils בשלב זה קבלנו החלטה שלמען פשטות, כל כוכב יוציא לכל היותר צי אחד בתור. בחירת הצי אותו יכול כוכב מוצא לשלוח נעשתה באופן הבא: 1. לולאה על כל שאר הכוכבים, שבה עבור כל כוכב: a. חישוב החלליות הנדרשות לשליטה על הכוכב. b. אם המספר הוא אפס, הכוכב יהיה בשליטתנו גם אם לא נשלח צי, ולכן האופציה יורדת מהשולחן. c. מתן ציון לכוכב היעד על בסיס הפרמטרים הבאים )הרחבה על הפרמטרים תנתן בהמשך(:.c.i מספר החלליות שצריך לשלוח כדי לשלוט..c.ii קצב הגדילה של כוכב היעד..c.iii מרחק כוכב היעד מכוכב המוצא..c.iv הנוסחה היא: 1 +GrowthRate 1+shipsNeeded +DistFactor dist 4. בחירת הכוכב עם הציון המקסימאלי ככוכב יעד. קיים מצב שבו לא יבחר אף כוכב יעד, זאת במקרה שכוכב המוצא לא יכול להוציא צי שיוביל לשליטה על כוכב אחר. שחקנים בסיסיים המשתמשים בפונקציה כדי לבדוק את הפונקציה הנ"ל הפעלנו שחקן שבוחר ככוכב המוצא את הכוכב הכי חזק שלו, ובוחר את כוכב היעד בשיטה הנ"ל, ללא שימוש כלל באלגוריתם מינמקס.)BasicBot.py( השחקן הזה כבר ניצח את כל הבוטים שבאים עם החבילה הבסיסית. בשלב זה, לאחר שכתבנו שחקן שמשתמש בפונקציה, שינינו ובדקנו את הפרמטרים המשפיעים על בחירת צי ושליחתו: 1. בהתחלה שמנו הגבלה על מספר החלליות שהכוכב יכול לשלוח למשל אם מספר החלליות שהכוכב צריך לשלוח כדי להשתלט על כוכב כלשהו גדולה ממחצית החלליות על הכוכב, הכוכב לא יוציא את התקיפה. ראינו שכאשר אנו מורידים את ההגבלה הזאת השחקן משתפר. הדבר נובע ככל הנראה בעיקר מכך שמספר החלליות הדרוש בכל מקרה נכנס לשיקולי התקיפה, ולכן הוספת עוד חסם על מספר זה נותן משקל יתר לפרמטר. 4. חשבנו שצריך לתת משקל גדול יותר למרחק מאחר ומספר החלליות הדרושות, יכול להיות גדול משמעותית מהמרחק, ולכן המרחק יכול להיבלע. מאוחר יותר, לאחר שהרצנו את המינמקס, שיחקנו עם הפרמטר הזה קצת יותר, ולכן נרחיב על כך שם. עמוד 5

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

במצב זה התחלנו לראות התנהגות חכמה של השחקן שלנו. עם זאת ברגע שהיו לו יותר מ- 11 כוכבים זמן החישוב עלה על הזמן שהיה לו )אפילו כשנתנו,)5000ms לכן בתור פתרון זמני החלטנו למתן את החמדנות של השחקן, ע"י כך שכשיש בבעלותו כ- 0 כוכבים, הוא יפסיק לתקוף את הכוכבים הניטראליים ויתרכז בתקיפת היריב )והגנה(, במצב זה כבר קיבלנו התנהגות יפה יחסית )השחקן נמצא בקובץ- )MaxUnGreedy.py אבל שחקן זה עדיין לא מסוגל לשחק נגד יריבים חזקים )שכבשו הרבה כוכבים(. עדיין ראינו מספר בעיות: 1. במידה ויהיה לנו יריב רציני ששולט על מספר רב של כוכבים, נגיע למצב שבו יש לנו יותר כוכבים ממה שאנחנו יכולים לחשב )כי נצטרך להשתלט על הכוכבים שלו(. 4. כל כוכב אצלנו פועל באופן עצמאי, דבר המקשה על פעולה משולבת, שיכולה לתת יתרון גדול. 3. לשחקן שלנו אין מספיק העדפה לתקיפה של כוכב אויב על פני כוכב ניטראלי )למרות שבמינמקס יש ציון גבוהה יותר לכיבוש אויב, הפונקציה שבוחרת צעדים למינמקס יכולה לבחור שלא לשים בכלל את האופציה לכיבוש האויב(. עמוד 7

מבחן 4 הכוכבים ייצרנו לעצמנו מפת כוכבים קטנה, שמהווה מבחן שפיות לאלגוריתמים שאנחנו יוצרים. במפה שני כוכבים גדולים )שמייצרים 1 חלליות בכל תור( ושייכים כל אחד לשחקן אחר, ועוד שני כוכבים קטנים )שמייצרים 4 חלליות בכל תור(. מרחקים: גדול לגדול - 9 תורות, גדול לקטן קרוב - 2 תורות, גדול לקטן רחוק - 0 תורות. כל שחקן התחיל עם 177 חלליות. מספר החלליות בכוכבים הניטראליים היה 1 29 או.1 מטרת המבחן היא לראות האם השחקן שלנו מתנהג בצורה הגיונית כלומר הניטראלי רק חללית אחת אז שווה לכבוש את הכוכב הקרוב, אבל אם יש 29 הקרוב תשאיר את התוקף פגיע. אם בכוכב אז תקיפת ההתנהגות שציפינו לראות במקרה של 29 היא שהשחקן החכם ייתן ליריב לתקוף ראשון ואז יתקוף את הכוכב שהשני תקף, מייד אחרי שהשני כבש אותו )כך האויב יפסיד חלליות רבות(, זה מה שאכן קרה ע"י השחקנים הראשוניים שלנו. הופתענו לגלות שכשהשחקנים שלנו החלו לבצע חישובים של כמה חלליות דרושות להשתלטות על כוכב הם עשו משהו הרבה יותר אמיץ - הם תקפו את כוכב הבית )הגדול( של היריב, ועשו זאת מייד כשהיריב שלח צי כיבוש לאחד הכוכבים הניטרליים. שחקן המחשב שלנו ביצע חישוב שלפיו ידע שהוא יוכל להשתלט על הכוכב הגדול, למרות שבזמן שהצי מתקדם לכוכב נוצרים בו עוד ועוד חלליות, וכך לקבל יתרון משמעותי על היריב, לנו כבני אדם לא הייתה אפשרות לחשב את החישוב הזה ולכן חשבנו שהצעד החכם הוא להשתלט קודם כל על הכוכב הקטן )שאותו כבש היריב(. עמוד 8 1 הסיבה למספר 29 היא שהשחקן BullyBot שהוא אחד מהשחקנים ההתחלתיים שמגיעים עם המשחק ומולו התמודדנו בשלבים הראשונים, תמיד שולח 17 חלליות בתקיפה הראשונה, רצינו שבנטרלי יהיה מספר גבוהה אבל שיאפשר לו לכבוש את הכוכב.

שני כוכבים מנהיגים על מנת להתמודד עם הבעיות שתוארו החלטנו לעבור לשיטת הכוכבים המנהיגים, בשיטה זו נבחרים בכל תור מספר כוכבים מנהיגים, שרק הם מבצעים את התקיפות. שאר הכוכבים את החלליות שלהם לכוכב המנהיג הקרוב אליהם כוכבים תומכים שרק שולחים מהווים ביותר. שיטה זו מקטינה את עץ המינמקס כך שגודלו לא קשור למספר הכוכבים שבבעלותנו )העץ יהיה רק על פעולות המנהיגים(. בנוסף, היא מאפשרת להיות אגרסיביים יותר כלפי היריב, כיוון שכוכבי היריב נוטים להכיל מספר גדול יותר של חלליות, ולכן ריכוז החלליות יאפשר לתקוף אותם. היה ברור לנו שאחד המנהיגים יהיה הכוכב הקרוב ביותר לכוכבי היריב, כיוון שקרבתו ליריב תאפשר תגובה הגנתית מהירה על כוכבים אחרים וגם תקיפה טובה יותר. מצד שני יתכן מצב בוא היריב פרוש בכמה מקומות מרוחקים במפה ולכן אם יהיה רק מנהיג שהוא הכוכב הקרוב אליו ביותר, השאר יהיו חשופים, לכן רצינו שיהיה מנהיג נוסף. החלטנו שהמנהיג הנוסף יהיה הכוכב עם הכי הרבה חלליות מבין הכוכבים האחרים. באופן כזה המנהיג השני יהיה כנראה כוכב בעל כח ייצור גדול, לרוב יוצא שזהו כוכב הבית )הכוכב שבו מתחילים ולו תמיד קצב ייצור גדול(. ראינו שעדיין אין תקיפה יותר רצינית של האויב ולכן החלטנו לשנות את פונקצית הציון שעל פיה נבחרות הפעולות האפשריות. הפונקציה בנוגע לכוכב ניטראלי נשארה כמו המקורית: את הפונקציה לכוכב שלנו או לכוכב אויב, שיננו ל: 1 = DistFactor - GrowthRate כוח הייצור של הכוכב. - shipsneeded מספר החלליות הנדרש לכיבוש. - dist המרחק בין הכוכב התוקף לנתקף. המצב החדש הגיוני כיוון שאם תוקפים. מגנים אז על כל איבוד חללית שלנו, גם היריב מאבד חללית ולכן איבוד החלליות לא אמור להשפיע על הכדאיות. בנוסף, אם הצלחנו לתקוף. להגן אז בנוסף לכך שבבעלותנו יש כוכב יצרן, היריב הפסיד אחד כזה ולכן נתייחס לקצב הייצור של הכוכב כאילו הוא פי 4. במצב החדש השחקן יותר אגרסיבי כלפי היריב כיוון שהפונקציה נוטה לתת ציון גבוהה יותר להגנה. תקיפת יריב. גלינו עוד שתי בעיות קטנות בנושא ההגנה העצמית )כוכבים שלנו שלחו חלליות שהיו דרושות להן להגנה(, לכן הוספנו שתי תוספות: 1. כוכב תומך שמותקף לא שולח חלליות למנהיגים )מנע את המצב האבסורדי שבו מנהיג שלח את מספר החלליות הדרוש על מנת להגן על כוכב, אבל בגלל שהכוכב שולח את החלליות שלו למנהיג הם לא שם כדי להגן עליו(, בנוסף השליחה היא ע"פ חצי מכמות הספנות שיש לכוכב בכל תור. 4. אם מנהיג מותקף הוא תמיד שומר לעצמו את המספר הדרוש של חלליות על מנת להגן על עצמו )במידה והוא יכול(. השחקן שהגענו אליו בשלב זה )max2.py( היה כבר שחקן טוב שניצח בצורה יפה את השחקנים הקודמים שהיו לנו. עמוד 9

לחזות את היריב למרות שבשלב זה השחקן שלנו שיחק יפה, עדיין לא ניצלנו את כוחו האמיתי של המינמקס שהוא לחזות את מהלכי היריב ולפעול על פיהם. עם זאת ידענו שאנחנו קצרים מאוד בזמן חישוב )כיוון שלמרות שהקטנו דרסטית את מספר הצמתים לחישוב, העלנו את זמן החישוב של כל פיצול, כיוון שעשינו בחירה חכמה(. ראינו שאפילו להניח שהיריב פועל כמונו זו בעיה מבחינת זמן החישוב, ובנוסף פחדנו שזה יהפוך את השחקן שלנו לשחקן שמתבצר בכוכבים שלו )כי השחקן שלנו אגרסיבי ואם הוא יניח שגם היריב כזה הוא יפחד לתקוף כי יניח שהוא עומד להיות מותקף(. החלטנו לתת ליריב רק את 4 הפעולות הבאות: 1. לא לשלוח ציים חדשים. 4. תקיפה מכוכב יריב שרחוק מהמנהיגים אבל קרוב לכוכב כל שהוא שלנו )פה הנחנו שהיריב יודע מי המנהיגים שלנו(. באפשרות השנייה כוכב היריב תוקף את הכוכב שהכי קרוב אליו עם כל החלליות שיש לו, בחרנו באפשרות זו כי כוכבים שרחוקים מהמנהיגים וקרובים לאויב מהווים נקודת תורפה אצלנו. מציאת כוכב היריב שרחוק מהמנהיגים אבל קרוב לשלנו נעשתה באופן הבא: 1. בחירת כוכב יריב כל שהוא, שיוגדר זמנית כתוקף 4. עבור כל כוכב אחר, נגדיר אותו כתוקף החדש אם מרחקו המינימאלי מהמנהיגים גדול ממרחק התוקף הנוכחי וגם מרחקו מכוכב השחקן השני הקרוב אליו ביותר קטן ממרחק זה עבור התוקף הנוכחי. לאחר שהוספנו את חזיית צעדי היריב, נתנו למינמקס עומק של 1.1 )כלומר max אז min ואז,)max התוצאה )MaxMinMax2.py( הפתיעה לטובה כיוון שאפילו התוספת הקטנה הזו שיפרה את השחקן כך שברוב המשחקים, ברוב המפות, הוא ניצח את השחקן הקודם,)max2.py( וזאת מכיוון שהוא מצליח לשמור על הכוכבים שלו יותר טוב. למשל בדוגמא למטה, שחקן ה- max2 הוא הירוק ושחקן ה- MaxMinMax2 הוא האדום, השחקן האדום מחליט לא לשלוח צי לכוכב ה- 32 הקיצוני )כמו שהירוק עשה(, כיוון שהוא חוזה את אפשרויות הכיבוש שבמרכז ולכן רואה שהוא יזדקק לחלליות שלו שם. עמוד 10

יותר זה לא תמיד יותר טוב רצינו להתחשב בעוד מהלכים בעיתים שהיריב יכול לעשות, שמנו לב שקיימת בעייתיות במקרה שבו מנהיג נכבש, לכן החלטנו להוסיף ליריב את האופציה לתקוף כל אחד מהמנהיגים בעזרת הכוכב הכי חזק שלו, עם כל מה שיש בכוכב הזה. קראנו לשחקן -,MaxMinMax2LeaderAttack.py למרות שלרוב הוא מנצח את,MinMaxMin2 עדיין יש טעויות אסטרטגיות שהוא עושה וגורמות לו להפסיד, ובנוסף במפות מסוימות הוא מפסיד באופן כמעט מוחלט ל.Max2 לאחר חקירת הנושא מצאנו שזה קורה משתי סיבות עיקריות: 1. קורה מצב שבו יש כוכב קדמי, שהשחקן שלנו מניח שהוא ייפול בכל מיקרה ולכן הוא מבצע כיבוש לא אסטרטגי של כוכב ניטראלי )דוגמא: כובש עם 12 כוכב של 13 שממש צמוד לאויב, כך שהאויב יכול ישר לגנוב אותו(. זה הגיוני כי במינמקס לאויב רק צעד אחד ולכן הוא לא לוקח בחשבון את האופציה שהוא יעשה עוד משהו לאחר מכן, כמו לקחת את הכוכב שהוא יכבוש )תופעת האופק - מצב נראה טוב אבל אם היינו חוקרים יותר לעומק היינו רואים שלא(. 4. הוא מפחד על אחד מהמנהיגים ולכן לא מבצע מהלך טוב, למשל בתמונה המצורפת, האדום )MaxMinMax2LeaderAttack( מפחד על 07 ולכן לא תוקף את 49 כמו שהשחקן הירוק )MinMaxMin2( עושה, והדבר נותן לירוק יתרון משמעותי שעוזר לו לנצח את המשחק. פקטור פונקצית המרחק. פונקצית בחירת הפעולות התבססה על נוסחת ציון מהצורה: המשקל )DistFactor( שהחלטנו לתת למרחק כוכב היעד הוא 1, הגענו למספר זה ע"י הרצת שחקנים עם פקטור משקל שונה זה מול זה. גילינו שמצד אחד, פקטור קטן מידי גורם לשחקן לתקוף כוכבים רחוקים, דבר שמגביר את אפקט האופק, כיוון שככול שהכוכב רחוק יותר, יש ליריב יותר אפשרות לנצל את המצב מבלי שהשחקן שלנו יוכל להגיב בזמן. מצד שני, פקטור גדול מידי )47( גורם למצב בוא המרחק הוא הפרמטר שמשפיע הכי הרבה, ובחירת הכוכב אותו תוקפים נעשת כמעט רק על פיו )דבר שמוביל לכיבושים לא משתלמים רק כי הם קרובים(. בבחירת מספר קרוב ל- 1, כבר אין עדיפות לצד מסוים )הניצחון תלוי במפה(, ולכן בחרנו בו. עמוד 11

ניתוח תוצאות ורנדומאליות למרות שהמשחק אמור להיות דטרמיניסטי (כי השחקנים שלנו גם דטרמיניסטים), בפועל כשמריצים זוג שחקנים שלנו נכנסת רנדומיות. זה קורה כיוון שהמשחק מריץ את השחקנים במקביל ולכן סדר הכנסת הציים שלהם למאגר המשחק אינו קבוע. הדבר גורם לכך שיבחרו פעולות שונות במקצת ע"י השחקנים שלנו, לכן שחקן אחד צובר יתרון ומנצח (אפילו אם שני השחקנים הם אותו שחקן - אותו אלגוריתם). על מנת לחקור את ההבדלים בין שחקנים שלנו בחרנו 3 מפות שונות באופיים והרצנו 17 משחקים בניהם, שחקני המינמקס שבדקנו (מסודרים מה"אמיץ" ל "- פחדן ושמרן") הם : - BasicBot ללא מינמקס, הוא תמיד מבצע את הפעולות שהוא בוחר - הכי אמיץ. - Max2 מבצע רק מקס שלפיו מבצע או לא מבצע את הפעולות. - MaxMinMax2 מבצע מינמקס שחוזה שהיריב עלול לתקוף אותו בנקודת תורפה, ולפיו מבצע או לא מבצע את הפעולות, לכן הוא שמרן יותר. - LeaderAttack מבצע מינמקס שחוזה שהיריב תוקף אותו בנקודת תורפה או תוקף את המנהיגים, ולפיו מבצע או לא מבצע את הפעולות. BasicBot מפה : ניצחונות BasicBot ניצחונות Max2 ניצחונות MaxMinMax2 ניצחונות MaxMinMax2 LeaderAttack 04 0 0 8 Max2 04 8 0 8 04 0 3 4 4 1 1 3 MaxMin Max2 3 3 0 9 MaxMin Max2 LeaderAttack 0 17 04 2 4 17 4 2 1 8 במפה 04 השחקנים מרוחקים מאוד אחד מהשני ולכן משתלם להיות אמיץ יחסית, אנחנו רואים כאן פרדוקס : LeaderAttack מנצח את BasicBot שמנצח את Max2 שנצח את.LeaderAttack הפרדוקס קורה כנראה כי למרות שטוב להיות אמיץ, גם השמרנות משפיעה. השחקן MaxMinMax2 כנראה מספיק אמיץ אבל מספיק שמרן כדי לנצח את רוב המשחקים במפה הזו. במפה, 17 השחקנים קרובים יחסית ולכן, ברור שלא משתלם להיות אמיץ ולתקוף סתם כוכבים ניטראלים, ואכן ככל ששחקן יותר שמרן הוא יותר מנצח. במפה,0 הכל קרוב יחסית, ולכן למרות שהשחקנים רחוקים, חשוב מאוד לשמור על הכוכבים שכובשים. שחקן ה LeaderAttack מנצח לרוב במפה זו, אם זאת ה Max2 - מנצח לרוב את MaxMinMax2 כנראה בגלל צפיפות הכוכבים היצרנים (שנותנת יתרון ל Max2 שכובש מעט יותר). 04 0 עמוד 12

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