SISTEMAS INTELIGENTES

EJERCICIO 1

Enunciado | Código | Objetivos



Ejercicio 1: Búsqueda en árbol, no informada. Anchura y profundidad.

El fichero search.c contiene el código de los algoritmos de búsqueda en árbol y búsqueda en grafo extraídos directamente del pseudocógigo del libro [Russell&Norvig03]. En las prácticas utilizaremos este código para construir distintos dominios de búsqueda: por ejemplo, proporcionaremos completo del dominio de carreteras de Rumanía y tendremos que programar otros dos, el 8-puzzle y el mundo de los bloques.

Dominio 1: Carreteras de Rumanía

Es un escenario extraído del [Russell&Norvig03] en el que tenemos un mapa de carreteras de Rumanía con las siguientes ciudades y distancias entre ellas por carretera:

Romania roadmap

Se trata de encontrar una ruta a Bucharest (preferentemente la más corta) partiendo de Arad.

Dominio 2: el 8-puzzle

Es la versión reducida de un puzzle muy conocido en el que tenemos una parrilla de 3 x 3 posiciones que contienen 8 piezas y un hueco. En cada situación podemos mover hacia el hueco alguna de sus piezas adyacentes. Para estas primeras pruebas tomaremos los siguientes estado inicial y estado meta:

 1
 2
 3
 4
 5
 6
 7
 8


                  
 4
 1
 3
 7
 2
 5

 8
 6

Estado inicial

Estado meta

Codificaremos las posibles acciones como UP, DOWN, LEFT, RIGHT, dependiendo de cuál de las piezas movemos hacia el hueco.

Dominio 3: el mundo de los bloques

Se trata de un dominio de prueba muy conocido en Inteligencia Artificial. Tenemos un conjunto de N bloques numerados (de 0 a N-1). Cada bloque puede colocarse de uno en uno sobre la mesa (TABLE) o encima de otro bloque, formando torres. Sólo podemos mover bloques libres, que no tienen nada encima. En principio, en la versión más sencilla, la mesa tiene espacio suficiente para todos los bloques. Para estas primeras pruebas utilizaremos los siguientes estados inicial y estado meta.

blocks

Código a construir

Para cada dominio tendremos que completar dos archivos, domain.h y domain.c, que describimos a continuación.

Para facilitar el cambio de dominio y la compilación podemos usar el fichero Makefile. Por ejemplo, para el mapa de carreteras, tecleando

$  make domain DOM=romania

creará dos links simbólicos domain.h y domain.c a partir de los archivos romania.h y romania.c. Tendremos que crear los archivos 8puzzle.h, 8puzzle.c, blocks.h blocks.c para los otros dos dominios. Una vez elegido el dominio, para compilar el programa, simplemente tecleamos:

$  make

y, si la compilación tiene éxito, el ejecutable resultante se denominará search.

Por último, en el mismo directorio de compilación tendremos los ficheros queue.h y queue.c para manejo de colas y los ficheros hash.h y hash.c para el uso de tablas hash (necesario en el algoritmo de búsqueda en grafo). Los archivos .h contienen una descripción de cada una de las funciones que se pueden utilizar.

Se puede descargar un archivo zip con todos los archivos necesarios: ex1.zip

El ejecutable search permite las siguientes opciones desde línea de comandos:
    search -a <algoritmo> -i <tipodeinsercion> -f <fichero>

Todos los parámetros son opcionales:

OBJETIVOS DEL EJERCICIO 1

  1. Crear los dominios para el problema de 8-puzzle (ficheros 8puzzle.h y 8puzzle.c) y para el problema del Mundo de Bloques (ficheros blocks.h y blocks.h)
  2. Experimentar con la búsqueda en anchura (la incluida por defecto en search.c) en los tres dominios: romania, 8puzzle y blocks.
  3. Cambiar a búsqueda en profundidad, insertando al principio de la frontera, en lugar de al final: