**SVRAI 2024-25** Síntesis, Verificación y Razonamiento de Agentes Inteligentes Máster Universitario en Lógica, Computación e Inteligencia Artificial (MULCIA), $2024/2025$ Dpto. Ciencias de la Computación e Inteligencia Artificial - Universidad de Sevilla (Ir al sitio del [Curso $2023/2024$](https://www.cs.us.es/~fsancho/Cursos/SVRAI2324/))
!!!def: ① Agentes y Sistemas Multiagente 1. [Agentes Inteligentes](.\Temas\MAS_Agentes\) 1. [Sistemas Multiagente](.\Temas\MAS_clasico) 1. [Modelado MAS con NetLogo](.\Temas\MAS_NetLogo) !!!def: ② Toma de Decisiones bajo Incertidumbre 1. [Introducción](.\Temas\TDI_Intro) 1. [Utilidad y Racionalidad](.\Temas\TDI_Utilidad\) 1. [Procesos de Decisión de Markov](.\Temas\TDI_MDP\) 1. [MonteCarlo Tree Search](.\Temas\TDI_MCTS\) 1. [Aprendizaje por Refuerzo](.\Temas\TDI_Refuerzo\) $\quad$ !!!def: ③ Teoría de Juegos 1. [Juegos Estratégicos](.\Temas\TJ_Juegos_Estrategicos\) 1. [Coordinación](.\Temas\TJ_Coordinacion\) 1. [Conocimiento Común](.\Temas\TJ_Conocimiento_Comun\) 1. [Comunicación](.\Temas\TJ_Comunicacion\) 1. [Teoría de Juegos Evolutivos](.\Temas\TJ_Evolutivos\) !!!def: ④ Lógica Modal 1. [Introducción a la Lógica Modal](.\Temas\LM_Logica_Modal\) 1. [Aplicación a Juegos Estratégicos](.\Temas\LM_Juegos_Estrategicos\) 1. [Lógica de Coaliciones](.\Temas\LM_Logica_Coaliciones\)
!!!ejemplo: Modelos y Códigos 1. Toma de Decisiones bajo Incertidumbre: [MDP](./modelos/MDP.nlogo) (NetLogo), [MDP+RL](./modelos/MDPRL.jl) (Julia). 2. Teoría de Juegos: [Game Theory Demo](./modelos/GT_demo.ipynb) (notebook Jupyter en Julia). 3. Modelado Multiagente (Julia): [Schelling](./modelos/Schelling.jl), [Flocking](./modelos/flocking.jl), [Piedra-Papel-Tijera](./modelos/ppt.jl). 4. [Agent Based Evolutionary Dynamics](https://luis-r-izquierdo.github.io/abed/) (modelos NetLogo). 5. [_An introduction to ABED_](./modelos/ABED-open.pdf) (paper), L.R. Izquierdo, S.S. Izquierdo, W.H. Sandholm (2019). 5. [Agent-Based Evolutionary Game Dynamics](https://wisc.pb.unizin.org/agent-based-evolutionary-game-dynamics/) (book), L.R. Izquierdo, S.S. Izquierdo, W.H. Sandholm (2024). 5. [Imitación en Redes](./modelos/ImitacionRedes.nlogo) (NetLogo). [.](./examen/examen1.html) !!!alg: Material complementario 1. [IA: Una Ciencia empírica](https://www.cs.us.es/~fsancho/Blog/posts/IA_una_ciencia_empirica.md.html) 1. [Modelos Fundacionales](https://www.cs.us.es/~fsancho/Blog/posts/Modelos_Fundacionales/) 1. [¿Pueden los LLMs razonar y planificar?](.\Temas\Pueden_Razonar_Planificar_LLM\) 1. [Agentes LLM](https://www.cs.us.es/~fsancho/Blog/posts/LLMAgentes.md.html) 1. [A practical guide to multi-objective reinforcement learning and planning](https://link.springer.com/article/10.1007/s10458-022-09552-y)
Este curso trata de los métodos y técnicas que puede utilizar un agente computacional para **planificar y actuar de forma inteligente**, es decir, para decidir tanto qué acciones emprender como la forma de llevarlas a cabo, con el fin de alcanzar algún objetivo. El estudio de la agencia inteligente tiene varias motivaciones científicas y de ingeniería. Comprender y mejorar la toma de decisiones es un objetivo de la mayoría de las ciencias cognitivas. En la investigación sobre Inteligencia Artificial, esto se hace modelando la deliberación mediante enfoques computacionales que la pro­vo­quen y/o la expliquen. Por otro lado, las capa­ci­dades que se investigan se comprenden mejor si se mapean conceptos y teorías en sistemas y experimentos diseñados para probar, medir y cualificar empíricamente los modelos propuestos. La motivación ingenieril para estudiar la toma de decisiones es (1) construir sistemas que exhiban capacidades inteligentes y, (2) desarrollar tecnologías que respondan a necesidades socialmente útiles. Un sistema tecnológico necesita estas capacidades si debe realizar de forma autónoma un conjunto de tareas demasiado diversas -o debe llevarse a cabo en entornos demasiado diversos- como para diseñar esas tareas como compor­ta­mientos innatos. La autonomía y la diversidad de tareas y entornos es una característica crítica en muchas aplicaciones, como: robótica (por ejemplo, robots de servicio y personales; robots de rescate y exploración; estaciones, satélites o vehículos espaciales autónomos), sistemas de simulación com­ple­jos (por ejemplo, tutoría, formación o entre­te­ni­miento) o gestión de infra­es­truc­turas complejas (por ejemplo, plantas industriales o energéticas, redes de transporte, instalaciones urbanas). La **planificación automática** es un campo técnico muy rico, que se beneficia del trabajo de una comunidad investigadora activa y en crecimiento. Algunas áreas de este campo están ampliamente exploradas y corres­ponden a una serie de técnicas ya maduras. Sin embargo, hay otros ámbitos en los que es imprescindible seguir investigando para que la planificación auto­ma­ti­zada tenga una mayor repercusión en un conjunto más amplio de aplicaciones. Podemos destacar algunas líneas que precisan un desarrollo urgente: la integración de la planificación y la actuación; planificación y actuación bajo incertidumbre; y planificación en agentes basados en LLM. En este curso intentaremos introducir (no hay tiempo a más) distintos tipos de modelos y enfoques para el modelado de sistemas de agentes inteligentes y, para cada uno de ellos, presentaremos brevemente las técnicas disponibles. En el panorama más clásico de la Inteligencia Artificial se suele hacer uso de técnicas que pueden producir soluciones rápidamente al problema de la toma de decisiones y actuación a cambio de hacer una serie de fuertes suposiciones sobre el problema, todas ellas relacionadas con la certidumbre o no de los elementos del problema. Algunas de estas suposiciones pueden resumirse en: 1. Las acciones son **deterministas**. 2. Los entornos solo cambian como resultado de una acción. 3. Hay un conocimiento perfecto de los eventos (**omnisciencia**). 4. Suele haber un actor único (**omnipotencia**). 5. Funcionan bajo las reglas de un **modelo conocido**. Es interesante observar, sin embargo, que las aplicaciones más necesarias imponen situaciones que obligan a abordar algunas técnicas de resolución de IA que pretenden resolver problemas precisamente cuando estas suposiciones no se pueden confirmar, algo muy común cuando estamos construyendo agentes inte­li­gentes que deben tomar decisiones bajo contextos complejos e interactivos. Se dará por supuesto en el alumno del curso un mínimo conocimiento de las aproximaciones clásicas porque, aunque algunas de ellas no se usen explícitamente en el curso, sí aportan una visión de conjunto que da valor y sentido a las apro­xi­ma­ciones que veremos aquí, ya que examinaremos soluciones que nacieron por la incapacidad de los métodos tradicionales para resolver problemas en los que los supuestos anteriores no estás garantizados. En este sentido, se espera que el alumno tenga conocimientos de un curso inicial de IA y conozca diversos sistemas de representación de problemas, como **Lógica Formal**, **Espa­cios de Esta­dos/Confi­gu­ra­ciones** y **Pro­ble­mas de Satisfacción de Restric­ciones**, así como los algoritmos más clásicos de **Búsqueda**, **Planificación** y **Optimización**. !!!warn En la pestaña de **Prerrequisitos** se pueden encontrar algunos textos que sirven para unificar y establecer los mínimos imprescindibles en esta tarea. Asimismo, se espera que el alumno tenga un conocimiento básico de **Espacios de Probabilidad** para poder modelar, por ejemplo, el concepto de incer­ti­dumbre, y conocimientos de **programación** que le permitan leer y escribir algoritmos a nivel medio (no necesariamente en alguno de los lenguajes elegidos para este curso). Frente a la apro­xi­ma­ción más habitual de la IA, basada en la generación de algo­rit­mos que se ejecutan de forma centralizada, aquí proponemos una apro­xi­ma­ción trans­ver­sal a diversos temas desde un punto de vista **distribuido**. En la práctica, la **Inteligencia Artificial Distribuida** está asociada al uso de *Agentes* (deno­mi­nados *Inteligentes* cuando verifican algunas propiedades espe­cí­ficas) que contribuyen de forma no centralizada, por medio de capacidades como la *comu­ni­ca­ción*, *coope­ración*, *negociación*, *sincronización*, etc. a la resolución de problemas. El curso hace uso de metodologías concretas de repre­sen­ta­ción y resolución general de problemas para motivar e introducir principios y técnicas fundamentales en los sis­te­mas de agentes inteligentes. Los temas que se verán incluyen conceptos de *Teoría de la Decisión*, *Teoría de Juegos*, *Diseño de Procedimientos*, *Razo­na­miento con Res­tric­ciones*, *Aprendizaje Automático*, *Sistemas Multi­agente Distribuidos* y *Sistemas Basados en Agentes Sociales*.
| | | |-----------------------------|----------------------------------------------------------------------------------------------------------------------| |**Profesores** | [Fernando Sancho Caparrini](http://www.cs.us.es/~fsancho)| |**Contacto** | fsancho@us.es, Despacho H1.48 | |**Aula** | H0.10 | |**Horario** | Martes: 16:30-18:30 y Miércoles: 18:30-20:30 | |**Calendario** | 8 oct 2024 - 27 nov 2024 |
Como corresponde a un Máster, esta asignatura tiene un marcado carácter de motivación del descubrimiento. Para ello, intentar cubrir nuestros objetivos impone algunos con­di­cio­nantes que deben ser reconocidos, y asumidos, previamente por parte de profesor y alumnos: 1. Todo el **contenido estará dis­po­ni­ble 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 está dis­po­ni­ble desde el primer día de clase, 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 rea­li­zar en el curso para llevar un ritmo constante pero sin sobresaltos, teniendo en cuenta que presenta un **formato temporal más con­cen­trado** que otras asignaturas del mismo máster. 2. El 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. Siguiendo el sistema de créditos ECTS, las sesiones tendrán un desarrollo paralelo (e im­pres­cin­dible) tanto dentro del aula (explicaciones y trabajo colaborativo) como fuera de ella (lecturas y trabajo personal).
El curso está programado para el **Primer Cua­tri­mes­tre del Máster Universitario en Lógica, Com­pu­ta­ción e Inteligencia Artificial** de la Universidad de Sevilla y, por tanto, hace uso de los conocimientos que los alumnos han debido adquirir en los grados que le han dado acceso y que, idealmente, deben incluir conocimientos como: Álgebra Lineal y Numérica, Cálculo Infinitesimal y Numérico, Estadística, Ma­te­má­ti­ca 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 pueden ser superficialmente re­cor­da­dos durante la exposición del contenido del curso, el objetivo 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 nive­larse adecuadamente y realizar un repaso de aque­llos contenidos de los que haremos uso a lo largo de este curso. Muy especialmente, debe quedar claro que **no es res­pon­sa­bi­lidad de esta asignatura enseñar a pro­gra­mar 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 está ya disponible entre las capacidades del alumno, inde­pen­dien­te­mente de si el lenguaje de pro­gra­ma­ción coincide o no. Con el fin de unificar y nivelar los conocimientos fundamentales que se requieren, se incluyen a con­ti­nuación algunos temas introducitorios que pueden servir de recordatorio para los alumnos que lo necesiten: !!!def: ⓪ Fundamentos * [Teoría de la Probabilidad](./Temas/Pre_Probabilidad/) * [Lógica (Proposicional y de Primer Orden)](./Temas/Pre_Logica/) * Inteligencia Artificial: * [Introducción a la IA](./Temas/Pre_Introduccion_a_la_IA/) * [Historia de la IA](./Temas/Pre_Historia_de_la_IA/) * [Metaheurísticas](./Temas/Pre_Metaheuristicas) * [Satisfacción de Restricciones (CSP)](./Temas/Pre_Satisfaccion_de_Restricciones) * [Espacios de Estados](./Temas/Pre_Espacios_de_Estados) * [Planificación](./Temas/Pre_Planificacion) * [Fundamentos de Machine Learning](./Temas/Pre_Fundamentos_de_ML) * Programación: * Estructuras de Datos * Fundamentos de Algoritmia
Junto a los contenidos de carácter teórico, puntualmente pre­sen­taremos implementaciones de experimentos, es­truc­tu­ras y métodos para facilitar la adquisición de nuevos conocimientos. Para ello, se han buscado lenguajes de alto nivel, de orientación científica y que tenga una sintaxis clara y cercana a la formalización matemática que se está usando. Siguiendo estas directrices, se propone una combinación de **Julia** y **NetLogo** (dependiendo de la unidad en la que estemos trabajando), ya que presentan carac­te­rís­ticas propias muy interesantes y diferenciadas que cuadran muy bien con nuestros objetivos. Para las soluciones por parte del alumno también se permiten otras opciones, como **Python**, **Haskell** o **Javascript**.
!!!ejercicio: NetLogo y los MAS ![](img/netlogo.png align="right" width="150px") Entre las variadas razones por las que NetLogo ha sido elegido para este curso podemos destacar las siguientes: * Proporciona de forma nativa y natural un sistema de **modelado basado en agentes**. * El **tiempo de desarrollo** de modelos es **extremadamente reducido**, lo que permite que en unos minutos se pongan en práctica ideas acerca de cómo aplicar soluciones teóricas a problemas concretos. * Gracias a sus **capacidades gráficas**, las soluciones se presentan de una forma visual que facilita la comprensión de los conceptos subyacentes. * Ofrece un **lenguaje de programación y entorno de trabajo simplificados**. * Está basado en un **paradigma de programación declarativo y con tintes funcionales**. * Tiene una **amplia comunidad de usuarios** y proporciona **cientos de ejemplos de modelado** que facilitan una primera aproximación al modelado de problemas. A pesar de todas las ventajas, no debe olvidarse que tiene algunas limitaciones. El objetivo de NetLogo es proporcionar una **herramienta de prototipado y desarrollo rápido de modelos de simulación**, no de aplicaciones finales, por lo que está más cerca de una herramienta de exploración científica que de un lenguaje de programación estándar (algo que también puede verse como una ventaja en nuestro caso). Estas limitaciones se traducen, por ejemplo, en: * **No genera aplicaciones independientes**, sino que los modelos creados deben ser ejecutados dentro del mismo entorno de desarrollo de NetLogo (o por línea de comandos desde la versión no gráfica). Actualmente, hay un subconjunto (casi completo) del lenguaje que puede ejecutarse en navegadores web (con javascript) y en dispositivos móviles (iOS y android). * La generación de **proyectos de cierta envergadura** es una tarea **incómoda**, porque proporciona herramientas muy básicas para la división de código en módulos independientes. Normalmente, los proyectos que acometeremos serán limitados a ejemplos de una o dos técnicas concretas. * El usuario (ya programador) ha de superar una pequeña barrera inicial para resolver problemas con NetLogo, porque al estar orientado a agentes presenta algunas **características conceptuales** que lo **diferencian** ligeramente de los lenguajes de programación más comunes... aunque esto no puede verse como una limitación de NetLogo, sino de la formación habitual recibida en programación. En todo caso, en esta asignatura no necesitaremos habilidades de modelado específicas que dificulten nuestra aproximación. Los conocimientos mínimos de NetLogo que el alumno debe adquirir para poder seguir la asignatura con comodidad contienen (pero no se limitan a): * **Estructuras de datos básicas**: *listas*, *cadenas*, *arrays*, *matrices*, *diccionarios*, *agentes*, ... * **Estructuras de programación**: `repeat`, `while`, `if`, `ifelse`, `ask` (`with`), ... * **Funciones** y **procedimientos** más habituales: `min`, `max`, `list`, `remove`, ... * **Funciones de orden superior**: `map`, `reduce`, `filter`, `foreach`. * **Procedimientos y funciones** de usuario: `to ... end`, `to-report ... end`, funciones anónimas. * **Agentes**: tipos, procedimientos, contextos, especies, propiedades, interacción, ... !!!ejemplo: Julia y la Programación Científica ![](img/logo.svg align="right" width="150px")[**Julia**](https://julialang.org/) es un lenguaje de programación **homoicónico** (palabra rebuscada para decir que la representación pri­ma­ria de los programas escritos en Julia es también una estructura de datos en un tipo primitivo del lenguaje), **multi­plataforma**, **multiparadigma** (se adapta al estilo del usuario y la necesidad del problema, pudiendo mostrar características de programación funcional, im­pe­ra­tiva, 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éc­nica 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 ma­te­má­ticas. La biblioteca, desarrollada fun­da­mental­mente 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, pro­gra­ma­ció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. En particular, para este curso pueden ser especialmente interesantes algunas librerías que abordan diversos temas que se tocan con diferentes profundidades: * [POMDP.jl](https://juliapomdp.github.io/POMDPs.jl): Una interfaz Julia para definir, resolver y simular procesos de decisión de Markov parcial­mente observables y sus homólogos totalmente observables. * [GameTheory.jl](https://github.com/QuantEcon/GameTheory.jl): Librería que proporciona algoritmos y estructuras de datos específicas para el trata­miento de Teoría de Juegos en Julia. * [Agents.jl](https://juliadynamics.github.io/Agents.jl): Se trata de un framework puro de Julia para el modelado basado en agentes (ABM). * [SoleLogics](https://aclai-lab.github.io/SoleLogics.jl): Una librería de Julia para trabajar con diversas Lógicas, entre ellas, Lógicas Modales. Además, hay muchos entornos de programación (como [VSCode](https://code.visualstudio.com/), [Atom](https://atom.io/), etc.) que proporcionan ex­ten­sio­nes específicas para facilitar el trabajo con Julia, así como sistemas de notebooks que permiten usar Julia como lenguaje de desarrollo ([Jupyter­/Jupyter­Lab](https://jupyter.org/), y [Pluto](https://www.juliapackages.com/p/pluto)) o entornos in­ter­ac­tivos como [IJulia](https://juliapackages.com/p/ijulia).
La evaluación del alumno se realizará por medio de un examen presencial en la fecha publicada en las convo­ca­torias oficiales. La puntuación de este examen tendrá un valor máximo de 10 puntos. Se realizará un examen similar el último día de clase del curso que, en caso de ser superado, eximirá al alumno de tener que presentarse a la convocatoria oficial. Voluntariamente, el alumno podrá realizar un trabajo complemetario (previa comunicación y acuerdo con el profesor de la asignatura antes de la última sesión presencial del curso) que tendrá un valor máximo de 2 puntos. Si la puntuación del examen es mayor o igual a 4 puntos, entonces la nota del alumno se calculará como la suma directa de ambas puntuaciones.