ورود

نسخه کامل مشاهده نسخه کامل : پازل N



فاطـمه
23-05-2009, 09:31
سلام بچه ها
من باید برنامه پازل n رو با الگوریتمهای مختلف بنویسم(bfs,dfs,a*,idf,...)
ولی مشکلم اینجاست که اصلا نمی دونم چه استراتژی برای جست و جو داشته باشم
مثلا برای مسئله nqueen در حالت افزایشی یکی یکی q ها رو اضافه می کردیم ، تو هر سطر یکی می ذاشتیم و تو حالتای ضربدری چک می کردیم
ولی این رو نمی دونم چه جوری حل کنم
اگر راهنمایی کنید ممنون میشم

واسه دوستانی که ممکنه ندونند npuzzle چیه توضیح می دم این قسمت رو:
یه پازل داریم با N تا خونه مثلا تو حالت n=9 یه پازل 3*3 داریم تو خونه ها اعداد 1و8 رو به صورت نا مرتب داریم و یه خونه خالی
که این برنامه باید خودش خونه ها رو مرتب کنه
و ترتیب اعمالی رو که انجام داده بده:41:

ali.sholug
23-05-2009, 10:38
سلام

ببین اینجوری میشه؟

پازل رو یه ماتریس در نظر بگیر

تمام سطر هارو مرتب کن
بعد تمام ستونهارو مرتب کن
عنصر آخر هر سطر رو با عنصر اول سطر بعدی مقایسه کن
اگه کوچیک بود سطر بالایی مرتب شده
اگه نه جای این عنصر ها رو عوض کن
اه واسه همه سطر ها شرط بالا درست بود ماتریست مرتبه
ای کارو واسه سطر های پایین هم انجام بده
بعد دوباره
تمام سطر هارو مرتب کن
و تمام ستونهارو مرتب کن

ali.sholug
23-05-2009, 10:41
یا اینکه میتونی از اول هر عدد رو برداری ببری سر جاش بذاری وقتی به n/2 +1 عضو رسیدی ماتریست مرتبه

امتاحانش کن هر دو روشو

موفق باشی

فاطـمه
23-05-2009, 10:44
نه دیگه اینا نمیشه
اگه این بازی رو انجام داده باشی
می بینی که با توجه به خونه خالی حرکاتی که می تونی انجام بدی خیلی محدوده
یعنی همیشه بین 2-4 حرکت فقط وجود داره واسه انتخاب
بچه ها خیلی فوریه لطفا کمک

hamidreza_buddy
23-05-2009, 18:15
اینارو واسه 8puzzle توضیح می دهم.
ببین شما state فعلیت یه حالت رندومه. اگه خونه وسطی خالی باشه، چهار تا حرکت می تونید انجام بدید.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اگه مثلاً خونه پایین سمت راست خالی باشه دو حرکت قابل انجامه.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
پس شما به یک تابع نیاز دارید که بتونه حالت های بعدی حالت فعلی رو به دست بیاره. اسم این تابع رو می گذاریم succ (مخفف successor یا بعدی)
این تابع اینجوری اجرا میشه که حالت فعلی و می گیری و حالت بعدی رو می ده (این تابع توی همه این الگوریتم هایی که شما قصد پیاده سازیش رو دارید مشترکه)

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
البته ساختمان داده State چیزی نیست جز یه آرایه دو بعدی (یا حتی یک بعدی)
خوب! حالا که اینو داریم ما می آیم و استراتژی های جستجو رو که توی کتاب هوش مصنوعی هست و می نویسیم.
مثلاً واسه A* باید از یک تابع heuristic استفاده کنیم (فاصله منهتن یا فاصله قطری ...)
این تابع یه همچین شکلی داره:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خوب! حالا تابعای اصلی رو داری.
می آی از حالت اولیه شروع می کنی و همه همسایه هاشو بوسیله Succ به دست می آری. بعدش می آی و روی اون همسایه ها تابع Heuristic رو اجرا می کنی و واسه هر کدوم یه امتیاز به دست می آری. حالا از بین حالات همسایه هر کدوم که امتیاز بهتری رو داره (توی A* باید امتیاز Heuristic رو با path طی شده جمع کرد) رو انتخاب و دوباره همون کار بالا رو روش انجام می دی.

در نتیجه این جستجوی A* یه جورایی هوشمند هست (البته نه خیلی)

bfs و dfs هم که هیچی! فقط همسایه هارو با Succ تولید می کنی و اونا رو با یه ترتیبی (بسته به اینکه سطح اولند یا عمق اول) پیمایش می کنی. پیمایش هم یعنی اینکه Succ رو رو این حالات همسایه به دست آمده اجرا می کنیم و بررسی مکی کنیم که آیا به حالت هدف رسیده ایم؟ یعنی به حالت زیر:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
هر وقت هم به حالت هدف رسیدید، درخت جستجو را تا بالا پیمایسش می کنید تا ترتیب حرکت ها رو به دست بیاری.
همین!

idf هم که همون dfs هست که اونو محدود می کنیم به یه عمق خاص (تا اونجایی که یادم باشه)!

DaneshD
24-05-2009, 02:02
خیلی ساده هست. حتما میتونی تو زمان کمی انجام بدی. این دوستمون hamidreza_buddy هم توضیحات بالارو از این سایت آورده و البته به خوبی توضیح داده:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

که الگوریتمش هم اونجاست. سورس کدش هم رو اینترنت هست که البته ندونی کجاست بهتره تا خودت انجام بدی و یه چیزی یاد بگیری.

راهنمایی: مساله رو به Maze تبدیل کن. Maze همون بازی بود که از یک نقطه به یک نقطه دیگه باید بری تو یک مسیر مارپیچ. خونه خالی رو فرض کن که باید تکون بدی تا برسه به مرکز که اطرافش خونه های مرتب شده puzzle هست. برای ثبت حرکات هم از یک counter استفاده کن. طول counter هم برابر با 2 به توان n هست که n تعداد خونه های puzzle هست که میشه 9 برای یک puzzle با سایز 3x3. هر بار که counter یکی میره بالا در واقع یک حرکت جدید رو امتحان کردی. تقریبا حل شد!

فاطـمه
24-05-2009, 08:42
سلام دوست من ،( اول از همه از اینکه وقت گذاشتین خیلی ممنون)
خب اینا همه درست
ولی مشکل من اینجاست که مثلا تو حالت bfs که باید جست و جوی اول سطح داشته باشیم
چه جوری درخت رو تشکیل بدیم؟
مثلا سطح اول (با فرض وسط بودن خونه خالی) یه بار به راست ، یه بار به چپ، یه بار به پایین و یه بار به بالا می ریم
خب تو سطح دو چکار کنیم؟
اونی که سطح اول به راست رفته از کجا بفهمیم که سطح دوم کدوم طرفی حرکت کنه؟
این کار رو باید رندوم انجام بدیم؟
اگر فرضا واسه حالتای bfs و dfs این کار رو رندوم انجام بدیم تو حالت a* که حالت آگاهانه رو داریم باید چکار کنیم؟!

hamidreza_buddy
24-05-2009, 21:38
ببینید درخت جستجو تقریباً یه چیزه مجازیه!
یعنی شما واقعاً یه درخت نمی سازید
بلکه با فراخوانی های بازگشتی برنامه شما حالت یک درخت می گیره. مثلاً شما یه تابع به اسم Solve می نویسی که ورودیش یه حالته.
سپس توی مثلاً bfs دوباره اون رو روی همسایه های اجرا می کنی که در نتیجه یه درخت حالت به وجود می آد:

شبه کد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

یا مثلاً DFS:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

یا مثلاً A*:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

می بینید که ساختمان داده درخت نداریم ولی فراخوانی بازگشتی توابع به صورت درخت است.

فاطـمه
25-05-2009, 14:55
ببینید درخت جستجو تقریباً یه چیزه مجازیه!
یعنی شما واقعاً یه درخت نمی سازید
بلکه با فراخوانی های بازگشتی برنامه شما حالت یک درخت می گیره. مثلاً شما یه تابع به اسم Solve می نویسی که ورودیش یه حالته.
سپس توی مثلاً bfs دوباره اون رو روی همسایه های اجرا می کنی که در نتیجه یه درخت حالت به وجود می آد:

شبه کد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

یا مثلاً DFS:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

یا مثلاً A*:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

می بینید که ساختمان داده درخت نداریم ولی فراخوانی بازگشتی توابع به صورت درخت است.
سلام دوست من
از راهنمایی تون واقعا ممنون
من برنامه bfs رو نوشتم
خطا نداره ، بعضی اوقاتم جواب می ده
ولی به نظر خودم کاملا درست کار نمی کنه
اگه ممکنه یه نگا بندازین:20:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

hamidreza_buddy
25-05-2009, 16:08
سلام
من متاسفانه کامپایلر ندارم
اگه خطا نداره که هیچی
ولی اگه جواب نمی ده عجیب نیست
چون پازل های N-PUZZLE همیشه به دو فضای حالت قابل حل و غیر قابل حل تقسیم می شوند. یعنی برای نصف حالت ها «به هیچ وجه» نمیشه به حالت هدف رسید.

همچنین برای اون نصفی که میشه رسید، عمق درخت جستجو می تونه تا 24 (یعنی 24 حرکت) برسه. که فضای جستجو به صورت نمایی زیاد می شه . یعنی اگر هر حالت فقط دو حالت همسایه داشته باشد (که اینطور نیست و بعضی ها سه یا چهار حالت همسایه دارند)، 2 به توان 24 می شود خیلی!!! یعنی اصلاً شما برای اینکار هم حافظه و هم قدرت پردازش کم می آورید.
در نتیجه bfs «در تئوری» برای همه حالات «قابل حل» جواب به دست می آورد ولی «در عمل» برای تعداد خیلی محدودی از اون نصف حالات قابل حل می تونه کار کنه. مثلاً برای اونایی که عمقشون 6-7 باشه (6-7 حرکت لازم داشته باشن تا برسن به حالت هدف).

برای همینه که از روش های هوشمند مثل A* استفاده می شه. چون این روش ها فضای جستجو رو به میزان بسیار زیادی محدود می کنند و در نتیجه سرعت جستجو خیلی خیلی بالاتر می ره (البته A* مشکل حافظه داره و نه قدرت پردازش). یعنی بعد از مدتی حافظه رو پر می کنه. البته توی کتاب هوش مصنوعی راسل روش هایی برای حل این مشکل ارائه شده مثل ids و ...

فاطـمه
25-05-2009, 16:58
سلام
من متاسفانه کامپایلر ندارم
اگه خطا نداره که هیچی
ولی اگه جواب نمی ده عجیب نیست
چون پازل های N-PUZZLE همیشه به دو فضای حالت قابل حل و غیر قابل حل تقسیم می شوند. یعنی برای نصف حالت ها «به هیچ وجه» نمیشه به حالت هدف رسید.

همچنین برای اون نصفی که میشه رسید، عمق درخت جستجو می تونه تا 24 (یعنی 24 حرکت) برسه. که فضای جستجو به صورت نمایی زیاد می شه . یعنی اگر هر حالت فقط دو حالت همسایه داشته باشد (که اینطور نیست و بعضی ها سه یا چهار حالت همسایه دارند)، 2 به توان 24 می شود خیلی!!! یعنی اصلاً شما برای اینکار هم حافظه و هم قدرت پردازش کم می آورید.
در نتیجه bfs «در تئوری» برای همه حالات «قابل حل» جواب به دست می آورد ولی «در عمل» برای تعداد خیلی محدودی از اون نصف حالات قابل حل می تونه کار کنه. مثلاً برای اونایی که عمقشون 6-7 باشه (6-7 حرکت لازم داشته باشن تا برسن به حالت هدف).

برای همینه که از روش های هوشمند مثل A* استفاده می شه. چون این روش ها فضای جستجو رو به میزان بسیار زیادی محدود می کنند و در نتیجه سرعت جستجو خیلی خیلی بالاتر می ره (البته A* مشکل حافظه داره و نه قدرت پردازش). یعنی بعد از مدتی حافظه رو پر می کنه. البته توی کتاب هوش مصنوعی راسل روش هایی برای حل این مشکل ارائه شده مثل ids و ...

از پیگیری تون ممنون
اینایی که می گین درست
ولی من به کد خودم اطمینان ندارم
ببینید من تابع dfs رو این جوری نوشتم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
استفاده بازگشتی به این صورت درسته؟
با توجه به اینکه برنامه رو توی c++ نوشتم
واسه اجراش خیلی محدودیت حافظه دارم
فک کنم مجبور شم تبدیل به c# کنم
اجرا که بیشتر از 1000 میشه سیستم هنگ میکنه واسه همین اون sw رو گذاشتم

hamidreza_buddy
25-05-2009, 17:33
اگه توی توربو سی پلاس پلاس نوشتین شاید حافظه کم بیاره ولی توی vc++ 6 کامپایلش کنین مشکلی از نظر حافظه نخواهد داشت و نسبت به سی شارپ هم سریع تر خواهد بود!

حقیقتش من متوجه استفاده شما هز int a و متغییر path نشدم.

فکر می کنم دارید سعی می کنید که مسیر رو ذخیره کنید.

بهرته برای ذخیره مسیر هر وقت به حالت هدف رسیدید مثلاً 1 رو برگردونید و همین طور rewind کنید به بالا و اون حرکت رو ذخیره کنید.

به نظر من به جای dfs ، سعی کنید ids رو پیاده سازی کنید. چون dfs همین طور الکی پایین میره و احتمال به جواب رسیدنش خیلی کمه!

یعنی به جای متغییر سراسری sw، از یک متغییر به نام depth استفاده کنین که عمق رو حساب کنه و مثلاً اگه به عمق 25 رسید برگرده.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

وباید از مکان اولیه خونه خالی شروع کنی:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

البته من تصور می کنم که شما یک متغییر سراسری دارید که آرایه دو بعدیه توش جدول ذخیره شده.

همچنین جدول تستو یه جدول با راه حله کوچیک (تو مایه های 2-3) بده ببین الگوریتم حلش می کنه. و کم کم حرکت اضافش کن ببین که چقدر طول می کشه که حل بشه. مثلاً فک کنم تا 7-8 حرکت رو بیشتر نکشه.

فاطـمه
25-05-2009, 17:42
حقیقتش من متوجه استفاده شما هز int a و متغییر path نشدم.

فکر می کنم دارید سعی می کنید که مسیر رو ذخیره کنید.
بله از path برای ذخیره مسیر و از a برای نگهداری عمق استفاده کردم

به نظر من به جای dfs ، سعی کنید ids رو پیاده سازی کنید. چون dfs همین طور الکی پایین میره و احتمال به جواب رسیدنش خیلی کمه!

من باید به هر 4 الگوریتم dfs,bfs,a*,idf این برنامه رو بنویسم

به نظر من به جای dfs ، سعی کنید ids رو پیاده سازی کنید. چون dfs همین طور الکی پایین میره و احتمال به جواب رسیدنش خیلی کمه!

یعنی به جای متغییر سراسری sw، از یک متغییر به نام depth استفاده کنین که عمق رو حساب کنه و مثلاً اگه به عمق 25 رسید برگرده.

خب همین برگردون رو چه جوری انجام بدم
از روی path?!
---------
کدتون جالبه

فاطـمه
25-05-2009, 17:48
ببینید من ساختار ها رو این جوری تعریف کردم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

hamidreza_buddy
25-05-2009, 18:01
ببینید به کدی که من نوشتم دقیت کنید. هر وقت به جایی رسید که Goal باشه، 1 رو برمی گردونه. اینجوری همینجور مستقیم تا بالا می ره و می شه همه حرکات رو به یه لیست اضافه کرد.

اگه a داره عمق رو حساب می کنه ، باید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

همه

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

باشه.

همچنین به جای swap تو کد من دقت کنید.

همچنین به این دلیل گفتم ids رو اول پیاده سازی کنید این بود که بتونید الگوریتم رو امتحان کنید و نتایج رو ببینید که الگوریتم درسته یا نه.
و بعد از اون محدودیت عمق رو حذف کنید تا بشه dfs!
چون با dfs به نتیجه نمی رسه و نمی تونین متوجه شین که الگوریتم رو درست پیاده سازی کردین یا نه!

فاطـمه
26-05-2009, 11:03
از توضیحاتتون بازم ممنون به نکات ظریفی اشاره کردین که بهشون دقت نکرده بودم
الان امتحانش می کنم

فاطـمه
27-05-2009, 06:42
سلام کد dfs رو اصلاح کردم حالا دارم bfs رو می نویسم
ممکنه یه شبه کد واسه bfs هم مشابه اونی که واسه dfs گذاشتین بذارین

hamidreza_buddy
27-05-2009, 15:50
برای پیاده سازی BFS باید یه صف queue داشته باشید:
شبه کد کلیش. باید یه ساختمان داده صف و یا لیست پیوندی داشته باشید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

عــــلی
01-06-2009, 11:48
من باید به هر 4 الگوریتم dfs,bfs,a*,idf این برنامه رو بنویسم
سلام خسته نباشید میشه لطفاً بگید این dfs,bfs,a*,idf چی هستن؟
و اینکه با چه زبانی این پروژه رو میخواین؟ممنون.

فاطـمه
01-06-2009, 11:56
سلام دوست
هر 4 تاش رو نوشتم البته با c++ ، البته با راهنمایی دوستان
bfs : جست و جوی اول سطح
dfs: اول عمق
ids: اول عمق با عمق محدود
a* : هوشمند

عــــلی
01-06-2009, 13:23
سلام دوست
هر 4 تاش رو نوشتم البته با c++ ، البته با راهنمایی دوستان
bfs : جست و جوی اول سطح
dfs: اول عمق
ids: اول عمق با عمق محدود
a* : هوشمند

سلام ممنون ولی من یه خوردهشو خوب متوجه نشدم با عرض معذرت آخه نمیدونم:31:.من این پروژه رو واستون نوشتم به سه زبان نت امیدوارم به دردتون بخوره(ببخشید که دیر رسیدم دیگه):5::

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]سی شارپ(#C) دانلود پروژه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]سی پلاس پلاس(++C) دانلود پروژه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]ویژو ال بیسیک(Visual Basic)دانلود پروژه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدالبته کامله اگه برنده هم بشی پیغام میده.

فاطـمه
01-06-2009, 13:45
نه دوست من
من برنامه ای می خواستم
که خودش پازل رو خودش با اون الگوریتما حل کنه
به هر حال از لطف و توجه تون خیلی ممنونم
در ضمن برنامه رو نوشتم، بازم ممنون

كارمج
23-06-2009, 10:21
برنامه پيمايش يك درخت

فاطـمه
23-06-2009, 15:39
برنامه پيمايش يك درخت
برنامه ای که تو این تاپیک هست
خودش یه برنامه پیمایش درخته

mehdi_hoolakian
31-03-2010, 12:01
فاطمه خانم میشه برنامتونو بزارین ما هم استفاده کنیم؟

nasim mohebi
06-12-2011, 21:15
من فردا تحویل پروژه همین 4 تا روش رو دارم ،ای کاش این برنامه رو فاطمه خانم می ذاشتی ما هم استفاده می کردیم.:41: