1 / 20

אלגוריתמים נבחרים בתורת הגרפים

אלגוריתמים נבחרים בתורת הגרפים. חיפוש לעומק Depth First search. חיפוש לעומק Depth First Search. המטרה: פתרון מבוכים ובעיות נוספות סריקת גרפים סופיים לא-מכוונים נתון גרף סופי G(V, E) . נתחיל באחד מקודקודיו ונרצה ללכת על הצלעות, מקודקוד לקודקוד, לבקר בכל הקודקודים ולעצור.

august
Download Presentation

אלגוריתמים נבחרים בתורת הגרפים

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. אלגוריתמים נבחרים בתורת הגרפים חיפוש לעומק Depth First search

  2. חיפוש לעומק Depth First Search • המטרה: • פתרון מבוכים ובעיות נוספות • סריקת גרפים סופיים לא-מכוונים • נתון גרף סופי G(V, E). נתחיל באחד מקודקודיו ונרצה ללכת על הצלעות, מקודקוד לקודקוד, לבקר בכל הקודקודים ולעצור. • לא נרשה תכנון מראש (על-ידי למידת הגרף). בכל צעד מקבלים החלטה לוקלית, מבנה הגרף נלמד תוך כדי סריקתו. • לשם כך נשאיר סימנים תוך כדי הליכה כדי לזהות מקום שבקרנו בו.

  3. חיפוש לעומק Depth First Search • סריקת גרפים סופיים לא-מכוונים • מעברים:חיבור של קשת לקודקוד. • בייצוג ע"י רשימת פגיעות: מעבר הוא הופעה של קשת ברשימת הפגיעות. • נשתמש בשני סימונים: • F – המעבר הראשון ששמש כניסה לקודקוד, • E – עבור כל מעבר אחר שבו עזבנו את הקודקוד. • סימון מעברים אינו משתנה במהלך האלגוריתם.

  4. חיפוש לעומק Depth First Search • האלגוריתם של Tremax • s צומת ההתחלה. נרצה להגיע חזרה ל- s אחרי שכל צמתי הגרף נסרקו. • באלגוריתם: • אף צלע לא נסרקת פעמיים באותו כיוון. • בסיום האלגוריתם: כל צלע נסרקת בדיוק פעם אחת בכל כיוון. • האלגוריתם עוצר תמיד בצומת ההתחלה. • סימון לקצוות הקשתות: • צד הכניסה לקודקוד מסומן ב-F-אם הצומת חדש, ז"א נכנסנו לצומת בפעם הראשונה דרך מעבר זה) או ב- E- אם הצומת כבר בוקרה קודם (מסמנים ב- E ומיד חוזרים עליה בחזרה). • ביציאה: קצה הקשת מסומן ב- E.

  5. האלגוריתם של Tre`maux 1. v <- s(v הוא הקודקוד בו נמצאים כרגע). 2. אם אין אף מעבר לא מסומן ב- v(כלומר, כל המעברים מסומנים), לך ל- 4. 3. בחר מעבר לא מסומן, סמן אותו ב- E ועבור על הקשת לקצה האחר שלה u. אם ל- u יש מעבר מסומן כלשהו (כלומר, הוא אינו קודקוד חדש) סמן את המעבר אליו הגעת זה עתה ל- u ב- E, עבור בחזרה ל- v וחזור לצעד 2. אם ל- u אין מעבר מסומן (כלומר, u הוא קודקוד חדש), סמן את המעבר שדרכו נכנסת ל- u ב- F, v<-u וחזור לצעד 2. 4. אם אין מעבר מסומן ב- F, עצור (אנו בחזרה ב- s וסריקת הגרף הסתיימה). 5. השתמש במעבר שסומן ב- F, עבור על הקשת לקצה השני שלה u הנמצא בקצה השני של צלע זו, v<-u וחזור לצעד 2.

  6. האלגוריתם של Tre`maux למה 1: באלגוריתם של Tre`maux אף צלע אינה נסרקת פעמים באותו כיוון. מסקנה: האלגוריתם עוצר תמיד. מסקנה: האלגוריתם עוצר תמיד בנקודת ההתחלה (כי לשאר הקודקודים יש מעבר שסומן ב- F). למה 2: בסיום האלגוריתם של Tre`maux כל צלע נסרקת בדיוק פעם אחת בכל כיוון.

  7. Hopcroft and Tarjan :ויאריציה על האלגוריתם של Tre`maux כמו האלגוריתם של Tre`maux עם שינוי בסימונים. השינויים: • כל קודקוד מקבל סימון מ- 1 עד |V|, עפ"י סדר הביקורים (s מקבל 1 וכו'). • במקום לסמן מעברים מסמנים קשתות כ"משומשות", ובמקום הסימון F (עבור המעבר שדרכו נכנסנו לקודקוד בפעם הראשונה) זוכרים את הקודקוד שממנו הגענו אליו לראשונה.

  8. Hopcroft and Tarjan :ויאריציה על האלגוריתם של Tre`maux 1. סמן את כל הקשתות כ"חדשות". לכל קודקוד v  V: k(v) ← 0. i ← 0, v ← s 2. i ← i+1, ik(v) ← 3. אם ל-v אין אף צלע חדשה הפוגעת בו, לך לצעד 5. 4. בחר בצלע חדשה כלשהי הנוגעת ב- v: e=(v, u). סמן אותה כ"משומשת". אם k(u)≠0(ז"א בקרנו כבר ב- u) לך לצעד 3. אחרת k(v)=0), v קודקוד שעדיין לא בקרנו בו)f(u)=v(סימון ה"אבא" של u), v ← u וחזור לצעד 2. 5. אם k(v)=1, עצור. 6. ← f(v)v ולך לצעד 3.

  9. סיבוכיות חיפוש לעומק Depth First Search 1. סמן את כל הקשתות כ"חדשות". לכל קודקוד v  V , k(v) ← 0. O(|E|) i ← 0, v ← s 2. i ← i+1, k(v) ← IO(1) צעדים 3 ו- 4: O(|E|)בכל האיטרציות 3. אם ל- v אין אף צלע חדשה הפוגעת בו, לך לצעד 5. 4. בחר בצלע חדשה כלשהי הנוגעת ב- v: e=(v, u). סמן אותה כ"משומשת". אם k(u)≠0 (ז"א בקרנו בו כבר) לך לצעד 3. אחרת k(v)=0) קודקוד שעדיין לא בקרנו בו), f(u)=v (סימון "אבא" של u), v ← u וחזור לצעד 2. 5. אם k(v)=1, עצור. O(1) 6. v ← f(v) ולך לצעד 3. O(1) המעבר ל- 3 מתבצע O(|V|) בגרף קשיר:O(|E|) + O(|V|) = O(|E|)

  10. בניית עץ ה- DFS תיאור סריקת קודקודי הגרף במהלך DFS.

  11. פתרון בעיות עם חיפוש לעומק Depth First Search • סדרת פיבונצ'י (סדר חישוב הערכים) • שמונה המלכות: • פתרו את הבעייה המופיעה ב- Eight Queens Java Applet • חקרו את הדגמת ה- Back Tracking המופיעה באתר: Recursion And Back Tracking An Example: The Eight Queens Problem • בנספח להרצאה מופיע חומר נוסף על בעיית שמונה המלכות • שימוש ב- DFS לפתרון מבוכים

  12. פתרון בעיות עם חיפוש לעומק Depth First Search Resource: Base, S. and Van Gelder, A. (2000). Computer Algorithms, Addison-Wesley.

  13. בעיית שמונה המלכות את חוקיותם של כמה סידורים יש לבדוק?

  14. את חוקיותם של כמה סידורים יש לבדוק? קיימים 64 מקומות על לוח שח-מט. מתוכם עלינו לבחור 8 מקומות ולכן מספר הסידורים האפשריים שאת חוקיותם עלינו לבדוק הוא:

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

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

  17. את חוקיותם של כמה סידורים יש לבדוק? לאחר בדיקת כל האפשרויות מסתבר שקיימים 92 סידורים המהווים פתרון לבעיה.

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

  19. כיצד נבדוק האם ניתן להציב מלכה במקום (i, j)? נייצג את שורות לוח השח-מט ע"י מערך בגודל 8 של ערכים בוליאנים, שיאותחל בערכי true. נייצג את האלכסונים ה"עולים" ע"י מערך בגודל 15 של ערכים בוליאנים, שיאותחל בערכי true. נייצג את האלכסונים ה"יורדים" ע"י מערך בגודל 15 של ערכים בוליאנים, שיאותחל בערכי true.

  20. כיצד נבדוק האם ניתן להציב מלכה במקום (i, j)? בכל פעם שנציב מלכה במקום (i, j) נעדכן את: מערך השורות במקום ה- iב- false; מערך האלכסונים ה"עולים" במקום ה- i+jב- false; מערך האלכסונים ה"יורדים" במקום ה- i-jב- false.

More Related