שאלת מבחן באלגוריתמים - האוניברסיטה הפתוחה 2021 - תכנות דינמי
שאלה 1 – תכנון דינאמי (בחירת מלונות לאורך מסלול)
ברצוננו לערוך מסע לאורכו של מסלול ישר מנקודת-התחלה לנקודת-סיום . נתונה רשימה של מיקומי-מלונות, כך שמלון ממוקם בדיוק קילומטרים מתחילת-המסלול. במהלך המסע לנים בכל לילה במלון אחר. החופשה מוגבלת בזמן, ולכן חייבים להשלים את המסע תוך לכל היותר ימים (). ידוע שכמות-המאמץ, שנדרש ביום-הליכה הינה הריבוע של המרחק , שהולכים באותו יום. ברצוננו לבחור את נקודות-הלינה, כך שנמזער את סכום המאמצים בכל המסע. הציגו אלגוריתם יעיל ככל האפשר לבעיה, שרץ בזמן פולינומי ביחס ל- וביחס ל-. נדרשת תשובה שמבוססת על נוסחה רקורסיבית בשיטה של תכנון-דינאמי.
מגדירים מערך שמשמעותו ____________________________________________(5 נק׳)
נוסחת-הנסיגה עבור המערך הינה (נדרש הסבר קצר)_______________________________
_______________________________________________________________(22 נק׳)
איך ממלאים את התאים במערך_________________________________________(3 נק׳)
זמן הריצה (הסבר קצרצר)_____________________________________________(3 נק׳)
ברצוננו לערוך מסע לאורכו של מסלול ישר מנקודת-התחלה לנקודת-סיום . נתונה רשימה של מיקומי-מלונות, כך שמלון ממוקם בדיוק קילומטרים מתחילת-המסלול. במהלך המסע לנים בכל לילה במלון אחר. החופשה מוגבלת בזמן, ולכן חייבים להשלים את המסע תוך לכל היותר ימים (). ידוע שכמות-המאמץ, שנדרש ביום-הליכה הינה הריבוע של המרחק , שהולכים באותו יום. ברצוננו לבחור את נקודות-הלינה, כך שנמזער את סכום המאמצים בכל המסע. הציגו אלגוריתם יעיל ככל האפשר לבעיה, שרץ בזמן פולינומי ביחס ל- וביחס ל-. נדרשת תשובה שמבוססת על נוסחה רקורסיבית בשיטה של תכנון-דינאמי.
מגדירים מערך שמשמעותו ____________________________________________(5 נק׳)
נוסחת-הנסיגה עבור המערך הינה (נדרש הסבר קצר)_______________________________
_______________________________________________________________(22 נק׳)
איך ממלאים את התאים במערך_________________________________________(3 נק׳)
זמן הריצה (הסבר קצרצר)_____________________________________________(3 נק׳)
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד 772021סמסטר א
★★★★★
תכנות דינמינוסחת נסיגהסיבוכיותניתוח אלגוריתמים
הגדירו תת-בעיה באמצעות שני פרמטרים: יעד הביניים (מלון מסוים) ומספר הימים שהוקצבו להגעה אליו. לאחר מכן, בטאו את הפתרון לתת-בעיה באמצעות פתרונות של תת-בעיות קטנות יותר.
ראשית, נגדיר את נקודות המסלול בצורה מסודרת. תהי נקודת ההתחלה, שמרחקה מתחילת המסלול הוא 0. יהיו המלונות הנתונים, ונוסיף את נקודת הסיום בתור . נסמן ב- את המרחק של נקודה מתחילת המסלול. כעת, יש לנו נקודות פוטנציאליות לעצירה, .
מגדירים מערך שמשמעותו:
נגדיר טבלת תכנון דינמי בגודל . הערך בתא ייצג את המאמץ הכולל המינימלי הנדרש כדי להגיע לנקודה (כאשר ) לאחר בדיוק ימי הליכה (כלומר, מקטעי נסיעה).
נוסחת-הנסיגה עבור המערך הינה:
כדי לחשב את , נשים לב שכדי להגיע לנקודה ביום ה-, היינו חייבים לשהות בנקודה קודמת כלשהי () בסוף היום ה-. המאמץ של היום ה- במסלול כזה הוא ריבוע המרחק בין ל-, כלומר . העלות הכוללת להגיע ל- דרך היא סכום העלות המינימלית להגיע ל- ב- ימים, והמאמץ של היום האחרון. כדי למצוא את המאמץ המינימלי האפשרי להגיע ל- ב- ימים, עלינו לבחור את הנקודה הקודמת אשר ממזערת את העלות הכוללת. מכאן, נוסחת הנסיגה היא:עבור ו-.
תנאי בסיס: העלות להישאר בנקודת ההתחלה () לאחר 0 ימים היא 0, כלומר . כל שאר התאים בטבלה יאותחלו לערך אינסופי ($\") כדי לציין מסלולים בלתי אפשריים.
הפתרון הסופי לבעיה הוא הערך . הסיבה לכך היא שפונקציית המאמץ, , היא פונקציה קמורה. תכונה זו גורמת לכך שפיצול קטע נסיעה ארוך למספר קטעים קצרים יותר תמיד יקטין (או לא יגדיל) את סך המאמץ. לכן, הפתרון האופטימלי ישאף לנצל את מספר הימים המקסימלי המותר, , כדי לפזר את המרחק הכולל על פני כמה שיותר ימי הליכה. איך ממלאים את התאים במערך:
נמלא את טבלת ה-DP, , עמודה אחר עמודה, החל מ- ועד . בכל עמודה , נחשב את הערכים עבור עד . סדר מילוי זה מבטיח שבכל פעם שנחשב את , כל הערכים בעמודה הקודמת, , שעליהם הוא תלוי, כבר חושבו.
זמן הריצה:
האלגוריתם מורכב משלוש לולאות מקוננות:
1. לולאה חיצונית על מספר הימים, , מ-1 עד (סיבוכיות ).
2. לולאה אמצעית על נקודת היעד הנוכחית, , מ-1 עד (סיבוכיות ).
3. לולאה פנימית על הנקודה הקודמת האפשרית, , מ-0 עד (סיבוכיות ).
הפעולות בתוך הלולאה הפנימית לוקחות זמן קבוע, . לכן, סיבוכיות הזמן הכוללת של האלגוריתם היא . זהו זמן ריצה פולינומי בגודל הקלט כנדרש.
מגדירים מערך שמשמעותו:
נגדיר טבלת תכנון דינמי בגודל . הערך בתא ייצג את המאמץ הכולל המינימלי הנדרש כדי להגיע לנקודה (כאשר ) לאחר בדיוק ימי הליכה (כלומר, מקטעי נסיעה).
נוסחת-הנסיגה עבור המערך הינה:
כדי לחשב את , נשים לב שכדי להגיע לנקודה ביום ה-, היינו חייבים לשהות בנקודה קודמת כלשהי () בסוף היום ה-. המאמץ של היום ה- במסלול כזה הוא ריבוע המרחק בין ל-, כלומר . העלות הכוללת להגיע ל- דרך היא סכום העלות המינימלית להגיע ל- ב- ימים, והמאמץ של היום האחרון. כדי למצוא את המאמץ המינימלי האפשרי להגיע ל- ב- ימים, עלינו לבחור את הנקודה הקודמת אשר ממזערת את העלות הכוללת. מכאן, נוסחת הנסיגה היא:עבור ו-.
תנאי בסיס: העלות להישאר בנקודת ההתחלה () לאחר 0 ימים היא 0, כלומר . כל שאר התאים בטבלה יאותחלו לערך אינסופי ($\") כדי לציין מסלולים בלתי אפשריים.
הפתרון הסופי לבעיה הוא הערך . הסיבה לכך היא שפונקציית המאמץ, , היא פונקציה קמורה. תכונה זו גורמת לכך שפיצול קטע נסיעה ארוך למספר קטעים קצרים יותר תמיד יקטין (או לא יגדיל) את סך המאמץ. לכן, הפתרון האופטימלי ישאף לנצל את מספר הימים המקסימלי המותר, , כדי לפזר את המרחק הכולל על פני כמה שיותר ימי הליכה. איך ממלאים את התאים במערך:
נמלא את טבלת ה-DP, , עמודה אחר עמודה, החל מ- ועד . בכל עמודה , נחשב את הערכים עבור עד . סדר מילוי זה מבטיח שבכל פעם שנחשב את , כל הערכים בעמודה הקודמת, , שעליהם הוא תלוי, כבר חושבו.
זמן הריצה:
האלגוריתם מורכב משלוש לולאות מקוננות:
1. לולאה חיצונית על מספר הימים, , מ-1 עד (סיבוכיות ).
2. לולאה אמצעית על נקודת היעד הנוכחית, , מ-1 עד (סיבוכיות ).
3. לולאה פנימית על הנקודה הקודמת האפשרית, , מ-0 עד (סיבוכיות ).
הפעולות בתוך הלולאה הפנימית לוקחות זמן קבוע, . לכן, סיבוכיות הזמן הכוללת של האלגוריתם היא . זהו זמן ריצה פולינומי בגודל הקלט כנדרש.