**IAIC 2024-25**
Inteligencia Artificial - Ing. de Computadores $\mathbf{24/25}$
Dpto. Ciencias de la Computación e Inteligencia Artificial - Universidad de Sevilla
!!!ejemplo: 🄋 Introducción
0. [Presentación](.\Temas\Introduccion_a_la_IA\)
1. [Historia de la IA](.\Temas\Historia_de_la_IA\)
!!!ejemplo: ➀ Representación, Búsqueda y Optimización
1. [Lógica](.\Temas\Logica\)
3. [Satisfacción de Restricciones](.\Temas\Satisfaccion_de_Restricciones\)
4. [Espacios de Estados](.\Temas\Espacios_de_Estados\)
5. [Optimización](.\Temas\Optimizacion\)
6. [Tratamiento de la Incertidumbre](.\Temas\Incertidumbre\)
$\quad$
!!!ejemplo: ➁ Machine Learning
1. [Fundamentos de Machine Learning](.\Temas\Fundamentos_de_ML\)
1. [Flujo de Trabajo ML](.\Temas\Flujo_ML\)
8. [Redes Neuronales](.\Temas\Redes_Neuronales\)
9. [Clustering](.\Temas\Clustering\)
10. [Árboles de Decisión](.\Temas\Arboles_de_Decision\)
!!!ejemplo: ⌨ Recursos
* [Ejercicios Propuestos](.\Compl\Ejercicios)
* [Códigos y Ejemplos](.\Practicas\)
!!!alg: ♾ Material complementario
1. [IA: Una Ciencia empírica](https://www.cs.us.es/~fsancho/Blog/posts/IA_una_ciencia_empirica.md.html)
1. [Introducción a la Lógica Difusa](https://www.cs.us.es/~fsancho/Blog/posts/Introduccion_logica_Difusa.md.html)
1. [Planificación](https://www.cs.us.es/~fsancho/Blog/posts/Planificacion/)
1. [Algoritmos Genéticos](https://www.cs.us.es/~fsancho/Blog/posts/Algoritmos_Geneticos.md.html)
1. [Mapas Auto-organizados](https://www.cs.us.es/~fsancho/Blog/posts/SOM.md.html)
1. [Videos de Redes Neuronales](https://www.youtube.com/playlist?list=PLIb_io8a5NB0CP5ktJE9qaLd6GOfh1Z9m)
1. [Modelos Fundacionales](https://www.cs.us.es/~fsancho/Blog/posts/Modelos_Fundacionales/)
1. [¿Pueden los LLMs razonar y planificar?](.\Compl\Pueden_Razonar_Planificar_LLM\)
El objetivo general del curso es **introducir al estudiante en técnicas avanzadas de Inteligencia Artificial** (**IA**), realizando un recorrido desde las técnicas más clásicas hasta las más novedosas, con el fin de que el alumno sea capaz de explicarlas, analizarlas e implementarlas en sus proyectos futuros, ya sean profesionales o académicos. Sin embargo, y por encima de las técnicas individuales que podamos ver, se espera que el alumno adquiera una visión en conjunto de qué es la IA, cuáles son sus principales características, y por qué es de facto una de las áreas fundamentales de la Computación y, en general, de la Ciencia e Ingeniería del S. XXI.
Tras haber realizado este curso con aprovechamiento, se espera que el estudiante sea capaz de:
* **Describir y reconocer** un buen número de las principales técnicas de IA, tanto en términos generales como en detalle.
* **Representar formalmente** un problema para poder ser abordado por técnicas de IA.
* **Conocer los fundamentos matemáticos** que están detrás de las técnicas de IA.
* **Aplicar técnicas** concretas de IA a problemas concretos.
* **Combinar** diferentes técnicas de IA, tanto desde un punto de vista teórico como práctico.
* **Comparar y evaluar** la idoneidad de diversas técnicas de IA.
* **Reconocer las dificultades** generales y los errores más habituales en el uso práctico de IA.
* **Explorar la literatura** relevante de proyectos de IA específicos de manera independiente.
* **Implementar** técnicas no triviales de IA en un sistema de computación.
* **Definir y ejecutar experimentos** que pongan a prueba distintas implementaciones.
* **Escribir informes científico-técnicos** con la documentación relativa a sistemas de IA, reflejando tanto sus implementaciones como las teorías subyacentes.
La asignatura tiene un marcado carácter práctico y de motivación del descubrimiento. Para ello, a pesar de las limitaciones reales que el sistema educativo español impone (como el tamaño de los grupos, o la mala distribución de la carga de trabajo de las asignaturas), intentar cubrir nuestros objetivos impone algunos condicionantes que deben ser reconocidos, y asumidos, previamente por parte de profesor y alumnos:
1. Todo el **contenido estará disponible de forma abierta** en este mismo sitio web con antelación suficiente para que el alumno lo pueda revisar antes de las sesiones presenciales (una versión inicial de todo el contenido estará disponible desde el primer día, pero podrá sufrir ligeras modificaciones durante la ejecución del curso).
1. El alumno ha de ser capaz de **prever y seguir una planificación adecuada** del esfuerzo a realizar en el curso para llevar un ritmo constante pero sin sobresaltos (es un área que lleva muy mal los esfuerzos puntuales y recompensa el trabajo continuo).
2. El [contenido](#Contenido) se articula alrededor de una serie de sesiones (teórico-prácticas) que marcan un ritmo continuo y común al conjunto de la clase.
3. Una **sesión** estándar consta de (puede haber diferencias notables entre las diversas sesiones):
* **Breve resumen del contenido teórico**, centrado en los puntos principales del mismo, sin entrar en detalles que ya han estado a disposición del alumno.
* **Resolución de dudas concretas** planteadas por los alumnos, que pueden realizar en ese momento, o plantear previamente por los medios disponibles.
* **Planteamiento y resolución de problemas relacionados** con el contenido que ayuden a aclarar los conceptos fundamentales y a mostrar las características particulares de las distintas técnicas analizadas.
* **Análisis de ejemplos resueltos** en el sistema de implementación elegido y/o en la pizarra.
5. Siguiendo el sistema de créditos ECTS, las sesiones tendrán un desarrollo paralelo (e imprescindible) tanto dentro del aula (lecciones y trabajo colaborativo) como fuera de ella (trabajo personal).
El curso está programado para el **Primer Cuatrimestre del curso 3º del Grado de Ingeniería Informática - Ingeniería de Computadores** y, por tanto, hace uso de los conocimientos que los alumnos han debido adquirir en asignaturas de cursos anteriores, entre las que se incluyen: Álgebra Lineal y Numérica, Cálculo Infinitesimal y Numérico, Estadística, Matemática Discreta, Análisis y Diseño de Datos y Algoritmos, y Fundamentos de Programación (es importante destacar el amplio contenido matemático en el que se basa).
Aunque muchos de los conceptos necesarios de estas otras asignaturas pueden ser superficialmente recordados durante la exposición del contenido de Inteligencia Artificial, debe quedar claro que el objetivo que se persigue no es explicarlos de nuevo aquí, sino destacar su importancia para los resultados que proporcionan en esta área y ponerlos en el contexto adecuado para su correcta aplicación.
En consecuencia, es responsabilidad del alumno realizar un repaso de aquellos contenidos explicados en asignaturas previas y de los que haremos uso a lo largo de este curso.
Muy especialmente, debe quedar claro que **no es responsabilidad de esta asignatura enseñar a programar en ningún lenguaje de programación**, y que se entiende que el nivel que se requiere para la comprensión y resolución de las aproximaciones que veremos se ha adquirido con creces en los cursos anteriores, independientemente de si el lenguaje de programación coincide o no con los usados en dichos cursos.
Junto a los contenidos de carácter teórico, presentaremos implementaciones de las estructuras y métodos para facilitar el aprendizaje. Para ello, se ha buscado un lenguaje de alto nivel, de orientación científica y que tenga una sintaxis clara y cercana a la formalización matemática. Siguiendo estas directrices, se ha elegido **Julia** como lenguaje de programación del curso.
!!!ejemplo: Julia y la Programación Científica
[**Julia**](https://julialang.org/) es un lenguaje de programación **homoicónico** (palabra rebuscada para decir que la representación primaria de los programas escritos en Julia es también una estructura de datos en un tipo primitivo del lenguaje), **multiplataforma**, **multiparadigma** (se adapta al estilo del usuario y la necesidad del problema, pudiendo mostrar características de programación funcional, imperativa, declarativa, etc.), de **tipado dinámico** (aunque puede pasarse a un tipado estático si se considera más adecuado), de **alto nivel** y alto desempeño para la **computación genérica, técnica y científica**, con una sintaxis similar a la de otros entornos de computación similares.
Dispone de un compilador avanzado con ejecución principalmente en modo **JIT** (Just in Time), mecanismos para la ejecución paralela y distribuida, además de una extensa biblioteca de funciones matemáticas. La biblioteca, desarrollada fundamentalmente en Julia, también contiene código desarrollado en C o Fortran, proporcionando librerías para el álgebra lineal, álgebra abstracta, cálculo real, generación de números aleatorios, procesamiento de señales, aprendizaje automático, ciencia de datos, procesamiento de cadenas, programación paralela, etc. Adicionalmente, la comunidad de desarrolladores de Julia contribuye con la creación y distribución de paquetes externos a un paso acelerado a través del [gestor de paquetes](https://juliapackages.com/) integrado en Julia.
Además, hay muchos entornos de programación (como [VSCode](https://code.visualstudio.com/), [Atom](https://atom.io/), etc.) que proporcionan extensiones específicas para facilitar el trabajo con Julia, así como sistemas de notebooks que permiten usar Julia como lenguaje de desarrollo ([Jupyter/JupyterLab](https://jupyter.org/), y [Pluto](https://www.juliapackages.com/p/pluto)) o entornos interactivos como [IJulia](https://juliapackages.com/p/ijulia).
!!!alg: Algunos recursos para Julia
* [Instalación y Ecosistema de Julia: `juliaup`](Practicas\installJulia.md.html)
* [Paquetes y Entornos de Julia](Practicas\PkgEnv.md.html)
* [Manual Rápido de Programación](Practicas\Julia.md.html)
* [Manual de Julia Plots](Practicas\Plots.md.html)
* [Colección: Beautiful Algorithms](https://github.com/mossr/BeautifulAlgorithms.jl)
El alumno tiene dos vías para poder superar la asignatura: la **Evaluación Continua**, y las diversas **Convocatorias Oficiales** del curso académico.
!!!ejemplo:Evaluación Continua
La **Evaluación Continua** del curso está regida por las siguientes condiciones:
1. El contenido se divide en dos bloques evaluables: $0\leq E_1, E_2\leq 10$.
1. La calificación de la Evaluación Continua será: $E=\frac{1}{2}(E_1+ E_2)$ si cada $E_i\geq 3$.
La pruebas de ambos bloques se harán en horario lectivo, la primera tras haber completado su contenido (en fecha que será comunicada con suficiente antelación), y la segunda en la última sesión lectiva del cuatrimestre.
!!!ejemplo:Convocatorias Oficiales
Las **Convocatorias Oficiales** (noviembre, enero y julio) son independientes, y la prueba se realizará en la fecha publicada por la E.T.S.I.I.
A las convocatorias oficiales solo podrán presentarse los alumnos que no hayan superado la Evaluación Continua del curso correspodiente. Excepcionalmente, a la convocatoria de enero podrán presentarse alumnos que, habiendo superado la Evaluación Continua, quieran subir nota (previo visto bueno del profesor).