Contest Algorithms January 2016 4 Backtracking Pseudocode for
Contest Algorithms January 2016 4. Backtracking Pseudo-code for backtracking search, and three examples (all subsets, permutations, and 8 queens). Contest Algorithms: 4. Backtracking 1
1. Backtracking § The problem has a large number of different possible answers, called a “search space” § Brute force strategy: check all possible answers to find the best one(s) § Today’s CPUs can handle problems with search spaces containing billions of answers (about 109). 2
Calculating the Search Space Size § Search space size is related to the number of variables in the problem, and their values § e. g. , 20 variables, each one 0 or 1; there are 220 different solutions, or about 106 § brute force should find an answer within the ACM contest time § e. g. , 12 variables, each one 0, 1, 2, …, or 9; there are 1012 different solutions § maybe too many for the ACM contest, but try using long § e. g. , 12 variables, holding the permutation of 1, 2, 3, …, 12; there are 12! = 479, 001, 600 different solutions § brute force may be fast enough 3
Backtracking Pseudo-code in Words § Assume the problem has n variables, stored in an array (v 0, v 1, …, vn-1) § Pseudo-code for search(): Look at k th variable in (v 0, v 1, …, vk, …, vn-1): if k == n, then all the variables have been assigned, so check if the array is a good solution. The program can exit at this point or this search() call can return so backtracking can look for other good answers. else for each possible value of vk: (c 0, c 1, …, cj) Assign a value c to vk, and then search for k+1 th variable value in (v 1, v 2, …, (vk = c), vk+1, …, vn-1) 4
Backtracking Pseudo-code private static void search(Data[] vars, int k) { if (vars. length == k) // looked at all vars? report. Soln(vars); // returning after the report will continue the search else { // process kth var Data[] candidates = get. Candidates(vars, k); for (Data c : candidates) { // for all values of kth vars[k] = c; search(vars, k+1); } } } // end of search() 5
Search Space as a Tree § E. g. , vars = { v 0, v 1, v 2 } can have values 0, 1, or 2 search one solution == one path v 0 v 1 v 2 0 1 1 0 0 2 0 1 1 0 2 2 0 1 2 1 . . . exit or use backtracking to try alternative paths 2 choice point 2 0 . . . 1 2 . . . 6
2. Constructing All Subsets § Given a set with n items, we have 2 n subsets. How to output all the subsets? § E. g. , the subsets of {1, 2, 3 } are {123} {12} {13} {1} {23} {2} {3} {} Use three variables, v 0, v 1, v 2. Each of them can be either true or false. vi is true means that i+1 is in the subset. 7
Search Space as a Tree Use three variables, v 0, v 1, v 2. Each of them can be either true or false. search vi is true means that i+1 is in the subset. one possible solution v 0 T F == {3} v 1 v 2 == {1, 2, 3} T T F Contest Algorithms: 4. Backtracking T F T F use backtracking to try alternative paths 8
Constructing All Subsets /* output all the subsets of {1, 2, 3} public static void main(String[] args) { boolean[] vars = new boolean[3]; search(vars, 0); } // end of main() vars[0] represents "1", vars[1] represents 2", etc. vars[i] == true value means i+1 is in the set see All. Subsets. java */ > java { 1 2 { 1 3 { 1 } { 2 3 { 2 } { 3 } { } All. Subsets 3 } } 9
private static void search(boolean[] vars, int k) { if (vars. length == k) // looked at all vars? report. Soln(vars); else { // process kth var boolean[] candidates = get. Candidates(vars, k); for (boolean c : candidates) { vars[k] = c; search(vars, k+1); } } } // end of search() Contest Algorithms: 4. Backtracking 10
private static boolean[] get. Candidates(boolean vars[], int k) { return new boolean[]{ true, false}; } private static void report. Soln(boolean vars[]) { System. out. print(" {"); for(int i = 0; i < vars. length; i++) { if (vars[i]) System. out. print(" " + (i+1)); } System. out. println(" }"); } // end of report. Soln() vars[0] represents "1", vars[1] represents 2", etc. vars[i] == true value means print i+1 Contest Algorithms: 4. Backtracking 11
3. Constructing All Permutations § Permutation of {0, 1, 2} are 012 021 102 120 201 210 Use three variables, v 0, v 1, v 2. Each of them can be assigned 0, 1, or 2 But can only use 0, 1, or 2 once per path 12
Search Space as a Tree Use three variables, v 0, v 1, v 2. Each of them can be assigned 0, 1, or 2 But can only use 0, 1, or 2 once per path search one solution == one path v 0 v 1 v 2 Contest Algorithms: 4. Backtracking 1 0 2 2 2 1 2 2 0 use backtracking to try alternative paths 0 1 1 0 13
Constructing All Permutations see Permutations. java public static void main(String[] args) { int[] vars = {-1, -1}; // -1 means 'no value' search(vars, 0); } // end of main() > java Permutations 0 1 2 0 2 1 1 0 2 1 2 0 1 2 1 0 vars[0] represents "0", vars[1] represents 1", etc. 14
private static void search(int[] vars, int k) { if (vars. length == k) // looked at all vars? report. Soln(vars); else { // process kth var int[] candidates = get. Candidates(vars, k); for (int c : candidates) { vars[k] = c; search(vars, k+1); } } } // end of search() Contest Algorithms: 4. Backtracking 15
private static boolean[] get. Candidates(boolean vars[], int k) { boolean[] in. Perms = new boolean[vars. length]; for(int i = 0; i < vars. length; i++) in. Perms[i] = false; for(int i = 0; i < k; i++) if (vars[i] != -1) in. Perms[vars[i]] = true; // using vars[i] int n = 0; int[] c = new int[vars. length - k]; for(int i = 0; i < vars. length; i++) if (!in. Perms[i]) /* candidates must be */ c[n++] = i; /* different from existing */ /* elements */ return c; } // end of get. Candidates() Contest Algorithms: 4. Backtracking 16
private static void report. Soln(boolean vars[]) { for(int v: vars) System. out. print(" " + v); System. out. println(); } // end of report. Soln() Contest Algorithms: 4. Backtracking 17
4. Eight-Queens Problem § Put 8 queens on an 8× 8 chessboard such that none of them is able to affect any of the others. § A solution requires that no two queens share the same row, column, or diagonal. § How many solutions? (92) 18
Eight-Queens Problem § If a queen can be placed at any square, the search space is 648. Maybe too large! (648 == 26*8 == 248 ≈ 1012 * 28 = 2. 56 x 1014) § Position constraints help to reduce the size of search space § The queen in the first column has 8 choices. § Next, the queen in the second column has 7 choices. § Next, the queen in the third column has 6 choices. Etc. § Using these constraints, the space size is 8! = 40320 only. § We can also add diagonal constraints to reduce the size more 19
Search Space this path succeeds this path fails X X X Contest Algorithms: 4. Backtracking X X 20
Eight-Queens Problem private static int solns. Count = 0; // there are 92 solutions see Queens 8. java public static void main(String[] args) { int[] qs = new int[8]; search(qs, 0); System. out. println("No. of solutions: " + solns. Count); } // end of main() 21
private static void search(int[] qs, int k) { if (qs. length == k) // looked at all qs? report. Soln(qs); else { // process kth var for (int i = 0; i < qs. length; i++) { qs[k] = i; if (is. Consistent(qs, k)) search(qs, k+1); } } } // end of search() replace get. Candidates() by loop and is. Consistent() 22
private static void report. Soln(int qs[]) { for (int i = 0; i < qs. length; i++) { for (int j = 0; j < qs. length; j++) { if (qs[i] == j) System. out. print("Q "); else System. out. print("_ "); } System. out. println(); solns. Count++; } // end of report. Soln() _ _ Q _ _ _ : _ Q _ _ _ _ _ Q _ _ _ _ Q _ _ _ _ _ Q _ _ _ _ _ _ _ Q _ _ _ _ No. of solutions: 92 Contest Algorithms: 4. Backtracking 23
private static boolean is. Consistent(int[] q, int k) /* Return true if queen placement qs[k] does not conflict with other queens qs[0] through qs[k-1] */ { for (int i = 0; i < k; i++) { if (q[i] == q[k]) // same column return false; if ((q[i] - q[k]) == (k - i)) // same major diagonal return false; if ((q[k] - q[i]) == (k - i)) // same minor diagonal return false; } return true; } // end of is. Consistent() Contest Algorithms: 4. Backtracking three position constraints 24
- Slides: 24