hasht's notes

ゲームAIやUnityの話題

ゲームAIとしてのHTN

GOAPの他にゲームAIでプランニングというと、HTN(Hierarchical Task Network、階層型タスクネットワーク)も「KILLZONE 2」を始めとするいくつかのタイトルで採用されているらしい。(ただこれはやや簡略化されているという話)

GOAPから見たHTN

GOAPの場合ではアクションの間に特に関係がなく、(条件が合う範囲で)任意に並べることができた。知識表現という点で言えば、達成すべきゴールとその為のアクションを全く別々に考えていた。 これに対してHTNはタスク、つまり状態(ゴール)というよりその変化をベースに考える。

例えば最も根本的なタスク「荷物を輸送する」があったとして(これはGOAP的には「荷物が目的地にある」というゴールを目指すことになる)、それを具体的にどう遂行するかは様々なやり方が考えられる。 小さく量も少ない場合は「郵送する」などのタスクにブレイクダウンすればいいし、かなり大きい場合は「トラックで運ぶ」といったタスクにするべきかもしれない。郵便であれば速達かそうでないか、など実行するためにはサブタスクも更に具体化していく必要がある。

HTNによるプランニングでは、こうしたあるタスクを別のタスクの集合(その中でいくつかのタスクには依存関係があったりするので、部分的に順序がありネットワークとなる)へ分解するメソッドがタスクと共に重要となる。メソッドの適用は再帰的に行われて、ネットワークの全てのタスクが実行可能(primitive task)になるまで行われる。速度のために一部のタスクの分解を遅らせるという手法もある。

HTNはタスクが上のように階層的な構造を持っているのを汲み取っており、タスクやメソッドを用意するにはよりドメインの知識が必要とされる一方、プランニング時のコストは抑えられている(探索空間を小さくなっている)ようだ。

ビヘイビアツリーと似ている?

HTNのタスク全体が木構造になっているのを見るとビヘイビアツリーとほぼ同じに見える。 両者の間の違いとして、まずそれぞれの基礎的な思想というかパラダイムがある。

HTNは古典的なAI研究の系譜から来ていて、静的な知識表現とそれを利用する推論システム、という形になっている。宣言的とも言い換えられる。

これに対してビヘイビアツリーは手続き的で、単純に何をするかがそのまま表現されている。HTNより直接的で分かりやすい一方で、メンテナンス性の点ではやや劣るかもしれない(プランニングのように意志決定の根拠が分離されていないので)。

またHTNではGOAPと同じく世界の状態を明示的に含んでいるので結果の予測がしやすい、ネットワークとして扱うので並列性を扱いやすい、といった点も考えられる。

参考:What's the difference between Behavior Trees and Hierarchical Task Networks

実装について

Game AI Proの記事が参考になりそう。

BeTrunkThumper(「Trunk Thumper(木でぶん殴る奴?)」をやる)というタスクを分解していくことで、キャラクターの詳しい振る舞いを作っている。