Temas evaluados:
- Módulo 10: Redes Bayesianas
- Módulo 11: Grafos Causales y Causalidad
- Módulo 13: Búsqueda Simple (BFS, DFS, IDDFS)
- Módulo 14: Búsqueda Informada (Dijkstra, A*, heurísticas)
Entrega los notebooks de los cuatro módulos (20 puntos cada uno):
- Módulo 10 — Redes Bayesianas (20 pts): Notebooks del módulo
- Módulo 11 — Grafos Causales (20 pts):
causal_intro - Módulo 13 — Búsqueda Simple (20 pts):
01_grafos,02_busqueday el notebook de aplicación elegido (03_laberintoso04_coloreo_imagen) - Módulo 14 — Búsqueda Informada (20 pts):
01_grafos_ponderados,02_busqueda_informaday el notebook de aplicación elegido (03_rutaso04_puzzle_8)
Opciones de entrega (elige una):
- Pull Request + Canvas: Sube tu trabajo en un pull request al repositorio del curso y pega el enlace en la tarea de Canvas.
- Canvas directo: Sube los archivos
.ipynbdirectamente en la tarea de Canvas.
Búsqueda Informada
"A heuristic is a technique that seeks good enough solutions at the cost of completeness, accuracy, or precision."
En el módulo anterior construimos el algoritmo genérico de búsqueda y vimos que BFS, DFS e IDDFS son instancias del mismo esquema con fronteras distintas. Ahí quedaron dos filas en la tabla de fronteras marcadas con «veremos en módulos posteriores»:
| Frontera | Algoritmo |
|---|---|
| Cola de prioridad por $g(n)$ | Dijkstra |
| Cola de prioridad por $g(n)+h(n)$ | A* |
Este módulo entrega esa promesa. La idea central: si tenemos conocimiento del dominio — una estimación de cuánto falta para llegar a la meta — podemos guiar la búsqueda y explorar exponencialmente menos nodos manteniendo la garantía de optimalidad.
Contenido
| Sección | Tema | Idea clave |
|---|---|---|
| 14.1 | Grafos con pesos y frontera de prioridad | $g(n)$, colas de prioridad, por qué BFS falla con costos |
| 14.2 | Heurísticas $h(n)$ | Admisibilidad, consistencia, espectro de calidad |
| 14.3 | Greedy best-first | Frontera por $h$ — rápido pero no óptimo |
| 14.4 | Dijkstra | Frontera por $g$ — óptimo, sin heurística |
| 14.5 | A* | Frontera por $f=g+h$ — óptimo y guiado |
| 14.6 | Diseño de heurísticas | Problema relajado, dominancia, pattern databases |
| 14.7 | Branch & Bound e IDA* | A* con memoria lineal — puzzle de 15 piezas |
Materiales y flujo de trabajo
| Paso | Material | Colab | Descripción |
|---|---|---|---|
| 1 | 14.1 Grafos ponderados | — | $g(n)$, colas de prioridad, motivación |
| 2 | 14.2 Heurísticas | — | $h(n)$: admisibilidad, consistencia, diseño |
| 3 | Notebook 01 — Grafos ponderados | Construir grafos con pesos, cola de prioridad en Python | |
| 4 | 14.3 Greedy | — | Intuición, pseudocódigo, fallo canónico |
| 5 | 14.4 Dijkstra | — | Inundación por costo, relajación, optimalidad |
| 6 | 14.5 A* | — | $f=g+h$, admisibilidad → optimalidad |
| 7 | Notebook 02 — Búsqueda informada | Greedy, Dijkstra, A* paso a paso con visualizaciones | |
| 8 | 14.6 Diseño de heurísticas | — | Problema relajado, dominancia, truco del máximo |
| 9 | 14.7 B&B e IDA* | — | Memoria lineal, puzzle de 15 piezas |
| 10 | Notebook de aplicación (elige uno) | — | Exploración profunda en un dominio real |
Notebooks de aplicación
Elige uno de los siguientes:
| Notebook | Tema | Herramientas | Colab |
|---|---|---|---|
| 03 — Rutas en ciudad | Grafo sintético de ciudad; comparar Dijkstra vs A* en tiempo real | networkx, matplotlib | |
| 04 — Puzzle de 8 piezas | Resolver el puzzle con A* e IDA*; medir $b^{∗}$ con diferentes heurísticas | numpy, matplotlib |
Objetivos de aprendizaje
Al terminar este módulo podrás:
- Explicar por qué BFS falla en grafos con pesos y qué propiedades garantiza Dijkstra
- Definir $g(n)$, $h(n)$, $f(n)$ y la relación entre admisibilidad, consistencia y optimalidad
- Distinguir Greedy, Dijkstra y A* como instancias del algoritmo genérico con fronteras distintas
- Implementar A* con lazy deletion usando
heapqde Python - Diseñar heurísticas admisibles usando la técnica del problema relajado
- Comparar heurísticas por dominancia y calcular el factor de ramificación efectivo $b^{∗}$
- Explicar por qué IDA* usa memoria lineal y cuándo preferirlo sobre A*
- Seleccionar el algoritmo adecuado para un problema dado usando la tabla comparativa
Prerrequisitos
| Concepto | Módulo |
|---|---|
| Algoritmo genérico de búsqueda, BFS, DFS, IDDFS | 13 — Búsqueda Simple |
| Complejidad computacional, notación $O$ | 04 — Computabilidad y Complejidad |
Mapa conceptual
graph TD
A["Búsqueda Simple (Módulo 13)"] --> B["Algoritmo genérico + frontera"]
B --> C["Frontera FIFO → BFS"]
B --> D["Frontera LIFO → DFS"]
B --> E["Frontera de prioridad"]
E --> F["key=g(n) → Dijkstra"]
E --> G["key=h(n) → Greedy"]
E --> H["key=g+h → A*"]
H --> I["h admisible → Óptimo"]
H --> J["h consistente → Sin reapertura"]
I --> K["Diseño de heurísticas"]
K --> L["Problema relajado"]
K --> M["Dominancia / max(h₁,h₂)"]
K --> N["Pattern databases"]
H --> O["Memoria O(b^d) → demasiada"]
O --> P["IDA* = IDDFS con límite f"]
P --> Q["Memoria O(bd)"]
Cómo ejecutar el script de imágenes
cd clase/14_busqueda_informada
python3 lab_informed_search.py
Dependencias: numpy, matplotlib, networkx (ver requirements.txt).