زنگ تفریح شماره 124
الگوریتم حریصانه
نام این روش از شخصیت معروف اسکروج گرفته شده است. اسکروج به جای فکر به مسائیل دیگر زندگی تنها به بدست آوردن طلا فکر میکرد و تنها انگیزهاش برای زندگی بدست آوردن طلای بیشتر بود.الگوریتم حریصانه (Greedy) نیز مانند شیوه اسکروج است.
الگوریتم حریصانه همانند روشهای پویا اغلب برای حل مسائل بهینه سازی مورد استفاده قرار میگیرد. در شیوه حریصانه در هر مرحله عنصری که بر مبنای معیاری معین ((بهترین))به نظر می رسد، بدون توجه به انتخاب هایی که قبلا انجام شده یا در آینده انجام خواهد شد،انتخاب می شود. الگوریتم های حریصانه اغلب راه حل های ساده ای هستند.در روش حریصانه برخلاف روش پویا ، مسأله به نمونه های کوچک تر تقسیم نمی شود.
الگوریتم حریصانه کمترین تعداد سکه هایی که باعث شود مسئله تغییر نماید را تعیین می نماید .اینها مراحل یک انسان هستند که سکه با مقدار ۳۶ را با استفاده از سکههای با مقادیر ۱و۵و۱۰و۲۰ تعیین می کند. سکه با بزرگترین مقدار و کوچکتر از تغییرات باقی مانده بعنوان بهینه محلی انتخواب می گردد(توجه کنید که در حالت معمول مسئله پیدا کردن تغییرات بااستفاده از برنامه ریزی پویا یا Linear programming Integer unknowns جواب بهینه را پیدا می کند).پول آمریکا و دیگر کشورهانمونههای خاصی هستند که با استفاده از الگوریتم حریصانه می توان جواب بهینه آنهارا پیدا کرد).]] در بسیاری از موارد مسئله از ما میخواهد که یک متغیر را کمینه یا بیشینه کنیم و یا اینکه صورت مسئله مستقیما از ما نمیخواهد که چیزی را کمینه یا بیشینه کنیم اما میتوان این مسئله را تبدیل به یک چنین مسئلهای کرد. در اکثر مسائل از این دست ما باید تعدادی انتخاب انجام دهیم و مسئله در تعدادی مرحله حل شود. بازهٔ وسیعی از این مسائل توسط الگوریتمهای حریصانه قابل حلاند. الگوریتمهای حریصانه در هر مرحله در نظر میگیرند که کدام انتخاب در حال حاضر بهترین وضعیت را برای ما رقم میزند و آن را انجام میدهند بدون در نظر گرفتن این که انجام این حرکت در آینده ممکن است به ضرر ما تمام شود. بنابراین الگوریتمهای حریصانه همیشه جواب درست را به ما نمیدهند اما خیلی وقتها هم اینطور نیست این دسته از الگوریتمها در علوم رایانه کاربرد وسیعی دارند.
حال مثالی برای اینگونه الگوریتمها میاوریم:
فرض کنید میخواهیم n تومان را با سکه های۲۵ تومانی۱۰ تومانی۵ تومانی۱ تومانی پرداخت کنیم به طوری که کمترین تعداد سکه را بپردازیم. ما میتوانیم یک الگوریتم حریصانه برای حل این مسئله ارائه دهیم که تعداد سکه بهینه را در هر مرحله بدست آورد برای این کار ما در هر مرحله بزرگترین سکهای را که از پول باقیمانده تجاوز نکند انتخاب میکنیم در این صورت تعداد سکهها بهینه خواهدبود.
مثال دیگری که میتوان عنوان کرد مسأ لهٔ زمان بندی چندین فعالیت در حال رقابت است که نیاز به استقادهٔ منحصر به فرد از یک منبع مشترک با هدف انتخاب مجموعهای با ماکزیمم اندازه از فعالیت هایی که متقابلا با یکدیگر سازگارند، دارند.
فرض کنید یک مجموعهٔ s={a۱،a۲،….an} از n فعالیت پیشنهادی داریم که می خواهند از یک منبع استفاده نمایند، مانند یک تالار سخنرانی که در یک زمان میتواند تنها مورد استفادهٔ یک فعالیت قرار گیرد. هر فعالیت ai دارای زمان شروع si و زمان خاتمهٔ fi است به طوری که ۰≤si
F۰≤f۱≤f۲≤…≤fn≤fn+۱ ادعا می کنیم که sij=ᴓ هرگاه i≥j باشد. فرض کنید یک فعالیت ak€sij برای i≥j وجود دارد به طوری که ai بعد از aj در ترتیب مرتب قرار دارد. پس خواهیم داشت fi≤sk
اکنون فرض کنید جواب Aij برای sij شامل فعالیت ak میباشد.پس جوابهای Aik برای sik و Akjبرای skj که در این جواب بهینه برای sij استفاده میشوند نیز باید بهینه باشند. بحث برش – و – الصاق معمول در این مورد بکار میرود. اگر یک جواب Áik برای sik میداشتیم که شامل فعالیتهای بیشتری از Aik میبود، میتوانستیم Aik را از داخل Aij برش داده و به داخل Áik الصاق نماییم، بنابراین یک جواب دیگر برای Sij با تعداد فعالیتهای بیشتری از Aij تولید میشود. از آنجا که فرض کردیم Aij یک جواب بهینه است، به یک تناقض رسیده ایم. به طور مشابه اگر جواب Ákj برای skj را با فعالیتهای بیشتر از Akj میداشتیم، میتوانستیم Akj را با Ákj جایگزین کنیم تا یک جواب با فعالیتهای بیشتری از Aij تولید نماییم.
اکنون از زیر ساختار بههینه خود استفاده کرده تا نشان دهیم که میتوانیم یک جواب بهینه برای مسئله از روی جوابهای بهینه زیر مسائل بسازیم. مشاهده کردم که هر جواب برای یک زیر مسئله غیر تهی sij شامل فعالیت ak است و آنکه هر جواب بهنه در درون خود شامل جوابهای بهینه نمونه زیر مسئلههای sik و skj میباشد. بنابراین، میتوانیم یک زیر مجموعه با ماکزیمم اندازه از فعالیتهای متقابلاً سازگار درSijبسازیم. با تقسیم مسئله به دو زیرمسئله (یافتن زیر مجموعههای با ماکزیمم اندازه از فعالیتهای متقابلا سازگار در sikو skj) و پیداکردن زیرمجموعههای با ماکزیمم اندازه Aik و Akjاز فعالیتهای متقابلا سازگار برای این زیر مسائل وسپس تشکیل زیر مجموعه Aij با ماکزیمم اندازه شامل فعالیتهای متقابلا سازگار بصورت Aik υ {ak } υ Akj=Aij یک جواب بهینه برای کل مسئله یک جواب برای S۰،n+۱ است.