תכנון דינאמי בתרגול זה נדון בבעיית הכפלת סדרת מטריצות (6..(CLR ראשית נראה דוגמא: דוגמא: תהינה ארבע מטריצות:. A, A, A, A נסמן את גודל המטריצות בסדרה ע"י סדרת גדלים כאשר, p 5 5 p היא בגודל A {,,,5,}, P כלומר הכפלה של שתי מטריצות. למשל: A A היא בסיבוכיות של במקרה הכללי: בדרך הנאיבית היא בסיבוכיות של מכפלת הגדלים, כלומר., והתוצאה היא מטריצה בגודל ** A A היא בסיבוכיות הכפלת מטריצות היא אסוציאטיבית:. p, p p p והמטריצה המתקבלת היא בגודל ( A A ) ( A A ) A (( A A ) A ), כלומר סדר הכפלים אינו משנה את התוצאה. לעומת זאת סדר הכפלים משנה את מספר הכפלים לחישוב: אם נכפיל את המטריצות כך: ) A ( A A ) ( A ה"עלות" תהיה לזוג המטריצות השמאליות, ו-. A הכפלת שתי התוצאות **. סך הכול A למכפלה *5* חישובים. תהיה A A, רק עלות המכפלה ) A A (( A A ) אם נכפיל את המטריצות כך: **5, ועלות זו גבוהה בהרבה מהכפלת הסדרה כולה לפי סדר ההכפלות הקודם. נגדיר פורמאלית את הבעיה: מימד העמודות { A, A..., A n הניתנות להכפלה, כלומר, לכל מופע: סדרת מטריצות } של שווה למימד השורות של. A, A..., A n }שנסמנו ב פתרון אפשרי: סדר הכפלה של המטריצות } )t cos להיות מספר הפעולות הנדרש להכפלת עלות הפתרון: עבור פתרון נגדיר את (U יש למצוא: סדר הכפלה של המטריצות עם עלות מינימום. נשים לב שפתרון לבעיה הינו הצבת סוגריים על סדרת המטריצות, שכן הסוגריים מגדירים סדר הכפלה. הפתרון הנאיבי הוא לנסות את כל האפשרויות להצבת סוגריים על הסדרה. בכמה אופנים ניתן להכניס סוגריים מאוזנים בצורה מלאה במחרוזת באורך n? התשובה היא מספר ק ט ל ן ).5 )Ώ n n/ הוא חסם תחתון אקספוננציאלי. ליתר דיוק, שהוא אקספוננציאלי ב- )Catalan( של למספר הזה. נראה כי קיים פתרון יעיל בהרבה.
פתרון על ידי תכנון דינמי הגדרת תתי הבעיות ו OPT }.,...,A {A את מספר פעולות הכפל המינימאלי הדרוש להכפלת סדרת המטריצות OPT[, נסמן ב- [ אנו מחפשים את [n, OPT[, כלומר מספר פעולות הכפל המינימאלי בהכפלת כל סדרת המטריצות..OPT[, למשל, אם } { A,..., A}=}A, A אז ]= טענה: )מבנה של פתרון אופטימאלי(, OPT[, ] mn{ OPT[, OPT[, ] },, הוכחה: א. ניתוח מקרים נחלק את הפתרונות האפשריים לקבוצות. נגדיר תת-קבוצות של פתרונות אפשריים,, S, S,, S כאשר היא אוסף של כל הפתרונות בהם הכפל האחרון הוא בין S תוצאת מכפלת הסדרה {A {,...,A לתוצאת מכפלת הסדרה {A }, A,..., ז"א כל הפתרונות. ( A A... A ) ( A A... A) ב. מהצורה: תת-הקבוצות מסעיף )א( מכסות את קבוצת כל הפתרונות האפשריים - ניקח פתרון כלשהו לבעיה U,שהוא סדר להכפלת סדרת מטריצות } A }. A, A,... נתבונן בכפל האחרון בסדר. נניח כי. US הכפל האחרון הוא בין המכפלות של הסדרות{ A {,...,A ו- {A }, A,..., אזי ג. מסקנה לצורת נוסחת המבנה )t cos להיות מספר הפעולות הנדרש להכפלת U) הגדרנו את U S תזכורת: לכל פתרון המטריצות } A { A, A..., לפי הסידור של הפתרון U עבור,., S כלומר, S O ( S להיות המחיר המינימאלי של הפתרונות בקבוצה נגדיר את ). O ( S ) mn{cos t( U)} U S מסקנה: מ-)א( ו- )ב( OPT [, ] mn O ( S ), ( ),..., O S O ( S )
ד. ניתוח האופטימום של כל קבוצה.. O ( S ) OPT[, OPT[, ] נוכיח כי לכל מתקיים P P כיוון : נסתכל כל צד ימין, יהיו ו- הסידורים של המטריצות {A {,...,A ו- {A { A,..., בהתאמה כך ש: P של סדרת המטריצות והמטריצות A} { A,..., t(. cos אזי הסידור P ) OPT[, ] ו- cos t( P ) OPT[, } A { A, A..., כך שהמטריצות A} { A,..., מוכפלות לפי הסידור P ( A A... A ) ( A A... A ), P והכפל האחרון מוכפלות לפי הסידור הוא S פתרון ב- ועלותו היא: בהכרח מתקיים t(. cos ולפי הגדרת P ) OPT[, OPT[, ]. O ( S ) cos t( P ) O ( S כיוון : P כך ש- ) ( cos,o ( S ) כלומר קודם מכפילים מטריצות t P S נסתכל על צד שמאל, יהי {A },,...,A אח"כ מכפילים מטריצות {A { A,..., ואח"כ מכפילים את התוצאות.. ב- P P ו- הסידורים של המטריצות A} { A,..., ו- A} { A,..., )בהתאמה( [ P ) P יהיו הוא מחיר t( cos ולכן P ) cos t( P ). O ( S ) cos t( P ) cos t( P ) cos t( P ), OPT ולכן ] cos t( P ) וגם OPT, cos t( P ) מתקיים כי: OPT[, לפי הגדרת [ [. O ( S ) OPT [, OPT [, ] הערה: הוכחנו רק את הנוסחא ולא את "האלגוריתם". שימו לב שעד כה לא תיארנו אלגוריתם. אלגוריתמים מבוססי תכנון דינאמי לבעיית המטריצות.OPT[, נתחיל מאלגוריתם רקורסיבי לחישוב [ Recursve-Matrx-Chan(,) f then return else m for to do q Recursve-Matrx-Chan(,) + Recursve-Matrx-Chan(+, )+ p p p f q m then m q return m A,..., A n המחיר המינימאלי של הכפלת המטריצות.Recursve-Matrx-Chan(,n) יתקבל ע"י ההפעלה
הבעיה באלגוריתם הנ"ל היא שנחשב מספר גדול של חישובים חופפים הרקורסיבי שראינו קודם: נתבונן לדוגמא בעץ הקריאות, OPT[ הוא לפחות אקספוננציאלי ב- n }פתרון נוסחת המבנה: מקרה בסיס זמן הריצה הנדרש לחישוב [ }T( n) n ( T( ) T( n ) ) ועבור :n> T() פתרון רקורסיבי כזה הוא לא הכי טוב שניתן להשיג. זה הזמן לשים לב לכך שכמה זוגות ערכים מופיעים בעץ פעמים רבות. כלומר,מספר תת הבעיות הקטנות שהאלגוריתם שלנו פוגש במהלך הפתרון הוא קטן יחסית: n. n ( n ) הוא n המקיים, מספר האפשרויות לבחור זוג על מנת להימנע מחישוב חוזר של תת בעיות, נשמור במבנה נתונים כל פתרון שנחשב לתת בעיה. במקרה, OPT[ אזי ערך הפתרון מאוכסן בטבלה שלנו, נבנה טבלה בגודל nn כך שאם חישבנו כבר את [ במקום ה- ].[, שיפור זמן ריצה על ידי שיטת הפתקאות (memozaton) בזמן ריצת האלגוריתם הרקורסיבי, לפני כל קריאה רקורסיבית נבדוק האם תת הבעיה הזו כבר חושבה )על פי הערך בטבלה בעלת ערך שונה מ- (, אם הערך חושב נשתמש בו ונחסוך קריאה רקורסיבית מיותרת )במחיר של חיפוש במבנה הנתונים(, אם הערך לא חושב, נחשב אותו ונאכסן את התוצאה במבנה הנתונים לשימוש עתידי. שיטה זו נקראת שיטת התזכור -.memozaton Memozed-Matrx-Chan(n) for to n do for to n do m[, ] return Looup-Chan(,n)
Looup-Chan(,) f m[, ] then return m[, ] else f then m[, ] else for to do q Looup-Chan(,) + Looup-Chan(+, )+ p p p f q m[, ] then m[, ] q return m[, ] ניתן לראות כי זמן החישוב של הפרוצדורה הוא. אלגוריתם איטראטיבי במקום לחשב את הפתרון בצורה רקורסיבית, נחשב את הפתרון "מלמטה למעלה" בצורה איטראטיבית. החישוב לתת בעיה באורך משתמש רק בתוצאות החישובים לתתי הבעיות באורך וכן הלאה. ז"א הנתונים הנדרשים לחישוב תת בעיה באורך l הם פתרונות עבור תתי בעיות באורך קטן מ- l אשר כבר חושבו ונמצאים בטבלה. זו בעצם בניית הטבלה מהאלכסון הראשי ומעלה. השגרה משתמשת בטבלת עזר m[..n,..n] לאחסון העלויות ובטבלת עזר s[..n,..n] שבה נרשמים האינדקסים שעבורם התקבלה עלות אופטימאלית בעת חישוב,m[,] כלומר זהו הערך שמפצלים בו את המכפלה A.. כדי לקבל הצבת סוגריים אופטימאלית. A Matrx-Chan-Order(n) for to n do m[, ] for l to n do for to nl do l m[, ] for to do q m[, ] + m[, ] + p p p f q m[, ] then m[, ] q s[, ] return m and s בקטע קוד הזה אנחנו מחפשים ומכניסים ל - s[,] את הערך שמפצלים בו את המכפלה A.. כדי לקבל הצבת סוגריים A אופטימאלית ע"י בדיקת הערכים =,..,- ומציאת המינימום.. A, A, A 5, A5 מכיוון שהגדרנו את m[,] עבור האיור הבא מדגים תהליך זה על המטריצות בלבד, אנו משתמשים רק במשולש הנמצא מעל האלכסון הראשי של הטבלה. באיור הבא, הטבלאות מסובבות כך שהאלכסון הראשי הוא בכיוון האופקי. העלות המינימאלית m[,] של חישוב תת המכפלה
A A לכיוון צפון-מזרח, והקו היוצא מ- A.. A תימצא בתא שבנקודת החיתוך בין הקו היוצא מ- לכיוון צפון-מערב. כל שורה אופקית בטבלה מכילה תאים עבור סדרות מטריצות באותו האורך. השגרה Matrx-Chan-Order(n) מחשבת את השורות מלמטה למעלה ובכל שורה משמאל לימין. ערך התא ובכל ערכי התאים m[,] מחושב תוך שימוש במכפלות p p p עבור הנמצאים מדרום-מערב ומדרום-מזרח ל-[ m[,. 5 5 5 A A A A m s הוכחת נכונות של האלגוריתם האיטראטיבי יש לוודא כי בעת חישוב תא m[,] כל התאים בהם תלוי החישוב של תא זה חושבו כבר ואלו מכילים ערכי פתרונות אופטימאליים עבור תתי-הבעיות אותן הם מייצגים. יש להוכיח את שתי הטענות הבאות: טענה)ניתן להראות באינדוקציה(: בעת חישוב התא ה- m[,] כל התאים בשורה ה- מהעמודה ה- ועד העמודה ה-( - ) וכל התאים בעמודה ה- מהשורה ה-( + ) ועד השורה ה- כבר חושבו על מבנה הנתונים )במקרה זה מטריצה(. טענה: )הטענה שמנסחת את הנוסחה הרקורסיבית(: התא m[,] אכן שווה ל- OPT(,) לאחר החישוב. כלומר יש להראות )באינדוקציה( שערך התא שווה לערך שמחושב על ידי הנוסחא שהוגדרה קודם,, OPT[, ] mn{ OPT[, OPT[, ] }, 6
שחזור: כיצד למצוא סדרת הכפלות אופטימאלית ולא רק עלות בזמן מילוי הטבלה, בכל תא נחזיק גם את ה- שממנו הגענו לתוכן התא. כלומר, את הערך שמגדיר כיצד לחלק את בעיית ההכפלה {A {,...,A בצורה אופטימאלית. בעזרת ערכים אלו נוכל ע"י הליכה "אחורה" מהתא [n,] ו"איסוף" ה- -ים לשחזר את הצבת הסוגריים. : A, A, A, A 5 5 לדוגמא, במקרה של המטריצות שלנו l שלב : ++p*p*p = * * = K = + + p*p*p = * * 5 = K = + +p*p*p = *5* = K= l שלב : = ++p*p*p = +**5 = 5 = K= ++p*p*p = +** = 5 = K= l שלב : = 5 = K= +5+p*p*p= 5+** = 5 = 5 = K= ערך הפתרון האופטימאלי נמצא ב [,]: = 5 = K= 5 = 5 = K= 7
{ A ותת שיחזור: נסתכל על התא [,]. כיוון ש ההכפלה האחרונה בסדרה היא בין תת הסדרה } הסדרה } A,{ A, A, ז"א ) A. A ( A A כעת נביט בתא [,] על מנת למצוא את ההצבה האופטימאלית של הסוגריים בתוך } A.{ A, A, בתא זה, משמע סדר ההכפלות הוא )) A, A ( A ( A ובזאת סיימנו את השחזור. ניתוח זמן : מילוי הטבלה: ישנם ) ( On תאים בטבלה. n תאי האלכסון מאותחלים בזמן קבוע לכל תא. זוגות של תאים שכבר חושבו, ובמקרה הכללי ) ( On כל תא [ [, מצריך בדיקה של תא. סה"כ זמן מילוי הטבלה: (n )O..O( n) שלבים כשכל צעד בזמן קבוע - שיחזור ההצבה הליכה לאחור n פעולות לכל וכמה מקום צריך? לסיכום: בהינתן בעיה שאתם שוקלים לפתור אותה )חושדים או יודעים שפתרונה הוא( ע"י תכנון דינאמי, אלה השלבים שמרכיבים את הפתרון:.OPT הגדרת הבעיות באופן מילולי והגדרת ניסוח נוסחת המבנה, כולל מקרי בסיס ומיקום הפתרון לבעיה המקורית. הוכחת נכונות של נוסחת המבנה: הגדרת תתי-קבוצות של פתרונות אפשריים לפי חלוקה למקרים. o הוכחה שתתי-הקבוצות הנ"ל מכסות את כל הפתרונות האפשריים. o הסקת הצורה הסכמאטית של נוסחת המבנה. o ניתוח כל תת-קבוצת פתרונות בנפרד, והוכחת המרכיבים המתאימים o בנוסחת המבנה. מימוש האלגוריתם איטראטיבי/רקורסיבי למציאת ערך הפתרון האופטימאלי ו/או הפתרון האופטימאלי עצמו )לפי הדרישה(. הוכחת נכונות של האלגוריתם: האלגוריתם פועל בהתאם לנוסחת המבנה. o בכל שלב בריצת האלגוריתם, כל ערך לו האלגוריתם זקוק, חושב o באחד מהשלבים הקודמים. ניתוח זמן ריצה. 8