Junto a los contenidos de carácter teórico, puntualmente presentaremos implementaciones de experimentos, estructuras 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 características 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
 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
[**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.
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 parcialmente 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 tratamiento 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 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).