מציאת תוכנית פעולה לרובוט, אשר תגרום לו להצמיד תיבה לאחד מקירות החדר, ע"י תכנות גנטי.
בשלב הראשון בנינו את התשתיות הדרושות עבור התיכנות הגנטי:
בשלב השני, עברנו למימוש מרכיבי התיכנות הגנטי:
עם סיום בניית התשתיות החלטנו לבצע מספר הרצות ראשונות.
בנינו חדר כמתואר במאמרו של קוזה:
גודל החדר וגודל התיבה מסומנים בסרטוט, הרובוט ממוקם במרחק מטר מהקיר התחתון והימני. המרחק ההתחלתי של התיבה מהקיר הוא 7.5 מטר.
הגדרות הריצה:
קצב קרוס-אובר: 0.8
גודל אוכלוסיה: 100
גודל עץ התחלתי מקסימלי: 2
צעדים לכל רובוט: 300
מספר דורות: 20
התוצאות:
הגרף הבא מציג את נתוני ה-best fitness, average fitness ומרחק התיבה מהקיר לאורך הדורות:
מוצגות חמשת התוכניות הטובות (מתאימות) ביותר בחמישה דורות:
![]() |
הפרט המתאים ביותר בדור 0 S0 |
![]() |
הפרט המתאים ביותר בדור 3 (IFSTK (IFSTK (IFLTE TL0 S10 MF S4) (IFBMP S7 MF)) (IFLTE (IFBMP TR0 S5) (IFLTE S5 MF TR0 S5) (IFBMP S0 S4) (IFLTE S10 S1 S8 S0))) |
![]() |
הפרט המתאים ביותר בדור 6 (PROGN2 (IFLTE (IFLTE (IFLTE TL0 S9 TR0 S8) (IFSTK (IFSTK (PROGN2 S8 TL0) (PROGN 2 S1 S4)) S8) S6 (PROGN2 S8 S2)) TL0 S5 MF) TR0) |
![]() |
הפרט המתאים ביותר בדור 13 (PROGN2 (IFLTE (IFLTE (IFLTE S6 S9 TR0 S8) (IFSTK (IFSTK (PROGN2 S8 TL0) (PROGN2 S1 S4)) S8) S6 (PROGN2 S8 TL0)) TL0 S5 MF) TR0) |
![]() |
הפרט המתאים ביותר בדור 19 ובכל הדורות (PROGN2 (IFLTE (IFLTE (IFLTE (IFLTE TL0 S9 TR0 S8) (IFSTK (IFSTK (PROGN2 S8 TL0) S8) S8) S6 (PROGN2 S8 S2)) S8 S6 (PROGN2 S8 (PROGN2 (IFLTE (IFLTE (PROGN2 (PROGN2 S1 S4) S4) (IFSTK (IFSTK (PROGN2 S5 TL0) (PROGN2 S1 S4)) S8) S6 (PROGN2 S8 (PROGN2 (IFLTE (IFLTE (IFLTE (IFLTE TL0 S9 TR0 S8) (IFSTK (IFSTK (PROGN2 S8 TL0) S8) S8) S6 (PROGN2 TR0 S4)) S8 S6 (PROGN2 S8 (PROGN2 (IFLTE (IFLTE (PROGN2 (PROGN2 S1 S4) S4) (IFSTK (IFSTK (PROGN2 S5 TL0) (PROGN2 S1 S4)) S8) S6 (PROGN2 S8 S2)) TL0 S5 MF) TR0))) TL0 S5 MF) TR0))) TL0 S5 MF) (IFLTE (IFLTE TL0 S9 TR0 S8) (IFSTK (IFSTK (PROGN2 S8 TL0) S8) S8) S6 (PROGN2 S8 S2))))) TL0 S5 MF) TR0) |
מסקנות:
ניתן לראות כי התכנות הגנטי מצליח לספק תשובה לבעיה זו במספר דורות קטן.
ניתן לראות כי במהלך הדורות, אורך התוכניות נוטה לגדול, מה שלאו דווקא מעיד על תוכניות "חכמות" יותר.
למרות התוצאות המעידות על התקדמות אבולוציונית בפיתרון הבעיה, בריצות אחרות שמנו לב לשתי תופעות מנוגדות:
בבעיה הקודמת, התכנות הגנטי הצליח לייצר תוכנית שתענה על הדרישות עבור החדר, אבל תשובה זו היתה ספציפית עבור חדר מסויים ומיקומי רובוט ותיבה מסויימים. אותנו עניין לדעת האם התכנות הגנטי יצליח לייצר תוכנית כללית יותר, שתפתור קונפיגורציות שונות של הבעיה. החלטנו להתמקד ביצירת תוכנית עבור מיקומים שונים של התיבה.
לשם כך, שינינו את פונקצית ה-Fitness כך שתבדוק את הרובוט מול ארבע קונפיגורציות חדר שונות. הפונקציה מחשבת את סך המרחקים של התיבה מהקיר בסיום עבודת הרובוט על כל חדר, ומחזירה את הערך (מרחק כולל \ 1).
מכיוון שבעיה זו קשה יותר מהבעיה הקודמת, הגדלנו את מספר הדורות ל-50.
זמן חישוב פונקצית ה-Fitness הוכפל פי 4 והפך את ריצת התוכנית לאיטית ביותר, לכן הוספנו יכולת Cache לפונקציה. שיפור זה קיצר את זמן הריצה באופן משמעותי.
הגדרות הריצה:
קצב קרוס-אובר: 0.8
קצב מוטציה: 0.05
גודל אוכלוסיה: 100
גודל עץ התחלתי מקסימלי: 2
צעדים לכל רובוט: 300
מספר דורות: 50
גרף הריצה:
מוצגות חמשת התוכניות הטובות (מתאימות) ביותר בחמישה דורות:
S11
(IFLTE S0 (PROGN2 (IFBMP S7 MF) (IFLTE S4 S9 S11 TR0)) TR0 (PROGN2 S10 (PROGN2 (PROGN2 S7 S11) (IFLTE S2 S4 S4 MF))))
(IFSTK (IFLTE (IFLTE TL0 S9 S3 S7) (IFSTK S11 S8) (IFLTE (PROGN2 (PROGN2 S3 S6) (IFSTK (IFLTE (IFLTE TL0 S9 S4 S7) (IFSTK S11 S8) (IFLTE (PROGN2 (PROGN2 S3 S6) (IFSTK MF (PROGN2 S11 TR0))) TL0 S2 MF) S0) S7)) TL0 S2 S1) (IFSTK TL0 (IFBMP MF S4))) MF)
(IFSTK (IFLTE MF (IFSTK S11 S8) (IFLTE (PROGN2 (PROGN2 S3 (IFBMP S1 S11)) (IFSTK (IFLTE (IFLTE TL0 S9 S4 S7) (IFSTK S11 S8) (IFLTE (PROGN2 (PROGN2 S3 S6) (IFSTK (IFBMP (IFBMP S5 MF) (IFSTK S4 S0)) (IFSTK TL0 S0))) TL0 S2 MF) S0) S7)) TL0 S2 S1) (IFSTK TL0 (IFBMP MF S4))) MF)
(IFSTK (IFLTE MF (IFSTK S11 S8) (IFLTE (PROGN2 (PROGN2 S3 (IFBMP S1 S7)) (IFSTK (IFLTE (IFLTE TL0 S9 S4 S7) (IFSTK (IFSTK (IFLTE (IFLTE TL0 S9 S4 S7) (IFSTK S11 S8) (IFLTE (PROGN2 (PROGN2 S3 S6) (IFSTK (IFBMP (IFBMP S5 (IFLTE TL0 S9 S4 S7)) (IFSTK (PROGN2 (PROGN2 S3 (IFBMP S3 MF)) (IFSTK (IFLTE TL0 S9 S3 (IFLTE (IFLTE TL0 S9 S4 S7) (IFSTK S11 S8) TL0 S0)) S7)) S0)) (IFSTK S4 S0))) TL0 S2 MF) S0) S7) S8) TL0 S0) S7)) TL0 S2 S1) (IFSTK TL0 (IFBMP MF S4))) MF)
מסקנות:
להפתעתנו לא נדרשו שינויים מהותיים באלגוריתם על מנת לפתור את הבעיה הכללית יותר.
מספר הרצות נוספות הראו כי הרובוט מצליח לעמוד במשימה בלפחות שלושה מתוך ארבעת החדרים, ובדרך כלל אף צולח בכולם.
בשלב הבא, ניסינו להכניס לאלגוריתם הגנטי העדפה לתוכניות קצרות יותר.
חשוב לציין, שהמטרה שלנו היתה לנסות ולצמצם את התוכניות המוצלחות, ולא למצוא מלכתחילה תוכניות קצרות.
מסיבה זו, רצינו למצוא פונקציית פיטנס שתתן בונוס לתוכניות קצרות יותר, אבל בצורה שלא תתן עדיפות לתוכניות קצרות שאינן עומדות במשימה.
בשלב הראשון, בחרנו פקטור גודל, שמורכב משבר בין 1 ל-2 ע"פ מספר מספר הקודקודים בכל עץ תוכנית, והכפלנו אותו בפיטנס המקורי.
מאחר והערכנו כי האבולוציה תעבוד לאט יותר אחרי השינוי, הגדלנו גם את מספר הדורות ל-100.
הרצה של התוכנית בתנאים אלו הניבה את הגרף הבא:

ניתן לראות כי שיפורים בביצוע המשימה של הרובוט גררו עליות באורך התוכנית, שלאחר מכן הצטמצמו באיטיות לעבר תוכנית קצרה או "נקייה" יותר.
משחקים נוספים בפקטור הגודל הביאו אותנו לבחירה בפקטור הבא:
(100\מספר הקודקודים)-4
בהרצה זו מצאנו את התוכנית הקצרה ביותר שלנו, שאורכה 15 קודקודים:
(PROGN2 (IFLTE (IFLTE MF S0 (IFSTK TR0 S0) S10) S3 S0 (PROGN2 S8 TR0)) S10)
התיכנות הגנטי הצליח לפתור את שתי הבעיות, גם את הבעיה עבור חדר עם קונפיגורציה קבועה וגם את בעית החדר עם קונפיגורציה משתנה.
נקודות מעניינות: