Smart-World Surf

יחידה 10: זרימות ברשתות

מודלים של זרימה ברשתות ובעיות אופטימיזציה.

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

מבוא לזרימות ברשתות

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

רשת זרימה (Flow Network): גרף מכוון $G=(V,E)$ עם קודקוד מקור $s \in V$, קודקוד בור $t \in V$, ופונקציית קיבולת $c: E \to \mathbb{R}^+$ המקצה לכל קשת $e \in E$ ערך קיבולת חיובי.
קיבולת (Capacity): הערך המקסימלי של זרימה שיכול לעבור דרך קשת מסוימת. מסומן כ-$c(u,v)$ עבור קשת $(u,v)$.
זרימה (Flow): פונקציה $f: E \to \mathbb{R}^+$ המקצה לכל קשת $(u,v) \in E$ ערך זרימה $f(u,v)$ המקיים שני תנאים עיקריים:
  • מגבלת קיבולת: $0 \le f(u,v) \le c(u,v)$ לכל קשת $(u,v) \in E$.
  • שימור זרימה: לכל קודקוד $v \in V \setminus \{s,t\}$, סך הזרימה הנכנסת ל-$v$ שווה לסך הזרימה היוצאת מ-$v$. כלומר, $\sum_{(u,v) \in E} f(u,v) = \sum_{(v,w) \in E} f(v,w)$.
ערך הזרימה הכולל ברשת מוגדר כסך הזרימה היוצאת מהמקור $s$ (או הנכנסת לבור $t$).

הבעיה המרכזית: זרימה מקסימלית וחתך מינימלי

בעיית הזרימה המקסימלית היא למצוא זרימה ברשת שערכה הכולל הוא הגדול ביותר האפשרי. זוהי בעיית אופטימיזציה קלאסית עם חשיבות תיאורטית ומעשית רבה.

גרף שיורי (Residual Graph): בהינתן רשת זרימה $G$ וזרימה $f$, הגרף השיורי $G_f$ הוא גרף המכיל את כל הקודקודים של $G$. עבור כל קשת $(u,v)$ ב-$G$:
  • אם $f(u,v)
  • אם $f(u,v) > 0$, קיימת קשת אחורה $(v,u)$ ב-$G_f$ עם קיבולת שיורית $c_f(v,u) = f(u,v)$.
קשתות בגרף השיורי מייצגות את ה"מקום הפנוי" להגדלת זרימה (קשתות קדימה) או את האפשרות להפחית זרימה קיימת (קשתות אחורה).
מסלול שיפור (Augmenting Path): מסלול מהמקור $s$ לבור $t$ בגרף השיורי. מציאת מסלול כזה מאפשרת להגדיל את הזרימה הכוללת ברשת.
חתך (Cut): חלוקה של קודקודי הגרף $V$ לשתי קבוצות $S$ ו-$T$ כך ש-$s \in S$ ו-$t \in T$. החתך מסומן כ-$(S,T)$.
קיבולת חתך (Cut Capacity): סכום הקיבולות של כל הקשתות היוצאות מ-$S$ ונכנסות ל-$T$. כלומר, $c(S,T) = \sum_{u \in S, v \in T, (u,v) \in E} c(u,v)$.
משפט זרימה מקסימלית-חתך מינימלי (Max-Flow Min-Cut Theorem): זהו אבן היסוד של תורת הזרימות. המשפט קובע כי ערך הזרימה המקסימלית ברשת שווה לקיבולת המינימלית של כל חתך $s-t$ ברשת.

מדוע זה קריטי לבחינה?

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

אלגוריתמים לפתרון בעיית זרימה מקסימלית

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

פורד-פלקרסון (Ford-Fulkerson)

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

אדמונדס-קארפ (Edmonds-Karp)

גרסה ספציפית של פורד-פלקרסון המבטיחה יעילות פולינומית. בכל איטרציה, מוצאים את מסלול השיפור הקצר ביותר (במונחי מספר קשתות) באמצעות חיפוש לרוחב (BFS) בגרף השיורי. זמן הריצה הוא $O(VE^2)$, מה שהופך אותו למעשי עבור גרפים בגודל בינוני.

דיניץ (Dinic)

אלגוריתם יעיל יותר, במיוחד עבור גרפים דחוסים. הוא פועל בשלבים: בכל שלב בונה "גרף רמות" (level graph) באמצעות BFS, ואז מוצא מספר מסלולי שיפור חוסמים (blocking flows) בגרף הרמות באמצעות DFS. זמן הריצה הוא $O(V^2E)$ במקרה הכללי, ו-$O(V^3)$ עבור רשתות עם קיבולות יחידה, ו-$O(E \sqrt{V})$ עבור רשתות דו-צדדיות.

ניתוח יעילות

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

מודלים ויישומים

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

שידוכים דו-צדדיים (Bipartite Matching)

בעיית מציאת שידוך בגודל מקסימלי בגרף דו-צדדי ניתנת למידול כבעיית זרימה מקסימלית. בונים רשת זרימה על ידי הוספת מקור $s$ המחובר לצד אחד של הגרף, ובור $t$ המחובר לצד השני, וקשתות בקיבולת 1. זרימה מקסימלית ברשת זו תיתן את גודל השידוך המקסימלי.

בעיית הסירקולציה (Circulation)

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

זרימה בעלות מינימלית (Min-Cost Flow)

בנוסף לקיבולת, לכל קשת יש גם עלות ליחידת זרימה. המטרה היא למצוא זרימה בגודל נתון (או זרימה מקסימלית) בעלות כוללת מינימלית. בעיה זו מורכבת יותר ודורשת אלגוריתמים ייעודיים, כגון אלגוריתם נתיבים קצרים עוקבים (Successive Shortest Paths) או ביטול מעגלים שליליים (Cycle Canceling).

שאלות לדיון

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

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

  • קשר מסלולי שיפור ומשפט זרימה-חתך: למה פורד-פלקרסון קובעת שזרימה היא מקסימלית אם ורק אם אין מסלולי שיפור בגרף השיורי. חתך $s-t$ בגרף המקורי שבו כל הקשתות מ-$S$ ל-$T$ רוויות (ומ-$T$ ל-$S$ ריקות) הוא חתך מינימלי, וערך הזרימה שווה לקיבולתו.
  • פורד-פלקרסון מול אדמונדס-קארפ: פורד-פלקרסון יכול לבחור מסלולי שיפור ארוכים, מה שמוביל לזמן ריצה לא פולינומי (או אינסופי עם קיבולות ממשיות). אדמונדס-קארפ בוחר תמיד את המסלול הקצר ביותר (ב-BFS), מה שמבטיח שכל קשת יכולה להיות חלק ממסלול שיפור רק מספר מוגבל של פעמים, ובכך מבטיח זמן ריצה פולינומי.
  • מידול שיבוץ עובדים: בונים גרף דו-צדדי עם קודקודי עובדים בצד אחד וקודקודי משימות בצד שני. קשת בין עובד למשימה אם העובד יכול לבצע את המשימה. מוסיפים מקור $s$ המחובר לכל העובדים (קיבולת 1), ובור $t$ המחובר מכל המשימות (קיבולת 1). קשתות העובד-משימה בקיבולת 1. זרימה מקסימלית תיתן את מספר השיבוצים המקסימלי.
  • הבדלים בין זרימה מקסימלית לזרימה בעלות מינימלית: זרימה מקסימלית שואפת למקסם את כמות החומר העובר ברשת, ללא התחשבות בעלויות. זרימה בעלות מינימלית שואפת להעביר כמות נתונה של חומר (או כמות מקסימלית) תוך מזעור העלות הכוללת. נשתמש בזרימה מקסימלית כאשר המטרה היא תפוקה מקסימלית (למשל, רוחב פס), ובזרימה בעלות מינימלית כאשר יש שיקולי עלות בנוסף לקיבולת (למשל, תכנון רשתות אספקה).
מצאתם טעות או שחסר משהו?
→ הקודמת
צביעת גרפים ומישוריות