حل قائم على الذكاء الاصطناعي للعبة سودوكو

حل قائم على الذكاء الاصطناعي للعبة سودوكو

عقدة المصدر: 3091242

يصادف يوم 29 يناير اليوم الوطني للألغاز، واحتفالًا به، أنشأنا مدونة ممتعة توضح بالتفصيل كيفية حل لعبة سودوكو باستخدام الذكاء الاصطناعي (AI).

المُقدّمة

قبل وردلأطلقت حملة لغز سودوكو كان الغضب ولا يزال يحظى بشعبية كبيرة. في السنوات الأخيرة، تم استخدام التحسين كانت طرق حل اللغز هي الموضوع السائد. يرى "حل لغز سودوكو باستخدام التحسين في Arkieva".

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

ستقدم هذه المدونة وصفًا تفصيليًا لكيفية استخدام هذه الطريقة لحل لعبة Sudoku. كما اتضح، يمكن العثور على "التراجع" داخل محركات التحسين والتعلم الآلي، وهو حجر الزاوية في الاستدلالات المتقدمة التي تستخدمها Arkieva للجدولة. يتم تنفيذ الخوارزمية في "لغة برمجة المصفوفات"، وهي لغة برمجة موجهة للوظيفة تتعامل مع مجموعة غنية من هياكل الصفيف.

أساسيات سودوكو

من ويكيبيديا: Sudoku عبارة عن لغز اندماجي لتحديد موضع الأرقام يعتمد على المنطق. الهدف هو ملء شبكة 9×9 بالأرقام بحيث يكون كل عمود وكل صف وكل شبكة من الشبكات الفرعية التسعة 3×3 التي تشكل الشبكة (وتسمى أيضًا "الصناديق" و"الكتل" و"المناطق" أو "المربعات الفرعية") تحتوي على جميع الأرقام من 1 إلى 9. يوفر أداة ضبط الألغاز شبكة مكتملة جزئيًا، والتي عادةً ما يكون لها حل فريد. الألغاز المكتملة هي دائمًا نوع من المربعات اللاتينية مع قيد إضافي على محتويات المناطق الفردية. على سبيل المثال، لا يجوز أن يظهر نفس العدد الصحيح مرتين في نفس صف أو عمود لوحة اللعب 9×9 أو في أي من المناطق الفرعية التسع 3×3 للوحة اللعب 9×9.

يحتوي الجدول 1 على مشكلة مثال. هناك 9 صفوف و9 أعمدة ليصبح المجموع 81 خلية. يُسمح لكل خلية أن تحتوي على واحد فقط من تسعة أعداد صحيحة بين 1 و9. في حل البداية، تحتوي الخلية إما على قيمة واحدة - والتي تثبت القيمة في هذه الخلية على تلك القيمة، أو تكون الخلية فارغة، مما يشير إلى أننا بحاجة إلى للعثور على قيمة لهذه الخلية. الخلية (1,1،2) لها القيمة 6,5 والخلية (6،1,2) لها القيمة 2,3. الخلية (XNUMX،XNUMX) والخلية (XNUMX،XNUMX) فارغة، وستجد الخوارزمية قيمة لهذه الخلايا.

التعقيد

بالإضافة إلى انتمائها إلى صف وعمود واحد فقط، تنتمي الخلية إلى مربع واحد فقط. هناك 1 صناديق، ويتم الإشارة إليها بالألوان في الجدول 9. يستخدم الجدول 1 عددًا صحيحًا فريدًا بين 2 و1 لتحديد كل مربع أو شبكة. تنتمي الخلايا ذات قيمة الصف (9 أو 1 أو 2) وقيمة العمود (3 أو 1 أو 2) إلى المربع 3. المربع 1 عبارة عن قيم الصفوف (6، 4، 5) وقيم الأعمدة (6، 7) ، 8). يتم تحديد معرف الصندوق بواسطة الصيغة BOX_ID = {9x(floor((ROW_ID-3) /1)} + السقف (COL_ID/3). بالنسبة للخلية (3)، 5,7 = 6x(floor(3-5) ))/1) + السقف (3/8)= 3×3 + 1 = 3+3.

قلب اللغز

للعثور على قيمة عددية واحدة بين 1 و9 لكل خلية غير معروفة بحيث يتم استخدام الأعداد الصحيحة من 1 إلى 9 مرة واحدة فقط لكل عمود وكل صف وكل مربع.

دعونا نلقي نظرة على الخلية (1,3،1) وهي فارغة. يحتوي الصف 2 بالفعل على القيمتين 7 و3. وهذه القيم غير مسموح بها في هذه الخلية. يحتوي العمود 3 بالفعل على القيم 5,6، 7,9،1، 2،3. هذه غير مسموح بها. يحتوي المربع 8 (الأصفر) على القيم 2,7 و3 و5. وهي غير مسموح بها. القيم التالية غير مسموح بها (6،7)؛ (9، 2، 3، 8، 2)؛ (3، 5، 6). القيم الفريدة غير المسموح بها هي (7، 8، 9، 1,4، XNUMX، XNUMX، XNUMX). القيم المرشحة الوحيدة هي (XNUMX،XNUMX).

يتمثل أسلوب الحل في تعيين 1 مؤقتًا للخلية (1,3،XNUMX) ثم محاولة البحث عن القيم المرشحة لخلية أخرى.

حل التراجع: بدء المكونات

هيكل الصفيف

مكان البداية هو تحديد بنية المصفوفة لتخزين مشكلة المصدر ودعم البحث. يحتوي الجدول 3 على بنية الصفيف هذه. العمود 1 هو معرف عدد صحيح فريد لكل خلية. تتراوح القيم من 1 إلى 81. العمود 2 هو معرف صف الخلية. العمود 3 هو معرف العمود للخلية. العمود 4 هو معرف الصندوق. العمود 5 هو القيمة في الخلية. لاحظ أن الخلية التي لا تحتوي على قيمة يتم منحها القيمة صفر بدلاً من القيمة الفارغة أو الخالية. وهذا يبقي هذه "مصفوفة أعداد صحيحة فقط" - وهي أفضل بكثير من حيث الأداء.

في APL، سيتم تخزين هذه المصفوفة في مصفوفة ثنائية الأبعاد حيث يكون الشكل 2 × 81. افترض أن عناصر الجدول 5 مخزنة في المتغير MAT. وظائف المثال هي:

الأمر MAT[1 2 3;] يمسك بالصفوف الثلاثة الأولى من MAT
1 1 1 1 2
2 1 2 1 0
3 1 3 1 0
مات[1 2 3؛ 4 5] يؤمن الصفوف 1 و2 و3 والعمودين 4 و5 فقط
1
1
1
(MAT[;5]=0)/MAT[;1] يبحث عن كافة الخلايا التي تحتاج إلى قيمة.

أدخل الجدول 3

التحقق من الصحة: ​​التكرارات

قبل البدء في البحث، من المهم التحقق من سلامة العقل! هذا هو الحل المبدئي الممكن. من الممكن بالنسبة لسودوكو أن توجد الآن نسخ مكررة في أي صف أو عمود أو مربع. حل البداية الحالي، على سبيل المثال، 1 ممكن. يحتوي الجدول 4 على مثال حيث يحتوي حل البداية على تكرارات. الصف 1 له قيمتان 2. المنطقة 1 لها قيمتان 2. تتعامل الدالة "SANITY_DUPE" مع هذا المنطق.

التحقق من السلامة: خيارات للخلايا التي لا تحتوي على قيم

قد تكون المعلومات المفيدة جدًا هي جميع القيم المحتملة لخلية بدون قيمة. إذا لم يكن هناك مرشحين، فهذا اللغز غير قابل للحل. لا يمكن للخلية أن تأخذ قيمة تطالب بها جارتها بالفعل. باستخدام الجدول 1 للخلية (1,3,'1' - الرقم 1 الأخير هو المربع)، فإن جيرانها هم الصف 1 والعمود 3 والمربع 1. يحتوي الصف 1 على القيم (2,7)؛ يحتوي العمود 3 على القيم (3,5,6,7,9،1،2,3,8،1,3.1،2,3,5,6,7,8,9)؛ يحتوي المربع 1,3,1 على القيم (1,4،4,1,2،1). لا يمكن للخلية (2) أن تأخذ القيم التالية (3). الخيارات الوحيدة للخلية (5،6،7) هي (9،4). بالنسبة للخلية (1،4،4,8)، فإن القيم XNUMX، XNUMX، XNUMX، XNUMX، XNUMX، XNUMX، XNUMX مستخدمة بالفعل في الصف XNUMX، العمود XNUMX، و/أو المربع XNUMX. القيم المرشحة الوحيدة هي (XNUMX) . يتعامل Unction "SANITY_CAND" مع هذا المنطق.

ويبين الجدول 5 المرشحين، على سبيل المثال 1، في بداية عملية البحث. إذا تم بالفعل تعيين قيمة للخلية في شروط البداية (الجدول 1)، فسيتم تكرار هذه القيمة وتظهر باللون الأحمر. إذا كانت الخلية التي تحتاج إلى قيمة تحتوي على خيار واحد فقط، فسيتم عرض ذلك باللون الأبيض. تحتوي الخلية (8,7,9،7،2,5,8,4,3) على القيمة المفردة 7 باللون الأبيض. تمت المطالبة (1) بواسطة العمود المجاور 2. (9, 8, 3,2,6) بواسطة الصف 9. (7) بواسطة المربع XNUMX. القيمة XNUMX فقط هي التي لم تتم المطالبة بها.

التحقق من الصحة: ​​البحث عن الصراعات

تتيح لنا المعلومات التي تحدد جميع الخيارات للخلايا التي تحتاج إلى قيمة (المنشورة في الجدول 4)، تحديد التعارض قبل بدء عملية البحث. يحدث التعارض عندما يكون لخليتين تحتاجان إلى قيمة مرشح واحد فقط، وتكون القيمة المرشحة هي نفسها، والخليتان متجاورتان. من الجدول 4، نعلم أن الخلية الوحيدة التي تحتاج إلى قيمة ولها مرشح واحد فقط هي الخلية (8,7,9،1،XNUMX). على سبيل المثال XNUMX، لا يوجد تعارض.

ماذا سيكون الصراع؟ إذا كانت القيمة الوحيدة الممكنة للخلية (3,7,3،7،1) هي 6 (بدلاً من 7، 8,7، 3,7)، فهذا يعني وجود تعارض. الخلية (4,9,2،7) والخلية (1،2) متجاورة - نفس العمود. ومع ذلك، إذا كانت القيمة الوحيدة الممكنة للخلية (7،XNUMX،XNUMX) هي XNUMX (بدلاً من XNUMX، XNUMX، XNUMX) فلن يكون هذا تعارضًا. هذه الخلايا ليست الجيران.

ملخص التحقق من الصحة

  1. إذا كان هناك تكرارات، فإن الحل الأولي غير ممكن.
  2. إذا كانت الخلية التي تحتاج إلى قيمة، ليس لديها أي مرشحات، فلا يوجد حل ممكن لهذا اللغز. يمكن استخدام قائمة القيم المرشحة لكل خلية لتقليل مساحة البحث - سواء من أجل التراجع أو التحسين.
  3. القدرة على العثور على الصراعات تحدد اللغز غير ممكن – ليس له حل – بدون عملية بحث. بالإضافة إلى ذلك، فإنه يحدد "الخلايا المشكلة".

حل التراجع: عملية البحث

مع وجود هياكل البيانات الأساسية والتحقق من السلامة، نوجه انتباهنا إلى عملية البحث. الموضوع المتكرر هو مرة أخرى، وضع هياكل البيانات لدعم البحث.

تتبع البحث

المصفوفة مطارد يتتبع المهام التي تم إجراؤها

  1. العمود 1 هو العداد
  2. العمود 2 هو عدد الخيارات المتاحة لتعيينها لهذه الخلية
    • 1 يعني خيارًا واحدًا متاحًا، و1 يعني خيارين، وما إلى ذلك.
    • 0 يعني - لا يوجد خيار متاح أو إعادة التعيين إلى 0 (لا توجد قيمة مخصصة) والتراجع
  3. العمود 3 هو الخلية المخصصة لرقم فهرس القيمة (من 1 إلى 81)
  4. العمود 4 هو القيمة المخصصة للخلية في سجل التتبع
    • القيمة 9999 تعني أن هذه الخلية كانت موجودة عندما تم العثور على الطريق المسدود
    • قيمة العدد الصحيح بين 1 و9، هي القيمة المخصصة لهذه الخلية في هذه المرحلة من عملية البحث.
    • القيمة 0 تعني أن هذه الخلية تحتاج إلى مهمة

يتم استخدام مصفوفة التعقب لدعم عملية البحث. المصفوفة تعقب له نفس بنية المتعقب ولكنه يحتفظ بسجل عملية البحث بأكملها. يحتوي الجدول 6 على جزء من TRACKHIST على سبيل المثال 1. ويتم شرحه بمزيد من التفصيل في قسم لاحق.

بالإضافة إلى ذلك، المصفوفة PAV (متجه للمتجه)، يتتبع القيم المعينة مسبقًا لهذه الخلية. وهذا يضمن عدم إعادة النظر في حل فاشل – على غرار ما تم في TABU.

توجد عملية سجل اختيارية حيث تقوم عملية البحث بكتابة كل خطوة.

بدء البحث

بعد الانتهاء من مسك الدفاتر والتحقق من السلامة، يمكننا الآن بدء عملية البحث. الخطوات هي:

  1. هل هناك أي خلايا متبقية تحتاج إلى قيمة؟ – إذا كان الجواب لا، فقد انتهينا.
  2. لكل خلية تحتاج إلى قيمة، ابحث عن جميع الخيارات المرشحة لكل خلية. يحتوي الجدول 4 على هذه القيم في بداية عملية الحل. وفي كل تكرار، يتم تحديث هذا لاستيعاب القيم المخصصة للخلايا.
  3. قم بتقييم الخيارات بهذا الترتيب.
    • إذا كانت الخلية تحتوي على صفر خيارات، فقم بإجراء التراجع
    • ابحث عن جميع الخلايا التي تحتوي على خيار واحد، وحدد إحدى هذه الخلايا، وقم بإجراء هذه المهمة،
      1. وتحديث جدول التتبع والحل الحالي وPAV.
    • إذا كانت جميع الخلايا تحتوي على أكثر من خيار واحد، فحدد خلية واحدة وقيمة واحدة، وقم بالتحديث
      1. وتحديث جدول التتبع والحل الحالي وPAV

سوف نستخدم الجدول 6 الذي يعد جزءًا من تاريخ عملية الحل (يسمى TRACKHIST) لتوضيح كل خطوة.

في التكرار الأول (نسبة النقر إلى الظهور = 1)، يتم تحديد الخلية 70 (الصف 8، العمود 7، المربع 9) لتعيين قيمة لها. يوجد فقط مرشح (7)، ويتم تعيين هذه القيمة للخلية 70. بالإضافة إلى ذلك، تتم إضافة القيمة 7 إلى متجه القيم المعينة مسبقًا (PAV) للخلية 70.

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

تعمل عملية تحديد الخلية التي تحتاج إلى قيمة وتعيين قيمة بشكل جيد حتى التكرار (CTR) 20. تحتاج الخلية 9 إلى قيمة، ولكن عدد المرشحين هو صفر. هناك خياران:

  • لا يوجد حل لهذا اللغز.
  • نتراجع عن بعض التكليفات ونسلك طريقًا آخر.

لقد بحثنا عن تخصيص الخلية الأقرب إلى هذا، حيث كان هناك أكثر من خيار. في هذا المثال، حدث هذا عند التكرار 18، حيث تم تعيين القيمة 5 للخلية 3، ولكن كانت هناك قيمتان مرشحتان للخلية 5 - القيمتان 3 و8.

بين الخلية 5 (نسبة النقر إلى الظهور = 18) والخلية 9 (نسبة النقر إلى الظهور = 20)، يتم تعيين القيمة 8 للخلية 4 (نسبة النقر إلى الظهور = 19). لقد وضعنا الخليتين 8 و5 مرة أخرى في قائمة "بحاجة إلى قيمة". يتم التقاط ذلك في الإدخالين الثاني والثالث = 20، حيث يتم تعيين القيمة على 0. يتم الاحتفاظ بالقيمة 3 في متجه PAV للخلية 5. وهذا يعني أن محرك البحث لا يمكنه تعيين القيمة 3 للخلية 5.

يبدأ محرك البحث في العمل مرة أخرى لتحديد قيمة للخلية 5 (لم تعد 3 خيارًا) ويقوم بتعيين القيمة 8 للخلية 5 (نسبة النقر إلى الظهور = 21). ويستمر الأمر حتى يكون لجميع الخلايا قيمة أو تكون هناك خلية بدون خيار ولا يوجد مسار تراجعي. الحل موجود في الجدول 7

لاحظ أنه عندما يكون هناك أكثر من مرشح للخلية، فهذه فرصة للمعالجة المتوازية.

مقارنة مع حل التحسين MILP

على المستوى السطحي، يختلف تمثيل أحجية سودوكو بشكل كبير. يستخدم نهج الذكاء الاصطناعي الأعداد الصحيحة وهو تمثيل أكثر إحكامًا وبديهية بأي مقياس. بالإضافة إلى ذلك، توفر أدوات التحقق من السلامة العقلية معلومات مفيدة لإنشاء صياغة أقوى. تمثيل MILP لا نهاية له ثنائيات (0/1). ومع ذلك، فإن الثنائيات تمثل تمثيلات قوية نظرًا لقوة حلول MILP الحديثة.

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

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

الطابع الزمني:

اكثر من اركيفا