ABA


"איזה דרך יותר יעילה ליפתור סודוקו?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15359 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15359
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   18:19   08.06.09   
אל הפורום  
  איזה דרך יותר יעילה ליפתור סודוקו?  
 
מבחינת אלגוריתם על המחשב כמובן,
אני מכיר את הדרך של ניסיון של כל האפשרויות, עד שמצליח.
אבל הצלחתי לעשות בדרך של פיתרון ממש, כלומר, לבדוק הצלבות לכל תא, ולחזור כמה פעמים עד הסוף.
מצד אחד הפיתרון השני תמיד יעבוד לעומת השני שבכאלה קשים לא יסיים. כמובן שאפשר לשפר את השני כך שיסיים, השאלה היא אם זה שווה.
בכל מקרה, הדרך השנייה יותר כיפית ליישום..
תודה.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אני חושב שכתבו פה פעם שbacktracking זה הפתרון akoka 08.06.09 19:30 1
     יעני הדרך הראשונה asco88  08.06.09 19:39 2
  אולי יש אלגוריתמים מתוחכמים מיוחדים, אבל בשיטה ldan192  09.06.09 12:11 3
     לא רנדומלי, מתחיל מ1 ועולה כל פעם asco88  09.06.09 16:55 4
         זה בדיוק backtracking. ממלא אפשרויות וממשיך הלאה - לא תקין חוזר אחורה ldan192  09.06.09 21:03 6
             סבבה, אני כנראה אלך על זה וזהו asco88  09.06.09 21:25 7
  ברור שיש דרכים יעילות יותר. Deuce  09.06.09 17:56 5
  אני מרגיש כזה עלוב פתאום..חח תודה. asco88  09.06.09 21:26 8
     יכול להפוך למעניין, אבל השאלה לכמה יש פה ידע. Deuce  09.06.09 23:55 9
         אני מקווה שמובן לך ש-DFS או BFS לא קשורים בכלל לשאלה |: ldan192  10.06.09 00:46 10
             בנאלי, פשוט ולא יעיל ... Deuce  10.06.09 06:01 11
         איזה יתרון יתנו לי BFS או DFS בסודוקו? asco88  10.06.09 07:18 12
             זה נותן לך יתרון קל. Deuce  10.06.09 07:58 13
                 אז מה דעתך על הדרך הזאת: asco88  10.06.09 08:22 14
                     מכתב Deuce  10.06.09 20:24 15
                         טוב עכשיו קראתי שוב את הבדיקה asco88  11.06.09 03:24 16

       
akoka

   19:30   08.06.09   
אל הפורום  
  1. אני חושב שכתבו פה פעם שbacktracking זה הפתרון  
בתגובה להודעה מספר 0
 
   האופטימלי.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   19:39   08.06.09   
אל הפורום  
  2. יעני הדרך הראשונה  
בתגובה להודעה מספר 1
 
כל פעם שם מספר ובודק אם מתאים ועובר לזה שאחריו- וכל פעם חוזר אחורה ומעלה. הכוונה לזה?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   12:11   09.06.09   
אל הפורום  
  3. אולי יש אלגוריתמים מתוחכמים מיוחדים, אבל בשיטה  
בתגובה להודעה מספר 0
 
ה-"strate forward" אין ספק ש-backtracking.

אם חשבת על אלגוריתמים של הגרלת מספרים עד שקולעים לתשובה.. זה פשוט לא יעבוד... אולי אם תיתן לזה לרוץ שבוע אז.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   16:55   09.06.09   
אל הפורום  
  4. לא רנדומלי, מתחיל מ1 ועולה כל פעם  
בתגובה להודעה מספר 3
 
וכל פעם מתקדם וחוזר, אין משהו כזה?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   21:03   09.06.09   
אל הפורום  
  6. זה בדיוק backtracking. ממלא אפשרויות וממשיך הלאה - לא תקין חוזר אחורה  
בתגובה להודעה מספר 4
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   21:25   09.06.09   
אל הפורום  
  7. סבבה, אני כנראה אלך על זה וזהו  
בתגובה להודעה מספר 6
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   17:56   09.06.09   
אל הפורום  
  5. ברור שיש דרכים יעילות יותר.  
בתגובה להודעה מספר 0
 
http://en.wikipedia.org/wiki/Algorithmics_of_sudoku






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   21:26   09.06.09   
אל הפורום  
  8. אני מרגיש כזה עלוב פתאום..חח תודה.  
בתגובה להודעה מספר 0
 
תגובה ל5 אגב.. שרשור מעפן..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   23:55   09.06.09   
אל הפורום  
  9. יכול להפוך למעניין, אבל השאלה לכמה יש פה ידע.  
בתגובה להודעה מספר 8
 
ערכתי לאחרונה בתאריך 10.06.09 בשעה 20:25 בברכה, Deuce
 
רובו המוחלט של הפורום לא בקיא מספיק בנושאי גרפים.
אני אישית עשיתי קורס באלגוריתמים ובתורת הגרפים אז אני דיי מבין בנושא.

אפשר להסתכל על הלוח כמו שרשמו בויקיפדיה כעל גרף (אפילו הייתי מסתכל על זה כמולטי גרף). קשת תחבר בין מספרים אם הם באותו בלוק, אם הם באותה שורה, אם הם באותה עמודה. כמובן נוכל להבדיל בין הקשתות בצורה כזאת או אחרת. אפשר אח"כ להתחיל לשחק עם זה. נשים לב שגם בפתרון לא פולינומיאלי, יש עדיפויות.

האופטימיזציה היא באמת כפי שרשמו להשתמש בשיטות סטוכסטיות.
השאלה האם מישהו באמת מעוניין להכנס לדיון על פתרון סודוקו ועל נכונות האלגוריתמים שאני אציג. אם כן, אני יכול לפתוח קצת את הנושא אבל צריך ידע.

לכותב האשכול, שים שהפתרון הטריוויאלי (נניח ליצור באמצעות BFS או DFS כזה) את כל הלוחות ולבדוק האם הם תיקניים עלול לעלות (בהסתברות קטנה כנראה, אבל בכל זאת) כ-O של מספר הלוחות. מספר הקומבינציות ליצירת לוח סודוקו הם תשחע בחזקת 81. ואפשר להרחיב את בעיית הסודוקו עבור n = k^2 (בעיית סודוקו מקורית היא עבור k = 3). עבור הרחבה מהסוג הזה יוצא שהסיבוכיות Worst Case של הפתרון הבנאלי היא:


Ω(n^(n^2))

כלומר, עבור למשל k = 4, יוצא שהסיבוכיות היא

Ω(16^(16^2))

זה רע מאוד
ובכלל, גם עבור k=3 ייקח יחסית הרבה זמן למחשב לבדוק תקינות לוח.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   00:46   10.06.09   
אל הפורום  
  10. אני מקווה שמובן לך ש-DFS או BFS לא קשורים בכלל לשאלה |:  
בתגובה להודעה מספר 9
 
לפחות, אני לא רואה איך האלגוריתמים הנ"ל עוזרים לך להגיע לפתרון ישירות.

בכל מקרה, שוב, הפתרון הכי יעיל מבחינת חיפוש והכי תואם לצורה שבני אדם במציאות פותרים סודוקו (שהוא לא אלגוריתמם ספציפי ומתוחכם לסודוקו) זה רק backtracking. אבל מה - אפשר לשפר את ביצועי האלגוריתם עם בחירת שורות מושכלות (ולא ללכת למשבצת 0,0 ואז ל-0,1 וכו').


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   06:01   10.06.09   
אל הפורום  
  11. בנאלי, פשוט ולא יעיל ...  
בתגובה להודעה מספר 10
 
ואתה ממלא את הלוח באמצעות BFS או DFS, אין פה משהו מיוחד - השאלה אם אתה קודם כל ממלא לוח שלם ואז בודק אותו או ממלא תא, בודק, ממלא את התא בערך אחר ואז בודק וכו'.

אין בעייה עם backtracking אבל מבחינתי זה סתם לזרוק מונח גדול. בחירת שורות משוכללות לא משפר לך מהותית את ביצועי האלגוריתם.

הדגמתי אגב את סיבוכיות backtracking, אתה מוזמן לכתוב קוד קצרצר אפילו ב-C - הוא לא יהיה כזה מהיר.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   07:18   10.06.09   
אל הפורום  
  12. איזה יתרון יתנו לי BFS או DFS בסודוקו?  
בתגובה להודעה מספר 9
 
הרי כשאני ניגש לפתור מבחינתי ההסתברות לכל תא (ריק) היא זהה, אלא אם אני לפני כל תא אחשב מספרים לא יעילים (לא חוקיים) אבל אז זה כבר נהיה מסורבל וארוך.
קיצר, זה סה"כ דרך יותר משוכללת לנחש את התוצאה, לפי מה שהבנתי..
אני אשמח לגלות שלא הבנתי נכון.. כי זה נשמע די מעניין


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   07:58   10.06.09   
אל הפורום  
  13. זה נותן לך יתרון קל.  
בתגובה להודעה מספר 12
 
לצורך ההבנה, נגדיר את לוח הסודוקו כלוח המורכב מ-9 בלוקים. כלומר בלוק זה המטריצה בגודל 3*3 בה אתה צריך לשבץ את המספרים 1-9.

כעת אני טוען שברור שבמידה ושיבצתי את המספר 1 בבלוק כלשהו אז אני לא ארצה לשבץ אותו שוב. כיביכול זאת דרישה סבירה. אין שום טעם שאני אשבץ אותו אם כבר אני יודע ששיבצתי אותו. יחד עם זאת, זה כנראה לא כזה פשוט כי מבחינת קוד נורא נוח לתת רקורסיה בסגנון:


foo(int[][] ar , int i , int j) {
// תנאי עצירה כלשהו
for (int k=1; k<10; ++k) {
ar[i][j] = k;
if (checkBoard(ar))
תצא מהלולאה ותתקדם ברקורסיה
}

בפועל זה דיי רע.
תאר לעצמך אנחנו בבלוק הכי ימיני למטה במטריצה ונניח שיש בו כבר את המספר 1. אז כל פעם שאנחנו ממלאים שם תא, אנחנו ממלאים אותו ב-1 ואז שולחים לבדיקת תקינות הלוח שככל הנראה תרוץ על כל הלוח עד שהיא תמצא שכבר בבלוק הזה משובץ המספר.

BFS ו-DFS אם ימומשו בצורה טובה, ישתמשו בסימונים מסויימים (בגרפים משתמשים בצבעים) כדי להימנע מלקיחת אפשרויות טריוויאליות.
למשל - רקורסיה נבונה תרוץ לפי בלוקים כאשר אנחנו נדאג לסמן את המספרים שכבר שיבצנו בתאים. ככה נימנע משליחת אפשרויות טריוויאליות לפונקציה מסיבית. תנסה להכליל את זה גם לשורות וטורים ותעיף ככה הרבה שיבוצים לא טובים. בגלל זה אולי החשיבה על זה כגרף עוזרת.

בכל מקרה, עדיין מדובר בפתרונות לא מספיק טובים (ואין מה לעשות, בעייה קשה - צריך פתרון יצירתי למרות שלאט לאט מתקדמים אליו).

אגב - בדיקת הלוח עצמו: הכי טוב לבדוק לוח על ידי מערך ביטים שהחוקיות שלו תהיה שתא i הוא 1 אםם הבלוק/טור/שורה מכיל את i. ככה אתה רץ על כל איבר פעם אחת כדי לבנות תקינות BOARD.

 






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   08:22   10.06.09   
אל הפורום  
  14. אז מה דעתך על הדרך הזאת:  
בתגובה להודעה מספר 13
 
נניח שיש לך מערך בן 81 תאים של מחרוזות.
פעם ראשונה אתה עושה סיבוב על כל הטבלה, ומכניס לכל תא את מה שכבר יש
פעם שניה אתה עובר רק על תאים שאין בהם מספר אחד (0 או שניים ומעלה) ומוסיף מספרים חוקיים כשכל פעם שנשארת עם מספר אחד אתה בודק את כל התאים המושפעים ממנו ומסנן וממשיך את רצף הסינונים עד שמסתיים. פעם שלישית והלאה אתה פשוט חוזר על התהליך.

ולגבי הדרך לבדיקה, בדרך הזאת אני אגלה שטעיתי רק אחרי הרבה זמן ולא במקום הנכון. כי ייתכן ששמתי שני מספרים זהים באותה שורה, אבל היא תיחשב תקינה עד שיהיה חסר 9 למשל. או שלא הבנתי את הרעיון לגמרי..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   20:24   10.06.09   
אל הפורום  
  15. מכתב  
בתגובה להודעה מספר 14
 
תשמע, מדובר בשיפורים סבירים אבל לא יוצאים מגדר הרגיל אם להיות כנים.
אני טוען שעם מערכים בגודל 9 אתה יכול להבין איך אפשר לממש את זה בצורה יותר יעילה (תחשוב על שיטת FLAG, דומה לתהליך הבדיקה שתיארתי לך).

ונראה לי שלא הבנתי.
הסברתי לך פשוט איך לבדוק שבלוק בודד ניתן לבדיקת תקינות בקצת יותר מתשעה צעדים שזה טוב, כי הגודל של טור/שורה/בלוק הוא בגודל 9. וכמו שאמרתי לך, המטרה שלא תיכנס למצבים טריויאלים מידי ברקורסיה.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   03:24   11.06.09   
אל הפורום  
  16. טוב עכשיו קראתי שוב את הבדיקה  
בתגובה להודעה מספר 15
 
והבנתי אותך.
נראה לי יש לי מספיק חומר למחשבה, אני כבר אתקדם מפה לבד. תודה רבה לכל העונים


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net