Algoritmos_de_Busqueda.doc

11
Actividades y Ejercicios INTELIGENCIA ARTIFICIAL–2da. UNIDAD Algoritmos DE BUSQUEDA En un documento en Word elabore diferentes algoritmos de búsqueda sin información de dominios, en juegos tales como: sopa de letras, sudoku. Envía tu archivo a través de este medio. ALGORITMO DE BUSQUEDA Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento con ciertas propiedades dentro de una estructura de datos; por ejemplo, ubicar el registro correspondiente a cierta persona en una base de datos, o el mejor movimiento en una partida de ajedrez. La variante más simple del problema es la búsqueda de un número en un vector. Los algoritmos presentan diferencias entre ellos que los convierten en más o menos eficientes y prácticos según sea la rapidez y la eficiencia demostrada por cada uno de ellos. JUEGO SOPA DE LETRAS En la figura que verán a continuación, se muestra un ejemplo de una sopa de letras. 1 INGENIERIA DE SISTEMAS E INFORMATICA - Alumno : Castro Rosado, Edwin Antonio

description

ALGORITMOS

Transcript of Algoritmos_de_Busqueda.doc

Page 1: Algoritmos_de_Busqueda.doc

Actividades y EjerciciosINTELIGENCIA ARTIFICIAL–2da. UNIDAD

Algoritmos DE BUSQUEDA

En un documento en Word elabore diferentes algoritmos de búsqueda sin informa-ción de dominios, en juegos tales como: sopa de letras, sudoku. Envía tu archivo a través de este medio.

ALGORITMO DE BUSQUEDA

Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento con ciertas propiedades dentro de una estructura de datos; por ejemplo, ubicar el registro correspondiente a cierta persona en una base de datos, o el mejor movi-miento en una partida de ajedrez.

La variante más simple del problema es la búsqueda de un número en un vector.

Los algoritmos presentan diferencias entre ellos que los convierten en más o me-nos eficientes y prácticos según sea la rapidez y la eficiencia demostrada por cada uno de ellos.

JUEGO SOPA DE LETRAS

En la figura que verán a continuación, se muestra un ejemplo de una sopa de le-tras.

1 INGENIERIA DE SISTEMAS E INFORMATICA - Alumno : Castro Rosado, Edwin Antonio

Page 2: Algoritmos_de_Busqueda.doc

Una sopa de letras se puede definir como un juego de destreza y rapidez mental, donde se tiene que encontrar un número finito de palabras. Dichas palabras están definidas previamente en el mismo juego y están ocultas en una matriz cuadrada de letras. La búsqueda de las palabras en la matriz se puede realizar de la siguien-te forma:

En la figura anterior se puede observar la forma de buscar una palabra en la matriz de letras, para este caso la palabra a buscar es “NADIE”.

ALGORITMOS DE DESARROLLO.

Algunas de las aplicaciones que le dan solución a una sopa de letras lo hacen por medio de la técnica llamada backtracking (vuelta atrás). Es una estrategia para en-contrar soluciones a problemas que satisfacen restricciones, usada muy frecuente-mente 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 solu-ción del famoso sudoku, o encontrar el camino que da la salida en un laberinto, o en un juego de ajedrez, podíamos usarlo para aplicarle cierta inteligencia artificial a la CPU. El backtracking también es usado como base lógica en sistemas de reglas de inferencia, como es el caso de prolog.

Aunque la solución que propone el backtracking parece ser buena frente a otras al-ternativas de búsqueda para este tipo de aplicaciones, el tiempo de respuesta pue-de variar dependiendo del tamaño de la matriz. Las causas de esta característica radican en la forma de implementación, y si no se usa otra técnica que lo comple-mente para dar con la solución, puede consumir mayor tiempo para encontrar las respuestas. Por ejemplo, si intentáramos solucionar la sopa de letra con la única implementación del backtracking tendríamos entonces que:

1. Comparar cada letra de la matriz, verificar si dicha letra es igual a la primera le-tra de la palabra buscada.

2. Si es igual entonces:3. Seleccionar una de las direcciones: (ABAJO, ARRIBA, DERECHA, IZQUIERDA,

DIAGONAL_INFERIOR_IZQUIERDA, DIAGONAL_INFERIOR_DERECHA, DIA-GONAL_SUPERIOR_DERECHA, DIAGONAL_SUPERIOR_IZQUIERDA).

2 INGENIERIA DE SISTEMAS E INFORMATICA - Alumno : Castro Rosado, Edwin Antonio

Page 3: Algoritmos_de_Busqueda.doc

4. Verificar la siguiente letra de la palabra buscada en una de las direcciones se-leccionada.

5. Si es igual entonces: ir al paso 4.6. No es igual entonces: ir al paso 3.7. Si ya no hay mas letras que buscar en la palabra buscada, entonces la palabra

ha sido encontrada en la dirección seleccionada y en la posición de letra de la matriz comparada. ir al paso 9.

8. Si ya no hay mas direcciones en donde buscar la solución entonces ir al paso 1.9. Si existen más palabras por buscar, Pasar a la siguiente palabra buscada.10.No existen más palabras por buscar, entonces debemos mostrar las soluciones

encontradas.

¿QUE ES UN ÍNDICE INVERTIDO?

Un índice invertido es una estructura de datos para almacenamiento que mapea contenido tales como palabras o números con sus ubicaciones en un archivo de base de datos, en un documento o en un conjunto de documentos. Digamos que tenemos los siguientes textos:

T1: "esa manzana es de color verde"

T2: “mira, esa pelota es de color azul”

T3: “eso es lo que es”

Una representación en índice invertido de lo anterior sería:

“esa”: {t1, t2}

“es”: {t1, t2, t3}

“color”: {t1, t2}

“manzana”: {t1}

“mira”: {t2}

“lo”:{t3}, etc.

La palabra que aparece en el lado izquierdo separado por los dos puntos y encerra-da entre comillas, es una palabra que aparece en alguno de los 3 textos del ejem-plo, llamada en el índice invertido como vocabulario. Las expresiones encerradas entre llaves que aparecen en la parte derecha, son los textos donde aparece la pa-labra de la izquierda, esta parte del índice invertido es llamada lista de posteo.

De 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. Así que, esta estructura tiene la obligación de permitir una búsqueda más rápida en una consulta, lo cual hace de esta técnica algo valioso para algunos de los motores de base de datos más famosos en el mundo.

3 INGENIERIA DE SISTEMAS E INFORMATICA - Alumno : Castro Rosado, Edwin Antonio

Page 4: Algoritmos_de_Busqueda.doc

Volviendo a nuestro pequeño problemita de la sopa de letras, al preguntarnos ¿por que necesito un índice invertido?, pues bien, la solución que proponíamos en la parte de nuestro análisis era inicialmente realizar una búsqueda secuencial, esto lo hacíamos Preguntando en cada letra de nuestra matriz si era igual a la primera le-tra de la palabra a buscar, y si era así, verificábamos en las direcciones validas donde se podía encontrar la solución, bueno eso no estaría mal, pero hablando en términos mayores, ¿que pasaría si existiese una matriz de 1000 X 1000, que da un total de 1.000.000 de letras y que al momento de buscar la solución a una palabra de 4 letras, dicha solución estuviera en la posición 999.996 y su dirección sea hacia la derecha?, ¿no se hubiese perdido bastante tiempo en comparaciones innecesa-rias con el resto de letras en la matriz? O en el caso en que hubiese en otra posi -ció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 y verificación que no tenía que ha-cerse. Y esta situación solo está ocurriendo para buscar una sola palabra, ahora imagínate si tuvieses que buscar 5 o más palabras.

Lo que propongo con el uso del índice invertido, es conocer de antemano, en que posiciones están las letras candidatas a ser evaluadas y luego hacer uso del back-tracking para verificar la solución a la palabra buscada.

Lo primero que haríamos para resolver la sopa de letra anterior, es crear nuestro índice invertido, tomando como vocabulario la primera letra de cada palabra a bus-car y como lista de posteo las posiciones de esa letra en la matriz de letras, de esta forma tendríamos los siguientes datos:

“A”: {(0,5), (0,8), (6,6)}

“E”: {(0,0), (9,0), (9,9)}

El par ordenado que se encuentra en la lista de posteo corresponde a la expresión (fila, columna) en la matriz de letras. Así, por ejemplo, la letra “A” con la que co -mienza la palabra “AULA”, se encuentra en la matriz, en las posiciones (0,5) (0,8) y (6,6). La letra “E” que corresponde a la palabra “ESTUDIANTE”, se encuentra en las posiciones (0,0) (9,0) y (9,9). En el caso de la palabra “ÉXITO”, si nos damos cuenta la letra inicial es la misma que la de “ESTUDIANTE” por lo tanto ya tenemos esa referencia guardada previamente en el índice invertido.

La idea general para armar esta estructura, es:

4 INGENIERIA DE SISTEMAS E INFORMATICA - Alumno : Castro Rosado, Edwin Antonio

Page 5: Algoritmos_de_Busqueda.doc

1. Recorrer una sola vez la matriz, preguntando en cada letra si se parece a algu-nas de las letras con que comienzan las palabras que se quieren buscar,

2. Si se parecen, preguntar si ya existe en el índice invertido. Si ya existe ir al pa-so 4 sino ir al paso 3.

3. Almacenar la letra como vocabulario y asignar una referencia de la fila y la co-lumna.

4. Si la posición no existe en la lista de posteo, guardar la posición de la forma (fi -la, columna).

Una vez tengamos el índice invertido construido, será más fácil encontrar la solu-ción de las palabras buscada, ya que tenemos una mayor precisión en la búsque-da. Entonces, el algoritmo que teníamos anteriormente en la primera parte de nues-tro tutorial, lo podemos ajustar a la siguiente forma:

1. Crear un índice invertido para la sopa de letras.2. Tomar como entrada la primera palabra a buscar y la lista de posteo asociada a

esta.3. Se toma como pivote la letra de la matriz en la posición del par ordenado que

se encuentra en la lista de posteo.4. Seleccionar una de las direcciones: (ABAJO, ARRIBA, DERECHA, IZQUIERDA,

DIAGONAL_INFERIOR_IZQUIERDA, DIAGONAL_INFERIOR_DERECHA, DIA-GONAL_SUPERIOR_DERECHA, DIAGONAL_SUPERIOR_IZQUIERDA).

5. Verificar la siguiente letra de la palabra buscada en una de las direcciones se-leccionada.

6. Si es igual entonces: ir al paso 5.7. No es igual entonces: ir al paso 4.8. Si ya no hay mas letras que buscar en la palabra buscada, entonces la palabra

ha sido encontrada en la dirección seleccionada y en la posición de letra de la matriz comparada. ir al paso 10.

9. Si ya no hay mas direcciones en donde buscar la solución entonces ir al paso 3.10.Pasar a la siguiente palabra buscada.11.No existen más palabras por buscar, entonces debemos mostrar las soluciones

encontradas.

SUDOKU

El Sudoku es un tipo especial de Cuadro latino, y abundaremos en detallesmás adelante. Este último apareció en la literatura árabe, hace aproximadamente700 años. A continuación se definirán algunos conceptos útiles para entender e imple- mentar el algoritmo.

Definición: Un Cuadro latino es una matriz cuadrada de n × n enla cual cada fi -la y cada columna son permutaciones de los elementos deS = {1, 2, . . . , n} para n > 1.

5 INGENIERIA DE SISTEMAS E INFORMATICA - Alumno : Castro Rosado, Edwin Antonio

Page 6: Algoritmos_de_Busqueda.doc

Definición: Un Sudoku es una matriz cuadrada de 9 × 9 subdividida en nueve submatrices de 3 × 3, también denominadas “cajas” (como semuestra en la fi-gura 1), en cuyas celdas se encuentran números del conjuntoA = {1, 2, . . . , 9}, de tal forma que cada fila, cada columna y cada cajacontiene uno y solo uno de los ele-mentos del conjunto A.

3 2 8 1 6 5 7 4 95 1 4 8 7 9 3 6 2

7 5 9 6 1 2 4 3 81 8 3 9 5 4 6 2 7

4 9 1 3 2 7 5 8 62 3 7 5 8 6 9 1 4

Un Sudoku inicial se obtiene al eliminar m números en las celdas de un Sudoku. El número m es el orden del Sudoku inicial (1 ≤ m ≤81). Decimos que un Sudoku inicial está bien definido si y solo si existe una única forma de llenar las celdas va-cías para alcanzar un Sudoku.

5 6 8 4 34 8 3 5 6

6 5 4 8 76 8 5 4 7

5 4 68 6 4 56 9 2 7 5 47 4 1 8 6 2 53 5 8 1 6 2 7 9 4

Sudoku inicial deorden m=32

ALGORITMOS PARA GENERAR Y RESOLVER

A continuación, se expone una breve explicación de algunos de ellos.

Algoritmos para resolver Sudokus iniciales:

Marcha atrás. Consiste en asignar un valor aleatorio a una celda vacía, verificando que dicha asignación cumpla con las condiciones del Sudoku, de lo contrario, devuelve el Sudoku inicial original e intenta con un valor dis-tinto. Este algoritmo itera este método conservando los valores que cum-plen las condiciones del Sudoku. Es costoso en términos de tiempo.

Programación lineal. Transforma el Sudoku inicial en un problema de progra-mación, con una función maximizadora.

6 INGENIERIA DE SISTEMAS E INFORMATICA - Alumno : Castro Rosado, Edwin Antonio

Page 7: Algoritmos_de_Busqueda.doc

Algoritmos para generar Sudokus iniciales:

Fuerza bruta. Genera una matriz de 9 × 9 y asigna los símbolos del conjunto {1, 2, . . . , 9} aleatoriamente, después comprueba si la matriz resultante es un Sudoku. En el momento en que encuentra unSudoku, procede a eliminar el número de celdas requeridas por el usuario, verificando después de cada eliminación si la matriz resultante es un Sudoku inicial bien definido

Métodosimétrico. Para un Sudoku predefinido elimina celdas en lamatriz triangular superior. Cuando las celdas están completamentedeterminadas las refleja por la diagonal y elimina las correspondientes celdas en la matriz trian-gular inferior para obtener un Sudoku inicial.

Estos algoritmos pueden llegar a ser muy lentos (Marcha atrás y Fuerza bruta) y complicados (Programación lineal).El objetivo de este trabajo recae en diseñar un algoritmo sencillo y fácil de entender que permita generar Sudokus con diferentes niveles de dificultad. Partiremos de una colección de Sudokus iniciales bien defini-dos, que según la literatura son aceptados como de “orden máximo”, y por medio de un algoritmo de solución, que se detallaramás adelante, se obtendrá un Sudoku inicial bien definido con el nivel de dificultad deseado.

Con base en la lista de Sudokus iniciales bien definidos de orden m = 64, se pro-cedió de la siguiente manera:

1. Se creó una pequeña base de datos con elementos de dicha lista, llama-mos a estos elementos, elementos básicos.

2. El algoritmo toma aleatoriamente un elemento básico y lo modifica para ob-tener un Sudoku inicial bien definido equivalente con el nivel de dificultad de-seado.

Para alcanzar esto, se encontró un algoritmo desarrollado en Matlab, el cual ge-nera Sudokus iniciales simétricos y además proporciona una solución paso a paso del rompecabezas. Del análisis del algoritmo, se concluyó que la función (“hint”) que determina la solución paso a paso no es complicada, de esta forma podría ser útil para nuestro proyecto. La función básicamente consiste en dos estrategias:

La primera estrategia intenta responder la pregunta “¿Qué número puede ocupar esta posición?”.

La segunda estrategia es preguntar “¿Dónde puede ir el número N en esta fila (o columna, o caja)?”.

Si alguna de las preguntas anteriores tiene soluciónúnica, el algoritmo asigna el valor correspondiente.

Como un primer paso, se definen los niveles de dificultad. Se considera que los elementos básicos son los Sudokus iniciales bien definidos aceptados en la lite -ratura como orden máximo. El nivel de dificultad se define como muestra la si-guiente tabla:

7 INGENIERIA DE SISTEMAS E INFORMATICA - Alumno : Castro Rosado, Edwin Antonio

Page 8: Algoritmos_de_Busqueda.doc

Nivel deDificultad Orden

F´acil 0a35Medio 36a50Dif´ıcil 51a63MuyDif´ıcil 64

El algoritmo es el siguiente:

1. El usuario determina el nivel de dificultad.2. Se selecciona aleatoriamente un elemento de la base de datos.3. Una rotación aleatoria y una permutación aleatoria se aplican al elemento

básico.4. Si el nivel máximo de dificultad es escogido, imprime el elemento básico trans-

formado; de otro modo se aplica la función “hint” a dicho elemento las veces que se necesite hasta que el Sudoku inicial alcance el orden deseado de acuerdo al nivel de dificultad requerido, y finalmente, imprime el Sudoku ini -cial bien definido resultante.

Para cada nivel de dificultad se muestra un Sudoku inicial bien definidogenera -do por el algoritmo, con su correspondiente solución.

8 2 9 4 7 5 3 8 2 9 4 6 1 7 5 35 3 1 8 9 6 4 5 3 1 8 7 2 9 6 4

5 9 3 1 2 8 7 6 4 5 9 3 1 2 86 5 8 4 7 3 6 2 9 5 8 1

8 5 2 3 1 8 6 7 4 5 2 3 95 1 8 4 7 2 9 5 1 3 8 4 7 6

3 5 8 2 9 1 7 3 5 6 8 4 25 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

8 INGENIERIA DE SISTEMAS E INFORMATICA - Alumno : Castro Rosado, Edwin Antonio