Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Backtracking en sudoku, Guías, Proyectos, Investigaciones de Compresión de Datos

Resolución de sudoku utilizando backtracking y python

Tipo: Guías, Proyectos, Investigaciones

2021/2022

Subido el 03/12/2022

KinngLex
KinngLex 🇦🇷

1 documento

1 / 8

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
TECNICATURA EN PROGRAMACIÓN
Estructura de Datos
00271
Proyecto Final
Resolución de sudoku con inteligencia
artificial
Integrantes:
Rivero Ayelén
Echavarría Lucas
Saucedo Alexis
Vivan Laura
Varela Alejandro
Sosa Jaqueline
Profesores:
Lic. Adrián N. Rodriguez
Lic. Diego A. Ambrossio
pf3
pf4
pf5
pf8

Vista previa parcial del texto

¡Descarga Backtracking en sudoku y más Guías, Proyectos, Investigaciones en PDF de Compresión de Datos solo en Docsity!

TECNICATURA EN PROGRAMACIÓN

Estructura de Datos

Proyecto Final

Resolución de sudoku con inteligencia

artificial

Integrantes: Rivero Ayelén Echavarría Lucas Saucedo Alexis Vivan Laura Varela Alejandro Sosa Jaqueline Profesores: Lic. Adrián N. Rodriguez Lic. Diego A. Ambrossio

Abstract The present work consists of using artificial intelligence to solve a sudoku. For this, the rules and conditions to solve it will be analyzed, as well as the strategy used to raise the code, as a result we can solve sudokus 3x3. Resumen El presente trabajo consiste en utilizar inteligencia artificial para resolver un sudoku. Para ello, se analizarán las reglas y condiciones para resolverlo, así también como la estrategia utilizada para plantear el código, cómo resultado podremos resolver sudokus 3x3. Historia del Sudoku Introducción Se cree que el juego que hoy conocemos como sudoku surgió de los trabajos del matemático Leonhard Euler (1707 – 1783) sobre el cálculo de probabilidades de los cuadrados latinos. Los sudokus empiezan a ser conocidos en las publicaciones de las revistas "Math Puzzles and Logic Problems" y “Dell Magazine” de Nueva York, bajo el nombre de “Number Place” y como entretenimiento. En 1984 el juego se exporta a Japón y se publica en el diario “Monthly Nikolist”. Se hace conocido con el nombre Sūji wa dokushin ni kagiru, "los números deben ser únicos" y como es costumbre de ese país, es abreviado a Sūdoku (sū = número, doku = solo). En 1986, el presidente de la revista introduce dos innovaciones en el rompecabezas: el número de cifras dadas estaría restringida a un máximo de 30 y estas deberían ser “simétricas” al rotarse, condición que ya no se cumple en los Sudokus actuales. En 1997 Wayne Gould, un juez neozelandés, durante unas vacaciones en Japón, encontró una revista de Sudoku y habiendo estudiado programación, escribió un programa para generar sudokus al azar. Vuelve a introducirlos en occidente ofreciéndoles al diario británico “The Times” a cambio de que se publicite su sitio web. Estos comienzan a ser publicados a partir de finales del 2004. Este juego se ha ido extendiendo por periódicos y publicaciones por todo el mundo convirtiéndose en un fenómeno global, tanto que todos los años se lleva a cabo el Campeonato Mundial de Sudoku. ¿Cómo se resuelve? El sudoku es un juego de lógica matemática en el que se debe completar una cuadrícula de 9x9 celdas dividida en 9 regiones de 3x3, con números del 1 al 9, de forma que cada número aparezca solo una vez en cada fila, en cada columna y en cada región. La estrategia para resolver sudokus se puede considerar como la combinación de tres procesos, rastreo, marcado y análisis en las diferentes etapas de la resolución. A partir de uno de los dígitos dados se puede rastrear dónde están ubicados los dígitos semejantes en las otras 8 subcuadrículas para ir completando los faltantes, siguiendo las condiciones del juego. Una vez agotado esté método y sin poder completar más celdas, se debe hacer un análisis de las posibilidades que existen para completar las celdas faltantes; esto se puede realizar aplicando una marca en las casillas o el número como subíndice y es lo que se conoce como

Análisis La solución cumple con todas las reglas del juego, las cuales son: En una cuadrícula de 9x9: 1 - Los espacios en blanco se rellenan con números del 1 al 9. 2 - El número no debe repetirse en la subcuadrícula de 3x3. 3 - El número no debe repetirse en la fila. 4 - El número no debe repetirse en la columna. 5 Si solo hay un valor posible para una casilla de determinada columna, fila o subcuadrado ese valor ocupará esa casilla. Por lo tanto, el algoritmo a utilizar debe constatar estas condiciones con cada número. Por ejemplo, en la primera casilla de nuestro sudoku ejemplo resuelto, vemos que el primer número es nueve, el cual no se encontraba en la cuadrícula correspondiente, no se encontraba en la fila y tampoco en la columna. Esta operación se debe realizar para cada casilla. Sin embargo, las condiciones no son suficientes para la resolución del problema. También vamos a necesitar pasar por cada casilla y verificar: 6 - Si NO hay un número entre el 1 y el 9 En caso de ser cierto se pondrá el número 1, si este verifica los pasos 2,3 y 4 pasará a la próxima casilla, caso contrario pondrá el número dos y así hasta encontrar un número válido. Hasta el momento, tenemos 6 enunciados que nos ayudan a poner un número en una casilla, pero ¿Cómo llegamos a la solución del problema?. Aquí es donde aplicamos el algoritmo de backtracking, En general, la forma de actuar consiste en elegir una alternativa del conjunto de opciones en cada etapa del proceso de resolución, y si esta elección no funciona (no nos lleva a ninguna solución), la búsqueda vuelve al punto donde se realizó esa elección, e intenta con otro valor. Cuando se han agotado todos los posibles valores en ese punto, la búsqueda vuelve a la anterior fase en la que se hizo otra elección entre valores. Si no hay más puntos de elección, la búsqueda finaliza.

Esta imagen es un ejemplo del backtracking, podemos ver que tiene la apariencia de un árbol de búsqueda (no necesariamente binario). Esto aplicado en el sudoku hallará la solución única para este sudoku. Modelado del problema a partir del análisis Partiendo de las reglas mencionadas y el algoritmo backtracking podemos deducir que: 1 - El programa debe recorrer cada casillero del sudoku 1 a 1. 2 - Debe saber si el casillero tiene un número entre 1 y 9. 3 - Debe poner un número y revisar si es válido(no se repite en la columna, cuadrícula o fila) 4 - Debe repetir el proceso, pero guardar las posiciones que vaya utilizando 5 - En caso de no poder poner ningún número válido, debe volver un paso atrás, setear ese casillero en 0 y debe poner el número siguiente que verifique la validez. Este proceso se repetirá hasta que el sudoku sea resuelto. Implementación del código Para realizar el algoritmo se utilizará python 3, más precisamente 3.9 pero debería funcionar en versiones anteriores. Colab de código

  • Primero escribimos los números que tenemos en el Sudoku separándolos con comas, entre corchetes y respetando la ubicación de cada número
  • Los espacios en los que se encuentran los ceros, son los que faltan completar con los respectivos números.
  • Luego definimos una función que resolverá el Sudoku, en este caso la llamaremos determinar_solución sudoku = [[0,1,8,7,2,0,3,0,0], [0,0,7,0,3,0,8,0,6], [5,3,0,0,9,0,2,0,0], [0,0,3,9,8,0,0,0,0], [0,0,0,0,0,0,0,0,0], [0,6,0,0,5,0,0,0,9], [0,2,0,0,0,3,0,5,4], [0,0,0,2,0,0,0,1,0], [3,0,9,5,4,0,6,8,0]] def print_sudoku(sudoku): #imprime sudoku for l in sudoku: print(l) def encontrar_coordenada_grid(val): if val <= 2: #nos da en que grid estamos ubicados return 0 #si estamos de (0,1,2) = grid 1 elif val <= 5: #si estamos de (3,4,5) = grid 2 return 1 #si estamos de (6,7,8) = grid 3 else: #tanto para “y” o “x”

determinar_sudoku(sudoku) revisar_filas_columnas(2,0,8,sudoku)

  • Asignamos " y" a las filas y " x " a las columnas, aclarando que son un total de 9.
  • Aclaramos que los valores que vamos a utilizar van del 1 al 9, es decir del 1 al 10
  • Creamos otra función que irá al comienzo del código para que se encargue de buscar en las filas , columnas y cada uno de los grid si un valor se encuentra allí. De ser así, retornará “False” , por lo que no será posible el reemplazo.
  • Creamos una lista para extraer la columna que vamos a comparar. Si el valor se encuentra en la columna, devolverá “False”.
  • Creamos una tercera función que se ocupará de revisar si los valores se encuentran en toda la grilla del Sudoku y así ubicar en cuál de todas se encuentra. Esta función será grid 3x3. Lo que hará es devolver una lista de nueve valores que están dentro del grid.
  • La idea es multiplicar el índice (los cuales son 0,1 y 2) nos dará la ubicación del grid en el que estemos con la suma + 3 se le agregan las 3 filas que lo componen.
  • Luego agregamos un “for” en donde estarán estas operaciones anteriores que iteraran dentro del grid.
  • Al final de estos dos “for” con un grid.append() agregamos el valor a la ubicación correspondiente en caso que sea posible su utilización en dicho lugar.
  • Con in ”if” realizamos la verificación de las reglas del juego, es decir revisa la columna, la fila y el grid, si ese valor sirve para utilizarlo en esa ubicación, nos devolverá verdadero.
  • La última función es la de resolver el sudoku la cual con 2 “for” para iterar por filas y columnas y el “if” agrega el valor a usar
  • Por último en esa función corre el backtracking que en caso de no ser la solución correcta vuelva atrás con el camino recorrido e intente una nueva (recursividad) es decir, borra la solución equivoca, por eso se = 0 y comienza nuevamente con otra opción de valor. Desafíos A la hora de la resolución del problema, se pueden plantear varias formas de realizarlo. En nuestra investigación se pudo encontrar una basta cantidad de algoritmos y aplicaciones, por lo tanto, el mayor desafío fue elegir uno y poder comprender su funcionamiento tanto desde la lógica como en el código. Conclusión La resolución de Sudoku tiene varios caminos, aplicando inteligencia artificial y sus respectivos algoritmos podemos apreciar que el más interesante,a nuestro parecer, es el de backtracking a nivel computacional al menos. El backtracking realizará el sudoku de una manera que una persona no lo haría, poniendo números hasta encontrar la solución y volviendo a un punto anterior cuando no tenga opciones correctas. Una persona tardaría más tiempo aplicando esta resolución, pero una computadora puede hacerlo en fracción de segundos. Por otro lado, la construcción de esta solución es un árbol de búsqueda con normas específicas para encontrar, en este caso, una única solución. Pero puede que en otros problemas, pueda existir más de una solución aplicando backtracking.

Bibliografía de consulta Peleato Pradel, J. J. (s. f.). 2.4 Backtracking - Programación, refactoriza tu mente. Introducción - Programación, refactoriza tu mente. https://docs.jjpeleato.com/algoritmia/backtracking https://estructuradedatos2backtracking.blogspot.com/2014/08/metodo-backtracking-u- algoritmo-vuelta.html https://recursospython.com/codigos-de-fuente/solucionador-de-sudoku/ https://github.com/jorditorresBCN/Sudoku https://github.com/Kyubyong/sudoku https://www.youtube.com/watch?v=KWP90gAsOa https://www.euskadi.eus/contenidos/informacion/ocio_cult_sudoku/es_11031/ sudoku.html#:~:text=Origen,el%20lugar%20de%20los%20n%C3%BAmeros). https://sudoku.com/es/como-jugar/la-historia-de-sudoku/ https://www.sudokumania.com.ar/noticias/origen-del-sudoku