700 likes | 1.26k Views
درس طراحی الگوریتم ها. فصل پنجم. راهبرد عقبگرد Backtracking approach. مدرس: سید محمد بیدکی. بهار 1392. هزارتوی شمشادی. اگر سعی کنید راه خود را در هزارتوی شمشادی بیابید، راهی ندارید جز دنبال کردن مسیری تا اینکه به بن بست برسید. در این حالت برمی گردید و راهی دیگر را امتحان می کنید.
E N D
درس طراحی الگوریتم ها فصل پنجم راهبرد عقبگرد Backtracking approach مدرس: سید محمد بیدکی بهار 1392
هزارتوی شمشادی درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی اگر سعی کنید راه خود را در هزارتوی شمشادی بیابید، راهی ندارید جز دنبال کردن مسیری تا اینکه به بن بست برسید. در این حالت برمی گردید و راهی دیگر را امتحان می کنید. در این حالت مسئله با یک جستجوی کورکورانه و بررسی تمام راه های ممکن حل می گردد.
تکنیک عقبگرد درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی • مبنای کار تکنیک عقبگرد مشابه با راهیابی در هزارتو می باشد با این تفاوت که تمام راه های ممکن پیمایش نمی شود. بلکه در حل مسئله، برخی از راه ها که شرایط مورد نظر را ندارند، پیمایش نمی گردند. • از تکنیک عقبگرد برای حل مسائلی استفاده می شود که در آن ها دنباله ای از اشیاء از یک مجموعه مشخص انتخاب می شود، به طوری که این دنباله، باید دارای شرایط خاصی باشد. • یک مثال کلاسیک از عقبگرد، مسئله n وزیر است. • هدف، چیدن n مهره وزیر در یک صفحه شطرنج n×n به طوریست که هیچ دو وزیری یکدیگر را گارد ندهند. یعنی هیچ دو مهره ای نباید در یک سطر، ستون یا قطر یکسان باشند.
جستجوی عمقی (اول عمق) درخت درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی در جستجوی عمقی (پیمایش preorder) ابتدا ریشه ملاقات می شود و سپس همه فرزندان آن به ترتیب از چپ به راست به صورت عمقی ملاقات خواهند شد. در جستجوی عمقی یک مسیر را با عمق هرچه بیشتر دنبال می کنیم تا به حل یا بن بست برسیم. در بن بست آنقدر به عقب برمیگردیم تا به گرهی برسیم که فرزندان آن پیمایش نشده اند و سپس دوباره به مسیری دیگر با عمق هرچه بیشتر پیشرفت می کنیم.
عقبگرد درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی عقبگرد حالت اصلاح شده ی جستجوی عمقی یک درخت است. الگوریتم عقبگرد همانند جستجوی عمقی است، با این تفاوت که فرزندان یک گره فقط هنگامی ملاقات می شوند که گره امیدبخش باشد و در گره جاری حلی وجود نداشته باشد. گره را غیرامیدبخش گوییم اگر هنگام ملاقات گره معلوم شود که احتمالاً منجر به حل نمی شود. در غیر اینصورت گره امیدبخش است. تکنیک عقبگرد شامل انجام جستجوی عمقی در درخت فضای حالت، تعیین امیدبخش بودن گره و در صورت امید بخش نبودن، بازگشت به گره والد می شود.
درخت فضای حالت (State Space) درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی • تمام مسیرهای ممکن (حل های کاندید) از یک درخت (مسئله) را درخت فضای حالت گویند. • به عنوان مثال بخشی از درخت فضای حالت برای مسئله n وزیر که در آن n=4 • هر وزیر را به یک سطر انتساب داده شده و باید چک کرد کدام ترکیب از ستونهای صفحه به حل می انجامد. • تعداد حالات: 4×4×4×4
درخت فضای حالت هرس شده درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی تکنیک عقبگرد تمام فضای حالت را پیمایش نمی کند بلکه درخت فضای حالت را با تعیین امیدبخش نبودن برخی گره ها هرس کرده و فقط بخشی از کل فضای حالت را ملاقات می نماید. زیر درخت شامل گره های بازبینی شده را درخت فضای حالت هرس شده گویند.
نمونه ای از درخت فضای حالت هرس شده درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
الگوریتم کلی راهبرد عقبگرد • در این الگوریتم، به ازای هر گره، تنها فرزندانی از آن که امیدبخش باشند، بازبینی می گردند. درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی در این الگوریتم، تمام فرزندان یک گره امیدبخش بازبینی می شوند. درنتیجه کارایی کمتر است.
بخشی از درخت فضای حالت هرس شده برای نمونه ای از مسئله n وزیر (n=4) الف ح د ب ط ی ج ه ز ک و درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
نمونه ای از مسئله n وزیر (n=4) درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
مسئله n وزیر درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی برای ساده سازی، هر وزیر را به یک ردیف انتساب می دهیم. در مسئله n وزیر، تابع امیدبخش باید چک کند که آیا دو وزیر در یک ستون یا قطر هستند یا خیر. فرض کنیم col(i) ستونی باشد که وزیر iاُم در آن قرار دارد. دو وزیر در یک ستون قرار دارند اگر: col(i) = col(k) دو وزیر در یک قطر قرار دارند اگر: |col(i)-col(k)| = |i-k|
الگوریتم عقبگرد برای مسئله n وزیر درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
تحلیل الگوریتم درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی • تحلیل الگوریتم از لحاظ نظری دشوار است. • می توان حد بالایی برای تعداد گره های درخت فضای حالت هرس شده را با شمارش تعداد کل گره های درخت فضای حالت بدست آورد: • 1 گره در سطح صفر، n گره در سطح 1، n2 گره در سطح 2، ... و nn گره در سطح n 1+n+n2+n3+…+nn = (nn+1-1)/n-1 • مثلاً برای n=8، 19،173،961 گره داریم. • ولی تعداد گره های درخت هرس شده خیلی کمتر از این میزان است. • می توان حد بالای گره های امیدبخش را با توجه به اینکه هیچ دو وزیری در یک ستون قرار نمی گیرند، بدست آورد. 1+n+n(n-1)+n(n-1)(n-2)+….+n! • مثلاً برای n=8، 109،601 گره امیدبخش داریم
تحلیل الگوریتم ... درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی • نتایج اجرای 3 الگوریتم مختلف برای مقایسه تعداد گره های پیمایش شده • الگوریتم1: جستجوی عمقی • الگوریتم 2: براساس اینکه هیچ دو وزیری روی یک سطر یا ستون نیستند
مسئله حاصل جمع زیرمجموعه ها درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی در اینجا n عدد صحیح مثبتِ wi (اوزان) و یک عدد صحیح مثبت W وجود دارد. هدف یافتن تمام زیرمجموعه هایی از این n عدد صحیح است که حاصل جمع آنها برابر W باشد.
ایجاد درخت فضای حالت درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی از ریشه به طرف چپ میرویم تا w1 را در مجموعه بگنجانیم و به طرف راست میرویم اگر بخواهیم w1 را طرد نماییم. به طور مشابه در سطوح بعدی نیز برای انتخاب یا عدم انتخاب وزن های دیگر به سمت چپ یا راست می رویم. هنگامی که wi را در مجموعه می گنجانیم، wi را روی یالی که در آن قرار داده می شود می نویسیم و هنگامی که wi را طرد می کنیم، 0 می نویسیم.
مثال (n=3 و W=6) درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
الگوریتم عقبگرد و تعیین امیدبخشی درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی • اگر وزنها را به صورت صعودی مرتب کنیم، وقتی در سطح iاُم هستیم، wi+1 کمترین وزن باقیمانده است. • اگر weight مجموع وزنهای موجود در زیرمجموعه تا گره ای در سطح i باشد: • در صورتی که weight + wi+1 > W، این گره غیر امیدبخش است و باید عقبگرد نمود. • همچنین اگر total مجموع وزن اعداد باقیمانده باشد: • در صورتی که weight + total < W، این گره غیر امیدبخش است و باید عقبگرد کرد. • در صورتی که weight = W، گره شامل یک حل است و باید حل را چاپ کرد و عقبگرد نمود. • در غیر این صورت، گره امیدبخش است و فرزندان آن باید ملاقات شوند.
مثال (n=4 و W=13) با الگوریتم عقبگرد درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
الگوریتم عقبگرد مسئله حاصل جمع زیرمجموعه ها درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
مسئله کوله پشتی صفر و یک درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی هدف دزد انتخاب مجموعه ای از اشیاء است که ارزش کل آنها بیشینه باشد به طوری که وزن کل آنها از W بیشتر نشود. در ساخت درخت فضای حالت مشابه با مسئله حاصلجمع زیرمجموعه ها عمل می کنیم (شاخه چپ: انتخاب، شاخه راست: عدم انتخاب). این مسئله یک مسئله بهینه سازیست پس تا جستجو به پایان نرسد نمی توان دریافت که آیا گره ای شامل حل است یا خیر. الگوریتم کلی عقبگرد در مسائل بهینه سازی:
بررسی امید بخشی درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی • اگر weight برابر با مجموع وزن قطعات گنجانده شده تا شیئ i باشد: • در صورتی که weight ≥ W گره جاری غیر امیدبخش است. • می توان از شرایط روش حریصانه در کوله پشتی کسری برای تعیین حد بالای ارزش قابل حصول از هر گره، استفاده نمود: • قطعات براساس مقدار pi/wi به ترتیب نزولی مرتب می شوند. • در هر گره که باشیم، نمی توانیم با انتخاب قطعات بعدی بهره بیشتری از حالت کوله پشتی کسری بدست آوریم (bound). • اگر profit حاصلجمع ارزش قطعاتی باشد که تاکنون انتخاب شده اند. • به متغیرهای bound و totweight مقادیر اولیه profit و weight را می دهیم. • سپس به روش حریصانه قطعات باقیمانده را برداشته و ارزش آن را به bound و وزن آن را به totweight اضافه می کنیم تا به قطعه ای برسیم که اگر وزن آن را اضافه کنیم از W بیشتر شود. • کسری از آن قطعه را که باقیمانده وزن اجازه می دهد، برداشته و ارزش مقدار آن کسر را به bound اضافه می کنیم.
بررسی امید بخشی ... درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی اگر گره در سطح i قرار داشته باشد و گره واقع در سطح k، شئیی است که حاصلجمع اوزان را از W بیشتر می کند: فرض کنیم maxprofit مقدار ارزش از بهترین حلی باشد که تاکنون پیدا شده است. در این صورت اگر bound ≤ maxprofit، گره iغیر امیدبخش است.
مثال درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 1) گره (0,0) Profit = 0$ Weight = 0 Maxprofit = 0$ totweight = 7 Bound = 115$ گره امید بخش است زیرا: (weight<16) and (bound > maxprofit)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 2) گره (1,1) Profit = 40$ Weight = 2 Maxprofit = 0$ 40$ totweight = 7 Bound = 115$ گره امید بخش است زیرا: (weight<16) and (bound > maxprofit)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 3) گره (2,1) Profit = 70$ Weight = 7 Maxprofit = 40$ 70$ totweight = 7 Bound = 115$ گره امید بخش است زیرا: (weight<16) and (bound > maxprofit)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 4) گره (3,1) Profit = 120$ Weight = 17 گره امید بخش نیست زیرا: (weight > 16) Maxprofit = 70$ عقبگرد به گره (2,1)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 5) گره (3,2) Profit = 70$ Weight = 7 Maxprofit = 70$ totweight = 7 + 5 = 12 Bound = 70+ 10 = 80$ گره امید بخش است زیرا: (weight<16) and (bound > maxprofit)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 6) گره (4,1) Profit = 80$ Weight = 12 Maxprofit = 70$ 80$ شیئ دیگری وجود ندارد پس Bound = 80$ گره امید بخش نیست زیرا: (bound ≤ maxprofit) عقبگرد به گره (3,2)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 7) گره (4,2) Profit = 70$ Weight = 7 Maxprofit = 80$ چون شیئ دیگری وجود ندارد پس Bound = 70$ گره امید بخش نیست زیرا: (bound ≤ maxprofit) عقبگرد به گره (1,1)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 8) گره (2,2) Profit = 40$ Weight = 2 Maxprofit = 80$ totweight = 2 + 10 = 12 Bound = 40$ + 50$ + (16-12) × 2$ = 98$ گره امید بخش است زیرا: (weight<16) and (bound > maxprofit)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 9) گره (3,3) Profit = 90$ Weight = 12 Maxprofit = 80$ 90$ totweight = 12 Bound = 90$ + (16-12) × 2$ = 98$ گره امید بخش است زیرا: (weight<16) and (bound > maxprofit)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 10) گره (4,3) Profit = 100$ Weight = 17 Maxprofit = 90$ گره امید بخش نیست زیرا: (weight ≥ 16) • پس maxprofit تغییر نمی کند. • عقبگرد به گره (3,3)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 11) گره (4,4) Profit = 90$ Weight = 12 Maxprofit = 90$ چون شیئ دیگری وجود ندارد پس Bound = 90$ گره امید بخش نیست زیرا: (bound ≤ maxprofit) عقبگرد به گره (2,2)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 12) گره (3,4) Profit = 40$ Weight = 2 Maxprofit = 90$ totweight = 2 + 5 = 7 Bound = 40$ + 10$ = 50$ گره امید بخش نیست زیرا: (bound ≤ maxprofit) عقبگرد به گره (0,0)
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی
درس طراحی الگوریتم ها - فصل پنجم: راهبرد عقبگرد - بیدکی 13) گره (1,2) Profit = 0$ Weight = 0 Maxprofit = 90$ totweight = 0+ 5 + 10 = 15 Bound = 0$ + 30$ + 50$ +(16-15) × 2$ = 82$ گره امید بخش نیست زیرا: (bound ≤ maxprofit) • عقبگرد به گره (0,0) • ریشه فرزند دیگری ندارد. • جستجو تمام است.