תרגיל - Algorithms

Download Report

Transcript תרגיל - Algorithms

‫תרגול ‪ – 10‬עוד זרימה‬
‫‪W‬‬
‫‪t‬‬
‫‪1‬‬
‫‪U‬‬
‫‪s‬‬
‫שאלה ‪ – 1‬זרימה בשלמים‬
‫‪ ‬תרגיל‪ :‬נתונה רשת זרימה ) ‪ G  (V , E‬מ‪ s -‬ל‪ t -‬עם‬
‫קיבולים שלמים‪ .‬הוכיחו שהשיטה של ‪Ford‬ו‪Fulkerson-‬‬
‫מוצאת זרימה מקסימלית ‪ f‬כך שלכל ‪ u , v  V‬הערך‬
‫) ‪ f ( u , v‬הינו שלם‪.‬‬
‫‪0 .7 / 1‬‬
‫‪t‬‬
‫‪2‬‬
‫‪0 .7 / 1‬‬
‫‪1 /1‬‬
‫‪0 .3 / 1‬‬
‫‪s‬‬
Ford - Fulkerson – ‫תזכורת‬
Ford-Fulkerson ( G , s , t )
1) Initialize flow ( f  0 ).
2) While there is an augmenting path p ,
Augment flow f along p .
3) Return f .
3
‫תזכורת‬
Ford-Fulkerson( G , s , t )
1) Initialize flow ( f  0 ).
2) While there is an augmenting path p ,
Augment flow f along p .
3) Return f .
‫רשת זרימה‬
‫רשת שיורית‬
0/2
10 //11
10 //11
s
0 /1
t
10 //11
2
1
1
s
1
t
1
4
‫תזכורת‬
Ford-Fulkerson( G , s , t )
1) Initialize flow ( f  0 ).
2) While there is an augmenting path p ,
Augment flow f along p .
3) Return f .
‫רשת זרימה‬
‫רשת שיורית‬
01 / 2
1 /1
10 //11
s
01 / 1
t
1 /1
2
1
1
s
1
t
1
5
‫תזכורת‬
Ford-Fulkerson( G , s , t )
1) Initialize flow ( f  0 ).
2) While there is an augmenting path p ,
Augment flow f along p .
3) Return f .
‫רשת זרימה‬
‫רשת שיורית‬
1/ 2
1 /1
1
0 /1
s
1 /1
1
1
t
1 /1
1
s
1
t
1
6
‫שאלה ‪ – 1‬זרימה בשלמים‬
‫‪ ‬תרגיל‪ :‬נתונה רשת זרימה ) ‪ G  (V , E‬מ‪ s -‬ל‪ t -‬עם‬
‫קיבולים שלמים‪ .‬הוכיחו שהשיטה של ‪Ford‬ו‪Fulkerson-‬‬
‫מוצאת זרימה מקסימלית ‪ f‬כך שלכל ‪ u , v  V‬הערך‬
‫) ‪ f ( u , v‬הינו שלם‪.‬‬
‫‪0 .7 / 1‬‬
‫‪t‬‬
‫‪7‬‬
‫‪0 .7 / 1‬‬
‫‪1 /1‬‬
‫‪0 .3 / 1‬‬
‫‪s‬‬
‫שאלה ‪ – 1‬פתרון‬
‫נוכיח את הטענה באינדוקציה על מספר הזרימות שהאלגוריתם חיבר‬
‫עד כה‪:‬‬
‫בסיס האינדוקציה‪( :‬מצאנו ‪ 0‬מסלולים) לכל קשת יש זרימה ‪.0‬‬
‫צעד האינדוקציה‪ :‬עד כה מצאנו זרימה ‪ f‬שבה בכל קשת עוברת‬
‫זרימה שלמה‪ .‬יהי ‪ p‬מסלול ברשת השיורית של ‪ . f‬נראה שגם‬
‫לאחר הוספת המסלול החדש ‪ p‬ל‪ , f -‬עדיין יש זרימה שלמה בכל‬
‫קשת‪.‬‬
‫מההנחה‪ ,‬כל הקיבולים ברשת השיורית שלמים‪.‬‬
‫גודל הזרימה שנעביר דרך ‪ p‬הינו הקיבול המינימאלי מקיבולי‬
‫קשתות ‪ , p‬ולכן מדובר בערך שלם‪.‬‬
‫‪8‬‬
‫שאלה ‪ – 2‬סוסים ורוכבים‬
‫‪ ‬תרגיל‪ :‬יש מאה סוסים ומאה רוכבים‪ .‬כל רוכב מכין‬
‫רשימה של סוסים שהוא מוכן לרכב עליהם‪ .‬מצא‬
‫אלגוריתם שימצא את המספר המקסימאלי של סוסים‬
‫ורוכבים שיוכלו לדהור אל החופש‪.‬‬
‫‪9‬‬
‫תזכורת – גרף דו‪-‬צדדי‬
‫‪ ‬הגדרה‪ :‬גרף לא מכוון נקרא דו צדדי אמ"מ אפשר לצבוע את‬
‫קודקודיו בשני צבעים‪ ,‬כך שאף קשת לא מחברת בין שני קודקודים‬
‫בעלי אותו צבע‪.‬‬
‫‪ ‬אפשר להגדיר גרף דו צדדי בתור שלשה ) ‪ G  (U , W , E‬כך ש‪U -‬‬
‫ו‪ W -‬הן שתי קבוצות זרות של קודקודים‪ ,‬ואין אף קשת בין שני‬
‫קודקודים מאותה קבוצה‪.‬‬
‫‪W‬‬
‫‪10‬‬
‫‪U‬‬
‫זיווגים‬
‫‪ ‬הגדרה‪ :‬עבור גרף לא מכוון ) ‪ ,G  (V , E‬זיווג הינו‬
‫קבוצת קשתות זרות בקודקודים ‪ .S  E‬גודל הזיווג‬
‫הינו מספר הקשתות בקבוצה‪ .‬זיווג מקסימום הינו זיווג‬
‫עם מספר מקסימאלי של קשתות מבין הזיווגים שבגרף‪.‬‬
‫‪11‬‬
‫שאלה ‪ :2‬ניסוח אחר‬
‫‪ ‬תרגיל‪ :‬נתון גרף דו‪-‬צדדי‬
‫מקסימום בגרף‪.‬‬
‫‪W‬‬
‫‪12‬‬
‫) ‪.G  (U , W , E‬‬
‫תארו אלג' המוצא זיווג‬
‫‪U‬‬
‫שאלה ‪ :2‬פתרון‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫נהפוך את ‪ G‬לרשת זרימה‪:‬‬
‫נכוון את כל הקשתות מ‪ U -‬ל‪.W -‬‬
‫נוסיף קודקוד ‪ s‬וניצור קשתות ממנו לכל קודקודי‬
‫נוסיף קודקוד ‪ t‬וניצור קשתות אליו מכל קודקודי‬
‫ניתן לכל הקשתות קיבול ‪.1‬‬
‫‪t‬‬
‫‪13‬‬
‫‪.U‬‬
‫‪.W‬‬
‫‪s‬‬
‫המשך פתרון‬
‫‪ ‬קיבלנו רשת זרימה (רשת ‪ .)0-1‬נריץ עליה אלג' למציאת זרימה‬
‫מקסימאלית מ‪ s -‬ל‪.t -‬‬
‫‪ ‬בניית רשת הזרימה לוקחת זמן לינארי‪ ,‬ולכן זמן הריצה תלוי רק‬
‫באלג' למציאת זרימה מקסימאלית‪.‬‬
‫‪ ‬בשיעור נראה שבמקרה כזה האלג' של דיניץ רץ בזמן‬
‫‪‬‬
‫‪V‬‬
‫‪‬‬
‫‪.O E‬‬
‫‪ ‬נוכיח שגודל הזרימה המקסימאלית שווה לגודל הזיווג המקסימום‪,‬‬
‫ושקבוצת הקשתות הרוויות מ‪ U -‬ל‪ W -‬הינה זיווג מקסימום‪.‬‬
‫‪14‬‬
‫הוכחה (המשך)‬
‫נראה שגודל הזרימה המקסימאלית‬
‫המקסימום ‪: m‬‬
‫‪f‬‬
‫שווה לגודל הזיווג‬
‫• ‪ :| f | m‬לכל זיווג ניתן למצוא זרימה מתאימה באותו גודל‬
‫באופן הבא‪ .‬עבור כל קשת ) ‪ ( u , w‬בזיווג‪ ,‬נעביר זרם ‪ 1‬דרך‬
‫הקשתות ) ‪.( s , u ), ( u , w ), ( w , t‬‬
‫‪u‬‬
‫‪w‬‬
‫‪t‬‬
‫‪15‬‬
‫‪s‬‬
‫הוכחה (המשך)‬
‫נראה שגודל הזרימה המקסימאלית‬
‫המקסימום ‪: m‬‬
‫‪f‬‬
‫שווה לגודל הזיווג‬
‫• ‪ :| f | m‬בהינתן זרימה שלמה‪ ,‬נוכל לקחת רק את הקשתות‬
‫שלה מ‪ U -‬ל‪ W -‬ולקבל את הזיווג המתאים‪.‬‬
‫‪W‬‬
‫‪t‬‬
‫‪16‬‬
‫‪U‬‬
‫‪s‬‬
‫הוכחה (המשך)‬
‫‪ ‬מצאנו התאמה בין הזרימות השלמות לזיווגים האפשריים‪.‬‬
‫גודל זיווג יהיה זהה לגודל הזרימה שמתאימה לו‪.‬‬
‫‪ ‬זרימה מקסימאלית תתאים לזיווג מקסימום‪.‬‬
‫‪17‬‬
‫שאלה ‪ – 3‬מכונות ומשימות‬
‫‪ ‬תרגיל‪ :‬נתונות ‪ n‬מכונות ו‪ m -‬משימות שצריכות‬
‫להתבצע ע"י המכונות‪ .‬מכונה ‪ n i‬יכולה לבצע ‪ i‬משימות‪.‬‬
‫בנוסף‪ ,‬עבור כל משימה נתונה רשימה של מכונות שיודעות‬
‫לבצע אותה‪ .‬תארו אלג' אשר בוחר לכל משימה את המכונה‬
‫שתבצע אותה (תחת ההגבלות הנ"ל)‪ ,‬או מודיע שלא‬
‫קיימות השמה כזו‪.‬‬
‫‪18‬‬
‫שאלה ‪ – 3‬דוגמא‬
‫‪‬‬
‫תרגיל‪ :‬נתונות ‪ n‬מכונות ו‪ m -‬משימות שצריכות להתבצע ע"י המכונות‪.‬‬
‫מכונה ‪ i‬יכולה לבצע ‪ n i‬משימות‪ .‬בנוסף‪ ,‬עבור כל משימה נתונה רשימה של‬
‫מכונות שיודעות לבצע אותה‪ .‬תארו אלג' אשר בוחר לכל משימה את המכונה‬
‫שתבצע אותה (תחת ההגבלות הנ"ל)‪ ,‬או מודיע שלא קיימות השמה כזו‪.‬‬
‫‪Caffè latte‬‬
‫‪Cappuccino‬‬
‫‪Decaf‬‬
‫‪Doppio‬‬
‫‪Espresso‬‬
‫‪Filter‬‬
‫‪Half-caf‬‬
‫‪Raspberry Mocha‬‬
‫‪Red Eye‬‬
‫‪Turkish coffee‬‬
‫‪19‬‬
‫פתרון‬
Mocha
n1
Filter
n2
s
1
Cappuccino
1
Decaf
t
n3
n4
m ‫נחפש זרימה בגודל‬
Turkish
20
‫סיבוכיות‬
‫‪ ‬נסמן את סך אורכי הרשימות של המשימות ב‪-‬‬
‫‪ ‬גודל רשת הזרימה‪:‬‬
‫◦ האם זו רשת ‪ ?0-1‬לא!‬
‫◦ מספר הקודקודים – ‪.m  n  2‬‬
‫◦ מספר הקשתות – ‪.m  n  M‬‬
‫‪ ‬האלג' של דיניץ ירוץ בזמן‬
‫‪2‬‬
‫‪2‬‬
‫‪  O m  n  M m  n  ‬‬
‫‪ ‬ניתן להריץ ‪ FF‬בזמן ‪‬‬
‫‪21‬‬
‫‪‬‬
‫‪.O E V‬‬
‫‪.O  m  m  n  M‬‬
‫‪.M‬‬
‫‪ - k‬קשירות‬
‫‪ ‬הגדרה‪ :‬גרף מכוון נקרא ‪- k‬קשיר אם בין כל זוג‬
‫קודקודים שלו יש לפחות ‪ k‬מסלולים זרים‬
‫בקשתות (בכל כיוון)‪.‬‬
‫‪22‬‬
‫גרף ‪-2‬קשיר‬
‫שאלה ‪4‬‬
‫‪ ‬תרגיל‪ :‬נתון גרף מכוון ) ‪ G  (V , E‬וקבוע‬
‫תארו אלג' אשר בודק האם ‪ G‬הוא ‪- k‬קשיר‪.‬‬
‫‪.k‬‬
‫‪23‬‬
‫פתרון‬
‫‪ ‬ניסיון ראשון‪:‬‬
‫◦ עבור כל זוג קודקודים ‪ , v , u  V‬נבדוק האם יש ביניהם‬
‫מסלולים זרים בקשתות (בשני הכיוונים)‪.‬‬
‫◦ ראינו בתרגול הקודם איך לעשות את זה באמצעות זרימה‬
‫ברשתות ‪.0-1‬‬
‫‪k‬‬
‫‪ ‬סיבוכיות ‪-‬‬
‫‪‬‬
‫‪1/ 2‬‬
‫‪, E‬‬
‫‪2/3‬‬
‫‪V‬‬
‫‪E min‬‬
‫‪2‬‬
‫‪‬‬
‫‪.O V‬‬
‫מספר הפעמים שצריך‬
‫למצוא זרימה מקסימאלית‪.‬‬
‫‪24‬‬
‫שיפור הפתרון‬
‫‪ ‬אין צורך למצוא זרימה מקסימאלית‪ .‬צריך רק לבדוק‬
‫האם קיימת זרימה בגודל ‪.k‬‬
‫‪ ‬נוכל להריץ את האלג' של ‪ Ford-Fulkerson‬ולעצור‬
‫לאחר ‪ k‬מסלולים משפרים‪.‬‬
‫‪ ‬סיבוכיות ‪ -‬‬
‫‪25‬‬
‫‪E‬‬
‫‪2‬‬
‫‪‬‬
‫‪.O k V‬‬
‫עוד שיפור‬
‫‪ ‬נבחר קודקוד כלשהו ‪ v  V‬ונבדוק שיש ‪ k‬מסלולים‬
‫זרים בינו לבין כל אחד מהקודקודים האחרים (בשני‬
‫הכיוונים)‪.‬‬
‫‪ ‬סיבוכיות ‪ -‬‬
‫‪26‬‬
‫‪.O k V E‬‬
‫הוכחת נכונות‬
‫‪ ‬נראה שהבדיקות שהאלג' מבצע נכשלות אם"ם הגרף אינו‬
‫‪- k‬קשיר‪.‬‬
‫‪ ‬כיוון ראשון‪ :‬אם אחת הבדיקות שהאלג' ביצע נכשלה‪,‬‬
‫ברור שהגרף אינו ‪- k‬קשיר‪.‬‬
‫‪ ‬כיוון שני‪ :‬אם קיימים ‪ u , w  V‬כך שאין ‪ k‬מסלולים זרים‬
‫בקשתות מ‪ u -‬ל‪: w -‬‬
‫◦ קיים חתך ‪ u  S , w  T‬שגודלו קטן מ‪.k -‬‬
‫◦ אם ‪ v  S‬אז זהו גם חתך מ‪ v -‬ל‪ , w -‬ולכן בדיקת המסלולים‬
‫מ‪ v -‬ל‪ w -‬תכשל‪.‬‬
‫◦ אחרת‪ , v  T ,‬ובדיקת המסלולים מ‪ u -‬ל‪ v -‬תכשל‪.‬‬
‫‪27‬‬
‫שאלה ‪ - 5‬מציאת חתך מינימאלי‬
‫‪ ‬תרגיל‪ :‬נתונה רשת זרימה ) ‪ G  (V , E‬וזרימה מקסימאלית‬
‫עבורה‪ . f ,‬תארו אלג' למציאת חתך מינימאלי של הרשת‪.‬‬
‫‪2/5‬‬
‫‪d‬‬
‫‪1/1‬‬
‫‪2/5‬‬
‫‪1/1‬‬
‫‪c‬‬
‫‪t‬‬
‫‪1/1‬‬
‫‪4/5‬‬
‫‪s‬‬
‫‪0/3‬‬
‫‪e‬‬
‫‪3/3‬‬
‫‪28‬‬
‫‪a‬‬
‫‪3/7‬‬
‫‪b‬‬
‫‪3/3‬‬
‫שאלה ‪ - 5‬פתרון‬
‫‪ ‬נבנה את הרשת השיורית ביחס לזרימה‬
‫‪ ‬נריץ ‪ BFS‬מהמקור ונכניס את כל הקודקודים שבעץ ה‪BFS-‬‬
‫לתוך ‪. S‬‬
‫‪ ‬שאר הקודקודים יהיו ב‪.T -‬‬
‫‪ ‬זמן ריצה – ) ‪.O ( V  E‬‬
‫‪.f‬‬
‫‪29‬‬
‫דוגמא‬
‫רשת זרימה‬
‫‪2/5‬‬
‫‪d‬‬
‫‪1/1‬‬
‫‪c‬‬
‫‪t‬‬
‫‪1/1‬‬
‫‪4/5‬‬
‫‪1‬‬
‫‪d‬‬
‫‪2‬‬
‫‪t‬‬
‫‪4‬‬
‫‪1‬‬
‫‪30‬‬
‫‪2‬‬
‫‪1‬‬
‫‪3‬‬
‫‪3‬‬
‫‪c‬‬
‫‪3‬‬
‫‪s‬‬
‫‪1‬‬
‫‪e‬‬
‫‪a‬‬
‫‪4‬‬
‫‪3‬‬
‫‪3‬‬
‫‪3‬‬
‫‪b‬‬
‫‪e‬‬
‫‪3/7‬‬
‫‪2/5‬‬
‫‪1/1‬‬
‫רשת שיורית‬
‫‪a‬‬
‫‪s‬‬
‫‪0/3‬‬
‫‪3/3‬‬
‫‪b‬‬
‫‪3/3‬‬
‫הוכחת נכונות‬
‫‪ ‬נכונות‪ :‬נראה שהחתך שקיבלנו מינימאלי‪.‬‬
‫◦ ממשפט ה‪ ,max-flow min-cut-‬חתך הוא מינימאלי אם"ם‬
‫הוא בגודל ‪ . f‬נראה שגודל החתך שמצאנו‪. f  c ,‬‬
‫כל הקשתות של החתך שמצאנו רוויות‪( .‬אם הייתה‬
‫◦‬
‫בחתך קשת שאינה רוויה‪ ,‬אז צריך להוסיף את הקודקוד שהיא‬
‫מובילה אליו ל‪.) S -‬‬
‫אין זרימה מ ‪ T -‬ל‪ . S -‬אם הייתה‪ ,‬אז ברשת‬
‫◦‬
‫השיורית הייתה קשת לא רוויה מ‪ S -‬ל‪ . T -‬לכן‪ ,‬כיוון שסך‬
‫הזרימה בכל חתך הוא ‪ , f‬ויש זרימה רק בכיוון אחד של‬
‫החתך‪. f  c ,‬‬
‫‪31‬‬