3rd - Algorithm Haye Harisane
3rd - Algorithm Haye Harisane
Algorithm Design
طراحی الگوریتماه
الگوریتمها
Algorithm D
esign
ارژنگ ملک
راههایارتباطی
@tnb_students
1
Greedy Algorithms
الگوریتمهایحریصانه
فصلاول
طراحیالگوریتمها
روشهایطراحیالگوریتم
الگوریتم حریصانه () Greedy Algorithms
2
الگوریتمحریصانه
• در روش حریصانه در هر مرحله عنصری که طبق معیار ما " بهترین" انتخاب است ،بدون در نظر گرفتن انتخابهای گذشته و
آینده انتخاب میشود .در هیچ کدام از یک مراحل امکان برگشت به مراحل قبل وجود ندارد.
• اغلب برای مسائل بهینه سازی از روشهای حریصانه استفاده میشوند ولی الزاما جواب بهینه را تولید نمیکند.
• در حل مسائل به روش حریصانه؛ با یک مجموعه تهی کار را آغاز میکنیم و عناصر را به ترتیبی خاص به مجموعه اضاف ه
میکنیم ،تا به جواب برسیم
الف) آیا عضو انتخاب شده ،امکان رسیدن به پاسخ نهایی را دارد یا خیر؟ ()feasible
ب) با هربار انتخاب بررسی میشود ،آیا به پاسخ نهایی رسیدهایم یا خیر؟ ()solution
حریصانه -خردکردنپول
مثال :از فروشگاهی 114تومان خرید میکنید ،و بابت آن 200تومان پول پرداخت میکنید .فروشنده بایستی به شما 86تومان
برگرداند ،اگر فروشنده سکههای 25 ، 10 ، 5 ، 1و 50تومانی داشته باشد؛ چگونه پول را به شما برگرداند به شرطی که از کمترین
تعداد سکه استفاده کند؟
50 + 25 + 10 + 1
مثال :حال فرض کنید 59تومان خرید میکنید ،و بابت آن 100تومان پول پرداخت کردهاید .فروشنده 41تومان باقی مانده را با
سکههای 12 ، 10 ، 5 ، 1و 25برخواهد گرداند؛ به شرط استفاده از کمترین تعداد سکه ،با چه سکههایی اینکار انجام خواهد شد؟
25 + 12 + 1 + 1 + 1 + 1
3
حریصانه -کدهافمن
• با هدف صرفه جویی در حافظه به منظور نمایش یک فایل اطالعاتی به شکل رشتههایی از بیتها از کد هافمن استفاده میکنیم.
• برای ارسال اطالعات با حجم کمتر بر روی خطوط شبکه ،کد هافمن مورد استفاده قرار میگیرد.
اگر:
c: 11 b: 01 a: 00
داریم:
0001110101
حریصانه -کدهافمن
• برای بهینه سازی و صرفه جویی در حافظه و استفاده از حداقل تعداد بیتهای ممکن ،از "کد گذاری با طول متغیر" استفاده
میکنیم؛
• برای این منظور بایستی ،کاراکترها با احتمال تکرار بیشتر ،را با رشته کد کوچکتر و کاراکترهایی که به ندرت ظاهر میشوند ،را
با رشته کد بزرگتر نشان داد.
4
حریصانه -کدهافمن
مثال :عناصر اطالعاتی زیر را با وزنهای مشخص شده داریم؛ میخواهیم درخت مربوط به کد هافمن آنها را با حداقل طول مسیر،
کاراکتر A B C D E F G برای وزن داده شده ،ترسیم کنیم.
وزن 20 1 12 8 4 27 10
در ابتدا یک درخت که برگ های آن شامل ،دو کاراکتر ،دارای کمترین وزن است ،را ترسیم میکنیم.
5
همواره گره با وزن کمتر سمت چپ قرار میگیرد.
حریصانه -کدهافمن
کاراکتر A B C D E F G
وزن 20 1 12 8 4 27 10 5
حال مراحل قبل را تا انتها ادامه میدهیم.
13 در این مرحله ،فراوانی ( 5ریشه درخت مرحله قبل) و ( 8تعداد تکرار کاراکتر ) Dانتخاب خواهند شد.
5
حریصانه -کدهافمن
کاراکتر A B C D E F G
وزن 20 1 12 8 4 27 10 5 13
حال مراحل قبل را تا انتها ادامه میدهیم.
13 در این مرحله ،فراوانی ( 10تعداد تکرار کاراکتر ) Gو ( 12تعداد تکرار کاراکتر ) Cانتخاب خواهند شد.
22
حریصانه -کدهافمن
کاراکتر A B C D E F G
وزن 20 1 12 8 4 27 10 5 13 22
حال مراحل قبل را تا انتها ادامه میدهیم.
33 در این مرحله ،فراوانی ( 13ریشه درخت مراحل قبل) و ( 20تعداد تکرار کاراکتر ) Aانتخاب خواهند شد.
22
1 B E 4 کاراکتر A B C D E F G
وزن 20 1 12 8 4 27 10 5 13 22 33
6
حریصانه -کدهافمن
کاراکتر A B C D E F G
وزن 20 1 12 8 4 27 10 5 13 22 33
حال مراحل قبل را تا انتها ادامه میدهیم.
33 در این مرحله ،فراوانی ( 22ریشه درخت مراحل قبل) و ( 27تعداد تکرار کاراکتر ) Fانتخاب خواهند شد.
49
1 B E 4 کاراکتر A B C D E F G
وزن 20 1 12 8 4 27 10 5 13 22 33 49
حریصانه -کدهافمن
کاراکتر A B C D E F G
وزن 20 1 12 8 4 27 10 5 13 22 33 49
82
حال با دو مقدار باقی مانده درخت را تکمیل مینمایم.
33 49
7
الگوریتمحریصانه -کدهافمن
درخت بدست آمده را به شکل زیر رسم میکنیم
0 1
F
به یالهای سمت چپ عدد صفر و به یالهای سمت راست
1 A 1
0 0
عدد یک را اختصاص میدهیم.
D G C
0 1
B E
حال برای پیدا کردن کد هر کاراکتر ،از ریشه تا کاراکتر مورد نظر حرکت کرده ،و بیتهای مشاهده شده را مینویسیم:
A: 01 B: 0000 C: 101
D: 001 E: 0001 F: 11 G: 100
Arzhang Malek - TNB طراحی الگوریتمها ()AD Slide 15
حریصانه -کدهافمن
تمرین :فرض کنید متنی شامل حروف a, b, c, d, e, fمیباشد؛ و فراوانی این حروف در جدول زیر آمده است ،هدف ایجاد کد
بهینه برای این حروف است.
8
حریصانه -کوتاهترینمسیر
مسئله :پیدا کردن کوتاهترین مسیر بین دو نقطه (درخت پوشای مینیمم)
F
20 25
8
3
D
حریصانه -الگوریتمپریم
مراحل پیدا کردن درخت پوشای مینیمم ،توسط الگوریتم پریم:
حال تمامی یالهای متصل به تمامی گرههای انتخاب شده را بررسی و کوچکترین آنها را انتخاب میکنیم
9
الگوریتمپریم-حریصانه
2
Step 1: A B
2 4
Step 2: A B F
2 4
Step 3: A B F
3
D
Arzhang Malek - TNB )AD( طراحی الگوریتمها Slide 19
الگوریتمپریم-حریصانه
C
Step 4: 5
2 4
A B F
3
D 1
C E
5
Step 5:
2 4
A B F
3
D
Arzhang Malek - TNB )AD( طراحی الگوریتمها Slide 20
10
حریصانه -الگوریتمکروسکال
مراحل پیدا کردن درخت پوشای مینیمم ،توسط الگوریتم کروسکال:
تا زمانی که تمام راسها به هم وصل شوند این کار را ادامه میدهیم
حریصانه -الگوریتمکروسکال
1
Step 1: C E
2
A B
Step 2:
1
C E
2
A B F
Step 3: 3
1
C E D
11
حریصانه -الگوریتمکروسکال
2 4
A B F
Step 4: 3
1
C E D
2 4
A B F
5 3
Step 5:
C 1 E D
حریصانه– مقایسهپریموکروسکال
مرتبه اجرایی الگوریتم پریم برابر است با:
:mتعدادیالها : nتعدادراسها
12
حریصانه– مقایسهپریموکروسکال
نکات:
با توجه به پیچیدگی الگوریتم کروسکال داریم؛
)𝒏 𝑶(𝒏 log • اگر گراف خلوت باشد
نتیجه میگیریم ،اگر گرافی یالهای کمی داشته باشد ،بهتر است از کروسکال و اگر یالهای زیادی دارد بهتر است از
پریم استفاده کنیم.
الگوریتم پریم در ایجاد راه برای چند شهر ،که کمترین هزینه و مسافت را داشته باشد ،کاربرد دارد
حریصانه -کوتاهترینمسیر
مسئله :فاصله چند شهر مورد نظر در گراف زیر مشخص شده است ،میخواهیم تمامی شهرها را به هم متصل کنیم ،به
نحوی که مردم بتواند از هر شهر به شهر دیگر بروند ،باتوجه به محدودیت بودجه میخواهیم با کمترین مقدار جاده
کشی ممکن این کار را انجام دهیم
A
28
10
B
14 16
E G C
18
24 12
25
D
F 22
13
حریصانه -الگوریتمدایجکسترا
برای پیدا کردن کوتاهترین مسیر از یک راس به سایر رئوس در یک گراف جهت دار از الگوریتم دایجکسترا استفاده میکنیم
هدفمان پیدا کردن طول کوتاهترین مسیر از راسی به نام مبدا تا سایر رئوس می باشد
حریصانه -الگوریتمدایجکسترا
مراحل پیدا کردن کوتاهترین مسیر توسط الگوریتم دایجکسترا
یالهای متصل به مبدا را بررسی و کوتاهترین یال را انتخاب ،و گره مربوط به آن یال را درون مجموعه Sقرار میدهیم
مسیرها از مبدا تا سایر رئوس که آن مسیر از گرههای مجموعه Sعبور کند را بررسی و کوتاهترین آنها را انتخاب و گره
مربوطه را به مجموعه Sاضافه میکنیم
14
حریصانه -الگوریتمدایجکسترا
}S:{A,D }S:{A,D,C
}S:{A,D,C,B }S:{A,D,C,B,E
حریصانه -الگوریتمدایجکسترا
تمرین :کوتاهترین مسیر بین هر دو راس گراف مقابل را بدست آورید.
15
حریصانه– زمانبندیفعالیتها
• در این مسئله بدنبال ،زمانبندی و انتخاب ترتیب انجام فعالیتها برای رسیدن به اهداف مسئله میباشیم.
زمانبندی ساده:
مثال :آرایشگری می خواهد به 3مشتری خود که زمان خدمت هر کدام با دیگری متفاوت است ،سرویس دهد .به چه ترتیبی باید
مشتریان را انتخاب کنیم ،تا زمان کل سیستم حداقل شود؟
مشتری اول دوم سوم
زمان سرویس 5 9 7
حریصانه– زمانبندیفعالیتها
مشتری اول دوم سوم
زمان سرویس 5 9 7
• یک راه برای حل مسئله این است که تمامی حاالت را بررسی و بهترین را انتخاب نماییم .در زیر تمامی حاالت ممکن را داریم؛
زمان کل سیستم زمانبندی
5 + (5 + 9) + (5 + 9 + 7) = 40 ][1,2,3
5 + (5 + 7) + (5 + 7 + 9) = 38 ][1,3,2
9 + (9 + 5) + (9 + 5 + 7) = 44 ][2,1,3
9 + (9 + 7) + (9 + 7 + 5) = 46 ][2,3,1
7 + (7 + 5) + (7 + 5 + 9) = 40 ][3,1,2
7 + (7 + 9) + (7 + 9 + 5) = 44 ][3,2,1
مشاهده میشود کمترین زمان سیستم ،زمانی است که مشتریان بر اساس زمان سرویس بصورت صعودی مرتب شده باشند.
5 + (5 + 7) + (5 + 7 + 9) = 38 ][1,3,2
16
حریصانه– زمانبندیفعالیتها
مراحل الگوریتم زمانبندی ساده:
نکته :در زمانبندی ساده ،زمان کل سیستم فقط هنگامی مینیمم میشود ،که فعالیتها بر مبنای افزایش زمان ارائه
خدمات مرتب و زمان بندی شده باشند.
تتای الگوریتم زمان بندی ساده )𝒏 𝜽(𝒏 logمیباشد .زیرا تنها زمان صرف مرتب سازی میشود.
حریصانه– زمانبندیفعالیتها
زمانبندی با مهلت معین:
• در این مسئله هر فعالیت در یک واحد زمانی اجرا و تمام میشود ،و هر فعالیت یک مهلت معین و یک سود معین دارد.
• زمانی سود مورد نظر بدست میآید ،که آن فعالیت پیش از مهلت معین اجرا شود.
• هدف این مسئله ،انجام زمانبندی فعالیتها جهت به حداکثر رسیدن سود میباشد.
مثال :فرض کنید فعالیتها ،مهلتها و سودهای زیر را داریم؛ فعالیتها را به گونهای انتخاب نمایید که حداکثر سود حاصل شود.
کار اول دوم سوم چهارم
مهلت 2 1 2 1
سود 30 35 25 40
17
حریصانه– زمانبندیفعالیتها
فعالیت اول دوم سوم چهارم
مهلت 2 1 2 1
سود 30 35 25 40
• یک راه برای حل مسئله این است که تمامی حاالت را بررسی و بهترین را انتخاب نماییم.
سود کل زمانبندی در مقابل تمامی حاالت ممکن را داریم؛
30 + 25 = 55 ][1,3
35 + 30 = 65 ][2,1 مهلت فعالیت سوم برابر 2است ،یعنی این فعالیت تنها در زمان 1یا زمان 2
35 + 25 = 60 ][2,3 قابل اجراست.
25 + 30 = 55 ][3,1 زمان بندی ] [4,2غیرممکن است ،زیرا فعالیت چهارم و دوم فقط در زمان 1
40 + 30 = 70 ][4,1 قابل اجرا میباشند.
40 + 25 = 65 ][4,3
مشاهده میشود حداکثر سود ،در حالتی است که زمان بندی بصورت زیر باشد.
40 + 30 = 70 ][4,1
حریصانه– زمانبندیفعالیتها
مجموعه امکان پذیر :مجموعهای است که حداقل یک ترتیب امکان پذیر برای آن فعالیتها وجود داشته باشد.
• مجموعه { ،} 4,2امکان پذیر نیست زیرا هیچ ترتیبی از اعضای آن قابل زمان بندی نمیباشد.
18
حریصانه– زمانبندیفعالیتها
مراحل الگوریتم زمانبندی با مهلت معین:
اگر مجموعه Sجدید ،امکان پذیر بود آن فعالیت را در مجموعه Sقرار میدهیم
برای بررسی امکان پذیر بودن ، Sفعالیتهای موجود در Sرا بر اساس مهلت بصورت صعودی مرتب میکنیم.
در زمانبندی با مهلت معین لزوما تمامی فعالیتها انتخاب نخواهند شد.
حریصانه– زمانبندیفعالیتها
مثال :فعالیتها را به گونهای انتخاب نمایید که حداکثر سود حاصل شود.
کار اول دوم سوم چهارم پنجم ششم هفتم مجموعه Sبرابر با {}
مهلت 3 1 1 3 1 3 2
سود 40 35 30 25 20 15 10 S برابر با {} 1
جواب مسئله { S = } 4,2,1میباشد ،و بهره کل ما از انتخاب این فعالیتها 40+35+25 = 100میباشد.
Arzhang Malek - TNB طراحی الگوریتمها ()AD Slide 38
19
حریصانه– انتخابفعالیتها
• در این مسئله هدف انتخاب بیشترین تعداد فعالیت است به صورتی که هیچ دو فعالیتی با هم اشتراک بازه زمانی نداشته باشند.
مفروضات زیر را داریم؛
تعدادی فعالیت میخواهند از یک منبع استفاده کنند.
هر فعالیت دارای یک زمان شروع )𝒊𝑺( و یک زمان خاتمه )𝒊𝑭( میباشد.
مثال :در سمیناری 8داوطلب سخنرانی اعالم آمادگی کردهاند .با توجه به جدول مقابل سخنرانان را به گونهای انتخاب کنید که
اوال هیچ دو سخنرانی باهم تداخل زمانی نداشته باشند و ثانیا بیشترین تعداد ممکن سخنران در سمینار شرکت کنند.
سخنران)(i 1 2 3 4 5 6 7 8
زمان شروع ]S[i 1 3 0 5 3 5 6 8
زمان خاتمه ]F[i 4 5 6 7 8 9 10 11
حریصانه– انتخابفعالیتها
مراحل الگوریتم انتخاب فعالیتها:
اگر فعالیت iام با آخرین فعالیت انتخاب شده تداخل زمانی نداشت ،آن را انتخاب می کنیم (]) F[j] ≤ S[i
20
حریصانه– زمانبندیفعالیتها
سخنران)(i 1 2 3 4 5 6 7 8
زمان شروع ]S[i 1 3 0 5 3 5 6 8 فعالیت ها را بر اساس زمان پایان مرتب
زمان خاتمه ]F[i 4 5 6 7 8 9 10 11 میکنیم
i ]F[j] ≤ S[i select A اولین فعالیت را انتخاب میکنیم {A=} 1
1 True √ }{1
فعالیتهای بعدی را به ترتیب بررس ی
2 False × }{1
3 False × }{1 میکنیم ،که مشاهده میشود ،تنها در
4 True √ }{1,4 فعالیتهای 4و 8رسیدن به جواب
5 False × }{1,4
6 False × }{1,4 امکان پذیر است و سایر موارد شرایط
7 False × }{1,4 مسئله را نقض میکند.
8 True √ }{1,4,8
حریصانه– کولهپشتیکسری
• در مسئله کوله پشتی هدف انتخاب قطعاتی است ،که باالترین ارزش یا حداکثر سود ممکن حاصل شود.
21
حریصانه– کولهپشتیکسری
مثال :دزدی با کوله پشتی خود وارد جواهر فروشی میشود .کوله پشتی او تحمل حداکثر وزن 20کیلوگرم را دارد .هر قطعه
جواهر وزن مشخص و ارزش معینی دارد .مسئله اصلی دزد انتخاب قطعاتی است که حداکثر ارزش را داشته ،در حالیکه جمع وزن
آنها از ظرفیت کوله پشتی بیشتر نشود.
جواهر)(i 1 2 3
18 15 10
25 24 15
حریصانه– کولهپشتیکسری
معیار اول -انتخاب با ارزش ترینها
مراحل:
مراحل را تا زمانی که وزن کل اجسام انتخاب شده از ظرفیت کوله پشتی تجاوز نکند ادامه میدهیم.
22
حریصانه– کولهپشتیکسری
جواهر)(i 1 2 3
معیار اول -انتخاب با ارزش ترینها
18 15 10
ابتدا اجسام را بر اساس ارزش به صورت نزولی مرتب میکنیم
25 24 15
جسم اول را کامل انتخاب میکنیم؛ در این صورت ظرفیت باقی مانده کوله پشتی برابر با 2کیلوگرم خواهد شد
𝑀 − 𝑊1 = 20 − 18 = 2
با توجه به ظرفیت باقی مانده ،امکان انتخاب تمام جسم دوم نیست ،حال کسری از جسم دوم (به اندازه ظرفیت باقی مانده
2 کوله پشتی) را انتخاب میکنیم تا کوله پشتی پر شود
𝑀 − 𝑊1 − 𝑊 = 20 − 18 − 2 = 0
15 2
در نهایت ارزش کوله پشتی باتوجه به اشیاء انتخاب شده برابر است با:
𝑛
2
𝑝𝑖 𝑥𝑖 = 1 × 25 + 𝟐× 24 + (0 × 15) = 𝟐𝟖/
15
𝑖=1
Arzhang Malek - TNB طراحی الگوریتمها ()AD Slide 45
حریصانه– کولهپشتیکسری
معیار اول -انتخاب کمترین وزنها
مراحل:
مراحل را تا زمانی که وزن کل اجسام انتخاب شده از ظرفیت کوله پشتی تجاوز نکند ادامه میدهیم.
23
حریصانه– کولهپشتیکسری
معیار اول -انتخاب با ارزش ترینها
جواهر)(i 3 2 1
10 15 18
ابتدا اجسام را بر اساس وزن به صورت صعودی مرتب میکنیم
15 24 25
جسم سوم را کامل انتخاب میکنیم؛ در این صورت ظرفیت باقی مانده کوله پشتی برابر با 10کیلوگرم خواهد شد
𝑀 − 𝑊3 = 20 − 10 = 10
با توجه به ظرفیت باقی مانده ،امکان انتخاب تمام جسم دوم نیست ،حال کسری از جسم دوم (به اندازه ظرفیت باقی مانده
10 کوله پشتی) را انتخاب میکنیم تا کوله پشتی پر شود
𝑀 − 𝑊3 − 𝑊2 = 20 − 10 − 10 = 0
15
در نهایت ارزش کوله پشتی باتوجه به اشیاء انتخاب شده برابر است با:
𝑛
10
𝑝𝑖 𝑥𝑖 = 0 × 25 + 𝟏𝟑 = )× 24 + (1 × 15
15
𝑖=1
Arzhang Malek - TNB طراحی الگوریتمها ()AD Slide 47
حریصانه– کولهپشتیکسری
معیار اول -انتخاب کمترین وزنها
مراحل:
𝒊𝒑
( به صورت صعودی مرتب میکنیم. ابتدا اجسام را بر اساس ارزش وزنی )
𝒊𝒘
بدیهی است که ،بهتر است جسمی لنتخاب شود که ارزش وزنی بیشتری داشته باشد.
مراحل را تا زمانی که وزن کل اجسام انتخاب شده از ظرفیت کوله پشتی تجاوز نکند ادامه میدهیم.
24
حریصانه– کولهپشتیکسری
جواهر)(i 2 3 1
15 10 18 معیار اول -انتخاب با ارزش ترینها
24 15 25
ابتدا اجسام را بر اساس ارزش وزنی به صورت نزولی مرتب میکنیم
1,6 1,5 1,3
جسم دوم را کامل انتخاب میکنیم؛ در این صورت ظرفیت باقی مانده کوله پشتی برابر با 5کیلوگرم خواهد شد
𝑀 − 𝑊2 = 20 − 15 = 5
با توجه به ظرفیت باقی مانده ،امکان انتخاب تمام جسم سوم نیست ،حال کسری از جسم دوم (به اندازه ظرفیت ب اقی مانده
5 کوله پشتی) را انتخاب میکنیم تا کوله پشتی پر شود
𝑀 − 𝑊2 − 𝑊3 = 20 − 15 − 5 = 0
10
در نهایت ارزش کوله پشتی باتوجه به اشیاء انتخاب شده برابر است با:
𝑛
5
𝑝𝑖 𝑥𝑖 = 0 × 25 + (1 × 24) + 𝟓× 15 = 𝟑𝟏/
10
𝑖=1
Arzhang Malek - TNB طراحی الگوریتمها ()AD Slide 49
حریصانه– کولهپشتیکسری
نکات:
پیچیدگی زمانی کوله پشتی کسری ) O(nlognمیباشد؛ چون وابسته به مرتب سازی است.
همانطور که مشاهده شد ،روش حریصانه ،همیشه پاسخ بهینه را در مسئله کوله پشتی کسری نخواهد داد.
25