1 מבוא למדעי המחשב backtracking. 2 מוטיבציה בעיית n המלכות: נתון: לוח שחמט בגודל. המטרה: לסדר על הלוח n מלכות כך שאף אחת לא תאיים על השנייה. דוגמא: עבור.

Slides:



Advertisements
Similar presentations
COSC2007 Data Structures II
Advertisements

מבוא למדעי המחשב לתעשייה וניהול
1 מבוא למדעי המחשב הקצאה דינאמית. 2 הקצאת זיכרון דינאמית  כאשר אנו משתמשים במערכים, אנו מקצים אוטומטית את הזיכרון המקסימלי שנצטרך.  בפועל, אנו משתמשים.
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
מסדי נתונים תשס " ג 1 תכנון סכמות (Design Theory) מסדי נתונים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
אוטומט מחסנית הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 11.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
אתחול מערך void main() { int i; int ar1[5]={7,3,4,5,2}; int ar2[]={9,3,3,4,6};/*the size is 5*/ int ar3[5]={3,2};/*the other nums are 0*/ int ar4[3];/*garbage*/
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 4 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
מסדי נתונים תשס " ג 1 תכנון סכמות – אלגוריתם פירוק לתבניות בצורת BCNF מסדי נתונים.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תכנות בשפת C תרגול 9 רקורסיה המשך
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
The Cyclic Multi-peg Tower of Hanoi מעגלי חד-כווני סבוכיות הפתרון בגרסאות עם יותר מ-3 עמודים.
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Last time on Clang משתנה: "פתק" המשמש את המחשב לשמירת מידע. לכל משתנה יש שם וטיפוס כללים לשמות משתנים –חייבים להכיל רק אותיות, מספרים ו '_' –חייבים להתחיל.
תחשיב היחסים (הפרדיקטים)
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
Markov Decision Processes (MDP) תומר באום Based on ch. 14 in “Probabilistic Robotics” By Thrun et al. ב"הב"ה.
לולאות 02 יולי יולי יולי 1502 יולי יולי יולי 1502 יולי יולי יולי 15 1 Department of Computer Science-BGU.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
- אמיר רובינשטיין מיונים - Sorting משפט : חסם תחתון על מיון ( המבוסס על השוואות בלבד ) של n מפתחות הינו Ω(nlogn) במקרה הגרוע ובממוצע. ניתן לפעמים.
1 מבוא למדעי המחשב רקורסיה. 2 רקורסיה היא שיטה לפתרון בעיות המבוססת על העיקרון העומד ביסוד אינדוקציה מתמטית: אם ידועה הדרך לפתור בעיה עבור המקרים הבסיסיים.
CSE 143 Lecture 17 More Recursive Backtracking reading: "Appendix R" on course web site slides created by Marty Stepp and Hélène Martin
Two Dimensional Arrays
1 CSE1301 Computer Programming: Lecture 24 - Supplement Teddy’s Modules.
Sudoku Jordi Cortadella Department of Computer Science.
Two Dimensional Arrays. Two-dimensional Arrays Declaration: int matrix[4][11]; 4 x 11 rows columns
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
TIC TAC TOE. import java.util.Scanner; import java.util.Random; public class PlayTTT{ public static void main(String[]args){ Scanner reader = new Scanner(System.in);
מבוא למדעי המחשב הרצאה 9: תכנות רקורסיבי 2 1. חישוב עצרת: רקורסיית זנב public static int fact (int n){ return factacc(n,1); } public static int factacc.
1 Data Structures CSCI 132, Spring 2014 Lecture 17 Backtracking.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
CSE 143 Lecture 18 More Recursive Backtracking slides created by Marty Stepp
1 רשימות טיפוס נתונים מסוג רשימה (enumeration) הוא אוסף של שמות שהם הערכים האפשריים עבור טיפוס זה. enum היא מילה שמורה המגדירה טיפוס שכזה. הערכים מוגדרים.
Print Row Function void PrintRow(float x[ ][4],int i) { int j; for(j=0;j
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
CSE 143 read: 12.5 Lecture 18: recursive backtracking.
1 Tirgul 11: Recursion & Backtracking. 2 Elements of a recursive solution (Reminder) A base case that is so simple we need no computation to solve it.
C Programming.
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
C Programming.
Programming Arrays.
Formal Specifications for Complex Systems (236368) Tutorial #1
CS 270 Math Foundations of CS
8-Queens Puzzle.
Sit-In Lab 1 Ob-CHESS-ion
מבוא למדעי המחשב סיבוכיות.
תירגול 14: מבני נתונים דינאמיים
הרצאה 11: פתרון בעיות ברקורסיה ו-Backtracking
תרגול 12: backtracking.
TicTacToe 過三關 使用者可按 XO X char gb[3][3]; gb[0][1] gb[0][0] gb[0][2]
Principles of Object Oriented Programming
Data Structures & Programming
Data Structures & Programming
Presentation transcript:

1 מבוא למדעי המחשב backtracking

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

3 מוטיבציה בעיית n המלכות: דוגמא: פתרון אפשרי עבור 4 מלכות. Q Q Q Q

4 בעיית n המלכות פתרון אפשרי:  לבדוק את כל האפשרויות: עבור n מלכות מספר האפשרויות הוא: עבור n=4 ← 43,680 אפשרויות. עבור n=8 ← 178,462,987,637,760אפשרויות.

5 בעיית n המלכות  פתרון אפשרי: לבדוק את כל האפשרויות.  החיסרון: מעבר שיטתי על קבוצת כל המיקומים האפשריים מתייחס לכל פתרון בנפרד ולא מבחין בפתרונות בעלי מכנה משותף שיכלו להיבדק (ולהיפסל !) כמקשה אחת בשלב מוקדם. דוגמא: Q Q

6 Backtracking הרעיון:  בניית הפתרונות האפשריים בצורה שיטתית.  בכל שלב מנסים ללכת צעד אחד קדימה.  במידה ומתאפשר ממשיכים. במידה ולא – חוזרים לשלב הקודם ומנסים לבחור בצעד אחר. למשל, עבור בעיית n המלכות:  ברור כי עלינו למקם בכל שורה בדיוק מלכה אחת. נעבור על השורות לפי הסדר.  עבור השורה ה- i : ננסה למקם את המלכה כך שלא תאיים על המלכות בשורות 1,…,i-1.  אם נצליח, נמשיך לשורה הבאה.  אם לא, נחזור לשורה הקודמת ונשנה את מיקום המלכה שם.  נחזור על התהליך באופן רקורסיבי עד למציאת כל הפתרונות.

7 בעיית n המלכות – פתרון בעזרת backtracking /* queens.c */ /* print all solutions of the 8 (N) queens problem */ #include #define N 5 enum {EMPTY,QUEEN}; enum {FALSE, TRUE}; void solve (char board[N][N], int row); void print_board (char board[N][N]); int threatens (char board[N][N], int row, int column); int main() { char board[N][N]; int i,j; /* initialize board to empty */ for (i=0; i<N; i++) { for (j=0; j<N; j++) { board[i][j]=EMPTY; } solve(board,0); return 0; }

8 בעיית n המלכות – פתרון בעזרת backtracking void solve (char board[N][N], int row) { int column=0; if (row == N) { print_board(board); } else { for (column=0; column < N; column++) { if (!threatens(board, row, column)) { board[row][column] = QUEEN; solve(board, row+1); board[row][column] = EMPTY; } return; }

9 בעיית n המלכות – פתרון בעזרת backtracking void print_board(char board[N][N]) { int i,j; static int counter=0; printf("Solution number %d:\n", ++counter); for (i=0; i<N; i++) { for (j=0; j<N; j++) { printf("%s", (board[i][j]==EMPTY)?". ":" Q "); } printf("\n"); } printf("\n"); }

10 בעיית n המלכות – פתרון בעזרת backtracking /* threatens: return TRUE if "board" has a queen which threatens position [row,column] */ int threatens(char board[N][N], int row, int column) { int r; /* check if there's a queen on this column */ for (r=0; r<row; r++) { if (board[r][column] == QUEEN) { return TRUE; } /* check if there's a queen on the diagonals */ /* first, check the upper-left diagonal: [row-r,column-r] */ for (r=1; row-r>=0 && column-r>=0; r++) { if (board[row-r][column-r] == QUEEN) { return TRUE; } /* then, check the upper-right diagonal: [row-r,column+r] */ for (r=1; row-r>=0 && column+r<N; r++) { if (board[row-r][column+r] == QUEEN) { return TRUE; } return FALSE; }

11 בעיית n המלכות – פתרון בעזרת backtracking שיפור הפתרון : במקום לייצג את הלוח ע " י טבלה ( מערך דו - מימדי ) ניתן להיעזר במערך חד - מימדי כאשר בתא ה - i יימצא אינדקס העמודה בה ממוקמת המלכה בשורה ה - i. Q Q Q Q

12 בעיית n המלכות – פתרון בעזרת backtracking /* queens1.c */ /* print all solutions of the 8 (N) queens problem */ #include #define N 8 enum {EMPTY,QUEEN}; enum {FALSE,TRUE}; void solve (char board[N], int row); void print_board (char board[N]); int threatens (char board[N], int column); int main() { static char board[N]; solve(board,0); return 0; }

13 בעיית n המלכות – פתרון בעזרת backtracking void solve (char board[N], int row) { int col; if (row == N) { print_board(board); } else { for (col=0; col < N; col++) { board[row] = col; if (!threatens(board, row)) { solve(board, row+1); } return; }

14 בעיית n המלכות – פתרון בעזרת backtracking void print_board(char board[N]) { int i,j; static int counter=0; printf("Solution number %d:\n", ++counter); for (i=0; i<N; i++) { for (j=0; j<N; j++) { printf("%s", (board[i]==j)?" Q ":". "); } printf("\n"); } printf("\n"); }

15 בעיית n המלכות – פתרון בעזרת backtracking /* threatens: return TRUE if "board" has a queen which threatens position [row,column] */ int threatens(char board[N], int row) { int i; for (i=0; i<row; i++) { /* check if there's a queen on this column */ if ( board[i] == board[row] ) { return TRUE; } /* check upper-right diagonal */ if ( board[i] == board[row] + (row-i) ) { return TRUE; } /* check upper-left diagonal */ if ( board[i] == board[row] - (row-i) ) { return TRUE; } return FALSE; }