Ex4.pdf

‫بهنام خدا‬
‫تمرین عملی چهارم درس »مقدمهای بر هوش مصنوعی«‬
‫نیمسال بهار ‪۸۵-۸۶‬‬
‫بازی دو نفرهی‬
‫»چهار متّصل‪«۱‬‬
‫موعد تحویل‪ :‬دو هفته پس از اعالن‬
‫‪Connect Four‬‬
‫صفحهی ‪ ۱‬از ‪۵‬‬
‫‪1‬‬
‫‪ ۱‬معرفی بازی‬
‫قانون اصلی بازی‬
‫‪۱٫۱‬‬
‫بازی »چهار متّصل« که بهنامهای ‪،Plot Four ،Connect Four‬‬
‫‪ Four in a line ،Four in a row‬و ‪ ...‬مشهور است‪ ،‬برای اوّلین بار در سال‬
‫‪ ۱۹۷۴‬توسّط ‪ Milton Bradley‬منتشر شد‪.‬‬
‫این بازی دو نفره روی یک صفحهی ایستاده انجام میشود‪ .‬هر بازیکن‬
‫در نوبت خود یکی از ستونهای صفحه را انتخاب کرده و یکی از مهرههای‬
‫رنگ خودش را در آن میاندازد تا در پایینترین خانهی خالی آن ستون جا‬
‫بگیرد‪.‬‬
‫اگر در مرحلهی چهار تا از مهرههای یک بازیکن در یک خط پیوسته و متوالی بهصورت افقی‪ ،‬عمودی یا مورب‬
‫قرار بگیرند‪ ،‬آن بازیکن برنده شده و بازی خاتمه مییابد‪.‬‬
‫نیز در صورتی که تمام خانههای جدول پر شوند و هیچ بازیکنی چهار خانهی متوالی همرنگ نساخته باشد‪،‬‬
‫بازی به تساوی میانجامد‪.‬‬
‫برای مثال در شکل روبهرو‪ ،‬اگر نوبت بازیکن زرد باشد‪ ،‬او با انداختن‬
‫یک مهره در سمت راست ترین ستون میتواند چهار مهرهی زرد قطری‬
‫ساخته و برنده شود‪.‬‬
‫با کمی دقّت میتوان دریافت که حتی اگر نوبت با بازیکن قرمز هم‬
‫باشد‪ ،‬بازیکن زرد در اوّلین حرکت خودش میتواند برنده شود؛ زیرا ستون‬
‫سوم از سمت چپ و ستون آخر از سمت چپ‪ ،‬هر دو میتوانند ستونهای‬
‫برد وی در اولین حرکتش باشد‪.‬‬
‫‪ ۱٫۲‬تکنیکها و روشهای حل بازی‬
‫در سال ‪ L. Victor Allis ،۱۹۸۹‬در تز فوقلیسانس خود نشان داد که‬
‫برای صفحهی ‪ ۷‬ستونه و ‪ ۶‬سطره‪ ،‬نفر اوّل استراتژی برد دارد‪James D .‬‬
‫ال این مهم را به تفصیل نشان دادهاست )و‬
‫‪ Allen‬نیز در سال ‪ ۱۹۹۰‬مستق ً‬
‫اینجا(‪.‬‬
‫برای این بازی‪ ،‬برنامههای مختلفی نوشته شد است‪ .‬یک نمونه از این‬
‫برنامهها که به زبان ‪ C‬توسّط ‪ Giuliano Bertoletti‬تهیه شده‪ Velena ،‬نام‬
‫دارد‪.‬‬
‫با این وصف‪ ،‬از شما خواسته شده که یک »بازیکننده« برای این بازی بنویسید‪.‬‬
‫صفحهی ‪ ۲‬از ‪۵‬‬
‫‪ ۲‬صورت دقیق مسئله برای پیادهسازی‬
‫‪ ۲٫۱‬حالت کلّی مسئله‬
‫در اکثر برنامهها و استراتژیهای رایج‪ ،‬صفحهی بازی ‪ ۷‬ستون و ‪۶‬‬
‫سطر دارد و کسی برندهاست که ‪ ۴‬مهرهی متوالی )در قطر‪ ،‬سطر یا‬
‫ستون( از رنگ خودش بسازد؛ اما شما باید بازی را برای حالت کلّی حل‬
‫کنید‪.‬‬
‫برنامهی شما باید با دریافت شرایط صفحه و بازی‪ ،‬بهصورت‬
‫محاورهای‪ ۲‬بازی را انجام داده و سعی کند برنده شود‪ .‬برای ارزشیابی و‬
‫نمرهدهی به برنامهها‪ ،‬پس از بازی با انسان معمولی‪ ،‬آنها با یکدیگر‬
‫بهرقابت خواهند پرداخت و برنامههای برتر‪ ،‬نمرهی اضافی میگیرند!‬
‫‪ ۲٫۲‬ورودی و خروجی مسئله‬
‫ورودی مسئله باید از ورودی استاندارد‪ ۳‬خوانده شده و خروجی مسئله نیز در خروجی استاندارد‪ ۴‬نوشته شود‪.‬‬
‫در ابتدای بازی‪ ،‬به برنامهی شما سه عدد ‪ m ،n‬و ‪) k‬از چپ به راست( داده میشود که بهترتیب بیانگر تعداد‬
‫ستونها‪ ،‬تعداد سطرها و تعداد مهرههای متوالی الزم برای برد )که الزام ًا ‪ ۴‬نیست( هستند‪ .‬بهعنوان مثال‬
‫برای »چهار م ّتصل« عادی‪ ،‬ابتدای ورودی بهشکل زیر است‪.‬‬
‫‪7 6 4‬‬
‫پس از آن در صورتیکه برنامهی شما قرارست اوّلین حرکت را انجام دهد‪ ،‬در یک سطر کلمهی ‪) START‬با‬
‫حروف بزرگ( به آن داده میشود‪.‬‬
‫برنامهی شما باید در هر حرکت خودش‪ ،‬شمارهی ستونی که قصد دارد مهرهای در آن ستون بیاندازد را در یک‬
‫سطر در خروجی استاندارد بنویسد‪ .‬شمارهی ستونها از صفر تا ‪ n − 1‬است‪.‬‬
‫پس از اوّلین حرکت )که با گفتن ‪ START‬انجام میپذیرد(‪ ،‬برنامه در ابتدای نوبت خودش‪ ،‬یک عدد باید از‬
‫ورودی بخواند که حرکت حریف در نوبت قبلی بوده است‪ ،‬آنگاه پس از مدت معقولی تجزیه و تحلیل‪ ،‬باید شمارهی‬
‫ستون مورد نظر خودش را در خروجی بنویسد‪ .‬دقّت کنید که اگر برنامهی شما بازیکن دوم باشد‪ ،‬در اوّلین‬
‫حرکتش ابتدا حرکت قبلی حریف )و نه ‪ (START‬را میخواند‪.‬‬
‫اگر برنامهی شما پس از دریافت ورودی )حرکت حریف( به این نتیجه رسید که باخته است‪ ،‬حتم ًا باید در یک‬
‫سطر )بهجای حرکت خودش( عبارت !‪ ۷) I LOST‬کاراکتر با حروف بزرگ و عالمت تعجب در انتها( را چاپ کند‪.‬‬
‫نیز در صورتی که پس از انجام دادن حرکتش برنده شد‪ ،‬باید بالفاصله پس از انجام حرکت و نوشتن شمارهی ستون‬
‫خروجیاش‪ ،‬عبارت !‪ ۶) I WON‬کاراکتر با حروف بزرگ( را چاپ کند‪.‬‬
‫نیز اگر حرکت حریف شما در لحظهای غیر معتبر بود )خارج از محدودهی ستونها یا روی یک ستون پُر( باید‬
‫بهجای حرکت خودتان در خروجی‪ ،‬عبارت !‪ ۱۳) ILLEGAL MOVE‬کاراکتر با حروف بزرگ( را چاپ کنید‪.‬‬
‫‪2‬‬
‫‪Interactive‬‬
‫‪Standard Input: cin in C++ & System.in in Java‬‬
‫‪4‬‬
‫‪Standard Output: cout in C++ & System.out in Java‬‬
‫‪3‬‬
‫صفحهی ‪ ۳‬از ‪۵‬‬
‫توجه کنید که‪:‬‬
‫•‬
‫میتوانید فرض کنید ‪ 5 ≤ k ≤ m, n ≤ 27‬و نیز ‪. k ≤ 10‬‬
‫•‬
‫برنامهی شما باید در هر حرکت حداکثر ‪ ۵۰۰‬میلیثانیه )روی یک سیستم ‪(AMD PIII 800Mhz‬‬
‫فکر کند‪ .‬پس از این مدت‪ ،‬برنامهی شما در صورت ندادن خروجی‪ ،‬کلّهپا میشود‪.‬‬
‫•‬
‫•‬
‫برنامهی شما حداکثر ‪ ۵۰‬مگابایت حافظه میتواند مصرف کند‪.‬‬
‫راهنمایی‪ :‬میدانید که عمق بیشتر جستجو‪ ،‬بازی هوشمندانهتری را نتیجه میدهد‪ .‬جستجوی‬
‫عمیقتر نیز نیازمند نگهداری بهینهتر صفحات در حافظه است‪ .‬برای استفادهی بهینه از حافظه نیز میتوان‬
‫هر ستون را )برای هر مقداری از مهرهها( در یک واحد ‪ ۳۲‬بیتی ‪ integer‬ذخیره کرد!‬
‫‪ ۳‬سیاست نمرهدهی‬
‫‪ ۳٫۱‬نمرهی خام‬
‫این تمرین نمرهی تشویقی مجزّا ندارد‪ .‬صرف ًا برنامههایی که در مسابقه‬
‫بتوانند نتایج بهتری را کسب کنند‪ ،‬نمرهی اضافی میگیرند‪.‬‬
‫این تمرین الزام ًا باید در گروههای دو نفری انجام شود‪.‬‬
‫نمرهی شما در این تمرین )بهترتیب( به گزارش‪ ،‬ایدهها و الگوریتمهای‬
‫پیادهسازی شده و نهایت ًا رقابت برنامهی شما بستگی دارد‪.‬‬
‫‪ ۳٫۲‬نمرهی منفی!‬
‫از آنجا که کُد آمادهی این بازی‪ ،‬در جایجای اینترنت یافت میشود‪،‬‬
‫سیاست نمرهی منفی در رابطه با این بازی شدیدتر خواهد بود‪ .‬تمامی‬
‫گروهها)ی ‪ ۲‬نفره( تحویل حضوری خواهند داشت و هر دو نفر میبایست بر‬
‫تمامی پروژه مسلّط باشند‪.‬‬
‫نیز تمامی الگوریتمهای پیادهسازی شده و ساختار کلّی برنامه میبایست‬
‫بهدقّت در گزارش توضیح داده شوند‪.‬‬
‫) ‪( 9−d‬‬
‫تأخیر همچنان از رابطهی‬
‫‪ log10‬که ‪ 1 ≤ d ≤ 8‬محاسبه میشود‪.‬‬
‫‪ ۳٫۳‬تحویل ارسالی‬
‫فایل ارسالی شما باید الزام ًا یک فایل ‪ zip‬با نام ‪) EX4-83101234-82101234.zip‬که در آن شمارهی‬
‫دانشجویی افراد نویسندهی پروژه بهجای اعداد نمونه قرار گرفتهاند( باشد‪.‬‬
‫موارد مورد نیاز برای تحویل‪ ،‬که میبایست در فایل ‪ zip‬گردآوری شوند‪ ،‬عبارتند از‪:‬‬
‫•‬
‫ُکد برنامه‬
‫•‬
‫یک فایل ‪ report.doc‬یا ترجیح ًا ‪ report.pdf‬که در آن توضیح جامعی دربارهی توابع‪،‬‬
‫کالسها و ‪ ...‬دادهاید‪ .‬عالوه بر آن در فایل ‪ report‬شما میبایست شرح جامعی از الگوریتمها و‬
‫صفحهی ‪ ۴‬از ‪۵‬‬
‫ایدههای بهکار برده شده بنویسید‪ .‬برای مثال عمق جستوجوی ‪ ،MINIMAX‬توصیف دقیق تابع‬
‫مقداردهی به حالتها و نحوهی نگه داری حالت)صفحه(ها در حافظه از نکات بسیار مهم‬
‫میباشند‪ .‬دقّت کنید که قسمت قابل مالحظهای از نمرهی تمرین شما به این بخش اختصاص مییابد‪.‬‬
‫فایل ارسالی خود را حداکثر تا موعد مقرّر به آدرس ‪ [email protected]‬ارسال کنید؛ در غیر اینصورت‬
‫بهمدت یک هفته مشمول بند تأخیر شده و پس از آن بههیچ وجه نمرهای دریافت نخواهید کرد‪.‬‬
‫‪ ۴‬کمک!‬
‫برای رفع ابهامات مسئله یا مشکالت پیادهسازی و ‪ ...‬در رابطه با این‬
‫تمرین با ‪ [email protected]‬تماس بگیرید‪.‬‬
‫توصیه میشود قبل از ارسال نهایی‪ ،‬خودتان یک دست با برنامه‬
‫بازی کنید و مطمئن شوید میتواند شما را شکست دهد!‬
‫»پایان«‬
‫صفحهی ‪ ۵‬از ‪۵‬‬