طلب إيجاد خوارزمية لمسألتي

  • MouhcineFD

السلام عليكم

واجهتني مشكلة في إيجاد حل لهده المسألة

والله قضيت أكتر من أسبوعين وأن أحاول حلها ولم أفلح في ذالك

المرجو المساعدة جزاكم الله خيرا

المسألة:A جدول مكون من n سطر m عمود

كل سطر وكل عمود يحتوي على x خانة مملوءة

x>=2

خانة مملوءة تمثل 1

خانة فارغة تمثل 0

المطلوب

تغيير قيمة بعض الخانات من الواحد الى الصفر وليس من الصفر الى الواحد لتحقيق الشرط الأول مع تغيير أقل عدد ممكن من الخانات(الشرط الثاني)

الشرط الأول

يجب أن يكون عدد الخانات المملوءة في كل سطر وعمود عددا زوجيا أو بمعنى آخر أن يكون المجموع في كل سطر وعمود قيمة زوجية وممكن أن يكون الصفر

يعني سيصبح x=2k / k>=0

الشرط الثاني

يجب أن تغير أقل عدد ممكن من الخانات أو بمعنى آخر أن تحصل على أكبر مجموع للخانات التي تمثل واحد في الجدول

مثال

لدينا هدا الجدول

نلاحظ أن العمود الثاني والثالث يحتويان على عدد فردي

الحل هو

مجموع الخانات التي تحتوي على القيمة واحد يساوي 10

يمكن أن يكون أكثر من حل

وهدا حل خاطئ لأنه يحقق الشرط الأول فقط يعني تم تغيير عدد من الخانات أكثر من الازم أي مجموع الخانات التي تحتوي على القيمة واحد يساوي 6 و6 ليست أكبر قيمة ممكن أن تحصل عليها (الحل الصحيح هو دو القيمة 10)

ملاحظة

في بعض الحالات يمكن أن يكون الحل الوحيد هو الجدول فارغ


التعليق السابق

جميل

توصلت إلي نفس النتيجة في الأول لاكن وجدت مشكلة

أولا سأوضح لك أمر مهم

إذا كان أحدهما شاقولي و الثاني عامودي ..... الحل بتحويل قيمة الخانة التي تمثل رقم العامود و السطر لهما " دائما تكون القيمة 1 موجودة في هذه الخانة "

دائما تكون القيمة 1 موجودة في هذه الخانة

هده القاعدة ليست صحيحة يمكن أن تجد القيمة صفر

مثال

|1|1|1||

|0|0|1|1|

|0|1|0|1|

|1|0|0|1|

خانة تلاقي السطر الأول مع العمود الأول تحتوي على صفر

إدن أفضل حل هو تغيير ثلاثة خانات وفي بعض الحالات تغيير خمس أو سبع ... خانات

اذا كانا الاثنين أسطر .... فيجب البحث عن خانتان متجاورتان لهما نفس قيمة العامود و بهما الرقم 1

كذالك نفس الملاحظة هنا لن تجد دائما تانك الخانتان المتجاورتان يحتويان على القيمة 1

هنا ستضطر لتغيير خانتين إضافيتين أو أربع أو ست ...

هنا نستنتج قاعدة

اذا كان أحدهما شاقولي و الثاني عامودي

يكون الحل بتغيير عدد فردي من الخانات

اذا كانا الاثنين أسطر أو اعمدة

يكون الحل بتغيير عدد زوجي من الخانات

والمشكلة هي

في بعض الحالات يكون أحدهما شاقولي و الثاني عامودي و الخانة التي تمثل رقم العامود و السطر لهما تحتوي على القيمة 1 ولا يجب أن نغيرها بل علينا تغيير ثلات خانات أو أكثر, مكان تغيير خانة واحدة

ستقول لي الهدف هو تغيير أقل عدد ممكن من الخانات نعم صحيح

لاكن لو قمت بتغير تلك الخانة الواحدة ستأقوم بتصحيح سطر وعمود , ماذا لو كان سطر آخر وعمود آخر علينا تصحيحهم ويتقاطعان كذالك في نفس الخانة وعندما قمت بتغيير تلك الخانة صححت السطر الأول والعمود الأول بخانة واحدة ولاكن قد تضطر لتتغير سبع أو تسع خانات لتصحيح السطر الآخر والعمود الآخر وفي المجموع تجد أنك غيرت ثمانية أو عشر خانات في حين كان بإمكانك تفادي تلك الخانة الواحدة لتصحيح السطر الأول والعمود الأول ودالك بتغير ثلات خانات مكان واحدة وستجد أن السطر الآخر و العمود الآخر يحتاج تغيير تلك الخانة فقط أو ثلات للتصحيح وستجد في المجموع أنك غيرت أربع أو ست خانات المهم عدد أقل من الحالة الأولى

أتمنى أن تكون فهمت قصدي

ونفس الشيء بالنسبة اذا كانا الاثنين أسطر أو اعمدة

kikoknkn أضف ردا

صحيح تماما ...

في صباح اليوم التالي انتبهت أن القاعدة الأولى ليست كاملة و يمكن أن تكون القيمة صفر و عندها سنحتاج الى اضافة شرط جديد وتعديل 3 واحدات "أحدهم بالقطر " وهاكذا .... ولكنني تقاعست عن الرد بسرعة مممممم

اذا نعود للحل الكلاسيكي

وهو اذا اعتبرنا أن مصفوفتك يمكن تمثيلها ب 16 بت

و بتنفيذ عملية ضرب ثنائي " أو AND " على مستوى كل بت

من

0000000000000000

0000000000000001

0000000000000010

0000000000000011

الى

1111111111111111

سنحتاج الى 65536 عملية ... ثم اكتشاف كل الاحتمالات التي تنتج مصفوفة الصحيحة ثم انتخاب الحل الافضل

طبعا هنا معدل حل المصفوفة سيكون دائما بحدود 130000 عملية

ولكن اذا رغبنا بتطوير الحل الكلاسيكي السابق

بحيث نعيد ترتيب الاحتمالات التي استخدمناها بالضرب

فلتكون

0000000000000000

0000000000000001

0000000000000010

0000000000000100

" بحيث نبدء بسلسلة تحوي بت وحيد به 1

ثم سلسلة تحوي بتان وهاكذا

0000000000000011

0000000000000101

0000000000001001

طبعا اجمالي طول السلسلة بقي 65536 ولكن اعادة ترتيبها أعطانا ميزة

أن أول عملية تنتج مصفوفة صحيحة هو حل مقبول

و بالمعدل يكون تم خفيض حجم العمل بنسبة 50%

المرحلة الثالثة من تطوير الحل الكلاسيكي يتم بضغط المصفوفة قبل البدء بحلها أي انشاء مصفوفة جديدة تمثل الخانات التي تحوي واحدات فقط .... ثم الضرب بالسلسلة السابقة

و بالمعدل يكون تم خفيض حجم العمل بنسبة 96% عن الحالة الكالسيكية " طبعا تحتاج الى اختبار الاداء ليتم معرفة مقدار التاخير في عملية الكشف"

ملاحظة : التمثيل المنطقي معكوس بالحقيقة و الخانة التي تحوي 1 هي خانة التعديل

ما فهمت من شرحك

هو أنك ستأخد المصفوفة الأصلية

في الأول ستجرب تغيير قيمة خانة واحدة وستجرب جميع الاحتمالات

ادا تم الحل توقف فهذا افضل حل

ادا لم تجد الحل تجرب تغيير خانتان ثم تجرب جميع الاحتمالات

وهكذا ...

سأضيف مرحلتين في تطوير الحل الكلاسيكي

أولا

أقل عدد ممكن أن تغيره من الخانات للتحصل على أفضل حل

هو العدد الأكبر بين(عدد الأسطر التي تحتوي على مجموع فردي و عدد الأعمدة التي تحتوي على مجموع فردي)

مثال

0111001

1000111

0001110

1111110

هنا لدينا سطر واحد يحتوي على مجموع فردي ولدينا ثلات اعمدة تحتوي على مجموع فردي

ادن لا يمكن ايجاد حل بتغيير عدد أقل من ثلات خانات

ومنه فالتطوير هو أن نبدأ بسلسلة تحتوي على ثلات بتات من الأول, فلاداعي لتجريب بت واحد وبتان لأنه لا يوجد حل

التطوير الثاني

كما قلت في الرد السابق

اذا كان أحدهما شاقولي و الثاني عامودي

يكون الحل بتغيير عدد فردي من الخانات

اذا كانا الاثنين أسطر أو اعمدة

يكون الحل بتغيير عدد زوجي من الخانات

ادن لو بدأنا السلسة بعدد معين من البتات

فالسلسلة الموالية تكون بإضافة 2 بث في كل مرحلة موالية

يعني لو بدأت ب

0000000000000011

وأنهيت جميع الاحتمالات ولم تجد حل

فمباشرة انتقل الى

0000000000001111

ثم الى

0000000000111111

و بالمعدل يكون تم تخفيض حجم العمل بنسبة ***111% عن الحالة الكالسيكية

***صراحة لم أعرف كيف حصلت أنت على تلك النسب ؟؟؟

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

المشكلة هي أن متوسط الجداول التي املك تحتوي على 120 خانة

ومتوسط أقل عدد لازم تغييره من الخانات هو 24

لك أن تحسب عدد الاحتمالات أكبر من 25^10

kikoknkn أضف ردا

اسئلة على السريع

هل حجم المصفوفة عندك 4*4 ?

أم هي مثلا 12*12 ؟

هل هي دائما مصفوفة مربعة مثلا 6*8؟

هل دائما ابعاد المصفوفة زوجي أم يمكن أن يكون فردي مثل 7*7 ؟

هل البرنامج الذي ستكتبه سيكون مخصص لحل مصفوفة ثابتة الابعاد أم أنه كل مرة سيتم ادخال أبعاد مختلفة

سأكتب توضيح عن فكرتي برد أخر

كتبت في أول الموضوع

A جدول مكون من n سطر m عمود

n>=1 و m>=1

يمكن أن تكون المصفوفة 4x4 5x3 2x1 15x20

ولدي العديد من الجداول بمثل هده الابعاد 35x16 23x17

هل البرنامج الذي ستكتبه سيكون مخصص لحل مصفوفة ثابتة الابعاد أم أنه كل مرة سيتم ادخال أبعاد مختلفة

لا يهم لأنني لا أريد برنامج أو كود

ما أريده هو فكرة عن طريقة حل المسألة يمكنك اعتبار الأبعاد ثابتة m و n

سأكتب توضيح عن فكرتي برد أخر

إدا كنت تتحدث عن فكرة تمثيل المصفوفة بسلسلة من البتات

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

الان وضحت الصورة ....

حجم المصفوفة أكبر من رقعة الشطرنج . مممم

يمكنني ابداء بعض الملاحظات لعلها تساعدك ...

مثلا

يمكن البحث عن الحل بشكل معاكس .... وهو بناء مصفوفة جديدة من الصفر عوضا عن حزف واحدات !!!!


فكرت ايضا كيف تستطيع بناء مصفوفة صحيحة

فوجدت الشروط التالية :

أن المصفوفة تكون صحيحة اذا اضفنا الواحدات بمضاعفات عدد 4 و موزعة بشكل مستطيل " أو مربع "

واذا ظهر صفر في احد الزوايا يتم تعويضه بظهور ثلاث واحدات عندها نستخدم 6 واحدات

في أول مصفوفة محلولة أنت وضعتها ظهر مستطيل كامل و مستطيل بزاوية صفرية و عدد لواحدات


محاولة لترتيب الفكرة

مثلا نبدأ بلبحث على اكبر مستطيل يحقق الشرط

حسب مثالك

1010

1111

1111

1100

أكبر مستطيل

x01x

1111

1111

x10x

غير محقق

نبحث عن مستطيل اصغر

x01z

1111

x11x

1100

هنا وجدنا اكبر مسطيل له زاوية صفرية

ثم يتم تثبيت الواحدات " سوف اكتبها كرقم 2

2020

1122

2112

1100

نتابع البحث

2020

xx22

2112

xx00

وجدنا مستطيل تم التثبيت ....

حتى لم يعد بالامكان العثور على مستطيلات

مبروك

طبعا تحتاج لدراسة مقدار التثقيل مثلا اخذ مساحة المستطيل و ربما وجود زوايا صفرية تعدل بقيمة المستطيل " تخفيض أو زيادة " فيما لو ظهر احتمالان بنفس المساحة


أنا فقط حاولت توليد بعض الافكار ... ويسعدني معرفت حلك النهائي