Modelado y Navegación de Espacios de Búsqueda en IA

La base de la Inteligencia Artificial clásica reside en la capacidad de formular problemas complejos como gráfos o árboles de estados. Para que un agente autónomo tome decisiones lógicas o alcance un objetivo, primero debe entender qué acciones son posibles y cómo estas alteran su entorno. Al mapear un escenario (como un laberinto) dentro de un “espacio de búsqueda”, se otorga al sistema una estructura matemática navegable. Esta práctica lleva los conceptos teóricos de nodos, transiciones y costos a un plano tangible, permitiendo visualizar cómo la inteligencia computacional explora sistemáticamente las posibilidades hasta hallar una solución óptima.
Objetivo general
El estudiante logrará modelar un problema computacional en forma de un espacio de búsqueda, implementando y comparando la eficiencia de algoritmos de búsqueda ciega frente a algoritmos con información heurística en un entorno de desarrollo estructurado.
Materiales o recursos necesarios
- Computadora con acceso a internet.
- Entorno de desarrollo de Python (se recomienda Google Colab, Jupyter Notebook o Visual Studio Code).
- Librería estándar de Python instalada.
Generación de Insumos Prácticos
Para llevar a cabo esta actividad, el estudiante requerirá un código base que defina el entorno (el laberinto) y la estructura de los nodos
Instrucciones paso a paso
- Configuración del entorno: El estudiante abrirá un nuevo Notebook (ej. Google Colab) y copiará el bloque de código base provisto. Ejecutará la celda para asegurar que no hay errores de sintaxis. El propósito de esto es aislar la lógica del problema antes de implementar los algoritmos.
- Implementación de Búsqueda Ciega (BFS): Utilizando una estructura de datos tipo Cola (
collections.deque), el estudiante desarrollará una funciónbusqueda_amplitud(inicio, meta, laberinto)que explore el árbol nivel por nivel, guardando los estados visitados para evitar ciclos. - Cálculo de Función Heurística: El estudiante creará una función auxiliar
distancia_manhattan(estado_actual, estado_meta)que retorne la distancia absoluta entre dos puntos matemáticos. Esta métrica representará el conocimiento del dominio. - Implementación de Algoritmo Informado (A*): Empleando una Cola de Prioridad (
heapq), el estudiante desarrollará el algoritmo A*, donde la prioridad de exploración de cada nodo se defina por la fórmulaF(n) = G(n) + H(n), siendoGel costo acumulado yHla heurística de Manhattan. - Reconstrucción del Camino: El estudiante creará una función que, dado el nodo meta encontrado, retroceda a través de los nodos
padrehasta llegar al nodo inicial, imprimiendo la secuencia de acciones (ej. “ABAJO”, “DERECHA”). - Comparativa de Rendimiento: Se ejecutarán ambos algoritmos (BFS y A*) y el estudiante agregará contadores dentro de las funciones para registrar cuántos nodos fueron expandidos por cada método antes de hallar la meta.
Recomendaciones
- Analizar detenidamente el método
obtener_sucesoresdel código base, ya que es el motor que expande el espacio de búsqueda. - Comentar cada bloque de código nuevo que se añada; esto facilitará la detección de errores lógicos.
- Al implementar estructuras de conjuntos (
set()) para los estados visitados, recordar que solo se deben almacenar las tuplas de coordenadas, no el objeto Nodo completo. - Comprobar manualmente el costo de la ruta generada para corroborar que los algoritmos están priorizando el camino más corto.
- No frustrarse si el algoritmo entra en un bucle; es una excelente oportunidad para revisar la lógica de los nodos cerrados/visitados.
Posible problema y solución rápida
- Problema: El código se ejecuta indefinidamente (bucle infinito) y eventualmente agota la memoria, o arroja el error de “Maximum recursion depth exceeded”.
- Solución: Esto sucede porque el algoritmo vuelve a visitar estados por los que ya pasó (ej. se mueve a la derecha y en el siguiente turno a la izquierda). La solución es crear una estructura
visitados = set()al inicio de la función de búsqueda. Antes de encolar un nuevo nodo sucesor, se debe verificar:if sucesor.estado not in visitados:, y si no está, se agrega al set y a la frontera de exploración.