Smart-World Surf

יחידה 4: בעיות סיפוק אילוצים (CSP)

מודלים וטכניקות לפתרון בעיות המוגדרות על ידי משתנים ואילוצים.
מודל CSPאלגוריתם Backtrackingעקביות קשתות (Arc Consistency)היוריסטיקות בחירה

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

מבוא לבעיות סיפוק אילוצים (CSP)

בעיות סיפוק אילוצים (Constraint Satisfaction Problems - CSPs) הן מסגרת כללית לתיאור בעיות שבהן עלינו למצוא הקצאה של ערכים למשתנים, כך שכל האילוצים המוגדרים על המשתנים יסופקו. בניגוד לבעיות חיפוש כלליות, CSPs מנצלות את המבנה המיוחד של הבעיה כדי לאפשר פתרונות יעילים יותר.

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

מודל בעיית סיפוק אילוצים (CSP)

כל בעיית CSP מוגדרת על ידי שלושה מרכיבים עיקריים:

  • משתנים (Variables): קבוצה לא ריקה של משתנים, נסמן אותם ב-X1, X2, ..., Xn.
  • תחומים (Domains): עבור כל משתנה Xi, קיים תחום Di המכיל את כל הערכים האפשריים ש-Xi יכול לקבל.
  • אילוצים (Constraints): קבוצה של אילוצים C1, C2, ..., Cm. כל אילוץ Cj מגדיר קבוצת משתנים (היקף האילוץ) וקבוצת צירופי ערכים חוקיים עבור משתנים אלו. אילוץ יכול להיות אונארי (על משתנה אחד), בינארי (על שני משתנים) או מסדר גבוה יותר.
הקצאה (Assignment): השמה של ערך מתוך התחום שלו למשתנה. הקצאה יכולה להיות חלקית (לכמה משתנים) או מלאה (לכל המשתנים).
פתרון (Solution): הקצאה מלאה של ערכים לכל המשתנים, כך שכל האילוצים מסופקים.

אלגוריתם Backtracking (חיפוש עם נסיגה)

אלגוריתם Backtracking הוא אלגוריתם חיפוש רקורסיבי, המבוסס על חיפוש לעומק (DFS), ומהווה את הבסיס לפתרון בעיות CSP. הוא מנסה לבנות פתרון על ידי הקצאת ערכים למשתנים בזה אחר זה.

כיצד Backtracking עובד:

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

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

שיפורים לאלגוריתם Backtracking: עקביות קשתות והיוריסטיקות

כדי לשפר את יעילות ה-Backtracking, משלבים בו טכניקות המפחיתות את מרחב החיפוש:

עקביות קשתות (Arc Consistency - AC)

עקביות קשתות היא טכניקת סינון (filtering) המבוצעת על תחומי המשתנים לפני או במהלך החיפוש. הרעיון הוא להסיר ערכים מתחומי המשתנים שאינם יכולים להיות חלק מפתרון עקבי.

עקביות קשתות (Arc Consistency): קשת (Xi, Xj) היא עקבית אם לכל ערך x בתחום של Xi, קיים לפחות ערך y בתחום של Xj כך שההקצאה (Xi=x, Xj=y) מספקת את האילוץ בין Xi ל-Xj. אם לא, הערך x מוסר מתחום Xi.

אלגוריתם AC-3 (או AC-4, AC-5) פועל על ידי בדיקה חוזרת ונשנית של עקביות קשתות, עד שלא ניתן להסיר יותר ערכים מתחומים. הפעלת AC לפני החיפוש (pre-processing) או במהלך החיפוש (כמו ב-Forward Checking) יכולה לצמצם משמעותית את גודל עץ החיפוש.

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

היוריסטיקות בחירה

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

היוריסטיקת המשתנה הבלתי מוקצה בעל התחום הקטן ביותר (MRV - Minimum Remaining Values)

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

היוריסטיקת הערך הפחות מגביל (LCV - Least Constraining Value)

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

היוריסטיקת הדרגה (Degree Heuristic): במקרה של תיקו ב-MRV, בוחרים את המשתנה המעורב במספר האילוצים הגדול ביותר עם משתנים שטרם הוקצו.

שאלות לדיון

  • הסבירו את שלושת המרכיבים העיקריים של מודל CSP. תנו דוגמה לבעיה יומיומית ומדלו אותה כ-CSP.
  • תארו את אלגוריתם Backtracking. מהם יתרונותיו וחסרונותיו בהשוואה לאלגוריתמי חיפוש כלליים?
  • כיצד עקביות קשתות (Arc Consistency) משפרת את ביצועי אלגוריתם Backtracking? הדגימו את השפעתה על תחומי משתנים בבעיה פשוטה.
  • השוו בין היוריסטיקת MRV ל-LCV. מתי נשתמש בכל אחת מהן, ומהי תרומתן הכוללת ליעילות פתרון בעיות CSP?
  • הסבירו מדוע שילוב של טכניקות סינון (כמו עקביות קשתות) עם היוריסטיקות בחירה הוא קריטי לפתרון יעיל של בעיות CSP מורכבות.

נקודות לתשובת מודל

  • מודל CSP: הגדרה ברורה של משתנים, תחומים ואילוצים. דוגמה קונקרטית (למשל, צביעת מפה, N-מלכות) עם פירוט המרכיבים.
  • Backtracking: הסבר על תהליך החיפוש לעומק, נסיגה, ונקודות כשל. ציון היותו שלם ונכון, אך לא יעיל ללא שיפורים.
  • עקביות קשתות: הגדרת קשת עקבית. הסבר על הסרת ערכים לא עקביים. הדגמה של צמצום תחומי משתנים והשפעה על עץ החיפוש (זיהוי מוקדם של כישלונות).
  • היוריסטיקות: הסבר על MRV כבחירת המשתנה הקשה ביותר, ו-LCV כבחירת הערך הפחות מגביל. ניתוח תרומתן לקיצור החיפוש.
  • שילוב טכניקות: הדגשה כי סינון (AC) מצמצם את מרחב החיפוש לפני או במהלך הקצאה, והיוריסטיקות מכוונות את החיפוש בתוך המרחב המצומצם. שילוב זה מאפשר התמודדות עם בעיות גדולות ומורכבות יותר.
מצאתם טעות או שחסר משהו?
→ הקודמת
חיפוש מושכל
הבאה ←
חיפוש בתנאי יריבות (משחקים)