2010-11-22 18 views
9

Estoy intentando crear un "árbol de comportamiento" usando C#.Creando un árbol de comportamiento de IA en C# - ¿Cómo?

Para cualquiera que no lo sepa, un árbol de comportamiento es básicamente un marco en el que puede construir una IA. Hay Secuenciadores, Selectores, Decoradores, acciones compuestas y otras cosas.

he encontrado una sola biblioteca que ha implimented un "árbol de la conducta" en C#, que se encuentra aquí (http://code.google.com/p/treesharp/) pero no puedo entender cómo hacer uso de ella ya que no hay código de ejemplo que puedo sacar de. ¿Podría alguien aquí quizás hacer un código de ejemplo simple que muestre cómo usar realmente este marco ... o tal vez conozca otra forma de implementar un árbol de comportamiento en C#?

¡Muchas gracias!

+1

La biblioteca que mencionó en code.google.com se agregó hace casi un año y se actualizó por última vez dos semanas después. Si planea usarlo, probablemente no encontrará ningún ejemplo, puede ser mejor si busca otra biblioteca o desarrolla la suya propia. – tbridge

Respuesta

14

Acabo de ver esa implementación y me pregunto por qué se necesita tanto código para algo relativamente simple.

Según lo que dices, quieres una forma simple de componer comportamientos. Un comportamiento aquí, supongo, es un mapeo de un estado a cero o más acciones de un agente. Puedes modelar esto muy fácilmente usando C# lambdas. Por ejemplo:

Action Selector(Func<bool> cond, Action ifTrue, Action ifFalse) { 
    return() => { if cond() then ifTrue() else ifFalse() }; 
} 

Action Sequencer(Action a, Action b) { 
    return() => { a(); b(); } 
} 

Las hojas de su árbol son simples Acciones que hacen algo apropiado para el estado. Usted "ejecuta" un árbol simplemente ejecutándolo.

Si quieres ser elegante, puedes parametrizar este esquema para hacer explícito el estado.

Espero que esto ayude.

---- ---- Adición

Jason pidió un ejemplo de cómo se puede utilizar este enfoque, así que aquí está un ejemplo simple guardia patrullando "AI" (supongo WorldState corresponde a una descripción de la medio ambiente en el momento de evaluar el comportamiento del árbol):

Func<bool> ifPlayerIsInSight =() => ...true iff WorldState shows guard can see player...; 

Action shootAtPlayer =() => { ...aim guard's weapon at player and fire... }; 

Func<bool> ifUnderFire =() => ...true iff WorldState shows guard hears player gunfire...; 

Action takeCover =() => { ...guard runs for nearest shelter... }; 

Action walkBackAndForthGuardingDoorway =() => { ...default guard patrol behaviour... }; 

Action patrollingGuardBehaviour = 
    Selector(ifPlayerIsInSight, shootAtPlayer, 
    Selector(ifUnderFire, takeCover, 
     walkBackAndForthGuardingDoorway)); 

Para hacer que el guardia de hacer algo, simplemente llame patrollingGuardBehaviour(). Tenga en cuenta que las diversas subacciones y pruebas se pueden implementar como métodos con las firmas correctas en lugar de en línea como lambdas. Puede agregar otros combinadores a Selector y Sequencer, por ejemplo, para actividad paralela.

+1

Rafe ... los árboles de comportamiento están un poco más involucrados en realidad ... permítanme intentar explicarlos simplemente: El árbol comienza con una raíz ... y luego se ramifica en ramas separadas de la lógica a partir de ahí. Cada rama tiene un "filtro" que decide si la IA necesita o no tomar esa rama. También hay "secuenciadores" que ejecutan una secuencia de acciones, que regresan al fallar cualquier acción, y "selectores" que ejecutan acciones hasta que se encuentra un éxito (no tiene en cuenta los fallos). Hay otras cosas, pero ese es el núcleo de eso. ¿Podríamos hablar de esto un poco más sobre el chat de alguna manera? – Jason

+0

Estoy realmente confundido sobre cómo podría poner en práctica algo así en C# ... tu ejemplo es realmente bueno, pero ... de nuevo no puedo entenderlo. ¿Tal vez para su implementación podría escribir un pequeño ejemplo que muestre realmente el uso de la estructura? – Jason

+0

Primero construye el árbol: define las acciones y cuándo (condiciones) y cómo (en paralelo, secuencialmente, etc.) se ejecutan. Para simplificar, comience con un árbol que siempre comienza la ejecución desde el nodo raíz y elige su hijo (s) dependiendo de las condiciones actuales (entrada sensorial). Hay muchos detalles de implementación y mejoras, pero ese es el flujo de trabajo más simple. ¿Estás seguro de que entiendes BTs como un concepto? Si no lo eres, prueba http://aigamedev.com/insider/presentations/behavior-trees/ (se requiere inscripción gratuita) y sus foros. – ftt

4

Parece que uno de los desarrolladores detrás de TreeSharp, apocdev, tiene algunos code that uses TreeSharp for some kind of spell-casting World of Warcraft player.

Aquí hay una snippit:

public Composite CreateSpellCheckAndCast(string name) 
{ 
    return new Decorator(
     ret => Spells.CanCast(name), 
     new Action(ret => Spells.Cast(name))); 
} 

No estoy seguro, pero el uso que aquí parece bastante simple: la clase Decorator parece que se comprueba un predicado (Spells.CanCast) antes de intentar ejecutar alguna acción (Spells.Cast) .

Así que un Composite es quizás un Action que puede hacer varias cosas, p. verifica un predicado de antemano o ejecuta varias acciones en secuencia.

apocdev's blog menciones this overview of behavior trees, que enlaza con las descripciones más generales de sequences, selectors y decorators.

+0

parece que la mayoría de los enlaces en esta respuesta están rotos :( – roundcrisis

+0

@Miau: Sí, parece que el blog de apocdev está caído. Dejaré los enlaces por ahora, en caso de que vuelvan a aparecer en el futuro cercano. –