# Inteligencia artificial para videojuegos/Sistemas multi-agente
## Introducción

En este bloque veremos técnicas prácticas y orientadas al desarrollo real de videojuegos, en concreto el Sistema multi-agente.

## Sistema multi-agente

Casi todos los NPC's siguen el enfoque de Agente. Para esto, la industria se centra en implementar sus propios algoritmos.
Para ello, tienen que entender bien el problema, esbozar una solución, diseñar la implementación, medir el rendimiento y reconocer las debilidades de la técnica que se use.
Como parte de este diseño se encuentran las estructuras de datos y la representación de estos.
Millington y Funge propusieron un modelo para la IA del videojuego en 2009 que consistía en:
* Pensar la estrategia a seguir.
* Toma de decisiones.
* Movimiento.
* Animación y Simulación física.

##### Enfoques

Hay que notar que los agentes no son necesariamente inteligentes. Existen como en todo el resto del dominio de la inteligencia artificial, dos enfoques para construir sistemas multiagentes:
* El enfoque formal o clásico, que consiste en dotar de los agentes de la mayor inteligencia posible utilizando descripciones formales del problema que resolver y de hacer reposar el funcionamiento del sistema en tales capacidades cognitivas. Usualmente la inteligencia es definida utilizando un sistema formal (por ejemplo, sistemas de inferencia lógica) para la descripción, raciocinio, inferencia de nuevo conocimiento y planificación de acciones a realizar en el medio ambiente.
* El enfoque constructivista, que persigue la idea de brindarle inteligencia al conjunto de todos los agentes, para que a través de mecanismos ingeniosamente elaborados de interacción, el sistema mismo genere comportamiento inteligente que no necesariamente estaba planeado desde un principio o definido dentro de los agentes mismos (que pueden ser realmente simples). Este tipo de conducta es habitualmente llamado comportamiento emergente.

##### Características

Los agentes en un sistema multiagente tienen varias características importantes:
* Autonomía: los agentes son al menos parcialmente autónomos
* Visión local: ningún agente tiene una visión global del sistema, o el sistema es demasiado complejo para un agente para hacer un uso práctico de esos conocimientos
* Descentralización: no hay un agente de control designado (o el sistema se reduciría a un sistema monolítico)

##### Arquitectura de agentes

Hay que distinguir entre la arquitectura software (computación distribuida) y la arquitectura cognitiva (modelo mental).

##### Credibilidad

En videojuegos importa más aparentar una mente que tenerla de verdad.
Algunos de los algoritmos más utilizados son puramente racionales. Pero también se usa mucho la heurística, sacrifica la precisión pero a cambio gana eficacia en su mayoría de casos.
* La heurística combina muy bien con los algoritmos voraces (primero lo más restrictivo y difícil).
Otras veces se define primero el comportamiento y luuego se programa hasta reproducirlo, para ello suelen usar trampas o trucos.

##### Velocidad y capacidad

El desafío de implementar una IA se basa en el aprovechamiento del hardware ya que los gráficos pueden variar de una máquina a otra pero la IA debe ser igual en todas las máquinas donde se juegue.
* Procesamiento (La CPU qued a adisposición de la IA ya que los gráficos se ejecutan en la GPU). Suele usar un 5-25% pero algunas veces alcanza el 50% de uso de CPU.
* Memoria (Los algoritmos se vuelven más eficaces si todos los datos están en caché y no tienen que cargarse y descargarse).
Para llevar estas 2 premisas acabo debemos optimizar el código con una herramienta llamada perfilador/profiler para ver en qué partes aparecen picos. En consolas no hay variación de componentes pero tiene una peor depuración debido al retardo de la plataforma y en el mundo del PC se suele diseñar pensando en las gamas más bajas de los ordenadores.

## Motor de IA

Actualmente los juegos no se crean desde 0, sino que se han creado motores que hacen más fácil su creación.
Un motor es un conjunto de herramientas reutilizables, combinables/encadenables y aplicables a varios géneros (según dinámicas de más alto nivel).
Los servicios y facilidades que ofrece un motor son:
* Mecanismo general para gestionar comportamientos (planificación de rutas, toma de decisiones, etc.) con estructura estándar (cierto interfaz).
* Interfaz para recibir datos del entorno.
* Interfaz para actuar sobre el entorno y los NPCs (controladores de movimiento y animación).
En un desarrollo profesional primero se diseña e implementa el motor de IA y luego sobre él, van las técnicas concretas.
El motor incorpora varias características:
* Gestión de la ejecución, se puede controlar el tiempo dedicado a cada comportamiento.
* Interfaz con el mundo, un sistema central de paso de mensajes y acciones según un formato estándar.
* Herramientas de autoría, para que el diseñador pueda configurar y combinar los comportamientos.

##### Gestión de la ejecución

Usa 3 técnicas fundamentales para aprovechar el tiempo de procesamiento:
* Programaciones, repartir el tiempo disponible entre todos los comportamientos activos ese momento.
* Algoritmos siempre listos, dar soluciones pronto y utilizar cuantos más frames mejor para pulirlas.
* Niveles de detalle, emplear más tiempo en aquellos comportamientos que son más relevantes ahora.

#### Programaciones

Se automatizan las programaciones del procesador decidiendo qué frames usar para cada comportamiento. Las técnicas que se utilizan para que esto sea eficiente son:
* Reducir frecuencias aplicándoles un desplazamiento, algoritmos interrumpibles, hilos, corrutinas o similares.
* Jerarquizar y priorizar los comportamiento.

#### Algoritmos siempre listos

Si un algoritmo tarda demasiado, el NPC quedará paralizado. Para que esto no suceda se hace lo siguiente:
* Que el algoritmo reciba el tiempo que tiene para ejecutarse y se ajuste a este tiempo.
* Garantizar siempre una solución válida aunque sea una aproximación muy rudimentaria y se vaya puliendo con el tiempo. Un ejemplo de esto es que un NPC comience a andar sin antes haber calculado su ruta. Esto ocurre en juegos que manejan gran cantidad de NPCs como The Witcher 3 o Red Dead Redemption 2, en este último es más destacable ya que cada NPC tiene una rutina de vida programada.

#### Niveles de detalle

Este tipos de algoritmos suelen estar presentes en temas gráficos. La distancia suele ser el principal motivo para ajustar los niveles de detalle de los objetos.
En IA esto se aplica a dar más tiempo a aquellos NPC's o comportamientos que estén más cerca del jugador o que el jugador pueda ser más sensible. (Muchedumbres de NPC's, cinemáticas in-game, etc.).
Por ejemplo en Monster Hunter World, los monstruos que se encuentran más alejados del jugador tienen animaciones más lentas y se ven peor para consumir menos recursos.
Realizado por: Pablo Gómez Calvo, Borja Núñez Béjar y Miguel Ángel Gremo Alcocer.