1 / 31

فصل سوم

درس طراحی الگوریتم ها. فصل سوم. روش برنامه نویسی پویا Dynamic Programming. مدرس: سید محمد بیدکی. زمستان 1391. برنامه نویسی پویا (dynamic programming). یک روش حل مسائل بزرگ و سخت، تقسیم کردن آن به تعدادی نمونه مسئله کوچکتر و سپس حل و ترکیب جواب آنهاست (مثل مرتب سازی ادغامی).

badrani
Download Presentation

فصل سوم

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. درس طراحی الگوریتم ها فصل سوم روش برنامه نویسی پویا Dynamic Programming مدرس: سید محمد بیدکی زمستان 1391

  2. برنامه نویسی پویا (dynamic programming) یک روش حل مسائل بزرگ و سخت، تقسیم کردن آن به تعدادی نمونه مسئله کوچکتر و سپس حل و ترکیب جواب آنهاست (مثل مرتب سازی ادغامی). در برخی مسائل زیرمسئله ها مستقل از هم نیستند یعنی زیرمسئله های کوچکتر مشترکی دارند. در اینگونه مسائل، روش تقسیم و غلبه ناکارآمد است زیرا زیر مسئله ها همواره مستقل فرض شده و در نتیجه هر زیرمسئله مشترک را چندین مرتبه حل می کند (مثلاً الگوریتم بازگشتی فیبوناچی). برنامه نویسی پویا عملکردی شبیه به تقسیم و غلبه دارد با این تفاوت که هر زیر مسئله را فقط یک بار حل می کند و جواب آن را در یک آرایه جدولی ذخیره می کند. برنامه نویسی پویا همانند تقسیم و حل، مسئله را با ترکیب جوابهای به دست آمده برای زیرمسئله ها حل می کند. درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  3. مراحل روش dynamic programming • برنامه ریزی برای ایجاد یک جدول به منظور نگهداری جواب زیرمسئله ها • برنامه نویسی پویا یک روش جزء به کل یا پایین به بالا (bottom-up) است. • به عبارتی تقسیم یک مسئله به زیر مسئله ها با توجه به زیرمسئله های قبلی حل شده، تا جایی که لازم است انجام می شود (بازگشت غیر کورکورانه). • مراحل بسط یک الگوریتم برنامه نویسی پویا • ارائه یک ویژگی بازگشتی برای حل نمونه ای از مسئله • حل نمونه ای از مسئله به شیوه جزء به کل با حل نمونه های کوچکتر درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  4. ضریب دوجمله ای محاسبه ضریب دوجمله ای برای مقادیر بزرگ n و K ضریب دوجمله ای را نمی توان مستقیم از این رابطه بدست آورد زیرا محاسبه n! برای مقادیر نه چندان بزرگ هم وقت گیر است. استفاده از رابطه بازگشتی درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  5. مثال از ضریب دوجمله ای مثال: محاسبه درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  6. حل با روش Divide & conquer این الگوریتم از کارایی پایینی برخوردار است. تعداد فراخوانی ها در الگوریتم برای تعیین برابر است با: درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  7. اثبات به وسیله استقرا T(n, k) = T(n-1 , k-1) + T(n-1 , k) + 1 تعداد فراخوانی ها در روش تقسیم و غلبه درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  8. مثال از ضریب دوجمله ای مثال: محاسبه درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  9. حذف تکرار در محاسبات • استفاده از یک ساختمان داده به منظور نگهداری محاسبات پیشین • ایجاد ماتریس Bبرای ذخیره ضرایب • مراحل: • ایجاد یک ویژگی بازگشتی • حل نمونه ای از مسئله به شیوه پایین به بالا با محاسبه سطرهای B به طور متوالي با شروع از سطر اول درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  10. روند محاسبه هر یک از سطرها از روی سطر قبلی خود محاسبه می شود. مقادیر موجود در هر سطر را فقط تا ستون kام محاسبه می کنیم. جواب نهایی در خانه B[n][k] می دانیم که: درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  11. مثال محاسبه c(4, 2) • عناصر مورد نیاز در محاسبه c(n, k) j = i j = k درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  12. الگوریتم غیربازگشتی • روش به کار گرفته شده در این الگوریتم به برنامه سازی پویا معروف است. برای محاسبه عناصر ماتریس B نیاز به دو حلقه داریم. ابتدا عناصری که مقادیر آنها از قبل مشخص است را پر می کنیم. مقدار جواب که در خانه B[n][k] است را بدست می آوریم. درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  13. محاسبه هزینه الگوریتم تعداد گذرها از حلقه j به ازای هر یک از مقادیر i تعداد کل گذرها درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  14. مسائل بهینه سازی (optimization) • یافتن بهترین جواب ممکن برای مسئله • کوتاهترین، طولانی ترین،کمترین، بیشترین و ... • برنامه نویسی پویا نمی تواند تمام مسائل بهینه سازی را حل کند مگر مسائلی که اصل بهینگی در آنها صدق کند. • گوییم اصل بهینگی در یک مسئله صدق میکند اگر یک حل بهینه برای نمونه ای از مسئله، همواره حاوی حل بهینه برای همه زیرنمونه ها باشد. • قبل از استفاده از برنامه نويسي پويا براي بدست آوردن راه حل، لازم است كه نشان دهيم اصل بهينگي برقرار است. • معمولا از برهان خلف برای اثبات استفاده می شود. درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  15. اصل بهینگی - مثال • اصل بهینگی در مسئله یافتن طولانی ترین مسیر ساده از هر رأس به تمام رئوس دیگر، برقرار نمی باشد. • مسیر بهینه (طولانی ترین) از v1 به v4 مسیر [v1, v3, v2, v4] می باشد. • زیرمسیر [v1, v3] بهینه نیست زیرا: درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  16. ضرب زنجیره ای ماتریس ها M = M1 * M2 * M3 * . . . * Mn M = M1 * M2 * M3 M = (M1 * M2 ) * M3 = M1 * (M2 * M3 ) • هدف بسط الگوریتمی است که ترتیب بهینه را برای ضرب n ماتریس معین کند. • بدین معنی که کمترین تعداد عمل ضرب انجام شود. • برای ضرب یک ماتریس m*n در یک ماتریس n*p به تعداد m*n*p عمل ضرب نیاز است. • از ویژگی های ضرب ماتریس ها این است که ضرب ماتریس ها شرکت پذیر می باشد. درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  17. مثال روش دوم روش اول درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  18. مثال (ادامه) روش چهارم روش سوم روش پنجم درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  19. الگوریتم Brute-force در نظر گرفتن تمام ترتیب های ممکن و پیدا کردن حداقل ضرب های انجام شده پیچیدگی این الگوریتم حداقل نمایی است به طور کلی اگر آنگاه تعداد حالات ممکن برای ضرب درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  20. روش تقسیم و غلبه • تمرین در خانه: • الگوریتم تقسیم و غلبه ضرب زنجیره ای ماتریس ها را بنویسید. درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  21. روش برنامه سازی پویا • در این مسئله اصل بهینگی برقرار می باشد. • برخی از خصوصیات: • تعداد ستونها در Ak-1 برابر با تعداد سطرها در Ak می باشد. • می توان فرض کرد که d0 تعداد سطرهای A1 و dk تعداد ستونهای Ak می باشد. (1 ≤ k ≤ n) • ابعاد ماتریس Ak برابر است با dk-1 * dk درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  22. ایجاد جدول (اگر i < j) حداقل تعداد ضرب های لازم برای ضرب Ai تا Aj= M[i][j] (اگر i = j) M[i][j] = 0 باید تعداد ضرب لازم برای هر زیردنباله ای از مسئله را نگه داریم. نیاز به یک ماتریس داریم درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  23. تعیین رابطه بازگشتی حالات مختلف ضرب 6 ماتریس A1 (A2 A3 A4 A5 A6) (A1 A2) (A3 A4 A5 A6) (A1 A2 A3) (A4 A5 A6) (A1 A2 A3 A4) (A5 A6) (A1 A2 A3 A4 A5) A6 (M1 * M2 *. . . * Mk) * (Mk+1 *… * Mn) dn-1 * dn d0 * d1 dk-1 * dk dk * dk+1 تعداد ضرب لازم = d0 * dk * dn M[1][n] = M[1][k] + M[k+1][n] + d0dkdn درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  24. رابطه بازگشتی (M1)* (M2 *. . . * Mk * Mk+1 *… * Mn) (M1 * M2) *(. . . * Mk * Mk+1 *… * Mn) . . . (M1 * M2 *. . . * Mk * Mk+1 *…) * (Mn) درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  25. پرکردن ماتریس M • ماتریس به صورت قطری پر میشود و کار از قطر اصلی با مقادیر صفر شروع می گردد. و سپس به مرور به سمت گوشه راست و بالای ماتریس پیش میرود. 0 0 0 0 0 هر عنصر M[i][j] با استفاده از عناصر سمت چپ آن (موجود در سطر i) و عناصر زیر آن (موجود در ستون j) بدست خواهد آمد. 0 0 j 0 i 0 0 درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  26. مثال قطر 1 ضرب ماتریس ها با ابعاد d0 =10, d1 =20, d2 =50, d3 =1, d4 =100 درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  27. مثال قطر 2 1.2k 3k ضرب ماتریس ها با ابعاد d0 =10, d1 =20, d2 =50, d3 =1, d4 =100 درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  28. مثال • ضرب ماتریس ها با ابعاد d0 =10, d1 =20, d2 =50, d3 =1, d4 =100 قطر 3 2.2k درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  29. الگوریتم محاسبه عناصر قطر اصلی محاسبه عناصر قطر 1 تا n-1 j = i + diagonal محاسبه یک عنصر • M[i][j] تعداد حداقل ضربهای لازم برای ضرب ماتریسهای i تا j است. • P[i][j] نشان دهنده نقطه ای است که در آن ماتریسهای i تا j به ترتیبی بهینه برای ضرب شدن، از هم جدا شده اند. درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  30. هزینه الگوریتم • عمل اصلی: تعداد مقادیری که در آزمون حداقل شرکت می کنند. • اندازه ورودی: n، تعداد ماتریس هایی که باید ضرب شوند. • پیچیدگی زمانی: • تعداد دفعات اجرای حلقه kبرای محاسبه min باتوجه به اینکه j = i + diagonal، برابر است با: • سه حلقه وجود دارد. بنابراین • به طور کلی الگوریتم از مرتبه می باشد. درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

  31. ترتیب بهینه ماتریس P چاپ ترتیب بهینه ضرب ماتریس ها درس طراحی الگوریتمها - فصل سوم: روش برنامه نویسی پویا - مدرس: بیدکی

More Related