Este es el tercer artículo que profundiza sobre las técnicas que utilizan los
programadores de inteligencia artificial para desarrollar comportamientos que
requieren una complejidad importante. Estos son los árboles de comportamiento.
Los árboles de comportamiento son estructuras que se crean con la finalidad de
organizar el comportamiento de nuestro sistema y permitir trabajar con el de
forma sencilla. Saber a que parte de nuestro código ir para modificar ciertos
comportamientos y cuando invocarla es una tarea que se hace mucho más rápido
utilizando estructuras como esta. Me voy a basar en el material de Ricard Pillosu
que ha realizado una muy buena contribución al tema.
A primera vista puede parecer que es más apropiado abordar el problema de forma
rápida sin tener que estar pendiente de relaciones en árbol ni de otras estructuras.
Podemos pensar que simplemente agrupando listas de instrucciones será más sencillo
y nos ahorraremos mucho tiempo. Sin embargo, nada más lejos de la realidad ya que
conforme la dificultad del entorno crece, estos mecanismos se hacen cada vez más útiles.
Algunos de los juegos que actualmente estan en el mercado utilizando estos sistemas son el
maravilloso Grand Theft Auto, el Halo o Spore. Todos ellos se basan en el uso de estas
estructuras para gestionar comportamientos y como ya debeis saber son referentes en sus
respectivos campos. De otro modo inmediatamente debeis abandonar la lectura de este material y poneros a jugarlos como locos.
Estos modelos se utilizan para hacer más sencilla la inclusión de nuevos comportamientos
que añadan complejidad a las respuestas de nuestros agentes inteligentes, simplificar
el trabajo de creación de los propios comportamientos, permitir el prototipado y la
puesta en escena de nuevas iteraciones y optimizar el rendimiento del sistema.
> Cómo son los árboles de comportamiento:
En estas estructuras se definen varios conceptos. El nodo, que representa cada
una de las partes del árbol y que representan cada uno de los diferentes comportamientos
junto con sus condiciones para ejecutarlos.
Como se ve en la figura superior, el árbol consta de varios elementos anidados en la estructura
que tiene como condición que cada uno de ellos puede tener varios hijos pero únicamente un padre. Es decir, la estructura crece o se mantiene a medida que descendemos, no a la inversa. Diferenciamos los nodos que están en el interior de la estructura de aquellos que son terminales llamados también nodos ‘hoja’. De este modo las ‘ramas’ serán aquellos nodos que tienen algún hijo o descendiente y las ‘hojas’ aquellos que no lo tienen.
Entrando más en detalle, cada nodo tendrá dos componentes inicialmente. El primero de ellos serán las condiciones, es decir, los requisitos que deben cumplirse para que el comportamiento en cuestión se ponga en marcha. En segundo lugar las acciones, es decir, el propio comportamiento que debe realizar. Este último elemento deberá ser cuanto más abstracto mejor, ya que nos encargaremos de a nivel de código definirlo con detalle.
Por ejemplo: La condición puede ser (Si Veo_Enemigo == 1). La lista de acciones sería (Alertar,
Esconderse). A nivel interno ya definiremos que implica alertar y que esconderse.
Como medida de simplificación las acciones las realizarán generalmente los nodos ‘hoja’, aunque para comportamientos muy bien definidos de los que se puede extraer características comunes podremos lanzar acciones desde nodos ‘rama’. Por ejemplo al controlar el comportamiento de la cabeza de un soldado podemos querer tener un ’supercomportamiento’ como el parpadeo ocular, independiente del estado en el qe nos encontremos (esto significa no que adquiera superpoderes sino que el comportamiento se manifieste de forma común a los nodos descendientes que pueda tener). Los hijos pueden ser ‘patrullando’ y ’siguiendo objetivo. En el primero estableceremos un comportamiento que haga rotar la cabeza desde el frente a -45 y 45 grados respecto al plano vertical. El segundo podemos definir que la cabeza se oriente a un determinado objetivo. De forma independiente se verá el parpadeo de los ojos que es común a los dos. Comenta el Sr. Pillosu que el 99% de los nodos con acciones serán nodos hoja por lo que será bueno tenerlo en cuenta.
Al mismo tiempo que el arbol anterior podriamos tener uno trabajando en paralelo para controlar el movimiento de la boca o incluso la expresión facial. Ya a partir de este punto empezamos a ver la utilidad que tienen y la facilidad que va a tener añadir nuevos comportamientos, tanto adicionales a los que tenemos como totalmente nuevos.
El funcionamiento, una vez vista la estructura es sencillo. Cuando pasamos por la iteración pertinente de nuestro sistema, evaluaremos las condiciones del árbol empezando por los nodos superiores.
Cuando uno de ellos cumple las condiciones, ejecutamos las acciones del nodo (si las hay) y pasamos a evaluar sus descendientes. Si alguna de las condiciones de sus hijos se cumplen en su totalidad, se continua el proceso. Acabamos de procesarlo cuando llegamos al nodo hoja. Podemos permitir que se ejecuten varios comportamientos en un mismo árbol pero será mejor que permitamos solo uno de ellos y englobemos las acciones de forma que con este funcionamiento podamos llevar a cabo la gestión de una forma correcta. De esta forma podemos controlar en cada momento que acciones se estan llevando a cabo y donde ir a buscarlas.
Una vez procesado el árbol continuamos con el siguiente y así hasta que todos los árboles de comportamiento aplicables al agente en cuestión se hayan procesado.
Vemos ahora un ejemplo de funcionamiento completo. Supongamos que tenemos que controlar el funcionamiento de un soldado en un entorno virtual. Para ello nos montaremos un árbol que será más o menos complejo pero que permitirá generar un comportamiento adecuado y que podremos ir aumentando en complejidad.
Despues de varias iteraciones llegamos supongamos que llegamos a esta propuesta:
Una primera respuesta sería:
Por otro lado en una situación diferente podria darse el comportamiento:
De cualquier forma podremos cambiar cualquier condición y cualquier acción de forma ‘muy’ sencilla o mejor dicho sabremos donde hay que ir a cambiar comportamiento de forma ‘fácil’. Conforme crezca nuestro árbol ya no será tan sencillo, pero seguro que será mucho más que si utilizamos otras porpuestas que no están tan organizadas.
Una vez que vamos trabajando con árboles cada vez más extensos y complejos se hace
interesante utilizar herramientas de gestión y edición de los mismos.
Es muy interesante la charla de Ricard Pillosu de Crytek que explica las virtudes de
estas estructuras de forma muy amena y desde el punto de vista de uno de los mejores
especialistas del panorama español en materia de inteligencia artificial orientada
a los sistemas de entretenimiento.
> Videos de la Charla y Bio
> Presentación PPT
En definitiva, hemos visto que es un árbol de comportamiento y cuanto mejora la organización del código. Hemos visto que no requiere una complejidad extrema para crear las estructuras necesarias y que representa una gran mejora respecto a tratar comportamientos de forma distribuida y sin orden. A partir de aqui podemos incluir parámetros estadísticos en los
nodos para añadir aleatoriedad o incluso podemos incluir aleatoriedad a nivel de acción, permitiendo que además de cambiar el comportamiento cambie la forma en que lo lleva a cabo nuestra entidad inteligente.
Planteamientos avanzados nos permitirán llevar a cabo tácticas de grupo y comportamientos más complejos donde intervienen varios agentes haciendo que la experiencia para el jugón sea mucho más divertida y le represente un mayor reto.
A partir de aqui queda en vuestras manos tener en cuenta esta esttructura, de cualquier forma siempre será una buena adquisición para vuestra caja de herramientas del Buen BricoDesarrollador de Inteligencia Artificial, fácil y sencillo amigos!











[...] Arboles de Comportamiento (Behaviour Trees) para gestionar comportamientos. [...]
[...] Arboles de Comportamiento (Behaviour Trees) para gestionar comportamientos. [...]
sweet