AI-Ex1-Fa.pdf

‫ﺑﻪﻧﺎﻡ ﺧﺪﺍ‬
‫تمرین عملی اوّل درس »مقدمهای بر هوش مصنوعی«‬
‫نیمسال بهار ‪۸۵-۸۶‬‬
‫مقایسهی‬
‫روشهای مختلف جستجو‬
‫در‬
‫مسئلهی »انباردار«‬
‫موعد تحویل‪ :‬دو هفته پس از اِعالن بدون تأخیر یا کار اضافی؛ سه هفته پس از اِعالن با تأخیر یا کار اضافی‬
‫صفحهی ‪ ۱‬از ‪۶‬‬
‫‪ ۱‬معرفی مسئله‬
‫‪۱٫۱‬‬
‫صورت مسئله‬
‫مسئلهی »انباردار« که به نام ‪ (倉庫番) Sokoban‬نیز معروفست‪ ،‬یک مسئلهی جستجوی آگاهانه است که‬
‫در آن یک نگهبان انبار قصد دارد صرف ًا با هُل دادن تعداد جعبه‪ ،‬آنها را از مکانهای اوّلیه به مقصدهای از پیش‬
‫تعیین شده برساند‪.‬‬
‫نقشهی این مسئله میتواند از یک حالت ساده مانند شکل روبهرو‬
‫تا حاالت بسیار پیچیده طراحی شود‪ .‬دقّت کنید که در هر مرحله‪،‬‬
‫انباردار تنها با حرکت )در صورت امکان( به یکی از چهار خانهی‬
‫مجاورش میتواند بسته به شرایط یکی از دو عمل زیر را انجام دهد‪:‬‬
‫• راه رفتن‪ :‬درصورتی که آن خانه خالی باشد )مانند جهت باال‬
‫در شکل مقابل(‪ ،‬انباردار میتواند به آنخانه راه برود‪.‬‬
‫• هُل دادن‪ :‬درصورتی که در آن خانه جعبهای قرار گرفته باشد‬
‫ی خانهی جعبه در همان راستا خالی باشد )مانند‬
‫و خانهی دقیق ًا بعد ِ‬
‫جهت پایین یا جهت چپ در شکل(‪ ،‬انباردار میتواند آن جعبه را در آن راستا هُل بدهد‪.‬‬
‫بدیهیست که در هر خانه‪ ،‬الزام ًا هر چهار راستا معتبر نمیباشند‪ ،‬به عنوان مثال در همین شکل انباردار‬
‫نمیتواند بهسمت راست حرکت کند!‬
‫‪ ۱٫۲‬حل مسئله‬
‫هدف مسئله‪ ،‬رساندن جعبهها به مقاصد است‪ .‬البته امتیاز بیشتر برای روشیست که در آن انباردار کمترین راه‬
‫را برود! بهعنوان مثال‪ ،‬یه حل‪ ۱‬بهینه برای مثال فوق‪ ،‬دنبالهی زیر است که در آن حروف ‪ D ،R ،U‬و ‪ L‬بهترتیب‬
‫حرکت بهسمت باال‪ ،‬راست‪ ،‬پایین و چپ را نمایش میدهند‪:‬‬
‫‪DULLRUUDRR‬‬
‫در این حل‪ ۹ ،‬بار انباردار حرکت کرده است که در آن ‪ ۶‬بار عمل هُل دادن و ‪ ۳‬بار عمل راه رفتن انجام‬
‫گرفتهست‪.‬‬
‫‪ ۱٫۳‬بیشتر!‬
‫از گوگل و ویکیپدیا ]‪ [http://en.wikipedia.org/wiki/Sokoban‬حتم ًا بهره بگیرید!‬
‫ضمن ًا نسخهی ‪ Online‬بازی برای دست و پنجه نرمکردن‪ ،‬در آدرس زیر موجود است‪:‬‬
‫‪http://michbuze.club.fr/Boxworld/sokojs.htm‬‬
‫‪solution‬‬
‫صفحهی ‪ ۲‬از ‪۶‬‬
‫‪1‬‬
‫‪ ۲‬صورت تقلیل یافتهی مسئله برای پیادهسازی‬
‫‪ ۲٫۱‬تغییرات اصلی‬
‫در این تمرین‪ ،‬بهجای چند جعبه‪ ،‬تنها یک جعبه و یک هدف داده میشود! البته در بند عملیات اضافه‪ ،‬ذکر‬
‫شدهاست که در صورت تمایل با گسترش مسئله به چند جعبه‪ ،‬نمرهی تشویقی برای این منظور درنظر گرفته‬
‫میشود‪ .‬سایر موارد‪ ،‬عموم ًا نظیر مسئلهی اصلی هستند‪.‬‬
‫‪ ۲٫۲‬ورودی مسئله‬
‫ورودی مسئله که از ورودی استاندارد‪ ۲‬باید خوانده شود‪ .‬چیدمان‪ ۳‬ورودی چنینست‪:‬‬
‫در سطر اوّل ابتدا دو عدد ‪ n‬و ‪ m‬که بهترتیب تعداد سطرها و تعداد ستونهای ماتریس نقشه هستند‪ ،‬داده میشود‪.‬‬
‫سپس در ‪ n‬سطر بعدی‪ ،‬در هر سطر ‪ m‬کاراکتر نوشته میشود که این کاراکترها بیانگر عناصر نقشه هستند‪:‬‬
‫•‬
‫‪ - #‬این کاراکتر‪ ،‬دیوار را نشان میدهد‪.‬‬
‫•‬
‫‪ - S‬محل قرارگیری انباردار در ابتدای کار‪.‬‬
‫•‬
‫@ ‪ -‬جعبه )درصورت تمایل به انجام کار تشویقی‪ ،‬سایر جعبهها نیز مشابه ًا با ‪ X‬نشان داده میشوند‪(.‬‬
‫•‬
‫‪ - X‬مقصد جعبه )جعبهها(‬
‫•‬
‫‪ - .‬زمین هموار برای حرکت!‬
‫یک مثال از ورودی میتواند چنین باشد‪:‬‬
‫‪5 12‬‬
‫‪############‬‬
‫‪######..X###‬‬
‫‪#S....@...##‬‬
‫‪######..####‬‬
‫‪############‬‬
‫دقت کنید که‪:‬‬
‫•‬
‫‪) @ ،S‬ها(‪) X ،‬ها( نیز مسیر هموار برای حرکت یا هُل دادن بهشمار میروند‪.‬‬
‫•‬
‫کارکترهای حرفی )‪ S‬و ‪ (X‬حروف بزرگ انگلیسی هستند و بههیچ وجه نباید از حروف کوچک بهجای‬
‫آنها استفاده کرد‪.‬‬
‫ممکنست در انتهای سطرها یا پس از آخرین سطر فاصلهی خالی وجود داشته باشد‪.‬‬
‫•‬
‫میتوانید مطمئن باشید که‪:‬‬
‫•‬
‫نقشه الزام ًا توسّط دیوارها بستهست و ‪ S‬نمیتواند از نقشه خارج شود‪.‬‬
‫•‬
‫تعداد @ )ها( دقیق ًا برابر تعداد ‪) X‬ها( است‪.‬‬
‫•‬
‫مقادیر ‪ m‬و ‪ n‬از ‪ ۱۰۰‬تجاوز نمیکنند‪.‬‬
‫•‬
‫تبدیل حالت‪ ۴‬به وضعیت‪!۵‬‬
‫برای نگهداری یک موقعیت قرارگیری انباردار و جعبه)ها( یک کالس با حداقل اشیاء زیر تعریف کنید‪:‬‬
‫‪2‬‬
‫‪Standard Input: cin in C++ & System.in in Java‬‬
‫‪Format‬‬
‫‪4‬‬
‫‪Situation‬‬
‫‪5‬‬
‫‪State‬‬
‫‪3‬‬
‫صفحهی ‪ ۳‬از ‪۶‬‬
‫{ ‪Class State‬‬
‫‪int Sx, Sy; // Sokoban's Place in the Map‬‬
‫‪int Bx, By; // Box's Place in the Map‬‬
‫}‬
‫درصورتی که تعداد جعبهها بیشتر از یکی باشد )کار تشویقی(‪ ،‬خط دوم باید یک آرایه از مکانها باشد‪ .‬این‬
‫وضعیت )و تولید( آن‪ ،‬که در خروجی مسئله چاپ میشود‪ ،‬نمایندهی پیچیدگی و سرعت الگوریتم خواهد بود‪.‬‬
‫‪ ۲٫۳‬خروجی مسئله‬
‫بهعنوان خروجی مسئله‪ ،‬در خروجی استاندارد‪ ،۶‬ابتدا سه عدد ‪ w ،t‬و ‪ v‬را بنویسید که بهترتیب برابر طول‬
‫دنبالهی حرکتی که یافتهاید‪ ،‬تعداد هُلدادنهای موجود در آن دنباله و تعداد وضعیتهای مشاهده شده توسط‬
‫الگوریتم( است‪ .‬سپس در سطر دوم‪ ،‬با استفاده از کاراکترهای ‪ B ،R ،U‬و ‪ L‬چنانکه گفته شد دنبالهی حرکتیتان را‬
‫چاپ کنید‪ .‬یک خروجی برای مثال ورودی باال‪ ،‬میتواند چنین باشد‪:‬‬
‫‪12 3 16‬‬
‫‪RRRRRDRUULUR‬‬
‫که عدد ‪ ،16‬بیانگر این امر است که الگوریتم استفاده شده‪ ۱۶ ،‬وضعیت را بررسی کرده تا به وضعیت نهایی‬
‫رسیده است‪.‬‬
‫در صورتی که مسئله حلناشدنیست و با هیچ دنبالهای نمیتوان جعبه)ها( را به مقصد رساند‪ ،‬در تنها سطر‬
‫ورودی‪ ،‬عدد ‪ -1‬و سپس تعداد وضعیتهای مشاهده شده را چاپ کنید‪.‬‬
‫‪ ۲٫۴‬پیادهسازی خواستهشده‬
‫شما باید این مسئله را بهکمک الگوریتمهای زیر پیادهسازی کنید‪:‬‬
‫‪BFS .۱‬‬
‫‪DFS .۲‬‬
‫‪Iterative Deepening .۳‬‬
‫‪Bidirectional Search .۴‬‬
‫‪ .۵‬و نهایت ًا *‪A‬‬
‫دقّت کنید که برنامهی شما باید شمارهی الگوریتمی که میبایست اجرا شود را از بههنگام اجرا بهعنوان‬
‫آرگومان برنامه بگیرد‪ .‬به عنوان مثال اگر برنامه با نام ‪ Sokoban.exe‬تکمیل شده باشد‪ ،‬دستور زیر باید با‬
‫استفاده از الگوریتم ‪ Bidirectional Search‬مسئله را حل نماید‪:‬‬
‫‪C:\AI\Proj1>Sokoban.exe 4‬‬
‫توجه کنید که‪:‬‬
‫•‬
‫در صورتی که الگوریتمی را پیادهسازی نکرده باشید و اجرای آن الگوریتم خواسته شود‪ ،‬میبایست‬
‫پیغام ‪ Not Implemented‬در خروجی استاندارد نمایش داده شود‪.‬‬
‫‪۷‬‬
‫•‬
‫از نوشتن هرگونه توضیح اضافه در خروجی استاندارد یا خروجی اشتباهات اجتناب کنید‪.‬‬
‫•‬
‫بهجز الگوریتم ‪ ،DFS‬سایر الگوریتمها باید طوری پیادهسازی شوند که یک جواب بهینه )تعریف آن‬
‫در ادامه خواهد آمد( را چاپ کند‪.‬‬
‫چند راهنمایی‪:‬‬
‫•‬
‫آرگومانهای خط فرمان در هر یک از زبانهای ‪ C++‬و ‪ Java‬بهصورت پارامتر از نوع ‪ string‬به‬
‫تابع ‪ main‬ارسال میشوند‪.‬‬
‫‪Standard Output: cout in C++ & System.out in Java‬‬
‫‪Standard Error: cerr in C++ & System.err in Java‬‬
‫صفحهی ‪ ۴‬از ‪۶‬‬
‫‪6‬‬
‫‪7‬‬
‫•‬
‫الگوریتمها را بهترتیب خوبی پیادهسازی کنید‪ ،‬چرا که ممکنست یک الگوریتم تغییراتی از الگوریتم‬
‫دیگر باشد!‬
‫•‬
‫برای سرعت بیشتر اجرا )که مستقل از خروجیست( بهتر از دادهساختارهای پیشرفتهی زبان‬
‫برنامهنویسیتان نظیر >‪ Set<State‬در ‪ C++‬یا ‪ HashMap‬در ‪ Java‬استفاده کنید‪.‬‬
‫‪ ۳‬سیاست نمرهدهی‬
‫‪ ۳٫۱‬نمرهی خام‬
‫از آنجا که انجام این تمرین بخشی از نمرهی اصلی شما را دارد‪ ،‬شما میبایست الگوریتمهای فوق را‬
‫پیادهسازی کنید اما‪:‬‬
‫•‬
‫جواب بهینه )= هزینهی عملیات( صرف ًا براساس طول دنباله سنجیده میشود‪ .‬دو دنباله با طولهای‬
‫مساوی‪ ،‬مستقل از تعداد هُلدادنهایشان میتوانند برابر گرفته شوند‪.‬‬
‫•‬
‫میتوانید فرض کنی دقیق ًا یک جعبه داریم‪.‬‬
‫•‬
‫تابع مکاشفه ای که بهکار میگیرید میتوانند ساده باشند اما نباید برای تمام حالتها مقدار صفر را‬
‫‪۸‬‬
‫برگردانند!‬
‫‪ ۳٫۲‬نمرهی تشویقی‬
‫برای هریک از اعمال زیر‪ ،‬نمرهی تشویقی در نظر گرفته میشود که ضریب آن عمل‪ ،‬بسته به دقت‪ ،‬صحت‪،‬‬
‫سرعت‪ ،‬اشراف در پیادهسازی و ‪ ...‬خواهد داشت‪:‬‬
‫•‬
‫* پیادهسازی برای چند جعبه‬
‫•‬
‫پیادهسازی برای توابع مکاشفهی بیشتر و مقایسهی آنها‬
‫•‬
‫پیدا کردن دنبالهی بهینهای که از نظر تعداد هُلها نیز )در‬
‫صورت تساوی طول( کمترین مقدار را داشتهباشد‪.‬‬
‫•‬
‫ساختن تستهای با جواب طوالنی و یا )بهتر( برنامهی‬
‫تستساز‬
‫•‬
‫‪۹‬‬
‫موارد پیشنهادی خودتان )هر چه سریعتر باید هماهنگ شوند(‬
‫در صورت پیادهسازی مناسب و دقیق این موارد‪ ،‬ممکنست شانس ارائهی گزارش آن فعالیتها به کالس را )که‬
‫نمرهی جداگانهای از تمرینها دارد( بهدست بیاورید!‬
‫‪ ۳٫۳‬نمرهی منفی!‬
‫در صورت مشاهدهی هرگونه تخلف‪ ،‬مخصوص ًا گرفتن کُپـ)ـی( از سایرین و یا انجام تمرین توسط کسی غیر از‬
‫دانشجوی مربوطه‪ ،‬بهشدت با مورد تخلف برخورد شده و اکیدًا نمرهی منفی در پی خواهد داشت‪ .‬هیچ عذر و‬
‫بهانهای در این زمینه پذیرفتنی نبوده و مشکالت آتی بهتر است از قبل مطرح شوند‪.‬‬
‫‪Heuristic‬‬
‫‪Generator‬‬
‫صفحهی ‪ ۵‬از ‪۶‬‬
‫‪8‬‬
‫‪9‬‬
‫) ‪( 9− d‬‬
‫‪ log10‬که ‪ 1 ≤ d ≤ 8‬ضرب میشود‪.‬‬
‫در صورت تأخیر در ارسال تمرین‪ ،‬تا یک هفته‪ ،‬نمرهی تمرین در‬
‫مالک روز تأخیر‪ ،‬ساعت ‪ ۲۳:۵۹‬است؛ بدینمعنی که یک ساعت با ‪ ۲۳‬ساعت فرقی نمیکند! کار اضافی )تشویقی(‬
‫تحویل با تأخیر نخواهد داشت‪.‬‬
‫‪ ۴‬تحویل‬
‫‪ ۴٫۱‬تحویل ارسالی‬
‫فایل ارسالی شما باید الزام ًا یک فایل ‪ zip‬با نام ‪) EX1-83101234-82101234.zip‬که در آن شمارهی‬
‫دانشجویی افراد نویسندهی پروژه بهجای اعداد نمونه قرار گرفتهاند( باشد‪.‬‬
‫موارد مورد نیاز برای تحویل‪ ،‬که میبایست در فایل ‪ zip‬گردآوری شوند‪ ،‬عبارتند از‪:‬‬
‫•‬
‫کّد برنامه‬
‫•‬
‫یک فایل ‪ report.doc‬یا ترجیح ًا ‪ report.pdf‬که در آن توضیح جامعی دربارهی توابع‪،‬‬
‫کالسها و ‪ ...‬دادهاید‪ .‬عالوه بر آن در فایل ‪ report‬شما میبایست گزارش نتایج حاصله از بررسی و‬
‫مقایسهی الگوریتمهای مختلف برای ورودیهای مختلف که در سایت درس قرار خواهد گرفت‪،‬‬
‫را ارائه کرده و دالیل خود را برای آنها ذکر کنید‪ .‬این مقایسه میبایست همراه با نمودار و استدالل‬
‫مجزا برای پیادهسازی‪ ،‬زمان اجرا )به ثانیه( و تعداد حالتهای مشاهدهشده باشد‪ .‬دقّت کنید که قسمت‬
‫قابل مالحظهای از نمرهی تمرین شما به این بخش اختصاص مییابد‪.‬‬
‫•‬
‫در صورت احتیاج‪ :‬یک شاخهی ‪ etc‬که در آن موارد الزم دیگر )تشویقی( قرار گرفتهاند‪ .‬شرح این‬
‫فایلها در ‪ report‬میبایست آمده باشد‪.‬‬
‫فایل ارسالی خود را حداکثر تا دو هفته پس از اِعالن به آدرس ‪ [email protected]‬ارسال کنید؛ در غیر‬
‫اینصورت بهمدت یک هفته مشمول بند تأخیر شده و پس از آن بههیچ وجه نمرهای دریافت نخواهید کرد‪.‬‬
‫درصورتی که قصد دارید موارد تشویقی را انجام دهید‪ ،‬حتم ًا باید مورد)های( خود را دقیق ًا انتخاب کرده و پیش از‬
‫فرا رسیدن موعد اوّل آنها را اعالم کنید‪ .‬در این صورت مهلت ارسال برای شما بهمدّت یکهفته )تا پایان بند تأخیر‬
‫سایرین( تمدید خواهد شد و دیگر مهلت ارسال با تأخیر نخواهید داشت‪.‬‬
‫‪ ۴٫۲‬تحویل حضوری‬
‫•‬
‫هر یک از افراد نویسندهی پروژه‪ ،‬میبایست اشراف کامل و جامع بر پیادهسازی کار داشته باشند‪ .‬این‬
‫مهم در طی تحویل حضوری )در صورت لزوم( بررسی خواهد شد‪.‬‬
‫‪ ۵‬کمک!‬
‫برای رفع ابهامات مسئله یا مشکالت پیادهسازی و ‪ ...‬در رابطه با این‬
‫تمرین با ‪ [email protected]‬تماس بگیرید‪.‬‬
‫»پایان«‬
‫صفحهی ‪ ۶‬از ‪۶‬‬