Ex3-fa.pdf

‫ﺑﻪﻧﺎﻡ ﺧﺪﺍ‬
‫تمرین عملی سوم درس »مقدمهای بر هوش مصنوعی«‬
‫نیمسال بهار ‪۸۵-۸۶‬‬
‫)‪ ۲۰‬فروردینماه ‪(۱۳۸۶‬‬
‫مقایسهی‬
‫روشهای مختلف حل‬
‫»مسئلهی ارضای قیدها«‬
‫‪۱‬‬
‫در معمای‬
‫»سوداکو«‬
‫موعد تحویل‪ ۲۷ :‬فروردینماه ‪ ۱۳۸۶‬بدون تأخیر یا کار اضافی؛ ‪ ۳‬اردیبهشتماه با تأخیر یا کار اضافی‬
‫‪Constraint Satisfaction Problem‬‬
‫صفحهی ‪ ۱‬از ‪۶‬‬
‫‪1‬‬
‫‪ ۱‬معرفی مسئله‬
‫صورت مسئله‬
‫‪۱٫۱‬‬
‫»سوداکو« صورت خالصهشدهی ‪) 数字は独身に限る‬با تلفظ "‪ ("suji wa dokushin ni kagiru‬بهمعنای‬
‫»هر رقم باید یکبار بیاید« است‪.‬‬
‫هدف این مسئله‪ ،‬پر کردن یک جدول ‪ ۹×۹‬با اعداد ‪ ۱‬تا ‪ ۹‬است بهطوریکه در هر‬
‫سطر‪ ،‬در هر ستون و در هر یک از ‪ ۹‬مربّع ‪۳×۳‬ی از پیش تعیین شده )مطابق شکل(‪،‬‬
‫اعداد ‪ ۱‬تا ‪ ۹‬دقیق ًا یکبار بیایند‪ .‬برای این منظور‪ ،‬در ابتدا مقادیر تعدادی از خانههای‬
‫جدول داده میشوند و مقادیر سایر خانههای جدول باید با استدالل و تفّکر بهدست‬
‫بیایند‪.‬‬
‫‪ ۱٫۲‬حل مسئله‬
‫واضحست که این مسئله را در حالت بسیار کلّی میتوان به مسئلهی رنگآمیزی‬
‫گراف تبدیل کرد؛ کافیست یک گراف ‪ ۹۲‬رأسی برای هر کدام از خانهها در نظر بگیریم‬
‫و رئوس هر دو خانهای که در یک سطر‪ ،‬یک ستون و یا یک مربّع ‪) ۳×۳‬از ‪ ۹‬مربع‬
‫کوچک م ّد نظر( قرار دارند را به هم وصل کنیم‪ .‬حال‪ ،‬حل مسئلهی »سوداکو« معادل‬
‫رنگآمیزی این گراف ‪-۲۰‬منتظم با ‪ ۹‬رنگ است که رنگ بعضی از رئوس آن نیز از پیش‬
‫داده شدهست‪.‬‬
‫اما چنانکه انتظار میرود‪ ،‬برای حل »سوداکو« الزم نیست گراف ‪ ۸۱‬رأسی را ساخته و سپس دقیق ًا مسئلهی‬
‫رنگامیزی گراف را اجرا نماییم! کافیست تکنیکهای مربوط به حل مسائل ‪ ،CSP۲‬نظیر ‪ Forward Checking‬را‬
‫بهطور خاص برای این مسئله پیادهسازی کرده و نکات خاص مسئله را نیز در نظر بگیریم‪.‬‬
‫‪ ۲‬صورت دقیق مسئله برای پیادهسازی‬
‫‪ ۲٫۱‬حالت کلّی مسئله‬
‫در حالت کلّی‪ ،‬یک جدول سوداکو از سایز ‪ n‬یک جدول ‪ n 2 × n 2‬خانهای است‬
‫که هر یک از آنها باید یکی از اعداد ‪ ۱‬تا ‪ n 2‬را طوری در خود قرار دهد که در هیچ‬
‫یک از سطرها‪ ،‬ستونها یا ‪ n 2‬زیرجدول ‪) n × n‬که جدول اصلی را افراز میکنند( عدد‬
‫تکراری قرار نگیرد‪ .‬در شکل مقابل‪ ،‬یک سوداکو از سایز ‪ ۴‬مشاهده میشود‪ .‬به سوداکوی‬
‫سایز ‪ Hexudoku ،۴‬نیز میگویند‪.‬‬
‫‪Constraint Satisfaction Problem‬‬
‫صفحهی ‪ ۲‬از ‪۶‬‬
‫‪2‬‬
‫‪ ۲٫۲‬ورودی مسئله‬
‫ورودی مسئله باید از ورودی استاندارد‪ ۳‬خوانده شود‪ .‬چیدمان‪ ۴‬ورودی چنینست‪:‬‬
‫در سطر اوّل ابتدا عدد ‪ n‬که سایز جدول »سوداکو« است‪ ،‬داده میشود‪ .‬سپس در ‪ n 2‬سطر بعدی‪ ،‬در هر سطر ‪n 2‬‬
‫عدد نوشته میشود‪ .‬در صورتی که عدد یک خانه ناصفر باشد‪ ،‬مقدار اوّلیه و ثابت آن خانه را نشان میدهد و‬
‫درصورتیکه این عدد صفر باشد‪ ،‬آن خانه باید توسّط برنامهی شما بهدرستی مقداردهی شود‪.‬‬
‫یک مثال از ورودی میتواند چنین باشد‪:‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪3‬‬
‫‪1‬‬
‫‪6‬‬
‫‪0‬‬
‫‪5‬‬
‫‪9‬‬
‫‪0‬‬
‫‪0‬‬
‫‪6‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪8‬‬
‫‪0‬‬
‫‪7‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪2‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪5‬‬
‫‪0‬‬
‫‪0‬‬
‫‪3‬‬
‫‪0‬‬
‫‪0‬‬
‫‪9‬‬
‫‪0‬‬
‫‪7‬‬
‫‪9‬‬
‫‪0‬‬
‫‪6‬‬
‫‪0‬‬
‫‪2‬‬
‫‪0‬‬
‫‪1‬‬
‫‪8‬‬
‫‪0‬‬
‫‪1‬‬
‫‪0‬‬
‫‪0‬‬
‫‪8‬‬
‫‪0‬‬
‫‪0‬‬
‫‪4‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪8‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪3‬‬
‫‪0‬‬
‫‪9‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪6‬‬
‫‪0‬‬
‫‪0‬‬
‫‪3‬‬
‫‪5‬‬
‫‪6‬‬
‫‪0‬‬
‫‪8‬‬
‫‪4‬‬
‫‪7‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪ ۲٫۳‬خروجی مسئله‬
‫بهعنوان خروجی مسئله‪ ،‬در خروجی استاندارد‪ ،۵‬ابتدا ‪ ،k‬تعداد جوابهای یافتهشده )جداولی که قوانین سوداکو‬
‫را دارند و خانههای معینشدهی ورودی در آنها تغییر نکرده است( را بنویسید‪ .‬سپس در ) ‪ k (1 + n 2‬سطر بعدی‪،‬‬
‫این جداول را مشابه ورودی جدول ورودی نمایش دهید‪ .‬دقّت کنید که قبل از نمایش هر جدول‪ ،‬یک سطر خالی‬
‫بگذارید‪ .‬در صورتی که اعداد بهکار گرفته شده در جدول بیش از یک رقم دارند‪ ،‬تمامی اعداد جدول باید به یک‬
‫اندازه فضا اشغال کنند؛ بهعنوان مثال برای ‪ ، n = 4‬قبل از چاپ اعداد یکرقمی در جدول باید یک فاصلهی خالی‬
‫قرار بگیرد تا طول تمامی سطرها برابر شود‪.‬‬
‫بالطّبع درصورتی که جدول جواب نداشته باشد‪ ،‬باید در تنها سطر خروجی‪ 0 ،‬نوشته شود‪.‬‬
‫خروجی نمونه برای ورودی باال بهصورت زیر خواهد بود‪:‬‬
‫‪1‬‬
‫‪2‬‬
‫‪8‬‬
‫‪7‬‬
‫‪3‬‬
‫‪1‬‬
‫‪6‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬
‫‪1‬‬
‫‪4‬‬
‫‪6‬‬
‫‪2‬‬
‫‪9‬‬
‫‪5‬‬
‫‪8‬‬
‫‪3‬‬
‫‪7‬‬
‫‪9‬‬
‫‪3‬‬
‫‪5‬‬
‫‪4‬‬
‫‪7‬‬
‫‪8‬‬
‫‪2‬‬
‫‪6‬‬
‫‪1‬‬
‫‪8‬‬
‫‪5‬‬
‫‪2‬‬
‫‪1‬‬
‫‪3‬‬
‫‪4‬‬
‫‪7‬‬
‫‪9‬‬
‫‪6‬‬
‫‪7‬‬
‫‪9‬‬
‫‪4‬‬
‫‪6‬‬
‫‪5‬‬
‫‪2‬‬
‫‪3‬‬
‫‪1‬‬
‫‪8‬‬
‫‪6‬‬
‫‪1‬‬
‫‪3‬‬
‫‪7‬‬
‫‪8‬‬
‫‪9‬‬
‫‪5‬‬
‫‪4‬‬
‫‪2‬‬
‫‪4‬‬
‫‪2‬‬
‫‪8‬‬
‫‪9‬‬
‫‪6‬‬
‫‪3‬‬
‫‪1‬‬
‫‪7‬‬
‫‪5‬‬
‫‪3‬‬
‫‪7‬‬
‫‪9‬‬
‫‪5‬‬
‫‪2‬‬
‫‪1‬‬
‫‪6‬‬
‫‪8‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪1‬‬
‫‪8‬‬
‫‪4‬‬
‫‪7‬‬
‫‪9‬‬
‫‪2‬‬
‫‪3‬‬
‫‪ ۲٫۴‬ارزیابی سرعت اجرای الگوریتمها‬
‫عالوه بر زمان‪ ،‬عامل مهم‪ ،‬دقیق و قابل اندازهگیری دیگری که میتواند بهعنوان معیار پیادهسازی این مسئله‬
‫درنظر گرفتهشود‪ ،‬تعداد دفعاتیست که یک خانه )ولو بهطور موقّت( مقداردهی میشود و بسته به الگوریتم‪ ،‬احتما ًال‬
‫به یک عمق بازگشتی بیشتر میرود‪.‬‬
‫‪3‬‬
‫‪Standard Input: cin in C++ & System.in in Java‬‬
‫‪Format‬‬
‫‪5‬‬
‫‪Standard Output: cout in C++ & System.out in Java‬‬
‫‪4‬‬
‫صفحهی ‪ ۳‬از ‪۶‬‬
‫‪ ۲٫۵‬پیادهسازی خواستهشده‬
‫شما باید این مسئله را بهکمک الگوریتمهای زیر پیادهسازی‬
‫کنید‪:‬‬
‫‪ Straight Forward .۱‬یا‬
‫‪BackTrack‬‬
‫که بدون هیچ پردازش‬
‫ضمنی‪ ،‬با یک حلقه )‪ (For‬اقدام به انتساب مقادیر به خانههای خالی‬
‫)با ترتیب ثابت( کرده و در صورت مواجهه با مقایرت در هر لحظه‪ ،‬به‬
‫عقب باز میگردد‪.‬‬
‫‪Forward Checking + MRV .۲‬‬
‫‪ Minimum Conflict + Random Restart .۳‬که در این‬
‫الگوریتم بهطور تصادفی خانههای تعیین نشده مقداردهی شده و سپس در صورت تصادم‪ ،‬این مقادیر )در سطر‪ ،‬یا ستون‪ ،‬یا‬
‫‪.۴‬‬
‫زیرمربّع( جابهجا میشوند‪.‬‬
‫و نهایت ًا یک الگوریتم دیگر که خودتان تعیین میکنید‪ .‬این الگوریتم میتواند انتخاب خانه)ای که در آن بهعنوان‬
‫مثال عدد ‪ ۷‬در سطر اوّل قرار میگیرد( بهجای انتخاب مقدار)ی که در اوّلین خانهی خالی سطر اوّل قرار میگیرد( باشد‪.‬‬
‫دقّت کنید که برنامهی شما باید شمارهی الگوریتمی که میبایست اجرا شود را از بههنگام اجرا بهعنوان‬
‫آرگومان برنامه بگیرد‪ .‬به عنوان مثال اگر برنامه با نام ‪ Soduko.exe‬تکمیل شده باشد‪ ،‬دستور زیر باید با استفاده‬
‫از الگوریتم ‪ MC + RR‬مسئله را حل نماید‪:‬‬
‫‪C:\AI\Ex2>Soduko.exe 3‬‬
‫توجه کنید که‪:‬‬
‫•‬
‫در صورتی که الگوریتمی را پیادهسازی نکرده باشید و اجرای آن الگوریتم خواسته شود‪ ،‬میبایست‬
‫پیغام ‪ Not Implemented‬در خروجی استاندارد نمایش داده شود‪.‬‬
‫•‬
‫‪۶‬‬
‫از نوشتن هرگونه توضیح اضافه در خروجی استاندارد یا خروجی اشتباهات اجتناب کنید‪.‬‬
‫چند راهنمایی‪:‬‬
‫•‬
‫آرگومانهای خط فرمان در هر یک از زبانهای ‪ C++‬و ‪ Java‬بهصورت پارامتر از نوع ‪ string‬به‬
‫تابع ‪ main‬ارسال میشوند‪.‬‬
‫•‬
‫برای سرعت بیشتر اجرا )که مستقل از خروجیست( بهتر از دادهساختارهای پیشرفتهی زبان‬
‫برنامهنویسیتان نظیر >‪ Set<State‬در ‪ C++‬یا ‪ HashMap‬در ‪ Java‬استفاده کنید؛ این امر در‬
‫نگهداری کاندیداهای خانههای ناتمام میتواند سودمند باشد‪.‬‬
‫‪ ۳‬سیاست نمرهدهی‬
‫‪ ۳٫۱‬نمرهی خام‬
‫از آنجا که انجام این تمرین بخشی از نمرهی اصلی شما را دارد‪ ،‬شما میبایست الگوریتمهای فوق را‬
‫پیادهسازی کنید اما‪:‬‬
‫•‬
‫میتوانید فرض کنید ‪. 3 ≤ n ≤ 4‬‬
‫‪Standard Error: cerr in C++ & System.err in Java‬‬
‫صفحهی ‪ ۴‬از ‪۶‬‬
‫‪6‬‬
‫•‬
‫الگوریتم چهارم )اختیاری( ای که انتخاب میکنید میتواند ساده باشد اما باید از الگوریتم اوّل‬
‫)‪ Back Track‬ساده( بهتر جواب بدهد و نیز میبایست تفاوت آن با الگوریتمهای دوم و سوم محسوس‬
‫باشد‪.‬‬
‫‪ ۳٫۲‬نمرهی تشویقی‬
‫برای هریک از اعمال زیر‪ ،‬نمرهی تشویقی در نظر گرفته میشود که ضریب آن عمل‪ ،‬بسته به دقت‪ ،‬صحت‪،‬‬
‫سرعت پیادهسازی و ‪ ...‬خواهد داشت‪:‬‬
‫•‬
‫پیادهسازی برای ‪n > 4‬‬
‫•‬
‫پیادهسازی الگوریتم ‪ AC3‬روی این مسئله‬
‫•‬
‫پیداکردن یک الگوریتم خاص منظوره برای حل »سوداکو« که‬
‫استداللها و تکنیکهای خاص مسئله را بهطور دقیق پیادهسازی کند‪.‬‬
‫•‬
‫* ساختن تستهای ورودی که حداکثر زمان استنتاج برای‬
‫الگوریتمهای مختلف را درپی داشتهباشد‪ .‬قابل ذکر است که میزان سختی یک‬
‫ورودی اوّلیه‪ ،‬الزام ًا متناسب با تعداد خانههای تعیین شده در ابتدای کار نمیباشد و‬
‫برای دریافت میزان سختی یک سوداکو میبایست روش دیگری را در پی بگیرید‪ .‬جالبست بدانید که تعداد جداول سوداکوی‬
‫‪ ۳×۳‬موجود )با حذف قرینگی‪ ،‬جایگشت اعداد‪ ،‬چرخش و ‪ (...‬برابر ‪ ۵٬۴۷۲٬۷۳۰٬۵۳۸‬عدد هستند که تنها ‪ ۰٫۰۰۰۱۲٪‬مربعهای‬
‫التین )که شرط سوم سوداکو را ندارند( را تشکیل میدهند!‬
‫•‬
‫موارد پیشنهادی خودتان )هر چه سریعتر باید هماهنگ شوند(‬
‫توجه کنید که مورد چهارم )ساختن تستهای ورودی(‪ ،‬از ارزش و عمق زیادی برخوردار است!‬
‫در صورت پیادهسازی مناسب و دقیق این موارد و یا بهدست آوردن تجربهی ارزشمند‪ ،‬ممکنست شانس‬
‫ارائهی گزارش آن فعالیتها به کالس را )که نمرهی جداگانهای از تمرینها دارد( بهدست بیاورید!‬
‫‪ ۳٫۳‬نمرهی منفی!‬
‫در صورت مشاهدهی هرگونه تخلف‪ ،‬مخصوص ًا گرفتن کُپـ)ـی( از سایرین و یا‬
‫انجام تمرین توسط کسی غیر از دانشجوی مربوطه‪ ،‬بهشدت با مورد تخلف برخورد‬
‫شده و اکیدًا نمرهی منفی در پی خواهد داشت‪ .‬هیچ عذر و بهانهای در این زمینه‬
‫پذیرفتنی نبوده و مشکالت آتی بهتر است از قبل مطرح شوند‪.‬‬
‫در صورت تأخیر در ارسال تمرین‪ ،‬تا یک هفته‪ ،‬نمرهی تمرین در‬
‫) ‪( 9− d‬‬
‫‪10‬‬
‫‪log‬‬
‫که ‪ 1 ≤ d ≤ 8‬ضرب میشود‪ .‬مالک روز تأخیر‪ ،‬ساعت ‪ ۲۳:۵۹‬است؛ بدینمعنی‬
‫که یک ساعت با ‪ ۲۳‬ساعت فرقی نمیکند! کار اضافی )تشویقی( تحویل با تأخیر نخواهد داشت‪.‬‬
‫‪ ۴‬تحویل‬
‫‪ ۴٫۱‬تحویل ارسالی‬
‫فایل ارسالی شما باید الزام ًا یک فایل ‪ zip‬با نام ‪) EX3-83101234-82101234.zip‬که در آن شمارهی‬
‫دانشجویی افراد نویسندهی پروژه بهجای اعداد نمونه قرار گرفتهاند( باشد‪.‬‬
‫موارد مورد نیاز برای تحویل‪ ،‬که میبایست در فایل ‪ zip‬گردآوری شوند‪ ،‬عبارتند از‪:‬‬
‫صفحهی ‪ ۵‬از ‪۶‬‬
‫•‬
‫کّد برنامه‬
‫•‬
‫یک فایل ‪ report.doc‬یا ترجیح ًا ‪ report.pdf‬که در آن توضیح جامعی دربارهی توابع‪،‬‬
‫کالسها و ‪ ...‬دادهاید‪ .‬عالوه بر آن در فایل ‪ report‬شما میبایست گزارش نتایج حاصله از بررسی و‬
‫مقایسهی الگوریتمهای مختلف برای ورودیهای مختلف که در سایت درس قرار خواهد گرفت‪،‬‬
‫را ارائه کرده و دالیل خود را برای آنها ذکر کنید‪ .‬این مقایسه میبایست همراه با نمودار و استدالل‬
‫مجزا برای پیادهسازی‪ ،‬زمان اجرا )به ثانیه( و تعداد عمقهای مشاهدهشده باشد‪ .‬دقّت کنید که قسمت قابل‬
‫مالحظهای از نمرهی تمرین شما به این بخش اختصاص مییابد‪.‬‬
‫در صورت احتیاج‪ :‬یک شاخهی ‪ etc‬که در آن موارد الزم دیگر )تشویقی( قرار گرفتهاند‪ .‬شرح این‬
‫•‬
‫فایلها در ‪ report‬میبایست آمده باشد‪.‬‬
‫فایل ارسالی خود را حداکثر تا تاریخ ‪ ۸۶/۱/۲۷‬به آدرس ‪ [email protected]‬ارسال کنید؛ در غیر‬
‫اینصورت بهمدت یک هفته مشمول بند تأخیر شده و پس از آن بههیچ وجه نمرهای دریافت نخواهید کرد‪.‬‬
‫درصورتی که قصد دارید موارد تشویقی را انجام دهید‪ ،‬حتم ًا باید مورد)های( خود را دقیق ًا انتخاب کرده و پیش از‬
‫فرا رسیدن موعد اوّل )‪ ۲۷‬فروردین( آنها را اعالم کنید‪ .‬در این صورت مهلت ارسال برای شما بهمدّت یکهفته )تا‬
‫پایان بند تأخیر سایرین‪ ،‬یعنی سوم اردیبهشت( تمدید خواهد شد و دیگر مهلت ارسال با تأخیر نخواهید داشت‪.‬‬
‫‪ ۴٫۲‬تحویل حضوری‬
‫•‬
‫هر یک از افراد نویسندهی پروژه‪ ،‬میبایست اشراف کامل و جامع بر پیادهسازی کار داشته باشند‪ .‬این‬
‫مهم در طی تحویل حضوری )در صورت لزوم( بررسی خواهد شد‪.‬‬
‫‪ ۴٫۳‬بیشتر!‬
‫از آنجا که »سوداکو« یک مسئلهی ‪ CSP‬خاص و ساده نیست‪ ،‬توصیه‬
‫میشود برای آشنایی و درک بیشتر فنون بازی و نیز روشهای پیادهسازی‬
‫الگوریتمهای متداول‪ ،‬حتم ًا به نشانیهای زیر سر بزنید‪:‬‬
‫‪http://www.sudoku.com/howtosolve.htm‬‬
‫‪http://www.sudoku-grok.com/help.jsp‬‬
‫‪http://en.wikipedia.org/wiki/Algorithmics_of_Sudoku‬‬
‫‪http://www.chessandpoker.com/sudoku-strategy-guide.html‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪ ۵‬کمک!‬
‫برای رفع ابهامات مسئله یا مشکالت پیادهسازی و ‪ ...‬در رابطه با این‬
‫تمرین با ‪ [email protected]‬تماس بگیرید‪.‬‬
‫!‪Soduko‬‬
‫»پایان«‬
‫صفحهی ‪ ۶‬از ‪۶‬‬