You are on page 1of 10

‫‪Tabu search‬‬ ‫מבוא לאופטימיזציה ‪−‬‬

‫שרון ינקוביץ' ־ ‪ ,209239409‬גל רואש ־ ‪ ,211680749‬אורה אמיר ־ ‪208937730‬‬

‫אפיון השיטה‪:‬‬

‫‪ Tabu serach‬היא שיטה מטא־יוריסטית‪ ,‬המשלבת שימוש בזיכרון בשיטות חיפוש לוקאלי על מנת לפתור בעיות אופטימיזציה‪.‬‬

‫החסרון העיקרי של שיטות חיפוש לוקאלי הוא הנטייה להתפס על פתרון שהתקבל במינימום לוקאלי אך אינו הפתרון הטוב‬
‫ביותר‪.‬‬
‫‪ Tabu search‬מתגבר על הבעיה הזו באמצעות קבלת פתרונות שאינם משפרים את הפתרון הקיים‪ ,‬כדי לא להיתקע על מינימום‬
‫לוקאלי‪ .‬מבנה הזכרון בו הוא משתמש נקרא ‪.Tabu list‬‬

‫‪:Tabu list‬‬

‫‪ Tabu list‬היא רשימה השומרת מספר קבוע של מהלכים שבוצעו לאחרונה‪ .‬אם פתרון פוטנציאלי מופיע ב־‪ ,Tabu list‬אי אפשר‬
‫לבקר בו שוב כל עוד הוא נמצא ברשימה‪ .‬ה־‪ Tabu list‬מאלץ את האלגוריתם לבקר במרחבים בהם עדיין לא ביקר‪ ,‬וכך מונע‬
‫ממנו להתקע באותו מינימום לוקאלי‪.‬‬

‫נציג את הפסודו־הקוד הכללי לשיטה‪:‬‬

‫‪1‬‬
‫שורות ‪ 1 − 4‬עוסקות באתחול‪ .‬המשתנה ‪ s0‬הינו פתרון התחלתי‪ ,‬פתרון זה מתקבל לפני הרצת ה־‪ Tabu search‬על ידי פונקציה‬
‫שיצרנו ומסופק לו כפרמטר‪.‬‬
‫את משתנה זה נקבע בתור הפתרון הטוב ביותר שראינו עד כה הן במשתנה ‪ sBest‬המייצג את הפתרון הטוב ביותר שנתקלנו‬
‫בו‪ ,‬וב־‪ bestCandidate‬שמייצג את הפתרון הטוב ביותר עבור איטרציה ספציפית של הלולאה‪ .‬בנוסף‪ ,‬נאתחל את ה־‪Tabu list‬‬
‫ונוסיף לו את הפתרון ההתחלתי‪.‬‬

‫כעת‪ ,‬כל עוד לא מתקיים תנאי העצירה‪ ,‬נבצע את החיפוש עצמו‪.‬‬


‫בשורות ‪ ,5 − 6‬נקרא לפונקציה ‪ getNeighbors‬שתפקידה להחזיר שכנים של הפתרון ההתחלתי‪ .‬כלומר‪ ,‬פתרונות נוספים‬
‫בסביבה שלו‪.‬‬
‫בשורות ‪ ,8 − 11‬נעבור בלולאה על כל שכן כזה‪ .‬עבור כל שכן‪ ,‬נבדוק אם אינו ב־‪ Tabu list‬וכן נשווה את משקלו בפונקציית‬
‫ה־‪ tness‬ביחס לפתרון הטוב ביותר עד כה‪ .‬פונקציה זו היא פונקציה המחזירה ציון מספרי מסויים לכל פתרון‪ .‬חשוב לציין‬
‫שאצלינו נרצה ‪ tness‬נמוך ככל הניתן ולכן כיוון ההשוואה מתהפך )נרצה < במקום >(‪ .‬אם אכן מצאנו שכן המקיים את שני‬
‫התנאים ־ הוא הפתרון הטוב ביותר הנוכחי החדש‪.‬‬
‫בשורות ‪ 13 − 15‬נבדוק אם הפתרון הטוב ביותר עד כה טוב מהפתרון הטוב ביותר‪ ,‬ואם כן נעדכן אותו בהתאם‪ .‬לבסוף‪ ,‬בשורות‬
‫‪ ,16 − 21‬נוסיף ל־‪ Tabu list‬את הפתרון הטוב ביותר עד כה‪ ,‬ובמקרה בו חרגנו מגודלו המקסימלי‪ ,‬נוציא את האיבר הראשון‪.‬‬
‫לאחר סיום כל ההרצות‪ ,‬נחזיר את הפתרון הטוב ביותר שראינו‪.‬‬

‫את מבנה הזיכרון ב־‪ Tabu search‬אפשר לחלק לשני סוגים עיקריים‪ Short term memory :‬ו־‪.Long term memory‬‬
‫זיכרון לטווח קצר הוא ה־‪ ,Tabu list‬ומטרתו לא לחזור לפתרונות שכבר ראינו‪ .‬הוא מחזיק פתרונות שראינו עד שגודלו מגיע‬
‫למספר מסויים )בפסודו־קוד נקרא ‪ ,(maxTabuSize‬ולאחר מכן מוציא פתרונות ישנים לטובת חדשים‪.‬‬
‫זיכרון לטווח ארוך דומה לזכרון לטווח קצר‪ ,‬אך מוסיף פונקציונליות שאמורה לעודד את האלגוריתם לחפש באיזורי פתרונות‬
‫מגוונים ולא להתקע בפתרון תת־אופטימלי‪ .‬למשל‪ ,‬דרך אחת לממש אותו היא לקחת פתרון התחלתי חדש רנדומלי אם עברו‬
‫מספר איטרציות קבוע ולא נתקלנו עדיין בפתרון טוב יותר‪.‬‬

‫המימוש בפועל‪:‬‬

‫המימוש אצלינו משתמש בכמה פרמטרים לחיפוש עם ‪:Tabu search‬‬


‫‪ :neighborhood_size‬מספר השכנים שנחזיר בכל קריאה ל־‪.getNeighbors‬‬
‫‪ :max_tabu_size‬גודל ה־‪ .Tabu list‬כאשר עוברים את גודל זה‪ ,‬נמחק את האיבר הראשון ב־‪ Tabu list‬כפי שראינו בשורות‬
‫‪.16 − 21‬‬
‫‪ :stopping_turn‬מספר ריצת הלולאה בו תנאי העצירה יופעל ונפסיק את ריצה האלגוריתם‪.‬‬

‫משתנים אלה הם היפר־פרמטרים להם עשינו ‪ tuning‬על מנת למצוא את הגודל האופטימלי להם‪ ,‬נפרט על כך בהמשך‪.‬‬

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

‫‪2‬‬
‫פונקציית ה־‪ tness‬בה השתמשנו היא פונקציית משקל של מסלול‪ .‬כלומר‪ ,‬ערך ה־‪ tness‬למסלול מסויים הינו סכום משקלי‬
‫הקשתות במסלול זה‪ .‬כאמור‪ ,‬המסלול הטוב ביותר הינו זה עם ה־‪ tness‬הנמוך ביותר‪.‬‬

‫עבור קבלת השכנים‪ ,‬השתמשנו באלגוריתם ‪.2 opt swap‬‬


‫הרעיון באלגוריתם הזה הוא בהנתן מסלול ‪ ,P‬ליצור שני אינדקסים ‪ (i < j) i, j‬בתחום ‪ 0, 1, 2, ..., |P | − 1‬ולהחזיר מסלול חדש‬
‫‪ P ′‬כך שהוא מתקבל מ־ ‪ P‬על ידי הפיכת סדר הקודקודים באינדקסים ‪ i‬עד ‪ j‬והשארת השאר כפי שהם‪.‬‬

‫בנוסף‪ ,‬מימשנו ‪ .Long term memory‬לאחר מספר מסויים של איטרציות ללא שינוי בפתרון האופטימלי‪ ,‬אנחנו מאתחלים את‬
‫החיפוש באמצעות פתרון התחלתי חדש ואיפוס ה־‪.Tabu list‬‬
‫בקוד שלנו‪ ,‬כל ‪ 500‬איטרציות שבהן לא היה שינוי בפתרון האופטימלי‪ ,‬רוקנו את ה־‪ Tabu list‬ויצרנו פתרון התחלתי חדש‪.‬‬
‫בנוסף‪ ,‬הגדלנו את ‪ stopping_turn‬ל־‪ 1000‬כדי שיהיו לו מספיק הזדמנויות למצוא פתרון אופטימלי ביחס לפתרון ההתחלתי‬
‫שקיבל‪.‬‬
‫נציין ששימוש בזיכרון לטווח ארוך היה טוב יותר משימוש בזיכרון לטווח קצר גם כאשר ‪ stopping_turn‬היה בגודל ‪.500‬‬

‫כיול הפרמטרים ואלגוריתמים נוספים‪:‬‬

‫על מנת לכייל את הפרמטרים עבור ה־‪ ,Tabu search‬הגדרנו שלוש קבוצות של גרפים‪ :‬קטנים‪ ,‬בינוניים וגדולים‪ .‬כל קבוצה‬
‫מכילה כמה מספרים המייצגים מספר קודקודים בגרף‪ .‬יצרנו פונקציה שיודעת ליצור קלטים לבעיה בגודל מסויים שנגדיר לה‪.‬‬
‫היא יוצרת גרפים מלאים עם משקלים רנדומליים בטווח ‪.1 − 100‬‬
‫בכל קבוצה‪ ,‬יצרנו גרפים לדוגמא עם מספר קשתות שונה‪ ,‬ועליהם הרצנו את אלגוריתם ה־‪ .Tabu search‬את שלושת ההיפר‬
‫פרמטרים עליהם פירטנו קודם לקחנו מתוך מערך שהכיל שלושה גדלים לבדיקה עבור כל פרמטר‪ .‬בלולאה‪ ,‬הרצנו את תהליך‬
‫החיפוש עבור על פרמוטציה אפשרית של הגדלים לכל פרמטר וראינו את ערך התשובה )‪ (tness‬ואת זמן הריצה‪.‬‬

‫תהליך זה נתן אינדיקציה לאילו פרמטרים טובים לאיזה סוג גרפים‪ ,‬ואת התוצאות והמסקנות נציג בסוף הדוח‪.‬‬

‫מעבר להשוואה של ‪ Tabu search‬עם עצמו‪ ,‬ביצענו גם השוואה שלו עם שיטות חיפוש לוקאלי אחרות‪ ,‬כאלו שלא משתמשות‬
‫במבנה בסגנון ‪ .Tabu list‬האלגוריתמים אותם מימשנו הם‪ hill climbing :‬ו־‪.simulated annealing‬‬

‫על מנת לעשות השוואה כמה שיותר הוגנת‪ ,‬רצינו לתת לכל אלגוריתם קבועים שמביאים אותו לביצועים הטובים ביותר‪ .‬לכן‬
‫ביצענו כיול גם עבור פרמטרים אלו בשיטה דומה לזו שהשתמשנו בה עבור ‪.Tabu search‬‬

‫תוצאות הניסויים‪:‬‬

‫הניסויים הראשונים שעשינו היו של ‪ Tabu search‬מול עצמו עם פרמטרים שונים‪.‬‬


‫הפרמטרים שבדקנו הם‪:‬‬
‫‪ :tabu size‬עבורו בדקנו את הערכים ‪.10000, 1000, 500, 200‬‬
‫‪ :neighborhood size‬עבורו בדקנו את הערכים ‪.500, 250, 100‬‬
‫‪ :stopping size‬עבורו בדקנו את הערכים ‪.500, 200, 100‬‬

‫בנוסף‪ ,‬הבדיקות בוצעו על שלושה קבוצות של גדלים לגרפים‪ .‬הגדלים של הגרפים הקטנים היו ‪ ,10, 25‬של הבינוניים היה ‪40‬‬

‫‪3‬‬
‫ושל הגדול היה ‪ .60‬הגרף הכי גדול שבדקנו היה בגודל ‪ 60‬מפאת הזמן שלוקח להריץ גרפים גדולים ממנו על כל הקומבינציות‬
‫השונות של הפרמטרים‪.‬‬
‫עבור כל גודל גרף ועבור כל פרמטר הרצנו את האלגוריתם שלוש פעמים ולקחנו את ממוצע הזמן וה־‪ ,cost‬וכל ריצה עבור גודל‬
‫גרף ספציפי השתמשה באותו פתרון התחלתי כדי לשמור על אמינות התוצאות‪.‬‬

‫חשוב לציין שבניסויים שמנו לב שלפרמטר ‪ tabu size‬אין הרבה השפעה על גדלי הקלט שבדקנו‪ ,‬ולכן על מנת לצמצם את‬
‫כמות הגרפים החלטנו לקבע את ערכו ל־‪) 500‬הערך הטוב ביותר( בכל ההרצות‪.‬‬
‫עבור קלטים בגודל ‪ 10‬התקבלו הגרפים הבאים‪:‬‬

‫עבור קלטים בגודל ‪ 25‬התקבלו הגרפים הבאים‪:‬‬

‫‪4‬‬
‫עבור קלטים בגודל ‪ 40‬התקבלו הגרפים הבאים‪:‬‬

‫‪5‬‬
‫ולבסוף‪ ,‬עבור קלטים בגודל ‪ 60‬התקבלו הגרפים‪:‬‬

‫‪6‬‬
‫מהגרפים האלו ניתן ללמוד על ההתנהגות של ‪ Tabu search‬ביחס לגדלי הפרמטרים וגודל הקלט‪.‬‬
‫בגרף הקטן )בגודל ‪ ,(10‬ניתן לראות שהתוצאות יוצאות זהות בכל גדלי הפרמטרים‪ .‬עבור גדלים מקסימליים )‪ (500, 500‬הפתרון‬
‫לוקח ‪ 6‬שניות‪ ,‬לעומת ‪ 0.2‬כאשר הגדלים הם )‪ − (100, 100‬פי ‪ 30‬איטי יותר‪ .‬מגמה זו ממשיכה גם בגרפים הבאים‪ ,‬ככל שגדלי‬
‫הפרמטרים גדולים יותר‪ ,‬הפתרון לוקח יותר זמן‪.‬‬

‫אם נסתכל על הגרפים של ה־‪ ,cost‬נבחין במגמה בה ככל שהקלט בעל יותר קודקודים‪ ,‬ההבדל בין הפתרון הטוב ביותר לזה‬
‫הגרוע ביותר גדל‪ .‬עבור ‪ 10‬קודקודים למשל‪ ,‬ההבדל הוא ‪ .0‬ב־‪ 25‬ההבדל הוא כבר ‪ ,8 13‬עבור ‪ 40‬נקבל ‪ 58 41‬ועבור גרף בגודל‬
‫‪ 60‬הוא יהיה ‪ .90‬יתרה מזאת‪ ,‬בגרפים בגדלים גדולים יותר )‪ 40‬ו־‪ ,(60‬עלייה בכל אחד מגדלי הפרמטרים )בנפרד או ביחד(‬
‫מביאה לירידה ב־‪.cost‬‬

‫‪7‬‬
‫נסיק ש־‪ Tabu search‬מכיל ‪ trade-o‬בין זמן וביצועים‪ ,‬וככל שנעלה את גודל הקלט הוא רק יגדל‪ .‬עבור גרפים קטנים‪ ,‬התוצאות‬
‫היו זהות לכל גדלי הפרמטרים‪ ,‬ולכן נעדיף לתת להם ערכים קטנים מאחר וההשפעה על התוצאה זניחה או לא קיימת‪ .‬הסבר‬
‫אפשרי לתופעה הזו הוא שבקלטים קטנים‪ ,‬בכל שילוב של ערכי הפרמטרים ה־‪ Tabu search‬מצליח להגיע לפתרון האופטימלי‪.‬‬
‫עבור גרפים גדולים יותר לעומת זאת‪ ,‬נדרש לחשוב אם נעדיף פתרון טוב או זמן ריצה קצר יותר‪ .‬בהתאם לבעיה אותה מנסים‬
‫לפתור והמגבלות איתן מתמודדים‪ ,‬אפשר לחפש גודל אופטימלי לכל אחד מהמשתנים בו מוותרים קצת על זמן הריצה וקצת על‬
‫אופטימליות התוצאה‪ ,‬אך ברמה שלא מפריעה לנו‪.‬‬

‫כמסקנה מהגרפים‪ ,‬ראינו שגדלים של ‪ 500‬עבור ‪ stopping size‬ו־‪ 500‬עבור ‪ neighborhood size‬הביא לתוצאות הטובות‬
‫ביותר‪ .‬עם זאת‪ stopping size ,‬בגודל ‪ 200‬הביאו תוצאות דומות עם זמן ריצה משמעותית נמוך יותר‪.‬‬
‫לכן בחרנו בגדלים ‪ 200‬עבור ‪ stopping size‬ו־‪ 500‬עבור ‪ ,neighborhood size‬ואיתם ביצענו השוואה לאלגוריתמים נוספים‪.‬‬

‫השוואה לאלגוריתמים נוספים‪:‬‬

‫על מנת לבדוק את ביצועי ה־‪ ,Tabu search‬ביצענו השוואה לאלגוריתמי חיפוש לוקאלי אחרים‪ .‬ביצענו שלוש הרצות עבור כל‬
‫גודל קלט וכל אלגוריתם‪ .‬ההרצות בוצעו כולן על אותו הקלט‪ ,‬ולקחנו את ממוצע ה־‪ cost‬והזמן עבור כל אלגוריתם‪ .‬בכל‬
‫אלגוריתם המכיל פרמטרים‪ ,‬נבחרו הפרמטרים הטובים ביותר לפי הכיול שביצענו קודם לכן‪.‬‬
‫באותן ההשוואות‪ ,‬ביצענו גם השוואה גם של ‪ Tabu search‬עם ‪) Long term memory‬שאת מימושו תיארנו קודם לכן( ביחס‬
‫ל־‪ Tabu search‬עם ‪ Short term memory‬ושאר אלגוריתמי החיפוש‪.‬‬
‫להלן גרפים של תוצאות ההשוואה‪:‬‬

‫‪8‬‬
‫ננתח את תוצאות הגרפים‪:‬‬
‫עבור קלט בגודל ‪ ,10‬ניתן לראות שהתוצאות זהות לכל האלגוריתמים‪ .‬כמו בבדיקת ‪ Tabu search‬מול עצמו‪ ,‬גם כאן נוכל‬
‫להסביר זאת בכך שבקלט קטן מרחב החיפוש יחסית קטן ולכן כל שיטה הצליחה למצוא את האופטימום הגלובלי‪ .‬מבחינת זמן‪,‬‬
‫‪ Tabu search‬בלי זכרון לטווח ארוך היה איטי פי ‪ 25‬משאר האלגוריתמים שהם לא ‪ ,Tabu search‬והגרסה עם הזיכרון לטווח‬
‫רחוק הייתה איטית פי ‪ 145‬מהם‪.‬‬

‫עבור קלט בגודל ‪ 25‬יש הבדלים גדולים יותר‪ .‬כעת‪ ,‬ביצועי השיטות המבוססות ‪ Tabu search‬טובים יותר באופן ניכר משאר‬
‫האלגוריתמים‪ ,‬בממוצע ב־‪ .64.8‬נשים לב שהזכרון לטווח ארוך סיפק פתרון טוב רק ב־‪ 2‬מהפתרון של החיפוש שלא משתמש בו‪,‬‬
‫אך עם זאת היה פי ‪ 3.73‬יותר איטי ממנו‪.‬‬

‫בקלט בגודל ‪ 40‬מגמה זו ממשיכה לקרות‪ .‬ביצועי השיטות שמבוססות על ‪ Tabu search‬טובים בממוצע ב־‪ 142.3‬משאר‬
‫האלגוריתמים‪ .‬כמו קודם‪ ,‬ההבדל בין הפתרון כאשר משתמשים בזכרון לטווח ארוך לעומת כאשר לא משתמשים קטן מאוד‪ ,‬רק‬
‫‪ .2.3‬הבדלי הזמן ביניהם רק גדלו‪ ,‬כאשר שימוש בזיכרון לטווח ארוך איטי פי ‪.5.57‬‬

‫לבסוף‪ ,‬עבור קלט בגודל ‪ 60‬נקבל עוד יותר הבדלים‪ Tabu search .‬טוב בממוצע ב־‪ 230.5‬משאר האלגוריתמים‪ ,‬וההבדל בזמן‬
‫הריצה הוא פי ‪ 2.94‬עבור שיפור של ‪ 11.6‬בתוצאה‪.‬‬

‫‪9‬‬
‫מסקנות מהגרפים‪ ,‬יתרונות וחסרונות לשיטה וסיכום‪:‬‬

‫מהנתונים שהצגנו‪ ,‬ניתן ללמוד שה־‪ Tabu search‬אכן עובד טוב יותר בהשוואה לאלגוריתמי חיפוש לוקאלי אחרים כאשר מדובר‬
‫בגרפים בגדלים גדולים‪ .‬כלומר‪ ,‬הוספת ה־‪ Tabu list‬אכן עוזרת להמנע מאופטימום לוקאלי ואכן מצליחה לשפר את התוצאות‪.‬‬

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

‫כמסקנה‪ ,‬נוכל לאמר שבאופן כללי לבעיות בעלות קלט קטן יחסית‪ ,‬נעדיף להשתמש בחיפוש לוקאלי לא מבוסס ‪.Tabu search‬‬
‫למשל אלגוריתמים כמו ‪ .hill climbing‬עבור קלטים בינוניים וגדולים‪ ,‬התשובה תלויה במה שמנסים למצוא‪ .‬אם רוצים פתרון‬
‫טוב ככל הניתן‪ ,‬לא משנה כמה זמן יקח‪ ,‬נעדיף את ‪ Tabu search‬מאחר והוא בהחלט מספק תוצאות טובות יותר‪.‬‬
‫אם לעומת זאת זמן הריצה קריטי‪ ,‬נדרש לכייל את פרמטרי ה־‪ Tabu search‬לאלו שמביאים זמן רצוי בידיעה שנראה ירידה‬
‫מסויימת בביצועים ובנוסף יש לקחת בחשבון שדבר כזה לוקח זמן‪.‬‬

‫נסכם ביתרונות ובחסרונות של השיטה‪:‬‬


‫יתרונות‪:‬‬
‫‪ .1‬שיטה זו מצליחה למצוא פתרונות טובים יותר עבור קלטים גדולים יחסית ביחס לשיטות אחרות שלא מבוססות ‪,Tabu list‬‬
‫בזכות זה שהיא מתחמקת מאופטימום לוקאלי‪.‬‬
‫‪ .2‬אפשר להשתמש בשיטה זו גם למרחב חיפוש בדיד וגם למרחב חיפוש רציף‪.‬‬
‫‪ .3‬נימנע מלהכנס ללולאות אינסופיות בזכות ה־‪.Tabu list‬‬

‫חסרונות‪:‬‬
‫‪ .1‬שיטה זו לא מבטיחה פתרון אופטימלי‪.‬‬
‫‪ .2‬שיטה זו מכילה כמה פרמטרים‪ ,‬וכיול שלהם לוקח לא מעט זמן‪.‬‬
‫‪ .3‬טיב הביצועים תלוי במימוש של האלגוריתם‪ :‬איך בוחרים שכנים‪ ,‬מימוש הזיכרון לטווח רחוק וכולי‪.‬‬

‫לסיכום‪ ,‬ביצענו השוואה של ‪ Tabu search‬על בעיית ‪ TSP‬מול אלגוריתמי חיפוש לוקאלי שונים‪.‬‬
‫למדנו שלכל שיטה יש את היתרונות והחסרונות שלה‪ ,‬והבחירה באיזה אלגוריתם להשתמש אינה חד משמעית ותלויה בנתונים‬
‫נוספים‪ .‬למשל‪ :‬כמות הזיכרון שמוכנים להקצות לתהליך החיפוש‪ ,‬כמות הזמן שמוכנים להקדיש‪ ,‬הגדרת הבעיה ו“הפתרון טוב‬
‫מספיק“ בעינינו‪ ,‬ומגבלות פיזיות כמו כוח חישוב שיש ברשותנו‪.‬‬
‫בתנאים המתאימים‪ Tabu search ,‬זו שיטה שיכולה להתאים ולמצוא פתרונות טובים ביחס לאלגוריתמים אחרים‪.‬‬

‫‪10‬‬

You might also like