درس طراحی الگوریتم ها
This presentation is the property of its rightful owner.
Sponsored Links
1 / 31

فصل سوم PowerPoint PPT Presentation


  • 117 Views
  • Uploaded on
  • Presentation posted in: General

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

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


3169667

درس طراحی الگوریتم ها

فصل سوم

روش برنامه نویسی پویا

Dynamic Programming

مدرس: سید محمد بیدکی

زمستان 1391


Dynamic programming

برنامه نویسی پویا (dynamic programming)

یک روش حل مسائل بزرگ و سخت، تقسیم کردن آن به تعدادی نمونه مسئله کوچکتر و سپس حل و ترکیب جواب آنهاست (مثل مرتب سازی ادغامی).

در برخی مسائل زیرمسئله ها مستقل از هم نیستند یعنی زیرمسئله های کوچکتر مشترکی دارند.

در اینگونه مسائل، روش تقسیم و غلبه ناکارآمد است زیرا زیر مسئله ها همواره مستقل فرض شده و در نتیجه هر زیرمسئله مشترک را چندین مرتبه حل می کند (مثلاً الگوریتم بازگشتی فیبوناچی).

برنامه نویسی پویا عملکردی شبیه به تقسیم و غلبه دارد با این تفاوت که هر زیر مسئله را فقط یک بار حل می کند و جواب آن را در یک آرایه جدولی ذخیره می کند.

برنامه نویسی پویا همانند تقسیم و حل، مسئله را با ترکیب جوابهای به دست آمده برای زیرمسئله ها حل می کند.

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


Dynamic programming1

مراحل روش dynamic programming

  • برنامه ریزی برای ایجاد یک جدول به منظور نگهداری جواب زیرمسئله ها

  • برنامه نویسی پویا یک روش جزء به کل یا پایین به بالا (bottom-up) است.

    • به عبارتی تقسیم یک مسئله به زیر مسئله ها با توجه به زیرمسئله های قبلی حل شده، تا جایی که لازم است انجام می شود (بازگشت غیر کورکورانه).

  • مراحل بسط یک الگوریتم برنامه نویسی پویا

    • ارائه یک ویژگی بازگشتی برای حل نمونه ای از مسئله

    • حل نمونه ای از مسئله به شیوه جزء به کل با حل نمونه های کوچکتر

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


3169667

ضریب دوجمله ای

محاسبه ضریب دوجمله ای

برای مقادیر بزرگ n و K ضریب دوجمله ای را نمی توان مستقیم از این رابطه بدست آورد زیرا محاسبه n! برای مقادیر نه چندان بزرگ هم وقت گیر است.

استفاده از رابطه بازگشتی

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


3169667

مثال از ضریب دوجمله ای

مثال: محاسبه

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


Divide conquer

حل با روش Divide & conquer

این الگوریتم از کارایی پایینی برخوردار است.

تعداد فراخوانی ها در الگوریتم برای تعیین برابر است با:

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


3169667

اثبات به وسیله استقرا

T(n, k) = T(n-1 , k-1) + T(n-1 , k) + 1

تعداد فراخوانی ها در روش تقسیم و غلبه

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


3169667

مثال از ضریب دوجمله ای

مثال: محاسبه

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


3169667

حذف تکرار در محاسبات

  • استفاده از یک ساختمان داده به منظور نگهداری محاسبات پیشین

  • ایجاد ماتریس Bبرای ذخیره ضرایب

  • مراحل:

    • ایجاد یک ویژگی بازگشتی

    • حل نمونه ای از مسئله به شیوه پایین به بالا با محاسبه سطرهای B به طور متوالي با شروع از سطر اول

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


3169667

روند محاسبه

هر یک از سطرها از روی سطر قبلی خود محاسبه می شود.

مقادیر موجود در هر سطر را فقط تا ستون kام محاسبه می کنیم.

جواب نهایی در خانه B[n][k]

می دانیم که:

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


3169667

مثال

محاسبه c(4, 2)

  • عناصر مورد نیاز در محاسبه c(n, k)

j = i

j = k

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


3169667

الگوریتم غیربازگشتی

  • روش به کار گرفته شده در این الگوریتم به برنامه سازی پویا معروف است.

برای محاسبه عناصر ماتریس B نیاز به دو حلقه داریم.

ابتدا عناصری که مقادیر آنها از قبل مشخص است را پر می کنیم.

مقدار جواب که در خانه B[n][k] است را بدست می آوریم.

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


3169667

محاسبه هزینه الگوریتم

تعداد گذرها از حلقه j به ازای هر یک از مقادیر i

تعداد کل گذرها

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


Optimization

مسائل بهینه سازی (optimization)

  • یافتن بهترین جواب ممکن برای مسئله

    • کوتاهترین، طولانی ترین،کمترین، بیشترین و ...

  • برنامه نویسی پویا نمی تواند تمام مسائل بهینه سازی را حل کند مگر مسائلی که اصل بهینگی در آنها صدق کند.

    • گوییم اصل بهینگی در یک مسئله صدق میکند اگر یک حل بهینه برای نمونه ای از مسئله، همواره حاوی حل بهینه برای همه زیرنمونه ها باشد.

  • قبل از استفاده از برنامه نويسي پويا براي بدست آوردن راه حل، لازم است كه نشان دهيم اصل بهينگي برقرار است.

    • معمولا از برهان خلف برای اثبات استفاده می شود.

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


3169667

اصل بهینگی - مثال

  • اصل بهینگی در مسئله یافتن طولانی ترین مسیر ساده از هر رأس به تمام رئوس دیگر، برقرار نمی باشد.

  • مسیر بهینه (طولانی ترین) از v1 به v4 مسیر [v1, v3, v2, v4] می باشد.

    • زیرمسیر [v1, v3] بهینه نیست زیرا:

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


3169667

ضرب زنجیره ای ماتریس ها

M = M1 * M2 * M3 * . . . * Mn

M = M1 * M2 * M3

M = (M1 * M2 ) * M3 = M1 * (M2 * M3 )

  • هدف بسط الگوریتمی است که ترتیب بهینه را برای ضرب n ماتریس معین کند.

    • بدین معنی که کمترین تعداد عمل ضرب انجام شود.

  • برای ضرب یک ماتریس m*n در یک ماتریس n*p به تعداد m*n*p عمل ضرب نیاز است.

  • از ویژگی های ضرب ماتریس ها این است که ضرب ماتریس ها شرکت پذیر می باشد.

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


3169667

مثال

روش دوم

روش اول

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


3169667

مثال (ادامه)

روش چهارم

روش سوم

روش پنجم

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


Brute force

الگوریتم Brute-force

در نظر گرفتن تمام ترتیب های ممکن و پیدا کردن حداقل ضرب های انجام شده

پیچیدگی این الگوریتم حداقل نمایی است

به طور کلی اگر

آنگاه تعداد حالات ممکن برای ضرب

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


3169667

روش تقسیم و غلبه

  • تمرین در خانه:

    • الگوریتم تقسیم و غلبه ضرب زنجیره ای ماتریس ها را بنویسید.

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


3169667

روش برنامه سازی پویا

  • در این مسئله اصل بهینگی برقرار می باشد.

  • برخی از خصوصیات:

    • تعداد ستونها در Ak-1 برابر با تعداد سطرها در Ak می باشد.

    • می توان فرض کرد که d0 تعداد سطرهای A1 و dk تعداد ستونهای Ak می باشد. (1 ≤ k ≤ n)

    • ابعاد ماتریس Ak برابر است با dk-1 * dk

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


3169667

ایجاد جدول

(اگر i < j) حداقل تعداد ضرب های لازم برای ضرب Ai تا Aj= M[i][j]

(اگر i = j) M[i][j] = 0

باید تعداد ضرب لازم برای هر زیردنباله ای از مسئله را نگه داریم.

نیاز به یک ماتریس داریم

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


3169667

تعیین رابطه بازگشتی

حالات مختلف ضرب 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

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


3169667

رابطه بازگشتی

(M1)* (M2 *. . . * Mk * Mk+1 *… * Mn)

(M1 * M2) *(. . . * Mk * Mk+1 *… * Mn)

. . .

(M1 * M2 *. . . * Mk * Mk+1 *…) * (Mn)

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


3169667

پرکردن ماتریس M

  • ماتریس به صورت قطری پر میشود و کار از قطر اصلی با مقادیر صفر شروع می گردد. و سپس به مرور به سمت گوشه راست و بالای ماتریس پیش میرود.

0

0

0

0

0

هر عنصر M[i][j] با استفاده از عناصر سمت چپ آن (موجود در سطر i) و عناصر زیر آن (موجود در ستون j) بدست خواهد آمد.

0

0

j

0

i

0

0

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


3169667

مثال

قطر 1

ضرب ماتریس ها با ابعاد d0 =10, d1 =20, d2 =50, d3 =1, d4 =100

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


3169667

مثال

قطر 2

1.2k

3k

ضرب ماتریس ها با ابعاد d0 =10, d1 =20, d2 =50, d3 =1, d4 =100

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


3169667

مثال

  • ضرب ماتریس ها با ابعاد d0 =10, d1 =20, d2 =50, d3 =1, d4 =100

قطر 3

2.2k

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


3169667

الگوریتم

محاسبه عناصر قطر اصلی

محاسبه عناصر قطر 1 تا n-1

j = i + diagonal

محاسبه یک عنصر

  • M[i][j] تعداد حداقل ضربهای لازم برای ضرب ماتریسهای i تا j است.

  • P[i][j] نشان دهنده نقطه ای است که در آن ماتریسهای i تا j به ترتیبی بهینه برای ضرب شدن، از هم جدا شده اند.

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


3169667

هزینه الگوریتم

  • عمل اصلی: تعداد مقادیری که در آزمون حداقل شرکت می کنند.

  • اندازه ورودی: n، تعداد ماتریس هایی که باید ضرب شوند.

  • پیچیدگی زمانی:

    • تعداد دفعات اجرای حلقه kبرای محاسبه min باتوجه به اینکه j = i + diagonal، برابر است با:

    • سه حلقه وجود دارد. بنابراین

  • به طور کلی الگوریتم از مرتبه می باشد.

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


3169667

ترتیب بهینه

ماتریس P

چاپ ترتیب بهینه ضرب ماتریس ها

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


  • Login