Taller de Backtracking Laboratorio de Algoritmos y Estructuras de Datos III Departamento de Computación Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires 8 de Abril de 2011 1 / 15
Menú del día 1 Repaso de Backtracking Generación de todas las permutaciones 2 SuDoku 2 / 15
Repaso de Backtracking Repaso de Backtracking Es una técnica algorítmica para recorrer sistemáticamente el espacio de soluciones de un problema. Ejemplos de problemas y sus espacios : Suma de Subconjuntos : Dado un conjunto de enteros, existe algún subconjunto cuya suma sea exactamente cero? 3 / 15
Repaso de Backtracking Repaso de Backtracking Es una técnica algorítmica para recorrer sistemáticamente el espacio de soluciones de un problema. Ejemplos de problemas y sus espacios : Suma de Subconjuntos : Dado un conjunto de enteros, existe algún subconjunto cuya suma sea exactamente cero? Ordenar arreglos 3 / 15
Repaso de Backtracking Repaso de Backtracking Es una técnica algorítmica para recorrer sistemáticamente el espacio de soluciones de un problema. Ejemplos de problemas y sus espacios : Suma de Subconjuntos : Dado un conjunto de enteros, existe algún subconjunto cuya suma sea exactamente cero? Ordenar arreglos El problema de la mochila, crucigramas, caminos simples en un grafo, etc. 3 / 15
Repaso de Backtracking Repaso de Backtracking La ventaja del backtracking es que recorre sistemáticamente. Entonces: Genera cada elemento del espacio una vez Evita saltearse configuraciones Evita repetir configuraciones Permite descartar un montón de soluciones inteligentemente 4 / 15
Repaso de Backtracking Repaso de Backtracking Se puede interpretar naturalmente como un árbol de soluciones parciales Cada vértice representa una solución parcial. Dos vértices x, y se conectan si x se puede extender de y Si el espacio de soluciones son todas las permutaciones de a 1,..., a N, a i A: las soluciones parciales son a 1,..., a k, a i A la forma de extender a 1,..., a k, es agregando a k+1 A {a 1,..., a k El árbol se puede podar. Es posible rechazar muchas soluciones mirando una solución parcial!! Ejemplo con los problemas vistos. 5 / 15
Repaso de Backtracking Generación de todas las permutaciones Generación de todas las permutaciones Backtracking se puede usar para generar todas las permutaciones No es el único algoritmo para tal fin, muchos otros en : Johnson-Trotter algorithm D. Knuth. The Art of Computer Programming, Volume 4 Fascicle 2: Generating All Tuples and Permutations. Addison Wesley, 2005. Por qué usarlo? 6 / 15
Repaso de Backtracking Generación de todas las permutaciones Generación de todas las permutaciones Generar todas las permutaciones de {0,..., N 1 void backtrack(vector<int>& perm, int actual, vector<bool>& usado){ if(actual == N) { procesar(perm); return; int n = perm.size(); forn(i,n) { if(usado[i]) continue; usado[i] = true; perm[actual] = val; backtrack(perm,actual+1,used); usado[i] = false; perm[actual] = -1; 7 / 15
Repaso de Backtracking Generación de todas las permutaciones Análisis En que orden se generan las permutaciones? Se procesan las soluciones parciales? 8 / 15
Repaso de Backtracking Generación de todas las permutaciones Más allá de Backtracking Hay algo más allá de Backtracking?? 9 / 15
SuDoku SuDoku Rellenar una cuadrícula de n 2 n 2 celdas dividida en subcuadrículas de n n con las cifras del 1 al n 2 partiendo de algunos números ya dispuestos en algunas de las celdas, si hay mas de una la menor lexicográficamente. 1 2 3 4 5 6 7 8 9 http://uva.onlinejudge.org/index.php?option=com_ onlinejudge&itemid=8&category=11&page=show_problem&problem= 930 Labo de Algo III (Departamento de Computación Facultad Taller deciencias Backtracking Exactas y Naturales Universidad 8 de Abril de de Buenos 2011 Aires) 10 / 15
SuDoku Solución sin podas bool backtrack(matrix& p, coord c, int n){ if(l.empty()) { return is_sol(p, n); int nn = p.size(); forsn(val, 1, nn+1) { p[c.first][c.second] = val; if(backtrack(p,siguiente(c,n),n)) { return true; p[c.first][c.second] = 0; return false; Labo de Algo III (Departamento de Computación Facultad Taller deciencias Backtracking Exactas y Naturales Universidad 8 de Abril de de Buenos 2011 Aires) 11 / 15
SuDoku Análisis Peor Caso? abo de Algo III (Departamento de Computación Facultad Taller deciencias Backtracking Exactas y Naturales Universidad 8 de Abril de de Buenos 2011 Aires) 12 / 15
SuDoku Análisis Peor Caso? abo de Algo III (Departamento de Computación Facultad Taller deciencias Backtracking Exactas y Naturales Universidad 8 de Abril de de Buenos 2011 Aires) 12 / 15
SuDoku Podas ideas? Labo de Algo III (Departamento de Computación Facultad Taller deciencias Backtracking Exactas y Naturales Universidad 8 de Abril de de Buenos 2011 Aires) 13 / 15
SuDoku Podas ideas? Verificar que no se agreguen números repetidos por columnas Verificar que no se agreguen números repetidos por filas Verificar que no se agreguen números repetidos por sub-cuadrículas Labo de Algo III (Departamento de Computación Facultad Taller deciencias Backtracking Exactas y Naturales Universidad 8 de Abril de de Buenos 2011 Aires) 13 / 15
SuDoku Solución con podas bool backtrack(matrix& p, coord c, int n){ if(l.empty()) { return is_sol(p, n); int nn = p.size(); forsn(val, 1, nn+1) { if(!ok(p,c,val)) /*+ podas! +*/ continue; p[c.first][c.second] = val; if(backtrack(p,siguiente(c,n),n)) { return true; p[c.first][c.second] = 0; return false; Labo de Algo III (Departamento de Computación Facultad Taller deciencias Backtracking Exactas y Naturales Universidad 8 de Abril de de Buenos 2011 Aires) 14 / 15
SuDoku Análisis. Caso Malo 9 9 1 2 3 Qué pasa si cambiamos el órden? Otras formas de resolver el sudoku : Andrew C. Bartlett, Amy N. Langville, An Integer Programming Model for the Sudoku Problem, The Journal of Online Mathematics and Its Applications, Volume 8. May 2008. Labo de Algo III (Departamento de Computación Facultad Taller deciencias Backtracking Exactas y Naturales Universidad 8 de Abril de de Buenos 2011 Aires) 15 / 15