Bienvenidos al curso de resolución de problemas por medio de algoritmos de búsqueda. Mi nombre es Stalin Muñoz y, en este curso, vamos a tratar sobre algoritmos muy importantes para la inteligencia artificial. No existen algoritmos universales que puedan resolver cualquier tipo de problemas. Entonces, va a ser importante poder identificar, para cada problema, cuál es el algoritmo adecuado. ¿De qué va a tratar el curso? El primer punto que vamos a tratar es la abstracción de un problema. La abstracción del problema consiste en identificar un grafo de estados y acciones. Los estados son las configuraciones del mundo y las acciones van a ser los operadores que puede ejecutar el agente para transitar este espacio de estados. Una acción nos va a llevar de un estado a otro. Resolver un problema significa encontrar una trayectoria en este espacio de estados desde una configuración inicial hasta una meta o un objetivo. Para resolver un problema, va a ser muy importante poder comparar el desempeño de los algoritmos. Para eso, definiremos criterios de selección, en los cuales podremos identificar la complejidad computacional de cada algoritmo y podemos, además, relacionarlo con las características del problema para seleccionar el algoritmo más adecuado a cada uno de ellos. Vamos a tratar de "algoritmos de búsqueda ciega", también conocidos como "algoritmos de búsqueda no informada". Estos algoritmos son los más básicos de todos y, quizás, los más importantes. Vamos a considerarlos como si fueran "building blocks" para construir algoritmos más sofisticados. Después, vamos a tratar con algoritmos de búsqueda informada. Los algoritmos de búsqueda informada utilizan conocimiento del dominio del problema. Estos algoritmos utilizan funciones heurísticas. Las funciones heurísticas le van a decir a la gente en qué dirección se encuentra, aproximadamente, la solución. Y, con ello, van a reducir los recursos computacionales y van a permitir llegar más rápido a la solución. También vamos a tratar de "algoritmos metaheurísticos". Los algoritmos metaheurísticos toman inspiración de la naturaleza, de la biología, de la física. Son algoritmos muy flexibles y muy poderosos, pero, también, computacionalmente muy demandantes. Nos interesa que puedas resolver problemas de manera práctica, y vamos a acompañarte en la implementación de los algoritmos en el lenguaje de programación Python. Vamos a ilustrarlos con problemas modelo muy sencillos. Al final, vas a poder probar tus algoritmos para resolver el problema del cubo de Rubik.