אלגוריתמים אבולוציוניים וחיים מלאכותיים

202-1-5171

 

מרצה: פרופ' משה זיפר

בודק תרגילים: יונתן שיכל

 

איל ליס ,    040170789

דוד סויסה , 040580003

הנדסת תוכנה, שנה ד'

 

תאריך הגשה: 12-11-2006

 

תרגיל הגשה 1

 

 

 

 

שאלה 1

מחרוזת הביטים 000 שייכת לשמונת הסכמות הבאות:

 

א)       ***

ב)       0**

ג)       *0*

ד)       **0

ה)       00*

ו)       0*0

ז)       *00

ח)       000

 

 

 

 

 

שאלה 2

fitness:   

 

                                                      

 

 

 

 

שאלה 3

מימוש אלגוריתם גנטי :

Population size = 100.

Single-point crossover rate pc=0.7.

Bitwise mutation rate pm=0.001.

The goal is to maximize the function x*|tan(x)| .

Range = [0,256] radians.

Run the GA five times for 1000 generations.

 

                                                          הקוד:   Question3.java

 

בתוכנית הנ"ל כל אינדיבידואל מיוצג ע"י bitstring באורך 10 ביטים, ועל כן ישנם 1024 אינדיבידואלים אפשריים בתחום  [0,256] . הנקודות בתחום בקפיצות של 0.25.

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

 

 

גרף הפונקציה  f(x)= x*|tan(x)|  :

                       

·        חשוב לציין כי גרף זה מופיע ללא נקודה (11776666.62, 177.5) השייכת לגרף, לטובת תצוגה ברורה יותר.

·        ניתן לראות כי הנקודה (11776666.62 , 177.5) היא נקודת המקסימום אך ישנן נקודות מקסימום מקומיות רבות.

·        כמו כן הדגשנו בגרף את נקודות המקסימום שיצאו בתוכנית בחמשת ההרצות שנציג.

·        בהרצה השנייה יצאה נקודת המקסימום  (11776666.62 , 177.5) שלא מופיעה בגרף.

 

 

 

הרצה 1

 

Average

Best

Generation

1798.227999

7546.797615

0

2789.48464

7546.797615

1

4341.272422

12500.15789

2

12377.10317

12500.15789

200

12377.10317

12500.15789

400

12378.8475

12500.15789

600

12500.15789

12500.15789

800

12375.43174

12500.15789

999

 

נשים לב כי בהרצה זו ערך המקסימום שנקבע (12500.15789) לא הוגרל לאוכלוסיה בדור הראשון אלא נוצר באבולוציה בעקבות  crossover & mutation והפך להיות דומיננטי באוכלוסיה.

 

 

 

 

 

הרצה 2

 

Average

Best

Generation

11658900

11776666.62

0

11658900

11776666.62

1

11305611

11776666.62

2

11541140

11776666.62

200

11541139

11776666.62

400

11776666

11776666.62

600

11658903

11776666.62

800

11658900

11776666.62

999

 

הרצה זו הצליחה למצוא את נקודת המקסימום של הפונקציה בתחום (11776666.62). ערך זה גדול בהרבה משאר ערכי הגרף ועל כן הגרף של ה- fitness הממוצע מפוזר מאוד.

מכיוון שאינדיבידואל זה ( 11776666.62 , 177.5 ) בעל fitness  גדול בהרבה משאר האוכלוסייה הוא מקבל הסתברות של  p(i) = 0.98  ובכך משתלט במהירות על האוכלוסייה.

 

 

 


הרצה 3

 

Average

Best

Generation

20328.68

37749.07

0

35882.09

37749.07

1

37372.76

37749.07

2

37376.07

37749.07

200

36996.68

37749.07

400

37373.80

37749.07

600

36995.59

37749.07

800

37749.07

37749.07

999

 

בהרצה 3 ובהרצה 5 נמצאה אותה נקודת מקסימום (37749.07).

 

 

 

 


הרצה 4

 

Average

Best

Generation

7870.05

22499.84

0

17198.46

22499.84

1

20452.20

22499.84

2

22275.72

22499.84

200

22275.72

22499.84

400

22276.14

22499.84

600

22054.15

22499.84

800

22052.15

22499.84

999

 

 

 

 

 

 

 

הרצה 5

 

Average

Best

Generation

793.74

3846.94

0

975.87

3846.94

1

1704.48

37749.07

2

37371.95

37749.07

200

37749.07

37749.07

400

37372.35

37749.07

600

37001.82

37749.07

800

37374.82

37749.07

999

 

נשים לב כי בהרצה זו ערך המקסימום שנקבע (37749.07) לא הוגרל לאוכלוסיה בדור הראשון אלא נוצר באבולוציה בעקבות  crossover & mutation והפך להיות דומיננטי באוכלוסיה.

בהרצה 3 ובהרצה 5 נמצאה אותה נקודת מקסימום.

 

 

 

 

 

מסקנות משאלה 3

 

 

 

 

 

 

שאלה 4

 

דרכים להרצה מהירה יותר של אלגוריתם גנטי:

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

·        ניתן להריץ את האלגוריתם פחות דורות באבולוציה , וכך הוא יסתיים מהר יותר. במקרים מסוימים הרצה על מספר דורות קטן יותר לא תשפיע על התוצאות (כמו בשאלה 3, היה ניתן להפסיק את ההרצה כבר בדור ה 20 במקום ה- 100) ובמקרים מסוימים מספר דורות קטן לא יספיק על מנת להתכנס לפתרון דומיננטי וטוב.

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

 

 

כפי שניתן לראות ישנו   trade off בין זמן הרצת האלגוריתם לבין יעילות האבולוציה, טיב הפתרונות ורמת הדיוק.

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

 

דוגמאות לשיפורים אפשריים שיובילו לאלגוריתם יעיל יותר שיתכנס מהר יותר לפתרון דומיננטי וטוב:

 

 

 

שאלה 5

 

בניית אלגוריתם גנטי לבעיית הגנב 0/1.  קיבולת מקסימאלית של תרמיל הגב = 625.

בתוכנית הנ"ל כל אינדיבידואל מיוצג ע"י bitstring באורך 50 ביטים (ביט עבור כל פריט אפשרי), ועל כן ישנם (50^2) אינדיבידואלים אפשריים.

הרצת האלגוריתם הגנטי במשך 500 דורות.

 

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

 

 

                                                          הקוד:   Question5.java

 

 

הרצה a

 

Single-point crossover rate pc=0.7     

Bitwise mutation rate pm=0.001    

 

Average

Best

Generation

506.54

714

0

588.145

768

10

643.485

794

20

738.06

883

100

799.375

892

200

837.355

899

300

854.655

931

400

874.215

923

499

 

 

 

 

 

הרצה b

 

Single-point crossover rate pc=0.4     

Bitwise mutation rate pm=0.001    

 

Average

Best

Generation

506.045

701

0

615.195

790

10

651.92

813

20

764.825

858

100

799.825

885

200

831.275

904

300

829.3

911

400

832.4

908

499

 

 

 

 

 

 

הרצה c

 

Single-point crossover rate pc=0.1     

Bitwise mutation rate pm=0.001     

 

Average

Best

Generation

506.045

701

0

614.065

734

10

666.57

777

20

745.38

849

100

801.49

868

200

822.655

887

300

830.28

874

400

828.725

883

499

 

 

 

 

 

 

 

הרצה d

 

Single-point crossover rate pc=0.7     

Bitwise mutation rate pm=0. 01      

 

Average

Best

Generation

506.045

701

0

559.64

755

10

598.12

799

20

683.39

844

100

646.375

854

200

682.08

842

300

654.95

897

400

693.66

860

499

 

 

 

 

 

 

 

הרצה e

 

Single-point crossover rate pc=0.7     

Bitwise mutation rate pm=0. 1        

 

Average

Best

Generation

498.49

772

0

520.07

724

10

516.02

745

20

509.205

729

100

515.285

757

200

483.64

701

300

496.44

724

400

513.29

746

499

 

 

 

 

 

סיכום שאלה 5

 

מסקנות עבור ה- Best:

בניסוי 1 קיבלנו את התוצאות הטובות ביותר. החל מהדור ה- 300 ה- Best fitness  מתייצב מעל ל- 900 וממשיך לעלות לאורך כל האבולוציה (מתכנס לפתרון), מה שמראה כי האבולוציה משפרת את האוכלוסייה.

התוצאה הגבוהה ביותר בניסוי זה ובכל הניסויים הופיעה בדור 476 והיא 940.

ניסוי 2 מציג תוצאות דומות אם כי מעט נמוכות מניסוי 1. ניסוי 3 עדין מציג Best fitness גבוה אם כי השונות נמוכה (גרף בקו ישר יחסית) בגלל פחות  (Pc) crossover .

ניסוי 4 וניסוי 5 הם הנמוכים ביותר מכיוון שהשונות גבוהה מאוד (גרף עם רעשים) הנגרמת בגלל mutation (Pm) רבים שמונעים מהאוכלוסייה להתכנס לפתרון עם fitness  גבוה.

ניסוי 5 שהוא הגרוע ביותר מציג תוצאות רנדומאליות לחלוטין.

 

מסקנות עבור ה- Average:

בניסוי 1,2,3 ה- Average מתקרב ל- Best ועולה באופן קבוע, מה שמראה כי האבולוציה משפרת את האוכלוסייה.

בדורות הראשונים יש קפיצה ב-fitness  שנובעת משיפור האוכלוסייה הרנדומאלית שנוצרה בהתחלה.

ניסוי 4 מראה שיפור רק בהתחלה ואח"כ האוכלוסייה לא משתפרת אלא נשארת באותו ממוצע הרחוק מ ה- Best עם שונות גבוהה (גרף עם רעשים).

ניסוי 5 שהוא הגרוע ביותר מציג תוצאות רנדומאליות לחלוטין עם שונות גבוהה (גרף עם רעשים) הנגרמת בגלל mutation (Pm) רבים שמונעים מהאוכלוסייה להתכנס לפתרון עם fitness  גבוה מכיוון שאינדיבידואלים טובים מתקשים לשרוד בהסתברות mutation כזו.

 

 

מסקנות כלליות:

 

הייצוג בתוצאה זו הוא:       11111010110110011011111101110111110010111111111010 .

 

דוגמא לייצוג בעל משקל 625:        00111000001100110110111101000001010110101110110101 .

 

 

מהרצות שערכנו בבעיית הגנב 0/1 שלנו עם פרמטרים אלו עולה כי הפרמטרים מהניסוי הראשון (Pc = 0.7 , Pm = 0.001 ) טובים יותר לבעיה זו.

 

 

 

 

 

 

- סוף -