به نام یگانه هستی بخش هوش مصنوعی مدرس :سلیمانی تمرین 3 دانشکده مهندسی کامپیوتر موعد تحویل تمرین تئوری 23 :اسفند قبل از کالس درس موعد تحویل تمرین عملی 28 :اسفند ساعت 24 تمرین تئوری سوال 6( - 1نمره) در صورتی که الگوریتم Simulated Annealingبرای یافتن کمینهی مطلق با هرکدام از شرایط زیر روبهرو شود ،باید چه تغییری را در Cooling Scheduleانجام داد؟ )aالگوریتم معموالً در کمینهی موضعی گیر میکند. )bالگوریتم زمان بسیار زیادی را صرف پیدا کردن جواب میکند. )cمیدانیم که تابع هزینه ،محدب ( )convexاست و میخواهیم جواب را در زمان کمتری پیدا کنیم. سوال 14( - 2نمره) میخواهیم با استفاده از الگوریتمهای Simulated Annealingو Genetic Algorithmبرای مسائل زیر جواب مناسبی بیابیم .عملگرهای این دو الگوریتم را (برای :SAنمایش حالتها ،تابع هزینه و یافتن همسایهها و برای :GAنمایش کروموزومها ،تابع هزینه ،تولید مثل و جهش) برای هر مسئله توضیح دهید. )aمسئلهی رنگآمیزی گراف :میخواهیم رأسهای یک گراف را با حداقل تعداد رنگ ،رنگآمیزی کنیم به طوری که هیچ دو رأس مجاوری همرنگ نباشند .مطلوب است رنگ هر رأس. )bمسئلهی فروشندهی دورهگرد :تعدادی شهر داریم و هزینه رفتن مستقیم از هر شهر به دیگری را میدانیم. مطلوب است کمهزینهترین مسیری که از یک شهر شروع شود و از تمامی شهرها دقیقاٌ یکبار عبور کند و به شهر شروع بازگردد. سوال 10( - 3نمره) روباتی در یک جدول 3x3به شکل زیر است .روبات در هر لحظه یک Perceptionدارد که او را از رنگ خانهی فعلی مطلع میسازد B( .برای رنگ آبی و Rبرای رنگ قرمز) سپس یک – Actionکه حرکت به یکی از جهات باال پایین ،چپ و یا راست است – را انجام میدهد .دورِ جدول دیوار کشیده شده است .در صورتی که روبات در خانههای کناری باشد و بخواهد به سمت دیوار حرکت کند ،حرکتش بیاثر خواهد بود و در همان خانه میماند. مکان اولیهی روبات نامعلوم است و فقط میدانیم نتیجهی اولین B ،Perceptionاست. )aیک گراف And-Orرسم کنید و با استفاده از آن ،پس از حداکثر 3حرکت ،مکان اولیهی روبات را بیابید( .نیازی نیست که پس از یافتنِ مکانِ اولیه ،به آن بازگردید) )bآیا این گراف دور دارد؟ )cآیا میتوان با تعداد حرکت کمتری مکان اولیه را یافت؟ اگر راهی هست ،گرافِ آن را رسم کنید و در غیر این صورت دلیل آن را بیان کنید. سوال 10( - 4نمره) فرض کنید روباتی در جدولی 3x3قرار دارد .دور جدول کامالً دیوار کشیده شده است .عالوه بر این بین بعضی از خانههای جدول هم دیوار وجود دارد .مثالً جدولِ زیر چهار دیوار داخلی دارد: فرض کنید وضعیت دیوارهای داخلی در ابتدا مشخص نیست .در هر لحظه ،روبات یک حرکت به یکی از چهار جهت انجام میدهد و پس از آن از دیوارهای داخلیِ چهار طرفِ خود مطلع میشود .مکان اولیهی روبات و هدف مشخص است .اگر از الگوریتم online DFSاستفاده شود و شمارهگذاری وضعیتها به صورت زیر باشد ،مشخص کنید که وضعیتها با چه ترتیبی در طول این الگوریتم مالقات میشوند (در شرایط یکسان بین کنشها ترتیب باال ،پایین ،چپ و راست را برای اعمال شدن در نظر بگیرید). تمرین عملی ( 20 + 60نمره) معرفی مسئله بازی لولهکشی – که در لینوکس KPlumberو در ویندوز Linkzنامیده میشود – یک پازل جدولی است .هر خانه از جدول دارای صفر الی چهار لوله است که در چهار طرف آن قرار دارند و در وسط خانه یکدیگر را قطع میکنند .به یک لوله در صورتی «باز» گفته میشود که در خانهی مجاور به هیچ لولهای متصل نباشد .برای آشنایی بیشتر عکسهای زیر را ببینید: شکل 1یک جدول 5در - 5شیری که روی یکی از خانه ها نصب شده تنها جنبه ی تزیینی دارد و نقشی در بازی ندارد! شکل 2لولههای باز با دایرهی قرمز مشخص شده اند. بازیکن میتواند در هر حرکت ،یک خانه را 90درجه در جهت حرکت عقربههای ساعت بچرخاند .هدف بازی چرخاندن خانههای جدول به صورتی است که در نهایت هیچ لولهای باز نباشد. شکل 3حالت نهاییِ شکل .1 ثابت شده است که این بازی در حالت کلی (در صورت امکانِ وجودِ همهی انواع خانهها) NP-Completeاست. 1 از طرفی تعداد حالتها هم در بدترین شرایط زیاد است 4n( .که nتعداد خانههای جدول است ).بنابراین در این تمرین قصد داریم این مسئله را با الگوریتم ژنتیک و Simulated Annealingحل کنیم. توضیحات کد بخشهایی از کد که مربوط به تعریف مسئله ،ساختن جدول و استفاده از الگوریتمهای شما برای حل مسئله است، قبالً نوشته شده و پیادهسازی الگوریتمهای ژنتیک و SAبرعهدهی شما گذاشته شده است. کالسهایی که باید شما تغییر دهید ،کالسهای Chromosomeو GASolverبرای الگوریتم ژنتیک و کالس- های Stateو SASolverبرای الگوریتم SAهستند. مستندِ کد در زیر آمده است: کالس Tile این کالس برای نمایش یک خانه از جدول به کار میرود .در سازندهی کالس به صورت زیر: )public Tile(boolean top, boolean bottom, boolean left, boolean right هر کدام از پارامترها مشخص میکنند که در جهت گفته شده لولهای وجود دارد یا خیر. )public Tile(Tile other این سازنده ،یک خانهی جدید مشابه خانهی داده شده درست میکند. )(public boolean hasTop )(public boolean hasBottom )(public boolean hasLeft )(public boolean hasRight http://www.sciencedirect.com/science/article/pii/S0304397503005954 1 این توابع بودن یا نبودنِ لوله در جهت مشخص شده را برمیگردانند. )(public void rotateClockwise این تابع خانه را 90درجه در جهت حرکت عقربههای ساعت میچرخاند .دقت کنید که این تابع همان Tileرا تغییر میدهد و شی جدیدی برنمیگرداند( .کالس Immutable ،Tileنیست). )public int cntRotates(Tile other مشخص میکند که این خانه چند بار باید با تابع قبلی بچرخد تا به وضعیت otherبرسد .در صورتی که با چرخیدن نتوان از این خانه به وضعیت otherرسید ،مقدار 4برگردانده میشود .در غیر اینصورت مقادیر 0الی 3برگردانده میشوند( .این تابع ،خانه را تغییر نمی دهد و فقط تعداد چرخشها را محاسبه میکند). )public boolean isEqual(Tile other یکی بودنِ این خانه با خانهی داده شده را بررسی میکند .به جای عملگر == یا تابع equalsاز این تابع استفاده کنید. کالس ProblemGenerator این کالس برای ساختن مسئله استفاده میشود .برای تست کردن کدتان میتوانید با استفاده از این کالس ،مسئله طراحی کنید. )public static Tile[][] generate(int rowCnt, int colCnt این تابع یک جدول تصادفیِ قابلِ حلشدن با تعداد سطر و ستون دادهشده میسازد. )(public static Tile[][] myProblem با تغییر این تابع میتوانید خودتان به صورت hard-codeیک مسئله مشخص کنید .خانههای جدول را مانند مثال مشخص شده در کد ،تعریف کنید rowCnt .تعداد سطرها و colCntتعداد ستونها را مشخص میکند. در ] rows[iخانههای سطر iام را مشخص کنید .هر خانه با 0الی 4حرف از حروف t ،l ،rو bمشخص میشود که هر کدام نشان میدهند در یک طرفِ خانه ،لولهای وجود دارد .به جای خانهی خالی (خانهای که لولهای ندارد) یک حرف xبگذارید و خانههای هر سطر را با ,از یکدیگر جدا کنید. کالس Main در این کالس یک نمونه تابع mainنوشته شده که الگوریتم GAیا SAرا اجرا میکند و نتیجه را چاپ میکند. برای تغییر الگوریتم استفاده شده method ،را در خط دوم تابع تغییر دهید. ;private final static int rowCount = 4 ;private final static int colCount = 4 این دو مقدار ،تعدادِ سطر و ستون را برای تولید مسئلهی تصادفی در ProblemGeneratorمشخص میکنند. ;private final static int maxTries = 1 در هنگام تست میتوانید این مقدار را افزایش دهید تا در صورتی که الگوریتم به جواب نرسید ،چند بار دیگر هم روی مسئله اجرا شود. )public static void printTable(Tile[][] table این تابع جدول داده شده را چاپ میکند .هر خانهی جدول با چهار حرفِ T ،R ،Lو Bمشخص میشود که هر کدام نشان میدهند در یک طرفِ خانه ،لولهای وجود دارد. )public static void printRes(Tile[][] result, Tile[][] problem این تابع ،جدولِ problemو جدولِ resultرا چاپ میکند .همچنین نشان میدهد که هر کدام از خانههای جدولِ problemباید چند بار بچرخند تا به حالتِ خود در جدولِ resultبرسند .در حالت عادی تعداد چرخشها عددی از 0تا 3است و در صورتی که نتوان از یک خانهی problemبه خانهی متناظر در resultرسید ،عدد 4برای آن خانه چاپ میشود .وجود عدد 4نشان میدهد که در ساختنِ جدولِ resultاشتباهی رخ داده است. کالس Chromosome این کالس – که نشاندهندهی یک کروموزوم در الگوریتم ژنتیک است – را باید شما طراحی کنید و از آن در کالسِ GASolverاستفاده کنید. کالس State این کالس – که نشاندهندهی یک حالت در Simulated Annealingاست – را باید شما طراحی کنید و از آن در کالسِ SASolverاستفاده کنید. کالس GASolver در این کالس قرار است الگوریتمِ ژنتیک پیادهسازی شود و در تابع mainاز آن استفاده شود .توابع داده شده باید طراحی شوند .عالوه بر آنها میتوانید خودتان هم توابع و فیلدهایی در این کالس تعریف و از آنها استفاده کنید. )public GASolver(Tile[][] problem این تابع سازندهی کالس است و یک جدول به عنوان ورودی میگیرد. )(public void runAlgorithm این تابع ،الگوریتمِ ژنتیک را روی مسالهی داده شده اجرا میکند و جدول جواب را در جایی ذخیره میکند. )(public Tile[][] getResult این تابع ،در صورتی که قبالً تابع runAlgorithmفراخوانی شده باشد ،حاصل آن را برمیگرداند. )(public boolean isSuccessful این تابع ،در صورتی که قبالً تابع runAlgorithmفراخوانی شده باشد ،نشان میدهد که آیا الگوریتم موفق به حل مسئله شده است یا خیر. )(public void initialize این تابع باید طراحی شود و در ابتدای الگوریتم فراخوانی شود تا یک جمعیت اولیه ایجاد کند. )(public Chromosome[] selectParents کروموزومهای Parentرا از میان جمعیت انتخاب میکند تا تولیدمثل کنند. )public Chromosome reproduce(Chromosome[] parents کروموزومهای Parentرا میگیرد و فرزند (نتیجهی تولیدمثل) را برمیگرداند. )public Chromosome mutate(Chromosome chrom یک کروموزوم میگیرد و نسخهی جهشیافتهی آن را برمیگرداند. کالس SASolver در این کالس قرار است الگوریتمِ Simulated Annealingپیادهسازی شود و در تابع mainاز آن استفاده شود .توابع داده شده باید طراحی شوند .عالوه بر آنها میتوانید خودتان هم توابع و فیلدهایی در این کالس تعریف و از آنها استفاده کنید. )public SASolver(Tile[][] problem این تابع سازندهی کالس است و یک جدول به عنوان ورودی میگیرد. )(public void runAlgorithm این تابع ،الگوریتمِ ژنتیک را روی مسالهی داده شده اجرا میکند و جدول جواب را در جایی ذخیره میکند. )(public Tile[][] getResult این تابع ،در صورتی که قبالً تابع runAlgorithmفراخوانی شده باشد ،حاصل آن را برمیگرداند. )(public boolean isSuccessful این تابع ،در صورتی که قبالً تابع runAlgorithmفراخوانی شده باشد ،نشان میدهد که آیا الگوریتم موفق به حل مسئله شده است یا خیر. )(public double getTemperature دمای فعلی را برمیگرداند. )(public void cool پس از هر iterationفراخوانی میشود و دما را کاهش میدهد .به عبارتی دیگر ،این تابع Cooling Schedule را مشخص میکند. )public State getRandomSuccessor(State s یک حالت میگیرد و یکی از حاالت مجاورش را به صورت تصادفی برمیگرداند. نکات در هنگام نمرهدهی ،تنها فایلهای State ،GASolver ،Chromosomeو SASolverاز کد شما استفاده میشوند و فایلهای دیگر مشابهِ کدِ آماده خواهند بود .بنابراین برای پیادهسازی الگوریتمِ خود فایلهای دیگر را تغییر ندهید .همچنین در صورتی که برای تست ،فایل دیگری را تغییر دادید، در نهایت باید الگوریتم شما با فایل اولیه قابل اجرا باشد. مستندی شامل توابعی که تعریف کردهاید یا تغییر دادهاید و همچنین روشِ پیادهسازی الگوریتمها و شیوههای اتخاذ شده ،به همراه کد بفرستید. این بخش در کل 20+60نمره دارد که 35نمره از آن مربوط به مستند و کدِ الگوریتم ژنتیک25 ، نمره مربوط به مستند و کدِ الگوریتمِ Simulated Annealingو 20نمرهی دیگر مربوط به حاصلِ اجرای کد روی مسائلِ نمونه است. هرگونه سوال دربارهی تمرین را به آدرس [email protected]ارسال نمایید. در صورت مشاهده هر گونه تقلب نمره تقلب کننده و گیرنده 0منظور شده و به استاد معرفی می شوند. موفق باشید
© Copyright 2025 Paperzz