# Inteligencia artificial para videojuegos/Toma de decisiones complejas

Normalmente, Inteligencia artificial para videojuegos, es un término que que se suele utilizar para referirse al conjunto de técnicas, sistemas y algoritmos controlados por la máquina, que gobiernan a las criaturas, aliados o enemigos del juego.
El sistema de toma de decisiones suele ser lo más característico de la Inteligencia Artificial de un videojuego, ya que hace de puente entre la lógica de alto nivel y el mundo del juego.
Las decisiones complejas las forman secuencias de decisiones simples, con relación y dependencia entre ellas.

## Sistema basado en reglas

Se usan en videojuegos desde los 90, aunque en títulos muy puntuales.
Tienen base de hechos y de reglas, donde varias pueden activarse pero sólo una ejecutarse. Esto se conoce como encadenamiento hacia delante.
Estas reglas deben ser muy expresivas para que no salga mejor sustituirlas por otra técnica, esto implica usar algoritmos de unificación como Rete.
Hay dos optimizaciones básicas que a veces requieren estos sistemas:
* Agrupar reglas para que no se activen demasiadas a la vez haciendo ineficiente el algoritmo.
* Anotar las causas (reglas ejecutadas) de cada hecho añadido o borrado, para poder depurar y justificar mejor el sistema.
Constituye la técnica más compleja y potente.

## Arquitectura de pizarra

Se usa en árboles de comportamiento, y también de base (flexible) para coordinar varios sistemas de toma de decisiones. Cada algoritmo es un "experto" que consulta la pizarra y pide turno. El árbitro cede el control a un experto y el experto modifica hechos de la pizarra. El experto devuelve el control al árbitro.
Destaca por su flexibilidad.

## Guiones

A mediados de los 90 casi todos los juegos se programaban ad hoc, sin inteligencia artificial, mediante guiones. Algunos lenguajes de uso habitual serían LUA, Python, Tcl, Java...

## Ejecución de acciones.

Se pueden considerar las acciones de varias maneras, las mas habituales son:
* centralizadas: La toma de decisiones se hace teniendo en cuenta el estado general todos los agentes que participan en la escena. De esta manera podemos controlarlos a todos evitando hagan comportamientos que puedan llegar a colisionar y permite una mejor coordinación entre los agentes.
* Distribuidas: Cada agente tiene un comportamiento propio independientemente del comportamiento del resto de los agentes. Ellos tienen un objetivo individual y trataran de completarlo indiferentemente del estado del resto. Su programación es mas intuitiva pero puede ser mas caótica a la hora de actuar.
* Mezcla de ambos: Los agentes pueden tener una serie de comportamientos que sean controlados de forma centralizada para evitar colisiones pero al mismo tiempo pueden añadirse comportamientos individuales a los jugadores si estos comportamientos son únicos a un agente y no colisiona con el resto. De esta manera tenemos un comportamiento híbrido entre centralizado y distribuido
Tipos de acciones:
* Simples, a menudo agrupando varias actividades.
* Interrumpidas, permiten saltar a otra más importante.
* Compuestas, generalmente resultado de combinar acciones simples tomadas por sistemas simultáneos.
* Guionizadas, no son algoritmos de inteligencia artificial pero son útiles y creíbles. también pueden combinarse con las anteriores.

## Árbol de comportamiento

Una de las técnicas que se ha venido utilizando en los últimos años para poder modelar inteligencia artificial en videojuegos, es el árbol de comportamiento o Behavior Trees. Ha ido ganando cada vez adeptos a lo largo de los años, a medida que cada vez más desarrolladores encontraran en ella una herramienta superior a las máquinas de estados finitas.
El uso de estos sistemas se popularizó con Halo 2 al ser una mezcla de técnicas comprensible para el diseñador.
Con estos árboles se puede añadir aleatoriedad a los nodos Selectores y hasta a los de Secuencia, haciendo que el comportamiento sea menos predecible.
Otros tipos de nodos podrían ser decoradores, justo sobre una tarea para filtrar y controlar recursos necesarios para su ejecución y paralelos, que suelen definirse como una secuencia que lanza todos los hijos a la vez.
Con el nodo paralelo, surge una necesidad clara de comunicar unas tareas con otras. La manera de hacer esto es desacoplando la comunicación mediante una pizarra compartida, que contiene información compartida.
Con una biblioteca de árboles prediseñados (arquetipos) el diseñador les puede instanciar y reutilizar parcial o totalmente, convirtiéndose así en una solución popular y de fácil acceso, pero limitada ya que dificulta la gestión de las interrupciones externas.

## Behavior Designer en Unity

El motor de videojuegos Unity dispone de múltiples Assets sobre árboles de comportamiento. Uno de los más usados es Behavior Designer.
Permite crear tareas propias con una poderosa API, así como utilizar algunas ya construidas.
Para más información: Behavior Designer Unity

## Resumen

* El sistema de reglas es la técnica más sofisticada, y la pizarra la más flexible.
* La IA puede complementarse con guionizado, con buenos resultados en comportamientos concretos.
* Un gestor de acciones da flexibilidad y facilita la depuración.
* En muchos IDEs encontramos herramientas que facilitan el uso de árboles de comportamiento.

## Participantes

* Federico Peinado.
* David Pérez Cogolludo.
* Raúl Serrano Gómez - Apartado Unity
* Diego Martínez Simarro
* Sergio Abreu García
* Alberto Córdoba Ortiz