Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Superwayne

Treue Seele

  • »Superwayne« ist der Autor dieses Themas

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

1

27.05.2016, 22:01

Behaviour Trees - Bedingung immer prüfen?

Moin,

Ich beschäftige mich zurzeit mit Behaviour Trees, habe aber etwas mit der Umsetzung zu kämpfen.
Wie implementiert man denn eine Bedingung, die immer gelten muss?

Beispiel Tree (Quelle):

(Link)


Angenommen "Do I have food?" dauert länger als einen Tick, z.B. weil ich erst im Kühlschrank nach Essen schauen muss. Soweit ich es verstanden habe, ruft der Sequencer ein Knoten sooft auf, bis dieser erfolgreich zurück liefert. Wenn jetzt "Am I Hungry?" erfolgreich ist, wird es danach nicht mehr überprüft. Stattdessen gehe ich jeden Tick zum Kühlschrank um nach essen zu schauen, bis das fehlschlägt oder erfolgreich ist. Was ist aber, wenn ich in der Zwischenzeit nicht mehr hungrig bin (warum auch immer)? Muss dann jeder nachfolgende Knoten die Vorbedingungen überprüfen? Der Sequencer kann ja auch schlecht jedes mal alle Knoten durchlaufen, wenn einer davon länger als einen Tick dauert. Sonst kommt er ja nie zum Essen, wenn er immer wieder im Kühlschrank schauen geht.

Viele Grüße

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Superwayne« (27.05.2016, 22:27)


Superwayne

Treue Seele

  • »Superwayne« ist der Autor dieses Themas

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

2

28.05.2016, 22:29

Soweit ich es verstanden habe, ruft der Sequencer ein Knoten sooft auf, bis dieser erfolgreich zurück liefert. Wenn jetzt "Am I Hungry?" erfolgreich ist, wird es danach nicht mehr überprüft.

Das habe ich wohl falsch verstanden. In diesem Beitrag wird das Problem beschrieben, das auftritt, wenn man beim Running State im nächsten Tick wieder beim zuletzt bearbeiteten Knoten weitergemacht wird. Stattdessen sollte der Baum immer neu durchlaufen werden.

Zitat

Treating Running States

One common question when implementing a Behavior Tree is that: what to do in the next tick after a node returned a running state? There are two answer to it: starting the graph traversal from the running node or starting it over from the first node.

The major drawback of starting the tick at the node that returned the running state is that this node can take too much time running an action and, thus, avoiding the execution of most important behaviors. For instance, suppose a robot performing an action to follow a certain path; in the half way the robot finds a hole, but it cannot avoid it because the tree is running the action of path following.

Therefore, the best option is always start over the tree, and if a most-important behavior wants to run, the previous node stops.