ALGORITMOS DE BUSQUEDA Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento concreto dentro de una estructura de datos. Consiste en solucionar un problema de existencia o no de un elemento determinado en un conjunto finito de elementos, es decir, si el elemento en cuestión pertenece o no a dicho conjunto, además de su localización dentro de ste. !ste problema puede reducirse a de"ol"er la existencia de un número en un "ector.
SOPA DE LETRAS !n la figura que "erán a continuación, se muestra un ejemplo de una sopa de letras.
Una sopa de letras se puede definir como un juego de destreza # rapidez rapidez mental, donde se tiene que encontrar un número finito de palabras. $ichas palabras están definidas pre"iamente en el mismo juego # están ocultas en una matriz cuadrada de letras. %a búsqueda de las palabras en la matriz se puede realizar de la siguiente forma&
!n la figura anterior se puede obser"ar la forma de buscar una palabra en la matriz de letras, para este caso la palabra a buscar es '()$*!+.
ALGORITMOS DE DESARROLLO. )lgunas de las aplicaciones que le dan solución a una sopa de letras lo hacen por medio de la tcnica llamada bactracing -"uelta atrás. !s una estrategia para encontrar soluciones a problemas que satisfacen restricciones, usada mu# frecuentemente en sistema multi/soluciones. Uno de los ejemplos que podemos encontrar en la aplicación de este algoritmo para el contexto que estamos tratando, es la solución del famoso sudou, o encontrar el camino que da la salida en un laberinto, o en un juego de ajedrez, pod0amos usarlo para aplicarle cierta inteligencia artificial a la C1U. !l bactracing tambin es usado como base lógica en sistemas de reglas de inferencia, como es el caso de prolog. )unque la solución que propone el bactracing parece ser buena frente a otras alternati"as de búsqueda para este tipo de aplicaciones, el tiempo de respuesta puede "ariar dependiendo del tamaño de la matriz. %as causas de esta caracter0stica radican en la forma de implementación, # si no se usa otra tcnica que lo complemente para dar con la solución, puede consumir ma#or tiempo para encontrar las respuestas. 1or ejemplo, si intentáramos solucionar la sopa de letra con la única implementación del bactracing tendr0amos entonces que&
1. Comparar cada letra de la matriz, "erificar si dicha letra es igual a la primera letra de la palabra buscada. 2. 2i es igual entonces& 3. 2eleccionar una de las direcciones& -)3)45, )66*3), $!6!C7), *89U*!6$), $*):5()%;*(. 6. (o es igual entonces& ir al paso ?.
7. 2i #a no ha# mas letras que buscar en la palabra buscada, entonces la palabra ha sido encontrada en la dirección seleccionada # en la posición de letra de la matriz comparada. ir al paso @. 8. 2i #a no ha# mas direcciones en donde buscar la solución entonces ir al paso A. 9. 2i existen más palabras por buscar, 1asar a la siguiente palabra buscada. 10. (o existen más palabras por buscar, entonces debemos mostrar las soluciones encontradas. ¿QUE ES UN ÍNDICE INERTIDO! Un 0ndice in"ertido es una estructura de datos para almacenamiento que mapea contenido tales como palabras o números con sus ubicaciones en un archi"o de base de datos, en un documento o en un conjunto de documentos. $igamos que tenemos los siguientes textos& BA& esa manzana es de color "erde BD& 'mira, esa pelota es de color azul+
B?& 'eso es lo que es+ Una representación en 0ndice in"ertido de lo anterior ser0a& 'esa+& EtA, tDF 'es+& EtA, tD, t?F 'color+& EtA, tDF 'manzana+& EtAF 'mira+& EtDF 'lo+&Et?F, etc. %a palabra que aparece en el lado izquierdo separado por los dos puntos # encerrada entre comillas, es una palabra que aparece en alguno de los ? textos del ejemplo, llamada en el 0ndice in"ertido como "ocabulario. %as expresiones encerradas entre lla"es que aparecen en la parte derecha, son los textos donde aparece la palabra de la izquierda, esta parte del 0ndice in"ertido es llamada lista de posteo. $e lo anterior se puede concluir que& Cada palabra que aparece en cada uno de los textos es asociada -mapeada con el texto o los textos donde esta aparece. )s0 que, esta estructura tiene la obligación de permitir una búsqueda más rápida en una consulta, lo cual hace de esta tcnica algo "alioso para algunos de los motores de base de datos más famosos en el mundo. =ol"iendo a nuestro pequeño problemita de la sopa de letras, al preguntarnos Gpor que necesito un 0ndice in"ertidoH, pues bien, la solución que propon0amos en la parte de nuestro análisis era inicialmente realizar una búsqueda secuencial, esto lo hac0amos 1reguntando en cada letra de nuestra matriz si era igual a la primera letra de la palabra a buscar, # si era as0, "erificábamos en las direcciones "alidas donde se pod0a encontrar la solución, bueno eso no estar0a mal, pero hablando en trminos ma#ores, Gque pasar0a si existiese una matriz de AIII J AIII, que da un total de A.III.III de letras # que al momento de buscar la solución a una palabra de > letras, dicha solución estu"iera en la posición @@@.@@K # su dirección sea hacia la derechaH, Gno se hubiese perdido bastante tiempo en comparaciones innecesarias con el resto de letras en la matrizH 5 en el caso en que hubiese en otra posición de la matriz, una letra parecida a la letra inicial de la palabra buscada pero no era la solución, entonces se hizo una búsqueda # "erificación que no ten0a que hacerse. L esta situación solo está ocurriendo para buscar una sola palabra, ahora imag0nate si tu"ieses que buscar M o más palabras. %o que propongo con el uso del 0ndice in"ertido, es conocer de antemano, en que posiciones están las letras candidatas a ser e"aluadas # luego hacer uso del bactracing para "erificar la solución a la palabra buscada.
%o primero que har0amos para resol"er la sopa de letra anterior, es crear nuestro 0ndice in"ertido, tomando como "ocabulario la primera letra de cada palabra a buscar # como lista de posteo las posiciones de esa letra en la matriz de letras, de esta forma tendr0amos los siguientes datos& ')+& E-I,M, -I,N, -K,KF '!+& E-I,I, -@,I, -@,@F !l par ordenado que se encuentra en la lista de posteo corresponde a la expresión -fila, columna en la matriz de letras. )s0, por ejemplo, la letra ')+ con la que comienza la palabra ')U%)+, se encuentra en la matriz, en las posiciones -I,M -I,N # -K,K. %a letra '!+ que corresponde a la palabra '!2BU$*)(B!+, se encuentra en las posiciones -I,I -@,I # -@,@. !n el caso de la palabra 'OJ*B5+, si nos damos cuenta la letra inicial es la misma que la de '!2BU$*)(B!+ por lo tanto #a tenemos esa referencia guardada pre"iamente en el 0ndice in"ertido. %a idea general para armar esta estructura, es&
1. 6ecorrer una sola "ez la matriz, preguntando en cada letra si se parece a algunas de las letras con que comienzan las palabras que se quieren buscar, 2. 2i se parecen, preguntar si #a existe en el 0ndice in"ertido. 2i #a existe ir al paso > sino ir al paso ?. 3. )lmacenar la letra como "ocabulario # asignar una referencia de la fila # la columna. 4. 2i la posición no existe en la lista de posteo, guardar la posición de la forma -fila, columna. Una "ez tengamos el 0ndice in"ertido construido, será más fácil encontrar la solución de las palabras buscada, #a que tenemos una ma#or precisión en la búsqueda. !ntonces, el algoritmo que ten0amos anteriormente en la primera parte de nuestro tutorial, lo podemos ajustar a la siguiente forma&
1. Crear un 0ndice in"ertido para la sopa de letras. 2. Bomar como entrada la primera palabra a buscar # la lista de posteo asociada a esta. 3. 2e toma como pi"ote la letra de la matriz en la posición del par ordenado que se encuentra en la lista de posteo.
4. 2eleccionar una de las direcciones& -)3)45, )66*3), $!6!C7), *89U*!6$), $*):5()%;*(. 8. 2i #a no ha# mas letras que buscar en la palabra buscada, entonces la palabra ha sido encontrada en la dirección seleccionada # en la posición de letra de la matriz comparada. ir al paso AI. 9. 2i #a no ha# mas direcciones en donde buscar la solución entonces ir al paso ?. 10. 1asar a la siguiente palabra buscada. 11. (o existen más palabras por buscar, entonces debemos mostrar las soluciones encontradas.
SUDO"U !l 2udou es un tipo especial de Cuadro latino, # abundaremos en detallesmás adelante. !ste último apareció en la literatura árabe, hace aproximadamentePII años. ) continuación se definirán algunos conceptos útiles para entender e imple/ mentar el algoritmo. $efinición& Un Cuadro latino es una matriz cuadrada de n Q n enla cual cada fila # cada columna son permutaciones de los elementos de2 R EA, D, . . . , nF para n S A. $efinición& Un 2udou es una matriz cuadrada de @ Q @ subdi"idida en nue"e submatrices de ? Q ?, tambin denominadas 'cajas+ -como semuestra en la figura A, en cu#as celdas se encuentran números del conjunto) R EA, D, . . . , @F, de tal forma que cada fila, cada columna # cada cajacontiene uno # solo uno de los elementos del conjunto ). 3
2
8
1
6
5
7
4
9
5
1
4
8
7
9
3
6
2
7
5
9
6
1
2
4
3
8
1
8
3
9
5
4
6
2
7
4
9
1
3
2
7
5
8
6
2
3
7
5
8
6
9
1
4
Un 2udou inicial se obtiene al eliminar m números en las celdas de un 2udou. !l número m es el orden del 2udou inicial -A T m TNA. $ecimos que un 2udou inicial está bien definido si # solo si existe una única forma de llenar las celdas "ac0as para alcanzar un 2udou.
5 4
8
3
6
5
4 6
5
4
8
6
6
8
4
3
5
6
8 8
5
7 4
7 6
4
6
9
2
7
7
4
1
8
3
5
8
1
5
6
5 4
2
6
2
5
7
9
4
Sudoku inicial deorden
m
32
=
ALGORITMOS PARA GENERAR # RESOLER ) continuación, se expone una bre"e explicación de algunos de ellos.
A$%&'()*&+ ,-'- '+&$/' S&+ (((-$+
Marcha atrás. Consiste en asignar un "alor aleatorio a una celda "ac0a,
"erificando que dicha asignación cumpla con las condiciones del 2udou, de lo contrario, de"uel"e el 2udou inicial original e intenta con un "alor distinto. !ste algoritmo itera este mtodo conser"ando los "alores que cumplen las condiciones del 2udou. !s costoso en trminos de tiempo. Programación lineal . Bransforma el 2udou inicial en un problema de programación, con una función maximizadora.
A$%&'()*&+ ,-'- %'-' S&+ (((-$+
Fuerza bruta. :enera una matriz de @ Q @ # asigna los s0mbolos del conjunto
EA, D, . . . , @F aleatoriamente, despus comprueba si la matriz resultante es un 2udou. !n el momento en que encuentra un2udou, procede a eliminar el número de celdas requeridas por el usuario, "erificando despus de cada eliminación si la matriz resultante es un 2udou inicial bien definido
Métodosimétrico. 1ara un 2udou predefinido elimina celdas en lamatriz
triangular superior. Cuando las celdas están completamentedeterminadas las refleja por la diagonal # elimina las correspondientes celdas en la matriz triangular inferior para obtener un 2udou inicial. !stos algoritmos pueden llegar a ser mu# lentos -archa atrás #
Con base en la lista de 2udous iniciales bien definidos de orden m R K>, se procedió de la siguiente manera&
1. 2e creó una pequeña base de datos con elementos de dicha lista, llamamos a estos elementos, elementos básicos. 2. !l algoritmo toma aleatoriamente un elemento básico # lo modifica para obtener un 2udou inicial bien definido equi"alente con el ni"el de dificultad deseado. 1ara alcanzar esto, se encontró un algoritmo desarrollado en atlab, el cual genera 2udous iniciales simtricos # además proporciona una solución paso a paso del rompecabezas. $el análisis del algoritmo, se conclu#ó que la función -'hint+ que determina la solución paso a paso no es complicada, de esta forma podr0a ser útil para nuestro pro#ecto. %a función básicamente consiste en dos estrategias&
%a primera ocupar esta %a segunda -o columna,
estrategia intenta responder la pregunta 'G9u número puede posiciónH+. estrategia es preguntar 'G$ónde puede ir el número ( en esta fila o cajaH+.
2i alguna de las preguntas anteriores tiene soluciónúnica, el algoritmo asigna el "alor correspondiente. Como un primer paso, se definen los ni"eles de dificultad. 2e considera que los elementos básicos son los 2udous iniciales bien definidos aceptados en la literatura como orden máximo. !l ni"el de dificultad se define como muestra la siguiente tabla& Nivel de Dificultad
Or den
F acil
0a35
Medio
36a50
Dif ıcil
51a63
´
´
MuyDif
ıcil
64
´
!l algoritmo es el siguiente&
1. !l usuario determina el ni"el de dificultad. 2. 2e selecciona aleatoriamente un elemento de la base de datos. 3. Una rotación aleatoria # una permutación aleatoria se aplican al elemento básico. 4. 2i el ni"el máximo de dificultad es escogido, imprime el elemento básico transformadoV de otro modo se aplica la función 'hint+ a dicho elemento las "eces que se necesite hasta que el 2udou inicial alcance el orden deseado de acuerdo al ni"el de dificultad requerido, # finalmente, imprime el 2udou inicial bien definido resultante. 1ara cada ni"el de dificultad se muestra un 2udou inicial definidogenerado por el algoritmo, con su correspondiente solución. 8
2
9
4
7
5
3
8
2
9
4
6
1
7
5
3
5
3
1
8
9
6
4
5
3
1
8
7
2
9
6
4
bien
5
9
3
1
2
5 5 8
6 8 5
5
1
8
7
6
4
5
9
3
1
2
8
8
4
7
3
6
2
9
5
8
1
2
3
1
8
6
7
4
5
2
3
9
4
7
2
9
5
1
3
8
4
7
6
3
5
8
2
9
1
7
3
5
6
8
4
2
2
9
8
3
7
6
5
2
9
8
4
3
1
7
8
2
6
5
3
4
8
2
1
7
6
9
5
(a ) Nivel fácil(b ) Solución