שאלת מבחן באלגוריתמים - האוניברסיטה הפתוחה 2021 - זרימה ברשתות
שאלה 3 – זרימה (תיקון של זרימה-מרבית נתונה)
נתונה רשת-זרימה: גרף מכוון עם מקור ויעד , ועם קיבולות שלמות לכל . נתונה זרימה-מרבית ברשת, שהתקבלה מהרצה של אלגוריתם Ford–Fulkerson, ונתונה צלע מסוימת . הציגו אלגוריתם שרץ בזמן לינארי למציאת זרימה מרבית ברשת, המתקבלת מהקטנת הקיבולת של ב-. (הניחו שבכל הצלעות הקיבולות קטנות כך שחיבור/חיסור/השוואה של קיבולת/זרימה הינן פעולות אלמנטריות המתבצעות בזמן .)
___________________________________________________________________1
___________________________________________________________________2
__________________________________________________________________3
___________________________________________________________________4
___________________________________________________________________5
__________________________________________________________________6
___________________________________________________________________7
___________________________________________________________________8
___________________________________________________________________9
__________________________________________________________________10
__________________________________________________________________11
_________________________________________________________________12
__________________________________________________________________13
__________________________________________________________________14
__________________________________________________________________15
נתונה רשת-זרימה: גרף מכוון עם מקור ויעד , ועם קיבולות שלמות לכל . נתונה זרימה-מרבית ברשת, שהתקבלה מהרצה של אלגוריתם Ford–Fulkerson, ונתונה צלע מסוימת . הציגו אלגוריתם שרץ בזמן לינארי למציאת זרימה מרבית ברשת, המתקבלת מהקטנת הקיבולת של ב-. (הניחו שבכל הצלעות הקיבולות קטנות כך שחיבור/חיסור/השוואה של קיבולת/זרימה הינן פעולות אלמנטריות המתבצעות בזמן .)
___________________________________________________________________1
___________________________________________________________________2
__________________________________________________________________3
___________________________________________________________________4
___________________________________________________________________5
__________________________________________________________________6
___________________________________________________________________7
___________________________________________________________________8
___________________________________________________________________9
__________________________________________________________________10
__________________________________________________________________11
_________________________________________________________________12
__________________________________________________________________13
__________________________________________________________________14
__________________________________________________________________15
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד 772021סמסטר א
★★★★★
זרימה ברשתותגרפיםניתוח אלגוריתמיםמעקב אחר אלגוריתם
נתחו את המצב לפי הזרימה על הצלע . אם הזרימה שווה לקיבולת, בדקו בגרף השיורי אם ניתן למצוא מסלול חלופי ליחידת הזרימה שיש להסיט, או שחייבים להקטין את ערך הזרימה הכולל.
האלגוריתם המוצע מנתח את מצב הזרימה על הצלע שקיבולתה הוקטנה, ופועל בהתאם. זמן הריצה הנדרש הוא לינארי בגודל הגרף, .
ראשית, נבדוק את ערך הזרימה על הצלע ברשת המקורית.
1. **מקרה א': **
במקרה זה, מכיוון שהזרימה והקיבולות שלמות, מתקיים . כלומר, הזרימה עומדת במגבלת הקיבולת החדשה על הצלע . מכיוון שלא שינינו קיבולות של צלעות אחרות, הזרימה היא זרימה חוקית גם ברשת החדשה. ערך הזרימה הכולל נותר . מאחר שהקיבולות ברשת החדשה קטנות או שוות לאלו שברשת המקורית, ערך הזרימה המרבית החדשה לא יכול להיות גדול מ-. לכן, היא זרימה מרבית גם ברשת החדשה. בדיקה זו מתבצעת בזמן .
2. **מקרה ב': **
במקרה זה, הזרימה אינה חוקית ברשת החדשה כי . עלינו למצוא זרימה מרבית חדשה. ערך הזרימה המרבית החדשה יכול להיות או .
נשתמש במשפט מרכזי בתורת הזרימה: **צלע רוויה (כלומר, ) נמצאת על חתך מינימום כלשהו אם ורק אם אין מסלול מהצומת לצומת בגרף השיורי **. נבנה את הגרף השיורי ונשתמש ב-BFS או DFS כדי לבדוק אם קיים מסלול מ- ל-.
* **תת-מקרה 2א': קיים מסלול מ- ל- ב-.**
לפי המשפט, הצלע אינה חלק מאף חתך מינימום ברשת המקורית. לכן, הקיבולת של כל חתך מינימום מקורי נשארת גם לאחר הקטנת הקיבולת של . מכאן שערך הזרימה המרבית החדשה הוא .
כדי למצוא זרימה זו, עלינו לתקן את הזרימה שהפכה ללא חוקית. נגדיר תחילה "קדם-זרימה" על ידי הפחתת הזרימה על : , ו- לכל . ב- נוצר עודף זרימה של 1 בצומת ומחסור בזרימה של 1 בצומת . כדי לתקן זאת, "נעביר" את יחידת הזרימה הבעייתית מ- ל- דרך המסלול שמצאנו בגרף השיורי. כלומר, נבצע הגדלת זרימה (augmentation) של 1 לאורך המסלול על גבי . הזרימה החדשה שתתקבל תהיה חוקית, ערכה יהיה , ולכן היא זרימה מרבית. מציאת המסלול ועדכון הזרימה לוקחים זמן .
* **תת-מקרה 2ב': לא קיים מסלול מ- ל- ב-.**
לפי המשפט, הצלע נמצאת על חתך מינימום כלשהו ברשת המקורית. קיבולת חתך זה הייתה . ברשת החדשה, קיבולת אותו חתך היא . מכאן שערך הזרימה המרבית החדשה הוא לכל היותר . נוכל להשיג זרימה בערך זה, ולכן זהו הערך החדש.
כדי לבנות את הזרימה החדשה, עלינו "לבטל" יחידת זרימה אחת שעברה במסלול . פעולה זו שקולה לביצוע הגדלת זרימה של 1 בגרף השיורי במסלול מהיעד למקור, , שעובר דרך הצלע (הצלע האחורית ל-). מסלול כזה מורכב ממסלול מ- ל- וממסלול מ- ל-. קיום מסלולים כאלה מובטח ממשפט פירוק הזרימה, שכן זרם חיובי עבר מ- ל- וכן מ- ל- (כחלק ממסלולי זרימה שונים).
האלגוריתם יפעל כך:
1. מצא מסלול מ- ל- ב- באמצעות BFS/DFS.
2. מצא מסלול מ- ל- ב- באמצעות BFS/DFS.
3. הגדר את הזרימה החדשה כתוצאה של הגדלת הזרימה ביחידה אחת לאורך המסלול המורכב .
הזרימה היא זרימה חוקית ברשת החדשה, ערכה הוא , ולכן היא זרימה מרבית. שלב זה דורש שתי הרצות של אלגוריתם חיפוש, ולכן זמן הריצה הוא .
לסיכום, בכל המקרים, האלגוריתם מוצא זרימה מרבית חדשה בזמן ריצה לינארי.
ראשית, נבדוק את ערך הזרימה על הצלע ברשת המקורית.
1. **מקרה א': **
במקרה זה, מכיוון שהזרימה והקיבולות שלמות, מתקיים . כלומר, הזרימה עומדת במגבלת הקיבולת החדשה על הצלע . מכיוון שלא שינינו קיבולות של צלעות אחרות, הזרימה היא זרימה חוקית גם ברשת החדשה. ערך הזרימה הכולל נותר . מאחר שהקיבולות ברשת החדשה קטנות או שוות לאלו שברשת המקורית, ערך הזרימה המרבית החדשה לא יכול להיות גדול מ-. לכן, היא זרימה מרבית גם ברשת החדשה. בדיקה זו מתבצעת בזמן .
2. **מקרה ב': **
במקרה זה, הזרימה אינה חוקית ברשת החדשה כי . עלינו למצוא זרימה מרבית חדשה. ערך הזרימה המרבית החדשה יכול להיות או .
נשתמש במשפט מרכזי בתורת הזרימה: **צלע רוויה (כלומר, ) נמצאת על חתך מינימום כלשהו אם ורק אם אין מסלול מהצומת לצומת בגרף השיורי **. נבנה את הגרף השיורי ונשתמש ב-BFS או DFS כדי לבדוק אם קיים מסלול מ- ל-.
* **תת-מקרה 2א': קיים מסלול מ- ל- ב-.**
לפי המשפט, הצלע אינה חלק מאף חתך מינימום ברשת המקורית. לכן, הקיבולת של כל חתך מינימום מקורי נשארת גם לאחר הקטנת הקיבולת של . מכאן שערך הזרימה המרבית החדשה הוא .
כדי למצוא זרימה זו, עלינו לתקן את הזרימה שהפכה ללא חוקית. נגדיר תחילה "קדם-זרימה" על ידי הפחתת הזרימה על : , ו- לכל . ב- נוצר עודף זרימה של 1 בצומת ומחסור בזרימה של 1 בצומת . כדי לתקן זאת, "נעביר" את יחידת הזרימה הבעייתית מ- ל- דרך המסלול שמצאנו בגרף השיורי. כלומר, נבצע הגדלת זרימה (augmentation) של 1 לאורך המסלול על גבי . הזרימה החדשה שתתקבל תהיה חוקית, ערכה יהיה , ולכן היא זרימה מרבית. מציאת המסלול ועדכון הזרימה לוקחים זמן .
* **תת-מקרה 2ב': לא קיים מסלול מ- ל- ב-.**
לפי המשפט, הצלע נמצאת על חתך מינימום כלשהו ברשת המקורית. קיבולת חתך זה הייתה . ברשת החדשה, קיבולת אותו חתך היא . מכאן שערך הזרימה המרבית החדשה הוא לכל היותר . נוכל להשיג זרימה בערך זה, ולכן זהו הערך החדש.
כדי לבנות את הזרימה החדשה, עלינו "לבטל" יחידת זרימה אחת שעברה במסלול . פעולה זו שקולה לביצוע הגדלת זרימה של 1 בגרף השיורי במסלול מהיעד למקור, , שעובר דרך הצלע (הצלע האחורית ל-). מסלול כזה מורכב ממסלול מ- ל- וממסלול מ- ל-. קיום מסלולים כאלה מובטח ממשפט פירוק הזרימה, שכן זרם חיובי עבר מ- ל- וכן מ- ל- (כחלק ממסלולי זרימה שונים).
האלגוריתם יפעל כך:
1. מצא מסלול מ- ל- ב- באמצעות BFS/DFS.
2. מצא מסלול מ- ל- ב- באמצעות BFS/DFS.
3. הגדר את הזרימה החדשה כתוצאה של הגדלת הזרימה ביחידה אחת לאורך המסלול המורכב .
הזרימה היא זרימה חוקית ברשת החדשה, ערכה הוא , ולכן היא זרימה מרבית. שלב זה דורש שתי הרצות של אלגוריתם חיפוש, ולכן זמן הריצה הוא .
לסיכום, בכל המקרים, האלגוריתם מוצא זרימה מרבית חדשה בזמן ריצה לינארי.