ABA


"קצת על אלגוריתמים גנטיים."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #6609 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 6609
dryice

דרג אמינות חבר זה
   18:10   24.07.03   
אל הפורום  
  קצת על אלגוריתמים גנטיים.  
 
   אפשר לעשות עם אלגוריתמים גנטיים המון דברים, אני אציג
פה גרסא מצומצמת קצת, של פתרון בעיית חיפוש.
אנו למעשה מנחשים פתרון ובודקים אותו. על סמך
תוצאות ניחושים קודמים אנו רוצים ניחוש נוסף, זאת גישה
של חיפוש היוריסטי.

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

במקרה שלנו אנו מחפשים פרמוטציה של המספרים 1 עד N.


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

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

אנו נרצה שהפונקציה ההיוריסטית שלנו תתאפס עבור הפתרון, ותהיה
גדולה מאפס עבור מה שאיננו פתרון.

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

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

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

DRYICE


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  תודה רבה, היה מעניין מאוד liranr 24.07.03 18:25 1
     אם יהיה לי זמן, אני אכתוב template בC++ dryice 25.07.03 10:54 2
         החלטתי לנסות לכתוב בעצמי את התוכנית liranr 25.07.03 10:59 3
             מימוש גנטי משלי: dryice 25.07.03 17:58 4
                 תודה רבה liranr 25.07.03 18:23 5
                     גישות אחרות לפתרון הבעיה: dryice 25.07.03 21:54 6
  תודה רבה Ken 26.07.03 01:16 7

       
liranr

דרג אמינות חבר זה
   18:25   24.07.03   
אל הפורום  
  1. תודה רבה, היה מעניין מאוד  
בתגובה להודעה מספר 0
 
   יש לך איזושהי דוגמת קוד פשוטה שנראה איך זה מבצע בפועל?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

דרג אמינות חבר זה
   10:54   25.07.03   
אל הפורום  
  2. אם יהיה לי זמן, אני אכתוב template בC++  
בתגובה להודעה מספר 1
 
   ואשתמש עמו בשביל לפתור את הבעיה של ריבועי קסם.

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
liranr

דרג אמינות חבר זה
   10:59   25.07.03   
אל הפורום  
  3. החלטתי לנסות לכתוב בעצמי את התוכנית  
בתגובה להודעה מספר 2
 
   כתבתי פונקציות איתחול, פונקציות מרחק, פונקצית מוטציה.
עכשיו אני עובד על לחבר את הכל ביחד ולהתפלל שזה יעבוד


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

דרג אמינות חבר זה
   17:58   25.07.03   
אל הפורום  
  4. מימוש גנטי משלי:  
בתגובה להודעה מספר 3
 
   מימשתי אלגוריתם גנטי, הביצועים שלו בגדול מאכזבים,
אבל הוא מצליח בכל זאת לפתור גם מקרים מעצבנים כמו n=6:

17 36 18 2 3 35
10 25 22 32 16 6
19 13 33 23 9 14
11 28 5 12 34 21
30 8 7 15 20 31
24 1 26 27 29 4

הקוד ממש לא יפה, ויש שם קצת דברים מיותרים שאפשר לצמצם,
אבל הנה:

http://rotter.net/User_files/nor/3f21447f69a7674f.txt


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
liranr

דרג אמינות חבר זה
   18:23   25.07.03   
אל הפורום  
  5. תודה רבה  
בתגובה להודעה מספר 4
 
   אני יעבור על זה.
כרגע אני עובד על שלי, ונראה לי שעשיתי משהו לא בסדר.
למרות שבניתי את האלגוריתם ככה שעשרת התוצאות הטובות ביותר נשארות
מדור לדור, איכשהו לפעמים אני מתרחק מהפתרון. כנראה איזו בעיה טיפשית
שלא שמתי לב אליה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dryice

דרג אמינות חבר זה
   21:54   25.07.03   
אל הפורום  
  6. גישות אחרות לפתרון הבעיה:  
בתגובה להודעה מספר 5
 
   אפשר לעשות חיפושים היוריסטים אחרים.
אפשר לנסות משהוא בסגנון A*, אפשר לעשות על סמך שינוי של פרמוטציה
ואפשר לנסות לבנות מלכתחילה משהוא נכון עם backtracking ולבחור
כיוון התקדמות באופן הירוסטי.


וגישה אחרת שאני כנראה אנסה לממש:
לפני זמן מה כתבתי אלגוריתם יעיל למדיי, למציאת תת קבוצות
של מספרים מ 1 עד N שסכומם k.
אם אעשה לאותו רעיון הסבה, למצוא תת קבוצות של 1 עד N*N בגודל N
שסכומם הוא k=f(n) אז יהיה אפשר אולי להכין פתרון סגור, שיעבוד
בזמן סביר גם עבור Nים גדולים.

DRYICE


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Ken

דרג אמינות חבר זה
   01:16   26.07.03   
אל הפורום  
  7. תודה רבה  
בתגובה להודעה מספר 0
 
   באמת מעניין מאוד


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net