ﺑﻪﻧﺎﻡ ﺧﺪﺍ تمرین عملی سوم درس »مقدمهای بر هوش مصنوعی« نیمسال بهار ۸۵-۸۶ ) ۲۰فروردینماه (۱۳۸۶ مقایسهی روشهای مختلف حل »مسئلهی ارضای قیدها« ۱ در معمای »سوداکو« موعد تحویل ۲۷ :فروردینماه ۱۳۸۶بدون تأخیر یا کار اضافی؛ ۳اردیبهشتماه با تأخیر یا کار اضافی 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میبایست آمده باشد. فایل ارسالی خود را حداکثر تا تاریخ ۸۶/۱/۲۷به آدرس ce417a@gmail.comارسال کنید؛ در غیر اینصورت بهمدت یک هفته مشمول بند تأخیر شده و پس از آن بههیچ وجه نمرهای دریافت نخواهید کرد. درصورتی که قصد دارید موارد تشویقی را انجام دهید ،حتم ًا باید مورد)های( خود را دقیق ًا انتخاب کرده و پیش از فرا رسیدن موعد اوّل ) ۲۷فروردین( آنها را اعالم کنید .در این صورت مهلت ارسال برای شما بهمدّت یکهفته )تا پایان بند تأخیر سایرین ،یعنی سوم اردیبهشت( تمدید خواهد شد و دیگر مهلت ارسال با تأخیر نخواهید داشت. ۴٫۲تحویل حضوری • هر یک از افراد نویسندهی پروژه ،میبایست اشراف کامل و جامع بر پیادهسازی کار داشته باشند .این مهم در طی تحویل حضوری )در صورت لزوم( بررسی خواهد شد. ۴٫۳بیشتر! از آنجا که »سوداکو« یک مسئلهی 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 • • • • ۵کمک! برای رفع ابهامات مسئله یا مشکالت پیادهسازی و ...در رابطه با این تمرین با aideen@gmail.comتماس بگیرید. !Soduko »پایان« صفحهی ۶از ۶
© Copyright 2025 Paperzz