AI好きな管理人が個人で勉強しているAIの技術を備忘録代わりとして色々と書いていくwikiです

この章では「BehaviorTree」について解説していく。

BehaviorTreeは2007年のサンフランシスコで行われた「Game Developers Conference」でゲーム業界に一気に広まった技術。

BehaviorTreeはTreeという名があるように、ツリー構造にAIの行動(Behavior)を格納していきノードの振る舞いを実行していくもの。
本来ならば可視化ツールでも作ってグラフィカルにしたほうが面白いのだろうが、作り方がわからないので割愛。

この技術には「ノード」「ステータス」という超重要な概念がある。
使うツールや解説しているページによってノードの名前やステータスの種類は異なるが中身は大体一緒。
ここからは代表的なノードを紹介し、それぞれのノードがどのような振る舞いをするのかを紹介していく。


・ステータス
ステータスには色々あるが大体は以下の4つ。
INVALID = 無効である事を表す
SUCCESS = 実行が成功した事を表す
FAILURE = 実行が失敗した事を表す
RUNNING = 実行中である事を表す
このwikiでは上記4つのステータスに「実行が中断」されたことを表す「ABORTED」を加えた5つのノードを用いる。


・Conditionalノード
Conditionalとは「条件付き」等の意味がある。
なのでこのノードは条件式を実行するノードである。
もう一つの特徴としては、このノードは「子を1つしか持つことが出来ない」という所だ。

上記の図を例にとってみる。
2つの例があり、それぞれ「Conditionalノードの結果が true の場合」と「false の場合」のノードの実行結果を表している。
Conditionalノードが true の場合、そのままConditionalノードの子ノードを実行する。
子ノードにはどんな種類のノードでも入れることが出来る。
子ノードの実行後に「SUCCESSステータス」を返す
そして false の場合、Conditionalノード内でそのまま return をし
子ノードの実行は行わず「FAILUREステータス」を返す

・Sequenceノード
Sequenceノードは複数の子を持つことが出来、それぞれの子ノードを順番に実行していくもの。
但し次の子ノードを実行できる条件としては「現在のノードがSUCCESSステータスを返した時」だけである。
現在のノードがSUCCESSステータス以外を返した場合次のノードは実行されない。
全てのノードがSUCCESSの場合SequenceノードはSUCCESSを返す。
子ノードの内どれか1つがSUCCESSノード以外を返すと子ノードが返したステータスと同じステータスを返す。(FAILUREを子ノードが返せば、SequenceノードもFAILUREを返す)



・Selectorノード
Selectorノードの振る舞いとしては大体Sequenceノードと同様。
複数の子を持ち、順番に実行していく。
しかし、1つ違う点があり「次のノードを実行する条件」が「SUCCESSステータス以外を返した時」という所。
「SUCCESSステータスを返すノードが見つかるまで子を順番に実行していくノード」である。
当然現在のノードがSUCCESSステータスを返せば次のノードは実行されない。
このノードが返すステータスは子ノードがSUCCESSを返せばSUCCESSを返し
全てのノードがFAILUREを返せばFAILUREを返す。


・Parallelノード
最後はParallelノード。このノードもSequenceやSelectorと同様の振る舞いをする。
2つのノードと異なる点はSequenceやSelectorは次のノードを実行するための条件があるのに対し、このノードには「条件式が無い」所である。
条件式が無い代わりにノードの内部では子ノードがSUCCESSを返した時にインクリメントするカウンタとFAILUREを返した時にインクリメントするカウンタがあり、全ての子ノードを実行し終わった際に「子ノードの数とSUCCESSカウンタの値が等しい場合」であればSUCCESSを返し「子ノードの数とFAILUREカウンタの値が等しい場合」であればFAILUREを返す。SUCCESSカウンタとFAILUREカウンタの値がバラけた場合RUNNINGを返す。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます