الگوریتم حریصانه greedy

الگوریتم حریصانه greedy
الگوریتم حریصانه یا آزمند (greedy) به ترتیب داده ها را گرفته و هر بار عنصری را که طبق معیار معینی "بهترین" به نظر میرسد، بدون توجه به انتخاب های قبلی و انتخاب هایی که در آینده انجام خواهد شد، انتخاب میکند. این الگوریتم بسیار ساده هستند و معمولا برای مسائل بهینه سازی کاربرد دارند.
در این الگوریتمها، مجموعه ای وجود دارد و باید از آن مجموعه، مرحله به مرحله اعضا را انتخاب (select) کرد. با هر انتخاب بررسی میشود که آیا عضو انتخاب شده، امکان رسیدن به جواب نهایی را دارد یا خیر (feasible). با هر انتخاب بررسی میشود که آیا به جواب نهایی رسیده ایم یا خیر (solution).
شکل کلی این الگوریتم ها بصورت زیر میباشد.
شکل کلی شبه کد الگوریتم های حریصانه
Set greedy (set c)
{
s = ф ;
while ( !solution (s) && c!=ф )
{
x = select(c) ;
c = c – {x} ;
if (feasible ( s ᴜ {x} ))
s = s ᴜ {x} ;
}
if (solution (s) )
return (s) ;
else
return (ф) ;
}
برای آشنایی بیشتر به مفهوم الگوریتم های حریصانه به مثال زیر توجه داشته باشید:
فرش کنید فروشنده ای میخواهد بقیه پول شما را که 36 واحد است پرداخت کند.
او میخواهد تعداد سکه های پرداختی حداقل باشد. فرض کنید سکه های موجود عبارتنداز: 25 و 10 و 5 و 1 واحدی. فروشنده ابتدا بزرگترین سکه موجود یعنی 25 واحدی را انتخاب میکند (بهینه محلی). با انتخاب یک سکه 25 واحدی دیگر جواب حاصل نخواهد شد بنابراین او یک سکه 10 واحدی انتخاب میکند. تاکنون 35 واحد انتخاب شده است. با انتخاب سکه 10 واحدی دیگر و 5 واحدی جواب حاصل نمیشود. بنابراین فروشنده سکه 1 واحدی را انتخاب میکند. بنابراین مجموعه جواب این مساله {25 , 10 , 1} میباشد که جواب بهینه نیز هست.
حال فرض کنید به جای سکه های 25 و 10 و 5 و 1 واحدی، سکه های 12 و 10 و 5 و 1 واحدی وجود میداشت و بقیه پول شما 16 واحد باشد. با روش حریصانه یک سکه 12 واحدی و 4 سکه 1 واحدی دریافت میکنید یعنی 5 سکه. حال آنکه جواب بهینه در این حالت شامل یک سکه 10 واحدی، یک سکه 5 واحدی و یک سکه 1 واحدی یعنی در کل 3 عدد سکه.
پس روش حریصانه برای خرد کردن سکه جواب نمیدهد.
در این مثال مجموعه انتخابهای ممکن یعنی C، سکه های موجود میباشد. تابع select هر بار یک سکه را انتخاب میکند، تابع feasible با هر انتخاب بررسی میکند که آیا انتخاب انجام شده امکان پذیر هست یا خیر. اگر امکانپذیر نباشد آن انتخاب برای همیشه طرد میشود. تابع solution با هر انتخاب بررسی میکند آیا جواب حاصل شده است یا خیر.
الگوریتم هایی که به روش حریصانه بررسی میشوند عبارتنداز:
► مسئله کوله پشتی غیر صفر و یک
► کد هافمن
► زمانبندی بر مبنای کمینه کردن زمان کل
► انتخاب (زمان بعدی) فعالیت ها
► زمانبندی فعالیت ها با مهلت معین
► الگوریتم های حریصانه کراسکال (راشال)
► الگوریتم پریم
► الگوریتم دایجسترا
سلام با ذکر منبع کپی می کنم ممنونم