AI-Ex2-Fa.pdf

‫بهنام خدا‬
‫تمرین عملی دوم درس »مقدمهای بر هوش مصنوعی«‬
‫نیمسال بهار ‪۸۵-۸۶‬‬
‫مقایسهی‬
‫روشهای مختلف‬
‫»جستجوی محلّی«‬
‫در‬
‫»حدس نقطهی صفر یک تابع«‬
‫موعد تحویل‪ :‬حداکثر دو هفته پس از اعالن‬
‫صفحهی ‪ ۱‬از ‪۶‬‬
‫‪ ۱‬معرفی مسئله‬
‫صورت مسئله‬
‫‪۱٫۱‬‬
‫در این مسئله از شما خواسته شده تا برای یک تابع خاص )و احیان ًا پیچیده( که از آن بیخبر‬
‫هستید‪ ،‬مقادیری از ورودی را بیابید که خروجیاش تا حد ممکن به صفر نزدیک باشد‪.‬‬
‫دقّت کنید که برنامهی شما‪ ،‬از محتوای تابع بیخبر است و صرف ًا میتواند با فراخوانی آن‬
‫بهازای ورودیهای مشخّص‪ ،‬مقادیر تابع برای آن ورودیها را بیابد‪.‬‬
‫‪ ۲‬صورت دقیق مسئله برای پیادهسازی‬
‫‪ ۲٫۱‬ورودی مسئله‪/‬تابع‬
‫در بخش ساده )بدون نمرهی اضافه( تابع شما دقیق ًا ‪ ۳‬متغیر خواهد داشت‪ .‬الگو‪۱‬ی تابع شما میبایست چنین باشد‪:‬‬
‫;)‪double funcVal(double x, double y, double z‬‬
‫بدنهی تابع شما‪ ،‬ورودی اصلی مسئله است که در داخل کُد شما )پس از ارسال‪ ،‬و بههنگام تصحیح( تغییر میکند‪ .‬در این‬
‫قسمت )که به هنگام تِست و نمرهدهی برای توابع گوناگون تثبیت میشود( تابع با کمک توابع ریاضیات و مثلثات )نظیر‬
‫)(‪ exp() ،sin‬و ‪ (...‬پیادهسازی میشود‪.‬‬
‫برای راحتی کار میتوانید فرض کنید که تابع مورد نظر که در برنامهی شما قرار میگیرد‪:‬‬
‫• ‪ ...‬حتم ًا یک جواب صفر برای یک ورودی سهعنصره که در آن ‪ − 100 ≤ x, y, z ≤ 100‬است‪ ،‬دارد‪ .‬توجه کنید‬
‫که هم ورودی و هم خروجی تابع‪ ،‬حقیقی )و نه لزوم ًا صحیح( هستند‪.‬‬
‫• ‪) ...‬جز در نقاط انتهایی بازهها( پیوسته است‪.‬‬
‫‪۳‬‬
‫‪۲‬‬
‫• ‪ ...‬بهازای تمام ورودیها در بازهی گفته شده معتبر بوده و هیچ استثنا یی )نظیر تقسیم بر صفر ( برنمیگرداند‪.‬‬
‫قدرمطلق خروجی تابع نیز )برای ورودیهای معتبر( همواره کوچکتر از ‪ 10100‬است‪.‬‬
‫‪z‬‬
‫بهعنوان مثال‪ ،‬تابع ‪) funcVal‬الزام ًا با همین نام( برای تابع ‪ x 2 e 10 + xy − sin( zx) + 12.5‬به شکل زیر نوشته‬
‫میشود‪:‬‬
‫{ )‪double funcVal(double x, double y, double z‬‬
‫))‪return x*x*exp(abs(z/10.0‬‬
‫‪+ x*y‬‬
‫)‪- sin(z*x‬‬
‫;‪+ 12.5‬‬
‫}‬
‫از سوی دیگر‪ ،‬شما از ورودی استاندارد‪ ۴‬باید یک عدد ‪ n‬بخوانید که حداکثر تعداد دفعات فراخوانی ‪ ،funcVal‬در زمان‬
‫اجرای برنامهی شما را تعیین میکند‪ .‬میتوانید فرض کنید ‪. 1 ≤ n ≤ 106‬‬
‫‪Prototype‬‬
‫‪Exception‬‬
‫‪Divison By Zero‬‬
‫‪Standard Input: cin in C++ & System.in in Java‬‬
‫صفحهی ‪ ۲‬از ‪۶‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪ ۲٫۲‬خروجی مسئله‬
‫بهعنوان خروجی مسئله‪ ،‬در خروجی استاندارد‪ ،۵‬ابتدا ‪ ،k‬تعداد دفعات فراخوانی تابع ‪) funcVal‬که در بدترین حالت‪،‬‬
‫برابر ‪ n‬است( را در سطر اوّل بنویسید‪ .‬سپس در سطر دوم‪ ،‬مقادیر ‪ y ،x‬و ‪ z‬را برای بهترین جوابی که بهدست آوردهاید‬
‫بنویسید‪ .‬نهایت ًا در سطر آخر‪ ،‬مقدار تابع بهازای این سه عنصر را چاپ کنید‪.‬‬
‫مقادیر حقیقی سطرهای دوم و سوم‪ ،‬باید تا ‪ ۸‬رقم اعشار )در صورت وجود( چاپ شوند‪.‬‬
‫دقّت کنید که در تمام برنامه و نیز خروجیها‪ ،‬هر عدد کوچکتر از ‪ ۱۰۸‬برابر صفر در نظر گرفته میشود‪.‬‬
‫‪ ۲٫۳‬پیادهسازی خواستهشده‬
‫شما باید این مسئله را بهکمک الگوریتمهای زیر پیادهسازی کنید‪:‬‬
‫‪.۱‬‬
‫‪ Hill Climbing‬با ‪ Random Restart‬در صورت لزوم‪ :‬در این حالت ممکنست صالح بدانید در هنگام رسیدن‬
‫‪۶‬‬
‫‪۷‬‬
‫‪۹‬‬
‫‪۸‬‬
‫به یک فالت ‪ ،‬قله یا دره یا حتی حالتهای دیگر‪ ،‬یک شروع مجدّد کنید! این‬
‫جزئیات و تصمیم خود را در گزارش‪ ۱۰‬ذکر کنید‪.‬‬
‫‪.۲‬‬
‫‪.۳‬‬
‫‪.۴‬‬
‫‪ :Simulated Annealing‬برای این منظور‪ ،‬مقدار پارامتر تعیینکنندهی‬
‫دما )‪ (T‬را بهصورت ثابت‪ ۱۱‬در نظر گرفته و در صورت تمایل‪ ،‬بهعنوان کار اضافی‪،‬‬
‫در گزارش خود راجع به مقادیر مختلف آن ادعا‪ ،‬استدالل و بحث کنید‪.‬‬
‫‪Local Beam Search‬‬
‫و نهایت ًا ‪Genetic Algorithm‬‬
‫مانند تمرین قبل‪ ،‬برنامهی شما باید شمارهی الگوریتمی را که میبایست انجام شود‪،‬‬
‫بههنگام اجرا بهعنوان آرگومان برنامه بگیرد‪ .‬به عنوان مثال اگر برنامه با نام ‪Func.exe‬‬
‫تکمیل شده باشد‪ ،‬دستور زیر باید با استفاده از الگوریتم ‪ Local Beam Search‬مسئله را حل نماید‪:‬‬
‫‪C:\AI\Proj2>Func.exe 3‬‬
‫توجه کنید که‪:‬‬
‫•‬
‫در صورتی که الگوریتمی را پیادهسازی نکرده باشید و اجرای آن الگوریتم خواسته شود‪ ،‬میبایست پیغام ‪Not‬‬
‫‪ Implemented‬در خروجی استاندارد نمایش داده شود‪.‬‬
‫‪۱۲‬‬
‫•‬
‫از نوشتن هرگونه توضیح اضافه در خروجی استاندارد یا خروجی اشتباهات اجتناب کنید‪.‬‬
‫•‬
‫تابع ‪ funcVal‬را حتم ًا در یکی از ‪ ۴۰‬خط ابتدایی برنامهتان پیادهسازی کرده و محل آن را در گزارش معیّن‬
‫کنید‪ .‬این تابع‪ ،‬چنان که گفته شد‪ ،‬برای تِستهای مختلف تغییر خواهد کرد‪ .‬پیش از ارسال برنامه‪ ،‬این تابع را برابر‬
‫‪ x + y + z‬قرار دهید‪.‬‬
‫•‬
‫‪۱۴‬‬
‫سرفایل‪۱۳‬های الزم نظیر ‪ cmath‬و ‪ ...‬را حتم ًا ضمیمه کنید‪.‬‬
‫‪5‬‬
‫‪Standard Output: cout in C++ & System.out in Java‬‬
‫‪Plateau‬‬
‫‪7‬‬
‫‪Local Maxima‬‬
‫‪8‬‬
‫‪Local Minima‬‬
‫‪9‬‬
‫‪Restart‬‬
‫‪10‬‬
‫‪Report‬‬
‫‪11‬‬
‫‪const in C++, final in Java‬‬
‫‪12‬‬
‫‪Standard Error: cerr in C++ & System.err in Java‬‬
‫‪13‬‬
‫‪Header‬‬
‫‪14‬‬
‫‪include/import‬‬
‫‪6‬‬
‫صفحهی ‪ ۳‬از ‪۶‬‬
‫•‬
‫در صورتی که در برنامهی خود از تابع ‪ random‬استفاده میکند‪ ،‬نحوهی کار برنامهی شما باید طوری باشد که‬
‫بهازای دفعات مکرّر اجرا‪ ،‬خروجی یکسان بدهد‪ .‬بهعبارت دیگر‪ ،‬استفاده از بذر‬
‫‪۱۵‬‬
‫اوّلیه برای تغییر خروجیهای‬
‫‪ random‬مجاز نمیباشد‪.‬‬
‫‪ ۳‬سیاست نمرهدهی‬
‫‪ ۳٫۱‬نمرهی خام‬
‫از آنجا که انجام این تمرین بخشی از نمرهی اصلی شما را دارد‪ ،‬شما میبایست الگوریتمهای فوق را پیادهسازی کنید‪.‬‬
‫لزومی به پیچیدگی الگوریتمها و تحلیل برای حالتهای خاص )مث ً‬
‫ال دماهای دقیق‪ ،‬حسّاس و مختلف برای ‪Simulated‬‬
‫‪ (Annealing‬نیست؛ اما از آنجا که در این تمرین‪ ،‬تئوری به عمل نزدیک بوده و بررسیها عمدت ًا کیفی میباشند‪ ،‬انجام کار‬
‫اضافی اکیدًا توصیه میشود‪.‬‬
‫‪۱۶‬‬
‫در مورد الگوریتم ژنتیک‪ ،‬میتوانید سیاست نخبهگزینی را در پیش بگیرید‪ .‬با این حال‪ ،‬اندازهی جمعیّت شما و نیز نرخ‬
‫زاد و ولد )چه دورگه‪۱۷‬ای‪ ،‬چه جهش‪۱۸‬یافته( باید معقول بوده و در گزارش توضیح داده شوند‪.‬‬
‫دقّت کنید که توابع آزمایشی داده شده )که در سایت درس قرار گرفتهاند(‪ ،‬صرف ًا برای آشنایی شما بوده و الزام ًا تِستهای‬
‫اصلی نمرهدهی نخواهند بود‪.‬‬
‫‪ ۳٫۲‬نمرهی تشویقی‬
‫برای هریک از اعمال زیر‪ ،‬نمرهی تشویقی در نظر گرفته میشود که ضریب آن عمل‪ ،‬بسته به دقت‪ ،‬صحت‪ ،‬سرعت‬
‫پیادهسازی و ‪ ...‬خواهد داشت‪:‬‬
‫•‬
‫)‪ (-‬انتخاب‪ ،‬توجیه و تفسیر بهترین الگوریتم برای ‪n‬های خیلی کوچک )کمتر از ‪ ،۱۰‬یا ‪ (۱۰۰‬یا ‪n‬های خیلی‬
‫بزرگ‪.‬‬
‫•‬
‫مقایسهی نرخ زمانبندی‬
‫‪۱۹‬‬
‫دماهای مختلف در‬
‫‪Simulated‬‬
‫‪ ،Annealing‬مقایسه و تفسیر آنها‬
‫•‬
‫پیدا کردن توابع بحرانی )بدترین توابع( برای هر یک از الگوریتمها‬
‫•‬
‫تغییرات جزئی و مؤثر در الگوریتمهای گفته شده‪ ،‬نظیر ‪Random‬‬
‫‪ Walk‬و مقایسهی آنها‬
‫•‬
‫اجرای سایر روشهای جستجوی ناآگاهانه نظیر ‪Stochastic Beam‬‬
‫‪Search‬‬
‫** پیادهسازی برای توابع با بیش از سه پارامتر‪ :‬در این حالت‪ ،‬پارامتر تابع‪،‬‬
‫•‬
‫یک آرایه از عناصر و نه تنها سه عنصر است‪ .‬سایر موارد مشابه است‪ .‬حداکثر تعداد پارامترها تا ‪) ۱۰۰۰‬یا حتی بیشتر( هم میتواند باشد‪.‬‬
‫تعداد ورودیهای تابع در یک ثابت در داخل کد برنامه )نظیر خود تابع( تنظیم میشود‪.‬‬
‫•‬
‫** مقایسهی سیاستهای گوناگون در الگوریتم ژنتیک‪ ،‬نرخهای مختلف زاد و ولد و انواع آن‬
‫•‬
‫موارد پیشنهادی خودتان )هر چه سریعتر باید هماهنگ شوند(‬
‫‪15‬‬
‫‪Seed‬‬
‫‪Elitism‬‬
‫‪17‬‬
‫‪Crossover‬‬
‫‪18‬‬
‫‪Mutation‬‬
‫‪19‬‬
‫‪Scheduling‬‬
‫‪16‬‬
‫صفحهی ‪ ۴‬از ‪۶‬‬
‫مشابه تمرین قبل‪ ،‬در صورت پیادهسازی مناسب و دقیق این موارد‪ ،‬ممکنست شانس ارائهی گزارش آن فعالیتها به‬
‫کالس را )که نمرهی جداگانهای از تمرینها دارد( بهدست بیاورید!‬
‫‪ ۳٫۳‬مسابقهی سریعترین پاسخ!‬
‫مورد دیگری که برای گرفتن نمرهی اضافه درنظر گرفته شدهاست‪ ،‬مسابقهی بهترین‬
‫برنامه است‪ .‬برای شرکت در این مسابقه‪ ،‬کافیست در گزارش خود یکی از الگوریتمهایی‬
‫که پیادهسازی کردهاید را بهعنوان الگوریتم »بهترین« خود معرفی کنید‪ ،‬سپس بهازای یک‬
‫تابع خاص )که بههنگام تصحیح مشخّص میشود(‪ ،‬افرادی که برنامهشان با کمترین میزان‬
‫م »بهترین«شان( به جواب برسند‪ ،‬نمرهی اضافه دریافت‬
‫فراخوانی تابع )در اجرای الگوریت ِ‬
‫میکنند!‬
‫‪ ۳٫۴‬نمرهی منفی!‬
‫دستکاری در محاسبهی تعداد دفعات فراخوانی تابع )که معیار مسابقه است( و نیز‬
‫تالش برای دستیابی به تابع‪ ،‬بهروشی بهجز دادن ورودی و گرفتن خروجی تقّلب محسوب‬
‫شده و نمرهی منفی در پی خواهد داشت‪.‬‬
‫نیز‪ ،‬مشابه سایر تمرینها‪ ،‬در صورت مشاهدهی هرگونه تخلف‪ ،‬مخصوص ًا گرفتن‬
‫کُپـ)ـی( و یا انجام تمرین توسط کسی غیر از دانشجوی)ان( مربوطه‪ ،‬بهشدت با مورد‬
‫تخلف برخورد شده و اکیدًا نمرهی منفی در پی خواهد داشت‪ .‬هیچ عذر و بهانهای در این‬
‫زمینه پذیرفتنی نبوده و مشکالت آتی بهتر است از قبل مطرح شوند‪.‬‬
‫در صورت تأخیر در ارسال تمرین‪ ،‬تا یک هفته‪ ،‬نمرهی تمرین در‬
‫) ‪( 9− d‬‬
‫‪10‬‬
‫‪ log‬که ‪ 1 ≤ d ≤ 8‬ضرب میشود‪ .‬مالک روز‬
‫تأخیر‪ ،‬ساعت ‪ ۲۳:۵۹‬است؛ بدینمعنی که یک ساعت با ‪ ۲۳‬ساعت فرقی نمیکند!‬
‫صفحهی ‪ ۵‬از ‪۶‬‬
‫‪ ۴‬تحویل‬
‫‪ ۴٫۱‬تحویل ارسالی‬
‫فایل ارسالی شما باید الزام ًا یک فایل ‪ zip‬با نام ‪) EX2-83101234-82101234.zip‬که در آن شمارهی‬
‫دانشجویی افراد نویسندهی پروژه بهجای اعداد نمونه قرار گرفتهاند( باشد‪.‬‬
‫موارد مورد نیاز برای تحویل‪ ،‬که میبایست در فایل ‪ zip‬گردآوری شوند‪ ،‬عبارتند از‪:‬‬
‫•‬
‫کّد برنامه‬
‫•‬
‫یک فایل ‪ report.doc‬یا ترجیح ًا ‪ report.pdf‬که در آن توضیح جامعی دربارهی توابع‪ ،‬کالسها و ‪...‬‬
‫دادهاید‪ .‬عالوه بر آن در فایل ‪ report‬شما میبایست‪ .‬تعدادی تابع‬
‫نمونه در سایت درس قرار داده شدهاست )که الزام ًا تِستهای‬
‫نمرهدهی نیستند(‪ .‬با این توابع و سایر توابعی که خودتان‬
‫میسازید‪ ،‬الگوریتمها را مقایسه کرده و نتایج حاصله از بررسی و‬
‫تفحّص راجع به آنها و نیز دالیل و استداللهای خود را ذکر کنید‪.‬‬
‫بررسی نحوهی عملکرد بهازای ‪n‬های مختلف نیز از موارد قابل ذکر‬
‫در گزارش است‪ .‬همچنین مواردی که در طی بخشهای این صورت‬
‫پروژه اشاره شدهاند )نظیر سیاست الگوریتم ژنتیک(‪ ،‬میبایست‬
‫ذکر شوند‪.‬‬
‫مجدّدًا دقّت کنید که قسمت قابل مالحظهای از نمرهی تمرین شما به این بخش اختصاص مییابد‪.‬‬
‫•‬
‫در صورت احتیاج‪ :‬یک شاخهی ‪ etc‬که در آن موارد الزم دیگر )تشویقی( قرار گرفتهاند‪ .‬شرح این فایلها در‬
‫‪ report‬میبایست آمده باشد‪.‬‬
‫فایل ارسالی خود را حداکثر تا دو هفته پس از اعالن تمرین به آدرس ‪ ce417a@gmail.com‬ارسال کنید؛ در غیر‬
‫اینصورت بهمدت یک هفته مشمول بند تأخیر شده و پس از آن بههیچ وجه نمرهای دریافت نخواهید کرد‪ .‬در صورت انجام کار‬
‫اضافه‪ ،‬مشابه تمرین قبل‪ ،‬یک هفته مهلت شما تمدید میشود‪ ،‬اما برای این منظور باید در زمان مشخّص )‪ ۱۰‬روز پس از‬
‫تعریف تمرین( آمادگی خود برای انجام موارد اضافه را اعالم کنید‪.‬‬
‫‪ ۴٫۲‬تحویل حضوری‬
‫•‬
‫هر یک از افراد نویسندهی پروژه‪ ،‬میبایست اشراف کامل و جامع بر پیادهسازی کار داشته باشند‪ .‬این مهم در‬
‫طی تحویل حضوری )در صورت لزوم( بررسی خواهد شد‪.‬‬
‫‪ ۵‬کمک!‬
‫برای رفع ابهامات مسئله یا مشکالت پیادهسازی و ‪ ...‬در رابطه با این تمرین با ‪ aideen@gmail.com‬تماس بگیرید‪.‬‬
‫صفحهی ‪ ۶‬از ‪۶‬‬