שאלת מבחן במבוא למדעי המחשב - אוניברסיטת בן גוריון 2019 - מערכים
סעיף ב (15 נקודות):
בהנתן מספר , נחפש השמה טובה למשתנים הפסוקיים .
השיטה
1. מקבלת מספר
2. מאתחלת פותרן של SAT
3. מוסיפה לפותרן את כל הפסוקיות הנדרשות כך שנוסחת ה-CNF המתקבלת תסופק אם ורק אם קיימת השמה טובה עבור הסידרה .
השיטה encode לא פותרת את הנוסחה. היא רק מוסיפה את פסוקיותיה לפותרן. ניתן למצוא בנספח תזכורת לשיטות ולאופן השימוש ב SATSolver.
לדוגמא: ידוע שקיים פתרון עבור סידרה באורך שמונה. קטע הקוד הבא משתמש בפונקציה encode:
לאחר שנריץ קטע קוד זה, תודפס השורה שמציינת סידרה טובה. לדוגמה, יתכן ותודפס השורה הבאה:
x[1]=false x[2]=true x[3]=false x[4]=true x[5]=true x[6]=false x[7]=true x[8]=false
בהנתן מספר , נחפש השמה טובה למשתנים הפסוקיים .
השיטה
public static void encode(int n):1. מקבלת מספר
2. מאתחלת פותרן של SAT
3. מוסיפה לפותרן את כל הפסוקיות הנדרשות כך שנוסחת ה-CNF המתקבלת תסופק אם ורק אם קיימת השמה טובה עבור הסידרה .
השיטה encode לא פותרת את הנוסחה. היא רק מוסיפה את פסוקיותיה לפותרן. ניתן למצוא בנספח תזכורת לשיטות ולאופן השימוש ב SATSolver.
לדוגמא: ידוע שקיים פתרון עבור סידרה באורך שמונה. קטע הקוד הבא משתמש בפונקציה encode:
לאחר שנריץ קטע קוד זה, תודפס השורה שמציינת סידרה טובה. לדוגמה, יתכן ותודפס השורה הבאה:
x[1]=false x[2]=true x[3]=false x[4]=true x[5]=true x[6]=false x[7]=true x[8]=false
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בן גוריוןמועד א · 2019 · סמסטר א
★★★★★
מערכיםלולאותתנאיםקידוד ל-SAT
עבור כל תת-סדרה עוקבת באורך 3, ישנם שני מצבים 'אסורים' שיש למנוע. תרגמו כל איסור כזה לפסוקית CNF באמצעות כלל דה-מורגן.
המטרה היא לקודד את הבעיה של מציאת "השמה טובה" לנוסחת CNF (Conjunctive Normal Form), אותה ניתן להעביר לפותרן SAT. משתנה פסוקי ייוצג על ידי המשתנה הבוליאני מספר
על פי ההקשר והדוגמה, "השמה טובה" היא השמה שבה אין שלושה משתנים עוקבים עם אותו ערך אמת. כלומר, לכל בתחום , לא מתקיים התנאי .
כדי לאכוף אילוץ זה, עלינו לתרגם אותו לאוסף של פסוקיות (clauses). נוסחת CNF היא AND של פסוקיות, כאשר כל פסוקית היא OR של ליטרלים. פותרן SAT ימצא השמה שמספקת את כל הפסוקיות בו-זמנית.
האילוץ "לא ייתכן כי " מתפרק לשני מקרים שאותם יש למנוע עבור כל מ-1 עד :
1. לא ייתכן כי כולם
2. לא ייתכן כי כולם
כעת נתרגם כל אחד משני האיסורים הללו לפסוקית CNF:
1. כדי למנוע את המצב שבו כולם
2. כדי למנוע את המצב שבו כולם
לסיכום, הפונקציה
i בפותרן. ליטרל חיובי i מייצג וליטרל שלילי -i מייצג .על פי ההקשר והדוגמה, "השמה טובה" היא השמה שבה אין שלושה משתנים עוקבים עם אותו ערך אמת. כלומר, לכל בתחום , לא מתקיים התנאי .
כדי לאכוף אילוץ זה, עלינו לתרגם אותו לאוסף של פסוקיות (clauses). נוסחת CNF היא AND של פסוקיות, כאשר כל פסוקית היא OR של ליטרלים. פותרן SAT ימצא השמה שמספקת את כל הפסוקיות בו-זמנית.
האילוץ "לא ייתכן כי " מתפרק לשני מקרים שאותם יש למנוע עבור כל מ-1 עד :
1. לא ייתכן כי כולם
true.2. לא ייתכן כי כולם
false.כעת נתרגם כל אחד משני האיסורים הללו לפסוקית CNF:
1. כדי למנוע את המצב שבו כולם
true, עלינו לדרוש שהפסוק יהיה שקרי. כלומר, אנו דורשים שהשלילה שלו, , תהיה אמת. לפי כלל דה-מורגן, ביטוי זה שקול לפסוקית . בתחביר של הפותרן, פסוקית זו תיוצג על ידי הליטרלים {-i, -(i+1), -(i+2)}.2. כדי למנוע את המצב שבו כולם
false, עלינו לדרוש שהפסוק יהיה שקרי. כלומר, אנו דורשים שהשלילה שלו, , תהיה אמת. לפי כלל דה-מורגן, ביטוי זה שקול לפסוקית . בתחביר של הפותרן, פסוקית זו תיוצג על ידי הליטרלים {i, i+1, i+2}.לסיכום, הפונקציה
encode(n) תעבור בלולאה על כל האינדקסים מ-1 עד , ובכל איטרציה תוסיף לפותרן את שתי הפסוקיות הללו. כך נבטיח שכל פתרון שהפותרן ימצא יקיים בהכרח את האילוץ לכל שלשה של משתנים עוקבים.