מבני נתונים ואלגוריתמים - מחברת קורס/גרפים/אלגוריתמי זרימה

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
קפיצה לניווט קפיצה לחיפוש


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



כדאי לדעת:

נחלק את החומר שנלמד בזרימה לשלשה חלקים:


כדאי לדעת:

זרימה - הגדרות, תוכל למצוא מימוש C++ לאלגוריתמי זרימה.
  1. בספר הקורס, הפרק "Maximum Flow" (תתי פרקים 1 ו2) מכסה נושא זה.


שיטת Ford-Fulkerson[עריכה]

שיטת Ford-Fulkerson מתבססת על הרעיונות הבאים:

  1. מסלולים משפרים מאפשרים למעשה לקבוע את זרימת המקסימום:
    1. ראינו בגודל זרימה ומסלולים משפרים שכל עוד מוצאים מסלול משפר בגרף הרשת השיורית, אפשר לשפר את הזרימה.
    2. ראינו בזרימה וחתכי S-T שאם אי אפשר למצוא מסלול משפר בגרף הרשת השיורית, אי אפשר לשפר את הזרימה.
  2. קל לבנות את הרשת השיורית ולמצוא מסלול בה (או לחלופין, להיווכח שאין מסלול כזה). אם כי לא נתעמק בזאת, לא קשה לראות שאפשר לעשות זאת בסיבוכיות .שתי נקודות אלו מובילות לרעיון הבא, הידוע כשיטת Ford -Fulkerson:


הגדרה: שיטת Ford-Fulkerson

בהינתן רשת הזרימה:

  1. ראשית קבע את זרימת האפס (כלומר הזרימה המשייכת לכל קשת זרימה 0). (זו בוודאי זרימה חוקית.)
  2. כל עוד יש מסלול משפר ברשת השיורית, שפר את הזרימה דרך מסלול זה.


כדאי לדעת:

בקורס נלמד מספר אלגוריתמים (ודמויי אלגוריתמים) למציאת זרימה מקסימלית בעזרת מציאת מסלול משפר ברשת השיורית.
אלגוריתמי הזרימה.
  1. שיטת Ford-Fulkerson מציעה להשתמש בכל פעם במסלול משפר ברשת השיורית כל עוד הדבר אפשרי. השיטה אינה מגדירה במדויק איך למצוא מסלול משפר כזה, וחשוב מכך, אינה מוכיחה סופיות (שהיא, כפי שראינו בתחילת הקורס כשדיברנו על הוכחת נכונות חיפוש לינארי, תנאי הכרחי לנכונות אלגוריתם).
  2. אלגוריתם Ford-Fulkerson הוא מקרה פרטי של שיטת Ford-Fulkerson, ופועל כאשר הקיבולים הם מספרים שלמים.
  3. אלגוריתם Edmonds-Karp הוא מקרה פרטי של שיטת Ford-Fulkerson, ופועל לכל מערכת קיבולים (לאו-דווקא שלמים).בנוסף, יש גם שיטות אחרות ומעניינות שאינן פועלות כלל לפי הרעיון הכללי הנ"ל. לא נלמד שיטות אלו בקורס; תוכל לקרוא על כך יותר בספר הקורס בפרק "Maximum Flow" (תתי-פרקים 4-5).

אלגוריתם Ford-Fulkerson[עריכה]

אלגוריתם Ford-Fulkerson הוא פחות-או-יותר שיטת Ford-Fulkerson בהקשר רשתות זרימה שבהן הקיבולים הם מספרים שלמים:


הגדרה:

(אלגוריתם Ford-Fulkerson) בהינתן רשת הזרימה:

  1. ראשית קבע את זרימת האפס. (אתחול זה משותף לכל אלגוריתם בשיטת Ford-Fulkerson)
  2. כל עוד יש מסלול משפר ברשת השיורית, מצא מסלול כזה, ושפר את הזרימה ב1 יחידת זרימה (לפחות).

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



משפט:

נניח שברשת הזרימה, גודל זרימת המקסימום הוא . אז אלגוריתם Ford-Fulkerson עובד בזמן .



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

מש"ל.PNG

אלגוריתם Edmonds-Karp[עריכה]

אלגוריתם Edmonds-Karp הוא פחות-או-יותר שיטת Ford-Fulkerson, אך תוך ציון כיצד יש לבחור מסלול שיפור בגרף הרשת השיורית:


הגדרה:

(אלגוריתם Edmonds-Karp) בהינתן רשת הזרימה:

  1. ראשית קבע את זרימת האפס. (אתחול זה משותף לכל אלגוריתם בשיטת Ford-Fulkerson)
  2. כל עוד יש מסלול משפר בגרף הרשת השיורית, מצא את המסלול הקצר ביותר (ספציפית, כמוחזר על ידי חיפוש רוחבי), ושפר על פיו.


שימו לב:

בניגוד לאלגוריתם Ford-Fulkerson, אלגוריתם זה עובד גם על רשתות זרימה שקיבוליהן אינן מספרים שלמים.



משפט:

אלגוריתם Edmonds-Karp עובד בזמן .


להלן "הוכחת נפנופי-ידיים":


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

מש"ל.PNG


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