Inteligencia Artificial Artificial Tema 1- Modelación de un problema mediante búsqueda en un espacio de estados Alejandro López Alarcón 15/10/2017
PROBLEMA Un hombre tiene que cruzar un río con un zorro, un pollo y un saco de maíz. Tiene una barca de remos, y sólo puede llevar con él una cosa en la barca. Si el zorro y el pollo quedan solos, el zorro se come al pollo. Si el pollo y el maíz quedan solos, el pollo se come el maíz. PLANTEAMIENTO DEL PROBLEMA Hay que tener en cuenta la situación de antes o después de cruzar. El hombre y el resto de los integrantes del problema tienen que estar en alguna de las dos orillas. La representación del estado debe entonces indicar en qué lado se encuentra cada uno de ellos. Para esto se puede utilizar la siguiente sintaxis: estado(H, Z, P, M), en que H, Z, P, M son variables que representan, respectivamente, la posición del hombre, el zorro, el pollo y el maíz. Las variables pueden tomar dos valores: i y f, que simbolizan respectivamente el borde inicio y el borde fin del río. El estado inicial es entonces estado(i,i,i,i). El estado objetivo es estado(d,d,d,d). GENERACIÓN DE ESPACIO DE ESTADOS
Movimientos Estado Estado(i, i, i, i) Estado(f, i, f, i) Estado(i, i, f, i) Estado(f, f, f, i) Estado(f, i, f, f) Estado(i, f, i, i) Estado(i, i, i, f) Estado(f, f, i, f) Estado(i, f, i, f) Estado(f, f, f, f)
Cruza Solo
Con zorro
Con pollo
Con maíz
Problema Estado(i, i, f, i) Estado(f, i, f, i) Problema Problema Problema Problema Estado(i, f, i, f) Estado(f, f, i, f) Problema
Problema Imposible Estado(f, f, f, i) Estado(i, i, f, i) Imposible Imposible Estado(f, f, i, f) Estado(i, i, i, f) Imposible Problema
Estado(f, i, f, i) Estado(i, i, i, i) Imposible Estado(i,d, i, i) Estado(i, i, i, f) Estado(f, f, f, i) Estado(f, i, f, f) Imposible Estado(f, f, f, f) Estado(i, f, i, f)
Problema Imposible Estado(f, i, f, f) Imposible Estado(i, i, f, i) Estado(f, f, i, f) Imposible Estado(i, f, i, i) Imposible Problema
SOLUCIÓN DEL PROBLEMA El camino que pasa por la siguiente secuencia de estados es una solución del problema: estado(i,i,i,i) -
cruza con el pollo
estado(f,i,f,i) -
cruza solo
estado(i,i,f,i) -
cruza con el zorro
estado(f,f,f,i) -
cruza con el pollo
estado(i,f,i,i) -
cruza con el maíz
estado(f,f,i,f) -
cruza solo
estado(i,f,i,f) -
cruza con el pollo
estado(f,f,f,f) -
FIN
BÚSQUEDA EN ESPACIO DE ESTADOS String Búsqueda { open {estado_inicial} closed {} while (open no está vacío) { remover un estado X del conjunto open if (X es un estado objetivo) return éxito else { generar el conjunto de sucesores del estado X agregar el estado X al conjunto closed eliminar sucesores que ya están en open o en closed agregar el resto de los sucesores al conjunto open } } return fracaso }
BÚSQUEDA EN PROFUNDIDAD String Búsqueda_en_profundidad { open [estado_inicial] closed {} while (open no está vacía) { remover el primer estado X de la lista open if (X es un estado objetivo) return éxito else { generar el conjunto de sucesores del estado X agregar el estado X al conjunto closed eliminar sucesores que ya están en open o en closed agregar el resto de los sucesores al principio de open
} } return fracaso
}
Considerando que la cantidad promedio de sucesores de los nodos visitados es B, y suponiendo que la profundidad máxima alcanzada es n, este algoritmo tiene una complejidad en tiempo de O(B^n) y, si no se considera el conjunto closed, una complejidad en espacio de O(B × n). BÚSQUEDA EN AMPLITUD String Búsqueda_en_amplitud { open [estado_inicial] closed {} while (open no está vacía) { remover el primer estado X de la lista open if (X es un estado objetivo) return éxito else { generar el conjunto de sucesores del estado X agregar el estado X al conjunto closed eliminar sucesores que ya están en open o en closed agregar el resto de los sucesores al final de open } } return fracaso }
Si el factor de ramificación es B y la profundidad a la cual se encuentra el estado objetivo más cercano es n, este algoritmo tiene una complejidad en tiempo y espacio de O(B^n). BÚSQUEDA HEURÍSTICA String Búsqueda_heurística { open [estado_inicial] closed {} while (open no está vacía) { remover el primer estado X de la lista open if (X es un estado objetivo) return camino hasta X else { generar el conjunto de sucesores del estado X foreach (Y en sucesores) { if (Y no está en open ni en closed) { asignar a Y un valor heurístico agregar Y en la lista open } elsif (Y está en open) { if (el nuevo camino a Y es más corto) actualizar el camino almacenado en open } elsif (Y está en closed) { if (el nuevo camino a Y es más corto) { remover el estado Y del conjunto closed agregar el estado Y en la lista open }
} } agregar el estado X al conjunto closed reordenar la lista open según valores heurísticos } } return fracaso
}