GuilanCS | علوم کامپیوتر
1.04K subscribers
1.61K photos
60 videos
225 files
1.01K links
💻انجمن علمی علوم کامپیوتر دانشگاه گیلان

🔶اینستاگرام انجمن:https://instagram.com/csguilan

🔷ارتباط با دبیر انجمن(اسماعیل ذوالفقاری):
@anon7vip


🔗گروه دانشجویان:
Download Telegram
اما حالا همین رو میخوایم با استفاده از برنامه ریزی پویا توضیح بدیم . ایده ی ما تقریبا مثل الگوریتم بازگشتی هست ولی سعی میکنیم ماتریسی تعریف کنیم مثل M به طوریکه M[i][j] حاوی C(i,j) باشه .
پس اول یک ویژگی بازگشتی تعریف می کنیم . دقیقا همون ویژگی که در الگوریتم بازگشتی دیده شد .
حالا کافیه ماتریس رو به شیوه ی پایین به بالا پر کنیم . یعنی با شروع از سطر صفرم . اگر دقت کنیم در این ماتریس میبینم که مثلت خیام _پاسکال در حال شکل گیری هست . هرکدوم از سطر ها هم از روی سطر قبلیشون در حال ساخته شدن هستن . اگر ماتریس خودمون رو nXk در نظر بگیریم ، عنصر M[n][k] همون C(n,k) خواهد بود . برای اینکه این موضوع رو متوجه بشیم یک مثال میگیم و بعد میریم سراغ الگوریتمش .
مثلا فرض کنید که بخوایم C(3,2) رو حساب کنیم . خب میایم شروع میکنیم به دست آوردن درایه های ماتریس از سطر صفرم .
M[0][0]= 1
M[1][0]=1
M[1][1]=1
M[2][0]=1
M[2][1]=M[1][0]+M[1][1]=1+1=2
M[2][2]=1
M[3][0]=1
M[3][1]=M[2][0]+M[2][1]=1+2=3
M[3][2]=M[2][1]+M[2][2]=2+1=3
⚡️البته دو نکته رو باید گفت:
یکی اینکه ممکنه به نظر بیاد این راه حل طولانی هست و بهتر بود از تعریف اصلی این رو حل کنیم . باید بگم که درسته ولی اینجا اعداد ما کوچک بودند و اگر اعداد بزرگ بشن نمیتونیم دستی حساب کنیم بنابراین باید با استفاده از یک برنامه اینکارو بکنیم . برنامه و الگوریتم هم باید کارآمد باشه . تعریف اصلی نمیتونه الگوریتم کارآمدی به ما بده و ما از این روش برای رسیدن به الگوریتم کارآمد استفاده میکنیم .
نکته ی دیگه هم اینکه ما گفتیم ماتریس باید تشکیل بدیم . اما احتمالا متوجه شدید که این ماتریس کاملا پر نمیشه . این یک ماتریس تقریبا پایین مثلثی هست . و ما اصلا با برخی از درایه ها کاری نداریم .
در این روش هر نمونه ی کوچکتر فقط یکبار محاسبه میشه و راه رو برای محاسبه ی نمونه های بزرگتر هموار میکنه . پیچیدگی این الگوریتم از مرتبه ی nk هست .
یک الگوریتم معروف برای روش برنامه ریزی پویا هم الگوریتمی به نام "فلوید " هست . هدف این الگوریتم یافتن کوتاهترین مسیر بین دو نقطه هست . یکی از کاربرد های این الگوریتم هم در زمینه ی حمل و نقله و یکی از بهترین موضوعاتی هم که میشه از اون برای فهم بهتر این الگوریتم استفاده کرد ، مبحث گرافه . ما اینجا فقط به بیان الگوریتم و پیچیدگی اون می پردازیم.
پیچیدگی این الگوریتم هم به واسطه ی وجود 3 حلقه ی تو در تو برابر با n به توان 3 خواهد بود .
اما گاهی اوقات یک مسئله که به روش برنامه ریزی پویا حل میشه ، دارای چندین جواب هست . البته منظورمون جواب درسته. مثلا در الگوریتم فلوید ما طول کوتاهترین مسیر بین دو نقطه رو به دست آوردیم . ولی ممکنه چند مسیر با اون طول رو داشته باشیم . اینجا بحثی پیش میاد به نام "بهینگی" یا حل بهینه ی مسائل . در ادامه الگوریتمی رو میگیم که علاوه بر مشخص کردن طول کوتاه ترین مسیر ، خود اون مسیر رو هم برامون ایجاد می کنه .
بهینگی رو به صورت یک اصل هم بیان میکنن که مفهومش اینه :
اصل بهینگی در یک مسئله صدق می کند اگر یک حل بهینه برای نمونه ای از مسئله ، همواره حاوی حل بهینه برای همه ی زیر نمونه ها باشد .
📝 پایان قسمت پنجم آموزش الگوریتم 📝


🌴🌱🌿🍀🍃🌷🌼🌸💐🌳🌲🎄🌵