2010-11-22 16 views
9

Ich versuche, einen "Verhaltensbaum" mit C# zu erstellen.Erstellen eines AI-Verhaltensbaums in C# - Wie?

Für jeden, der nicht weiß, ist ein Verhaltensbaum im Grunde ein Framework, das Sie eine KI erstellen können. Es gibt Sequenzer, Selektoren, Dekoratoren, zusammengesetzte Aktionen und andere Dinge.

Ich habe eine einzelne Bibliothek gefunden, die einen "Verhaltensbaum" in C# geplottet hat, der sich hier befindet (http://code.google.com/p/treesharp/), aber ich kann nicht verstehen, wie man ihn tatsächlich benutzt, da es keinen Beispielcode gibt, aus dem ich zeichnen kann. Könnte jemand hier vielleicht einen einfachen Beispielcode machen, der zeigt, wie man diesen Rahmen tatsächlich benutzt .. oder wisst ihr vielleicht eine andere Möglichkeit, einen Verhaltensbaum in C# zu implementieren?

Vielen Dank!

+1

Die Bibliothek, die Sie auf code.google.com erwähnt haben, wurde vor fast einem Jahr hinzugefügt und zuletzt zwei Wochen später aktualisiert. Wenn Sie vorhaben, es zu benutzen, werden Sie wahrscheinlich keine Beispiele finden, es ist vielleicht besser, wenn Sie nach einer anderen Bibliothek suchen oder Ihre eigene entwickeln. – tbridge

Antwort

14

Ich habe gerade diese Implementierung betrachtet und ich frage mich, warum so viel Code für etwas relativ einfaches benötigt wird.

Von dem, was Sie sagen, wollen Sie eine einfache Möglichkeit, Verhalten zu komponieren. Ein Verhalten hier, vermute ich, ist eine Zuordnung von einem Zustand zu null oder mehr Aktionen durch einen Agenten. Sie können dies sehr einfach mit C# Lambda modellieren. Zum Beispiel:

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(); } 
} 

Die Blätter Ihres Baumes sind einfache Aktionen, die dem Staat etwas entsprechendes tun. Sie "laufen" einen Baum, indem Sie ihn einfach ausführen.

Wenn Sie Lust haben, können Sie dieses Schema parametrisieren, um den Status explizit zu machen.

Hoffe, das hilft.

---- ---- Addendum

Jason für ein Beispiel gefragt, wie Sie diesen Ansatz verwenden könnte, also hier ein einfaches „AI“ patrouillieren Wächter Beispiel (ich nehme an World auf eine Beschreibung der entspricht Umgebung zum Zeitpunkt wird das Verhalten Baum) ausgewertet:

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)); 

die Wache etwas tun zu machen, patrollingGuardBehaviour() rufen Sie einfach an. Beachten Sie, dass die verschiedenen Subaktionen und Tests als Methoden mit den richtigen Signaturen anstelle von Inline als Lambdas implementiert werden können. Sie können andere Kombinatoren zu Selector und hinzufügen, z. B. für parallele Aktivität.

+1

Rafe ... Verhaltensbäume sind eigentlich ein bisschen mehr involviert ... lass mich versuchen, sie einfach zu erklären: Der Baum beginnt mit einer Wurzel .. und dann verzweigt er sich von dort in getrennte Zweige der Logik. Jeder Zweig hat einen "Filter", der entscheidet, ob die KI diesen Zweig übernehmen muss oder nicht. Es gibt auch "Sequenzer", die eine Folge von Aktionen ausführen, die nach dem Fehlschlagen einer Aktion zurückkehren, und "Selektoren", die Aktionen ausführen, bis ein Erfolg gefunden wird (Fehlschläge werden ignoriert). Es gibt andere Dinge, aber das ist der Kern davon. Könnten wir darüber ein bisschen mehr über Chat reden? – Jason

+0

Ich bin nur wirklich verwirrt darüber, wie ich tatsächlich so etwas in C# umsetzen konnte ... dein Beispiel ist wirklich gut, aber ... ich kann es nicht wirklich verstehen. Vielleicht könntest du für deine Implementation ein kleines Beispiel schreiben, das zeigen würde, dass du die Struktur tatsächlich nutzt? – Jason

+0

Zunächst erstellen Sie den Baum: Sie definieren Aktionen und wann (Bedingungen) und wie (parallel, sequenziell usw.) werden sie ausgeführt. Der Einfachheit halber beginnen Sie mit einem Baum, der die Ausführung immer vom Wurzelknoten aus startet und abhängig von den aktuellen Bedingungen (sensorische Eingabe) die untergeordneten Knoten auswählt. Es gibt viele Implementierungsdetails und Verbesserungen, aber das ist der einfachste Workflow. Sind Sie sicher, dass Sie BT als Konzept verstehen? Wenn Sie nicht sind, versuchen Sie http://aigamedev.com/insider/presentations/behavior-trees/ (kostenlose Registrierung erforderlich) und ihre Foren. – ftt

4

Es sieht aus wie einer der Entwickler hinter TreeSharp, apocdev, hat einige code that uses TreeSharp for some kind of spell-casting World of Warcraft player.

Hier ist ein snippit:

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

Ich bin nicht sicher, aber die Nutzung hier scheint ziemlich einfach: Die Decorator Klasse sieht aus wie es ein Prädikat (Spells.CanCast) überprüft, bevor Sie versuchen, eine Aktion (Spells.Cast) auszuführen .

So ein Composite ist vielleicht ein Action, der mehrere Dinge tun kann, z.B. Überprüfen Sie vorher ein Prädikat oder führen Sie mehrere Aktionen nacheinander aus.

apocdev's blog erwähnt this overview of behavior trees, was zu mehr allgemeinen Beschreibungen der sequences verbindet, selectors und decorators.

+0

scheint wie die meisten Links auf diese Antwort sind gebrochen :( – roundcrisis

+0

@Miau: Ja, es sieht aus wie Apocdevs Blog ist down. Ich werde die Links für jetzt verlassen, falls es in naher Zukunft wiederkommt. –

Verwandte Themen