תרגיל - Algorithms

Download Report

Transcript תרגיל - Algorithms

‫תרגול ‪BF - 5‬‬
‫‪1‬‬
‫שאלה ‪ – 1‬הדיקות מס' האיטרציות‬
‫‪ ‬תרגיל‪ :‬הראו שיתכן והאלגוריתם של בלמן‪-‬פורד זקוק ל ‪-‬‬
‫‪ n  1‬איטרציות בשביל לחשב מסלולים קצרים‬
‫ביותר‪.‬‬
‫‪2‬‬
1 ‫פתרון‬
‫ (ללא‬Bellman-Ford ‫ נזכר בתקציר האלגוריתם של‬
:)‫בדיקת המעגלים השליליים‬
Bellman-Ford(G,s):
Initialize(G).
‫מספר האיטרציות‬
for i = 1 to |V|-1
for each edge (u,v)
if (d(v)>d(u)+w(u,v))
Relax (u,v,w)
3
1 ‫פתרון‬
Bellman-Ford(G,s):
Initialize(G).
for i = 1 to |V|-1
for each edge (u,v)
if (d(v)>d(u)+w(u,v))
Relax (u,v,w)
1
:Bellman-Ford ‫ הרצת‬
1
1
1
s
0
1

2

7

8
9

4
‫שאלה ‪ – 2‬ארביטראג'‬
‫‪ ‬תרגיל‪ :‬נתונים ‪ n‬סוגי מטבעות וטבלת מחירי ההמרה‬
‫ביניהם‪ .‬תארו אלגוריתם הבודק האם ניתן להתחיל עם‬
‫מטבע אחד מסוג ‪ i‬ולבצע סדרת המרות שבסופה נקבל‬
‫יותר ממטבע אחד מסוג ‪.i‬‬
‫‪5‬‬
‫שאלה ‪ – 2‬דוגמא‬
‫‪1 X 22.3180 X 0.0120 X 0.7516 X 4.9517 =0.9967‬‬
‫‪6‬‬
‫שאלה ‪ – 2‬רעיון‬
‫‪ ‬נסמן את מספר המטבעות מסוג ‪ c j‬שניתן לקבל‬
‫בתמורה למטבע אחד מסוג ‪ ci‬בתור ‪.ai , j‬‬
‫‪ ‬נבנה גרף מכוון ) ‪ . G  (V , E‬הגרף מכיל צומת עבור‬
‫כל סוג מטבע‪ ,‬וקיימת קשת מכל צומת לכל צומת‬
‫אחרת‪.‬‬
‫‪ ‬לקשת בגרף היוצאת מקודקוד ‪ ci‬ונכנסת לקודקוד ‪c j‬‬
‫ניתן משקל ‪.ai , j‬‬
‫‪ ‬המשקל של מעגל ‪ c1  c2  ...  ck  c1‬יהיה‬
‫‪.a1,2  a2,3  ... ak ,1‬‬
‫‪7‬‬
‫◦ אבל אנחנו מחפשים מעגל שמקיים ‪.a1, 2  a2,3  ... ak ,1  1‬‬
‫שאלה ‪ – 2‬תיקון הבעיה‬
‫‪ ‬אנחנו מחפשים מעגל‬
‫שמתקיים ‪.a1, 2  a2,3  ... ak ,1  1‬‬
‫‪, c1  c2  ...  ck  c1‬‬
‫כך‬
‫‪loga1,2  loga2,3  ... logak ,1  0‬‬
‫‪ loga1,2  loga2,3  ... logak ,1  0‬‬
‫‪ ‬לקשת מ‪ ci -‬אל ‪ c j‬ניתן משקל‬
‫‪ ‬קיים רצף המרות שמביא לרווח אם"ם בגרף החדש‬
‫יש מעגל שלילי‪.‬‬
‫‪. logai, j‬‬
‫‪8‬‬
‫שאלה ‪ – 2‬המשך הפתרון‬
‫‪ ‬אנחנו רוצים למצוא מעגל שעבורו מתקיים‬
‫‪.  log a1,2  log a2,3  ... log ak ,1  0‬‬
‫‪ ‬לצורך כך‪ ,‬נשתמש באלג' של ‪ ,Bellman Ford‬וכך‬
‫נפתור את הבעיה בסיבוכיות זמן של‬
‫‪ ‬‬
‫‪.OV  E   O n3‬‬
‫‪ ‬הגרף קשיר בחוזקה‪ ,‬ולכן נוכל להריץ את‬
‫‪ Bellman-Ford‬מאיזו צומת שנרצה‪.‬‬
‫‪9‬‬
‫שאלה ‪ - 3‬המסלול הקל לקודקוד‬
‫‪ ‬תרגיל‪ :‬נתון גרף מכוון ) ‪ , G  (V , E‬ופונקצית‬
‫משקל ‪ .w : E  R‬בנוסף‪ ,‬ידוע שאין מעגלים‬
‫שליליים בגרף‪ .‬עבור כל קודקוד ‪ v  V‬נגדיר‪:‬‬
‫)‪ * (v)  min (u, v‬‬
‫‪uV‬‬
‫(זהו משקל המסלול הקל ביותר מכל המסלולים‬
‫שמסתיימים ב ‪.) v -‬‬
‫תארו אלגוריתם אשר מחשב את כל ערכי )‪. * (v‬‬
‫‪10‬‬
‫ דוגמא‬- 3 ‫שאלה‬
c
d
8
-1
-4
b
2
5
2
0
a
-2
e
 * (a)   2
 * (d )  0
 * (b)   4
 * (e)  0
 * (c )   5
11
‫שאלה ‪ - 3‬פתרון‬
‫‪ ‬נוסיף קודקוד חדש ‪ s‬ונוציא ממנו קשתות במשקל ‪0‬‬
‫לכל שאר קודקודי הגרף‪.‬‬
‫‪ ‬נריץ ‪ ,Bellman-Ford‬ועבור כל קודקוד ‪v  V‬‬
‫*‬
‫נציב )‪. (v)   (s, v‬‬
‫‪2‬‬
‫‪c‬‬
‫‪d‬‬
‫‪2‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪0‬‬
‫‪b‬‬
‫‪0‬‬
‫‪e‬‬
‫‪12‬‬
‫‪-2‬‬
‫‪s‬‬
‫‪0‬‬
‫‪1‬‬
‫‪a‬‬
‫‪00‬‬
‫‪0‬‬
‫‪0‬‬
‫נכונות וזמן ריצה‬
:‫ נכונות האלגוריתם‬
*


. (s, v)  minu w(s, u)   (u, v)  minu  (u, v)   (v)
:‫ זמן ריצה‬
.OV  – ‫◦ הוספת קודקוד לגרף‬
.OV  | E |
– Bellman-Ford ◦
.OV  | E |
- ‫◦ סה"כ‬
13
‫שאלה ‪ – 4‬מעגלים במשקל ‪0‬‬
‫‪ ‬תרגיל‪ :‬נתון גרף מכוון ) ‪ , G  (V , E‬ופונקצית‬
‫משקל ‪ .w : E  R‬בנוסף‪ ,‬ידוע שאין מעגלים‬
‫שליליים בגרף‪ .‬תארו אלג' שבודק האם קיים מעגל‬
‫במשקל ‪ 0‬בגרף‪.‬‬
‫‪-9‬‬
‫‪1‬‬
‫‪1‬‬
‫‪8‬‬
‫‪4‬‬
‫‪28‬‬
‫‪-3‬‬
‫‪14‬‬
‫‪9‬‬
‫שאלה ‪ – 4‬פתרון‬
‫‪ ‬בדומה לתרגיל הקודם‪ ,‬נוסיף קודקוד ‪ , s‬ועבור כל קודקוד ‪v  V‬‬
‫נוסיף קשת )‪ ( s, v‬במשקל ‪.0‬‬
‫‪ ‬נריץ ‪ Bellman-Ford‬מהצומת ‪.s‬‬
‫‪ ‬ניצור תת‪-‬גרף ) '‪ , G'  (V , E‬כאשר‬
‫‪.E'  (u, v)  E |  (s, v)   (s, u)  w(u, v)‬‬
‫‪ ‬במילים‪ ,‬קשת נשארת בגרף אמ"מ היא‬
‫חלק ממק"ב היוצא מ‪.s -‬‬
‫(גרף המסלולים הקלים‬
‫ביותר מ‪).s -‬‬
‫‪-9‬‬
‫‪1‬‬
‫‪1‬‬
‫‪8‬‬
‫‪4‬‬
‫‪28‬‬
‫‪-3‬‬
‫‪15‬‬
‫‪s‬‬
‫‪9‬‬
‫שאלה ‪ – 4‬פתרון‬
‫המרחקים מ ‪: s -‬‬
‫‪-9‬‬
‫‪b‬‬
‫‪s‬‬
‫‪-9‬‬
‫‪a‬‬
‫‪1‬‬
‫‪0‬‬
‫‪1‬‬
‫‪c‬‬
‫‪8‬‬
‫‪-8‬‬
‫‪28‬‬
‫‪9‬‬
‫‪d‬‬
‫‪4‬‬
‫נוריד קשתות‪:‬‬
‫‪f -7‬‬
‫‪16‬‬
‫‪-8‬‬
‫‪-3‬‬
‫‪-4‬‬
‫‪e‬‬
‫המשך פתרון‬
‫‪ ‬טענה‪ :‬אם קיים ב‪ G ' -‬מעגל‪ ,‬אז בהכרח משקלו ‪.0‬‬
‫‪ ‬הוכחה‪ :‬נניח שקיים מעגל ‪, v1  v2  ...  vk  v1‬‬
‫אז‬
‫) ‪ ( s, v2 )  w(v1 , v2 )   ( s, v1‬‬
‫) ‪ ( s, v3 )  w(v2 , v3 )   ( s, v2‬‬
‫‪‬‬
‫) ‪ ( s, v1 )  w(vk , v1 )   ( s, vk‬‬
‫‪ ‬נסכום את המשוואות ונקבל‬
‫) ‪0  w(v1 , v2 )  w(v2 , v3 )  ... w(vk , v1‬‬
‫‪17‬‬
‫המשך פתרון‬
‫‪ ‬טענה ‪ :2‬מעגל במשקל ‪ 0‬ב ‪ G -‬יהיה קיים גם ב ‪. G ' -‬‬
‫‪ ‬הוכחה‪ :‬נניח בשלילה ש ‪, v1  v2  ...  vk  v1‬‬
‫מעגל במשקל ‪ 0‬ב ‪ G -‬אבל לא ב '‪. G -‬‬
‫אז לפחות אחד מהאי‪-‬שיוויונים הבאים הוא חזק‪:‬‬
‫) ‪ ( s, v2 )   ( s, v1 )  w(v1 , v2‬‬
‫) ‪ ( s, v3 )   ( s, v2 )  w(v2 , v3‬‬
‫‪‬‬
‫) ‪ ( s, v1 )   ( s, vk )  w(vk , v1‬‬
‫‪ ‬נסכום את המשוואות ונקבל‬
‫) ‪0  w(v1 , v2 )  w(v2 , v3 )  ... w(vk , v1‬‬
‫‪18‬‬
‫סיכום וזמן ריצה‬
‫‪ ‬לסיכום‪ ,‬האלג' יראה כך‪:‬‬
‫◦‬
‫◦‬
‫◦‬
‫◦‬
‫נוסיף לגרף צומת ‪ s‬וקשתות היוצאות ממנה‪.‬‬
‫נריץ ‪ Bellman-Ford‬מ‪.s -‬‬
‫נזרוק את הקשתות שאינן חלק ממק"ב היוצא מ‪.s -‬‬
‫נבדוק האם קיים מעגל בתת הגרף שקיבלנו‪ .‬למשל‪ ,‬על ידי ‪.DFS‬‬
‫‪ ‬כל השלבים פרט לשני לוקחים זמן לינארי‪ .‬לכן‪ ,‬סיבוכיות‬
‫זמן הריצה הינה הסיבוכיות של ‪.Bellman-Ford‬‬
‫‪19‬‬