مساعدة في مسألة المربع الفارغ

feras_flash

السلام عليكم

ياشباب أنا علقان بمشكلة و مو لاقي لها حل
يمكن تكون بسيطة بالنسبة لكم لكن أنا بالنسبة لي حاسس أني وصلت لطريق مسدود

المشكلة هي
عندي المسألة التالية :(مسألة المربع الفارغ)
أريد أن أصل إلى الخوارزمية التراجعية التي تحلها

لدينا لوحة مربعة يمكن أن تتسع إلى 4 * 4 قطعة مربعة قابلة للانزلاق عمودياً أو أفقياً . يٌوضع في هذه اللوحة 15 قطعة فقط مرقمة من 1 إلى 15 بحيث نترك مربعاً واحداً فارغاً.

الهدف من هذا المربع الفارغ هو المساعدة في تحريك إحدى القطع المجاورة له إليه (وبذلك تشغل القطعة المتحركة المربع الفارغ ويصبح مكانها الذي تحركت منه مربعاً فارغاً وهكذا .... ) .

يتم وضع القطع في البداية بشكل غير مرتب مثلاً

4 5 6 1
3 2 9 10
14 7 8 11
12 13 15

نريد أن نصل إلى الشكل التالي

4 3 2 1
8 7 6 5
12 11 10 9
15 14 13

أرجو أن أكود قد وضحت فكرة المسألة

بالخوارزميات التراجعية في العادة هناك شرط نحدد من خلاله أننا وصلنا إلى حل خاطئ وهناك شرط من خلاله نعرف أننا قد وصلنا إلى حل للمسألة

مثلاً في خوارزمية جولات الحصان كان الشرط الخاطئ الذي يوقفنا عن إستمرار إستدعاء التابع هو الوصول إلى نقطة قد مر منها من قبل وتنتهي الخوارزمية عندما يمر على كل الرقعة

أما هنا لا أستطيع أن أحدد متى أصل إلى حل خاطئ لأنني وعند كل إستدعاء للتابع أصل إلى أربع إحتمالات جديدة ومن المؤكد أنه سيكون عندي إحتمالين على الأقل صحيحين من هذه الأربع إحتمالات عندما يكون المربع الفارغ على الزاوية لذلك لن يتنهي إستدعاء التابع لنفسه وسيستمر للانهاية

هل من حل ... وبأسرع وقت أرجوكم

خيارات عرض التعليق

اختر الطريقة التي تفضلها لعرض التعليقات، ثم اضغط على "احفظ الإعدادات" لتفعل التغيرات.
feras_flash

يمكن هي الصورة توضح الفكرة أكثر

بإنتظار ردودكم على الأقل ما هو شرط إنكسار العودية

sh_que_L

من شرحك أفترض التالي:

في خوارزمية جولات الحصان كان الشرط الخاطئ الذي يوقفنا عن إستمرار إستدعاء التابع هو الوصول إلى نقطة قد مر منها من قبل وتنتهي الخوارزمية عندما يمر على كل الرقعة

في خوارزمية المربع الفارغ "يكون" الشرط الخاطئ الذي يوقفنا عن إستمرار إستدعاء التابع هو الوصول إلى "مرحلة" قد مر "بها" من قبل وتنتهي الخوارزمية عندما يتم ترتيب كافة الأرقام

أظن
في خوارزمية جولات الحصان يتم تمثيل كل موقع بمتحول لمعرفة هل تمت زيارته أم لا.

في خوارزمية المربع الفارغ يمكن تمثيل كل وضعية بنص (مثلا) لمعرفة هل تم المرور بهذه الوضعية أم لا.

خوارزمية جولات الحصان يمكن ترميز وضع الموقع المزار ب ١ و قبل زيارته ب ٠ أو ب true و false

في خوارزمية المربع الفارغ يمكن ترميز وضع البداية ب
010605041009020311080714151312 لكل رقم خانتان أو 1654A923B87EFDC حسب النظام السداسي عشر
أو أي طريقة أخرى

هل هذا يكفي؟

feras_flash

ما هو المقصود بمرحلة قد مر بها!!
لم أفهم قصدك اخي

إذا كان قصدك بـ "مرحلة قد مر بها" هو أن لا يعود المربع الفارغ إلى نفس المكان مرة أخرى .. فهذا ليس محقق هنا فمن الممكن أن يعود المربع إلى نفس المكان أكثر من مرة حتى ينم الوصول إلى الحل

بالنسبة لطريقة الترميز أنا أستعمل مصفوفة تدل على محتويات كل عنصر وعند التحريك يتم تغير مجتويات هذه المصفوفة بما يناسب ما قد تم تحريكه

sh_que_L

المرحلة تمثل كافة المربعات
مثلا "مرحلة" البداية "1654A923B87 EFDC" لاحظ الفراغ

feras_flash

أهاااااااا وصلت الفكرة سأعمل على ذلك

الله يجزيك الخير

feras_flash

أخي لقد جربت هذه الطريقة أظنها فعالة ولكن هذه الطريقة تتسبب في إعادة إستدعاء التابع العودي لنفسه بعمق أكثر من 256 وهذا ما لا تقبله لغة الـ actionscript الذي أقوم بالعمل عليها
كما أنه بهذه الطريقة سيستغرق مدة طويلة للوصول إلى الحل ....

هل هناك طرق أخرى ... أم أن هذه هي الطريقة الوحيدة !

sh_que_L

أكيد ليست الوحيدة و ليست الأفضل

feras_flash

هل من حل آخر ... ؟

foaad

كتب feras_flash:
هل من حل آخر ... ؟

مافي حل لهيك مسائل غير الـ backtracking بس ممكن تضيف heuristic function لتحسين الأداء
واذا كانت لغة البرمجة ما بتدعم العودية فيك تحول الخوارزمية لتكرارية.

feras_flash

أيوا أكيد backtracking بس قصدي على الشرط تبع إنكسار العودية هو اللي معقدني يعني لو في شي شرط ثاني ممكن يسرع الخوارزمية لأن الخوارزمية هيك بطيئة جداً

والـ actionscript تدعم العودية ولكن لمجال معين يعني مو أكثر من 256 ليفل من الإستداعائات
وهو مو مشكلة مو مضطر أعمله على هذه اللغة ولكن أحس أن هذه الطريقة تتسبب في بطئ شديد ... معقول أكثر من 256 ليفل من الإستدعائات !!!!

على كل حال إنشالة بحاول طبقها على الـ c++

وإذا طلع معكم شرط جديد ممكن يخفف من بطئ هذه الخوارزمية ياريت تفيدونا

مشكورين جميعاً على الإهتمام والسرعة في الرد

feras_flash

طيب في هذه الحالة كيف سأحسب تعقيد الخوارزمية ؟

feras_flash

غير معقول ...
عند كل تنفيذ للبرنامج يطلع لي رسالة stack over flow

حسبت عدد الإحتمالات الممكنة اللي بأسوء حالة ممكن التابع يكرر نفسه فيها طلعوا 16^16 بما أن الرقعة عندي قياسها 4*4

أكيد في حل ثاني

sh_que_L

بسط المسألة لمجموعة مسائل متشابهة ثم كرر، مثلا:
حاول ترتيب أول عمود من شبكة مؤلفة من سطرين و ثلاثة أعمدة

sh_que_L
Gem Puzzle, Boss Puzzle, Game of Fifteen, Mystic Square and Sliding Puzzle
A simple parity argument shows that half of the starting positions for the n-puzzle are impossible to resolve. All even permutations are solvable, Aaron F. Archer presented a short, simple, elementary proof, based on defining equivalence classes via a hamiltonian path.

For larger versions of the n-puzzle, finding a solution is easy, BUT the problem of finding the SHORTEST solution is NP-hard. For the 15-puzzle, lengths of optimal solutions range from 0 to 80 moves; the 8-puzzle can be solved in 31 moves or fewer.

A possible help coding 4x4 slide 15 puzzle

S.W.A.T

يمكن ردي متأخر شوي
بس بهل الوظيفة
توزيع المربعات او تبديلون رح يكون عشوائي بحيث انو اذا اجا شي مربع على محللو تثبتو بمحلو .... ما تحاول بطريقة انو كل مربع تعمل حركاتو لحالو لأنو الخوارزمية وقتها بتكون كتير ضخمة بشكل غير معقول و صعبة و في ناس بالانترنيت عاملين هيك بس معقدة
و انت اذا بدك تشوفها بالانترنيت شوفها تحت اسم 15 puzzle