هدف ما ارائه الگوریتمی است که کمترین توالی حرکتها را برای انتقال دیسکها در این مسئله به ما بدهد. مثلاً اگر n=2 باشد، توالی حرکت به صورت زیر است:
• دیسک ۱ را به میله B منتقل میکنیم.
• دیسک ۲ را به میله C منتقل میکنیم.
• دیسک ۱ را به میله C منتقل میکنیم.
توجه داشته باشید که بر اساس قانون اول نمیتوان به غیر از بالاترین دیسک هر میله، به دیسک دیگری از آن دسترسی پیدا کرد. حال سوال این است که آیا این مساله به کمک تکنیک بازگشت قابل حل است؟ اصولاً چه مسائلی را میتوان بازگشتی حل نمود؟ برای اینکه مسالهای بتواند با روش بازگشتی حل شود باید یک ویژگی اساسی داشته باشد. مساله اصلی (مسالهای که به ما داده میشود) قابل خرد شدن به زیر مسالههایی از همان نوع مساله اصلی باشد، به شرطی که اندازه زیر مسالههای ایجاد شده کمتر باشد.
مخصوص اعضای ویژه (vip)
آنگاه میتوان امیدوار بود که آن را به طور بازگشتی حل کرد! این ویژگی در مورد مساله برج هانوی صدق میکند. ایده اصلی این است که توجهمان را به جای حرکت بالاترین دیسک، روی پایینترین دیسک میله متمرکز کرده، و مراحل زیر را طی میکنیم: n-1 دیسک بالایی را با شرایط ذکر شده و به کمک میله C به میله B منتقل میکنیم. بزرگترین دیسک را از میله مبدا به میله مقصد حرکت میدهیم n-1 ,دیسک را که هم اکنون در میله B هستند با شرایط داده شده به میله مقصد انتقال میدهیم. میبینیم که توانستیم عملیات جابجا کردن n دیسک را به دو عملیات مشابه ولی با اندازه کمتر و یک عملیات ساده تقسیم کنیم. واضح است که جابجا کردن n – ۱ قرص راحتتر از جابجا نمودن n قرص است. برای مثال فراخوانی تابع به شکل(' hanoi(3, ‘A’, ‘B’, ‘C مساله برج هانوی را با سه دیسک که در میله A قرار دارند و با کمک میله B به میله C منتقل خواهد شد، حل میکند. برای این که به کاهنان کمک کنیم، باید دستور ('hanoi(64, ‘A’, ‘B’, ‘C را اجرا کنیم. ولی چه زمانی طول میکشد تا این دستور اجرا شود؟ در حالت کلی میخواهیم بدانیم اگر تعداد دیسکها n باشد، کمترین تعداد حرکت برای جابجا نمودن دیسکها چقدر است؟ در ابتدا باید بررسی کنیم که آیا تابع بازگشتی فوق کمترین تعداد حرکت را چاپ میکند؟ جواب مثبت است. زیرا واضح است که برای جابجا کردن بزرگترین دیسک از پایین میله A، بقیه دیسکها باید در میله B باشند. فقط در این صورت این دیسک جابجا میشود. در فراخونیهای بعدی دیسک دوم از نظر بزرگی جابجا میشود و الی آخر. پس در این فراخوانیها جابجایی بیهودهای صورت نمیگیرد. همچنین توالی حرکتها برای هر n منحصربهفرد است. یعنی برای یک n دو توالی متمایز از جابجاییها وجود ندارد که تعداد جابجایی آنها کمتر یا مساوی این حالت باشد. حال به مساله مرتبه اجرایی مساله میپردازیم: فرض کنیم (T(n تعداد حرکتهای لازم جهت انتقال n دیسک به مقصد باشد. بر اساس توضیحات فوق (T(n –1 حرکت برای انتقال n –1 دیسک به میله کمکی، یک حرکت برای انتقال بزرگترین دیسک به میله مقصد، و باز T(n –1)حرکت برای انتقال n –1 دیسک موجود در میله کمکی به میله مقصد نیاز است. پس میتوان نوشت: T(n) =2 T(n – ۱) + ۱ با حل این رابطه بازگشتی داریم: T( n ) = 2n-1 همانطور که مشاهده میکنیم مرتبه اجرایی این الگوریتم (O(2*n است که هرچند مرتبه مناسبی نیست، این روش حداقل تعداد حرکتهای ممکن را میدهد. اگر فرض کنیم کاهنان با سرعت عمل زیاد توانسته باشند به صورت شبانه روزی و نسل به نسل در هر دو ثانیه یک قرص را جابجا کنند، برای انتقال تمامی ۶۴ قرص به میله مقصد، در حدود ۱٫۱۶۹ ترلیون (میلیون میلیون) سال زمان لازم دارند! در واقع ما از روش Divide and Conquer یا حل و تقسیم برای ارائه راه حل استفاده نمودهایم. اما چون در تقسیم مساله اصلی به دو زیر مساله، اندازه ورودیهای زیر مسالهها نزدیک به اندازه ورودی اصلی هستند، کارایی الگوریتم مطلوب نیست.
توجه :کاربر گرامی شما علاوه بر خرید مستقیم همچنین میتوانید این فایل را با خرید اشتراک ماهانه دانلود نمایید پس مشترک ماهانه ی سایت شوید و تا پایان مدت اشتراک از آپدیت ها و فایلهای جدید موجود در سایت بهره مند گردید.
لیست فایلهای اعضای اشتراکی
نام فایل :
برنامه مسئله برج های هانوی به زبان سی شارپ
حداقل اشتراک | محتویات | زمان ایجاد | حجم فایل | تعداد دانلودها |
یک ماهه (VIP) | سه شنبه, 20 اسفند 1392 21:55 | 56.79 KB | 0 |
تنها کاربران عضو یا دارای مجوز میتوانند دانلود نمایند |
توضیحات :