Modelando el Laberinto
Formalización Computacional de un Problema de Búsqueda

En el campo de la Inteligencia Artificial, antes de que un agente virtual pueda encontrar la solución óptima a un problema, necesita comprender las reglas fundamentales de su entorno. La definición formal de un problema de búsqueda actúa como el puente necesario entre una situación del mundo real (como encontrar la salida de un edificio) y la lógica de un algoritmo.
En esta práctica, el estudiante asume el rol de un ingeniero de datos e IA que debe modelar las reglas matemáticas de un mapa de cuadrícula, sentando las bases lógicas necesarias para que posteriormente un agente inteligente pueda navegarlo de forma autónoma.
Objetivo general:
El estudiante logrará identificar, estructurar e implementar a nivel de código los cinco componentes matemáticos que definen un problema de búsqueda clásica en IA (estado inicial, acciones legales, modelo de transición, prueba de meta y costo de ruta), preparando el terreno para la futura aplicación de algoritmos de búsqueda ciega.
Materiales o recursos necesarios:
- Computadora personal o de laboratorio con acceso a internet.
- Entorno de desarrollo integrado (IDE) compatible con Python (ej. Visual Studio Code, PyCharm, o un entorno web como Google Colab).
- Cuaderno de apuntes para el trazado matricial.
Generación de Insumos Prácticos:
A continuación, se provee el script de Python entorno_busqueda.py que contiene el esqueleto conceptual del problema. El estudiante utilizará este código base para completar la lógica de la formalización.
Instrucciones paso a paso:
- Analizar el entorno de estado: El estudiante debe leer detenidamente el método
__init__del código provisto para comprender el sistema de coordenadas matriciales empleado (donde la esquina superior izquierda es la coordenada0,0) y la ubicación de los obstáculos. - Configurar la prueba de meta: El estudiante procederá a completar la función
prueba_meta. Se debe comparar el parámetro de estado ingresado con la variable que define el final del recorrido y retornar un valor booleano. Esto es crucial para que los futuros algoritmos sepan cuándo detenerse. - Delimitar las acciones legales: Se programará el método
acciones. El estudiante tendrá que codificar validaciones matemáticas que aseguren que un movimiento propuesto no es menor a0ni mayor o igual afilas_maxocols_max. Adicionalmente, deberá verificar que la casilla destino contenga un0y no un1(obstáculo). - Desarrollar el modelo de transición: El estudiante deberá completar el método
modelo_transicion, traduciendo cada comando textual (ej."ARRIBA") en una operación matemática concreta sobre las coordenadas de fila y columna (ej. restar 1 a la fila). - Ejecutar pruebas unitarias manuales: El estudiante habilitará la zona de pruebas al final del script y verificará los resultados en consola pasando diversos estados de prueba, como esquinas o casillas adyacentes a obstáculos, para certificar la robustez del modelo.
Recomendaciones:
- Esbozar la matriz del mapa provisto utilizando papel cuadriculado antes de escribir ninguna línea de código. Esto facilita visualizar los límites reales (0 a 4).
- Recordar enfáticamente que en la programación matricial (listas anidadas en Python), el primer índice controla las filas (movimiento vertical “Y”) y el segundo controla las columnas (movimiento horizontal “X”).
- Utilizar las sentencias condicionales (
if) de manera estructurada y secuencial al validar los cuatro posibles bordes del laberinto. - Comprobar de manera obligatoria los estados “extremos”, insertando coordenadas de prueba como
(0,0),(4,4)o adyacentes al muro central(1,1). - Comentar claramente el código; esto resulta de vital importancia para repasar los conceptos antes de una evaluación teórica sobre representación de espacios de estados.
Posible problema y solución rápida:
- Problema habitual: La terminal muestra un error del tipo
IndexError: list index out of rangeal ejecutar las pruebas manuales. - Solución técnica: Esto ocurre cuando el estudiante intenta evaluar si existe un obstáculo en una casilla (ej.
self.mapa[estado_siguiente_fila][estado_siguiente_columna] == 1) sin haber validado primero que esas coordenadas existen dentro de los límites matemáticos del mapa. La solución radica en estructurar los condicionales de modo que primero se asegure que0 <= fila_nueva < filas_max, y solo si esto esTrue, proceder a leer el índice en la listamapa.