Un árbol de comportamiento es un modelo matemático de ejecución de planes utilizado en informática , robótica , sistemas de control y videojuegos . Describen cambios entre un conjunto finito de tareas de forma modular. Su fortaleza proviene de su capacidad para crear tareas muy complejas compuestas de tareas simples, sin preocuparse de cómo se implementan las tareas simples. Los árboles de comportamiento presentan algunas similitudes con las máquinas de estados jerárquicas con la diferencia clave de que el componente principal de un comportamiento es una tarea en lugar de un estado. Su facilidad de comprensión humana hace que los árboles de comportamiento sean menos propensos a errores y muy populares en la comunidad de desarrolladores de juegos. Se ha demostrado que los árboles de comportamiento generalizan varias otras arquitecturas de control. [1] [2]
Una estructura de control basada en el comportamiento fue propuesta inicialmente por Rodney Brooks en su artículo titulado 'Un sistema de control robusto en capas para un robot móvil'. En la propuesta inicial, una lista de comportamientos podría funcionar como alternativa entre sí, más tarde el enfoque se ha extendido y generalizado en una organización de comportamientos en forma de árbol, con una amplia aplicación en la industria del juego [ cita requerida ] como una poderosa herramienta para modelar el comportamiento de personajes no jugadores (NPC). [3] [4] [5] [6] Se han utilizado ampliamente en videojuegos de alto perfil como Halo , Bioshock y Spore . Trabajos recientes proponen árboles de comportamiento como un marco de control multimisión para UAV , robots complejos, manipulación robótica y sistemas multi-robot. [7] [8] [9] [10] [11] [12] Los árboles de comportamiento ahora han alcanzado la madurez para ser tratados en libros de texto de Game AI, [13] [14] así como en entornos de juego genéricos como Unity (motor de juego) y Unreal Engine (ver enlaces a continuación).
Los árboles de comportamiento se hicieron populares por su paradigma de desarrollo: poder crear un comportamiento complejo con solo programar las acciones del NPC y luego diseñar una estructura de árbol (generalmente mediante arrastrar y soltar ) cuyos nodos de hoja son acciones y cuyos nodos internos determinan la toma de decisiones del NPC. Los árboles de comportamiento son visualmente intuitivos y fáciles de diseñar, probar y depurar, y brindan más modularidad, escalabilidad y reutilización que otros métodos de creación de comportamiento.
A lo largo de los años, las diversas implementaciones de árboles de comportamiento siguieron mejorando tanto en eficiencia como en capacidades para satisfacer las demandas de la industria, hasta que evolucionaron hacia árboles de comportamiento impulsados por eventos . [15] [5] Los árboles de comportamiento impulsados por eventos resolvieron algunos problemas de escalabilidad de los árboles de comportamiento clásicos al cambiar la forma en que el árbol maneja internamente su ejecución y al introducir un nuevo tipo de nodo que puede reaccionar a los eventos y abortar los nodos en ejecución. Hoy en día, el concepto de árbol de comportamiento impulsado por eventos es un estándar y se utiliza en la mayoría de las implementaciones, aunque todavía se los llama "árboles de comportamiento" por simplicidad.
Un árbol de comportamiento se representa gráficamente como un árbol dirigido en el que los nodos se clasifican como raíz, nodos de flujo de control o nodos de ejecución (tareas). Para cada par de nodos conectados, el nodo saliente se denomina padre y el nodo entrante se denomina hijo. El nodo raíz no tiene padres y tiene exactamente un hijo, los nodos de flujo de control tienen un padre y al menos un hijo, y los nodos de ejecución tienen un padre y ningún hijo. Gráficamente, los hijos de un nodo de flujo de control se colocan debajo de él, ordenados de izquierda a derecha. [16]
La ejecución de un árbol de comportamientos comienza desde la raíz, que envía ticks con una cierta frecuencia a su hijo. Un tick es una señal de habilitación que permite la ejecución de un hijo. Cuando se permite la ejecución de un nodo del árbol de comportamientos, este devuelve al padre un estado de ejecución si su ejecución aún no ha finalizado, éxito si ha alcanzado su objetivo o fracaso en caso contrario.
Un nodo de flujo de control se utiliza para controlar las subtareas que lo componen. Un nodo de flujo de control puede ser un nodo selector (de reserva) o un nodo de secuencia. Ejecutan cada una de sus subtareas por turno. Cuando se completa una subtarea y devuelve su estado (éxito o fracaso), el nodo de flujo de control decide si ejecutar la siguiente subtarea o no.
Los nodos de reserva se utilizan para buscar y ejecutar el primer nodo secundario que no falla. Un nodo de reserva regresará con un código de estado de éxito o en ejecución inmediatamente cuando uno de sus nodos secundarios devuelva éxito o en ejecución (consulte la Figura I y el pseudocódigo a continuación). Los nodos secundarios se marcan en orden de importancia, de izquierda a derecha.
En pseudocódigo, el algoritmo para una composición de respaldo es:
1 para i de 1 a n hacer2 estado del niño ← Marcar(niño(i))3 si el estado del niño = en ejecución4 retorno corriendo5 de lo contrario, si el estado del niño es exitoso6 retorno exitoso7. Fin 8. Fallo de retorno
Los nodos de secuencia se utilizan para buscar y ejecutar el primer hijo que aún no ha tenido éxito. Un nodo de secuencia regresará con un código de estado de falla o en ejecución inmediatamente cuando uno de sus hijos regrese con falla o en ejecución (consulte la Figura II y el pseudocódigo a continuación). Los hijos se marcan en orden, de izquierda a derecha.
En pseudocódigo, el algoritmo para una composición de secuencia es:
1 para i de 1 a n hacer2 estado del niño ← Marcar(niño(i))3 si el estado del niño = en ejecución4 retorno corriendo5 de lo contrario, si el estado del niño es igual a fracaso6 fallos de retorno7 fin 8 regreso éxito
Para aplicar herramientas de la teoría de control al análisis de árboles de comportamiento, estos pueden definirse como tres-tuplas. [17]
donde es el índice del árbol, es un campo vectorial que representa el lado derecho de una ecuación diferencial ordinaria, es un paso de tiempo y es el estado de retorno, que puede ser igual a En ejecución , Éxito o Falla .
Nota : Una tarea es un árbol de comportamiento degenerado sin padre ni hijo.
La ejecución de un árbol de comportamiento se describe mediante las siguientes ecuaciones diferenciales ordinarias estándar:
donde representa el tiempo discreto, y es el espacio de estados del sistema modelado por el árbol de comportamiento.
Dos árboles de comportamiento se pueden componer en un árbol de comportamiento más complejo utilizando un operador de secuencia.
Luego, el estado de retorno y el campo vectorial asociado se definen (para [ definición necesaria ] ) de la siguiente manera:
{{cite book}}
: |work=
ignorado ( ayuda )