ゲームAIにおける意思決定アーキテクチャ:行動木(BT)と有限ステートマシン(FSM)
リサーチ

ゲームAIにおける意思決定アーキテクチャ:行動木(BT)と有限ステートマシン(FSM)

著者GameDev Base
日付2026年10月20日
25分で読める

行動ツリー(Behavior Trees)と有限ステートマシン(FSM)に関する包括的な分析

自律型エージェント、複雑なビデオゲームのキャラクター、産業用ロボットシステムの基盤となる意思決定メカニズムは、現代のソフトウェア工学および人工知能研究において、最も重要かつ議論されている分野の一つです。エージェントが刻々と変化する環境からの刺激にどう反応するか、数ある目標の中からどれを優先するか、特定のタスクをどの順序で実行するかは、すべてその根底にある意思決定アーキテクチャの堅牢性と柔軟性に依存しています。歴史的な発展の過程を検証すると、この分野は長年にわたり有限ステートマシン(Finite State Machines - FSM)によって支配されてきたことがわかります。しかし、デジタル世界や物理的なロボットタスクの複雑化に伴い、開発者や研究者はよりスケーラブルで反応性が高く、モジュール式の構造を求めるようになり、この探求が行動ツリー(Behavior Trees - BT)のような革新的な階層構造の誕生のきっかけとなりました。

本レポートでは、自律システムにおける意思決定と行動モデリングにおいて現在業界標準として認められているこれら2つの主要なアーキテクチャについて、技術的な詳細、数学的基盤、歴史的進化、産業上のユースケース、およびそれらの構造上の利点と欠点の関係性において深く検証しています。さらに、最新のゲームエンジン(Unreal Engineなど)における最新のハイブリッドアプローチや、ステートツリー(State Trees)などの次世代ソリューションも、本分析の不可欠な部分として評価されています。

有限ステートマシン (FSM): 理論的基盤と数学的基礎

有限ステートマシン (FSM) は、システムが一度に事前に定義された単一のステート(状態)にのみ存在し、特定の環境からの入力や内部イベント (inputs/events) に応じてステート間の遷移 (transition) を行う抽象的なマシンモデルです。計算理論の最も基本的な構成要素の一つであるこのモデルは、コンピュータサイエンスにおいてアルゴリズムの設計からデジタル電子回路の構築に至るまで、幅広い用途で使用されています。

FSM は理論的に決定性 (deterministic) または非決定性 (non-deterministic) の2つの主要なカテゴリに分けて設計することができます。しかし、計算理論の基本定理の一つは、任意の非決定性有限ステートマシンに対して、完全に同じ言語を認識し、同じ行動的出力生成する同等の決定性有限ステートマシンを常に対象に構築できることを証明しています。この定理により、ソフトウェアエンジニアは複雑なシナリオをより予測可能な決定性の構造に還元することが可能になります。

論理表現とステート遷移ダイナミクス

有限ステートマシンは、本質的に有向グラフ (directed graph) またはステートダイアグラム (state diagram) として視覚化および表現されます。この有向グラフにおいて、ノード (nodes) は抽象的なマシンの内部ステートを、それらのノードを接続する有向の矢印 (edges) はステート遷移を表します。任意の「t」の瞬間におけるシステムの現在のステートは、常に前のステートと、その瞬間にシステムに入力される現在の入力の決定論的関数として計算されます。

数学的な文脈において、このステート遷移関数は次のように表現されます。

この定式化において、システムの次のステートを、マシンの前(現在)のステート、その瞬間の入力 (input) の値を、そしてはステート遷移関数 (state transition function) を表しています。この関係は、文献においてしばしばステートの集合 (S) と入力の集合 (I) の直積を再びステートの集合にマッピングする操作として、すなわちのようにも示されます。ステートマシンは、生成する出力 (output) の性質に応じて、さらに2つの基本的なアーキテクチャのサブクラスに分類されます。ムーアマシンモデルでは出力関数がシステムのもっぱら現在のステートに依存する一方()、ミーリマシンモデルでは出力関数が現在のステートと瞬間的な入力の両方に同時に依存します()。

システム設計において、ステートと入力は通常、バイナリ (binary) のアルファベットまたは事前に定義された列挙型 (enum) によって表現され、と関数は通常、ルックアップテーブル (look-up table) またはステート遷移テーブル (state transition table) の形式でコード化されます。ソフトウェアアーキテクチャにおいて遷移の発生は、単に入力の存在だけでなく、追加の条件 (guards) が満たされることにも依存します。典型的な UML ステートダイアグラムまたは現代のエンジンの実装において、遷移の表記法は通常、トリガー[条件]/エフェクト (trigger[guard]/effect) の構文で表現されます。ここでトリガー (trigger) は信号、呼び出し、タイミング、または変更イベントになり得ます。条件 (guard) は、遷移が発生するために検証される必要がある追加の論理的テストです。エフェクト (effect) は、遷移中に実行される特定のアクションです。

それにもかかわらず、FSM アーキテクチャの強さは、ステート間の遷移においてだけでなく、特定のステートに突入したとき、それらのステート内に留まっているとき、およびそれらのステートから出るときに実行できるアクションにもあります。FSM のステートに入ったとき (entry action)、ステート内にいる間に定期的に (during action)、およびステートから出たとき (exit action) に、特別なコードブロックを実行することができます。例えば、無線システムにおいて、デバイスが「ラジオ」ステートにあるときに「次へ」ボタンを押すと次のラジオ局への遷移が行われる一方、デバイスが「CD」ステートにあるときに同じ「次へ」ボタンを押すと次の楽曲への遷移がトリガーされます。このように、まったく同じ環境的刺激が、マシンが存在する文脈的ステートに応じて完全に異なるアクションを生成します。

業界標準における FSM の位置づけと実践的な利点

有限ステートマシンは、デジタル回路設計からゲーム業界に至るまでの幅広い歴史的背景の中で、業界標準として存在し続けています。最も顕著な利点は、概念的に理解することが非常に容易であること、アーキテクチャのシンプルさ、そしてハードウェア/ソフトウェアレベルでの圧倒的な実行速度です。デザイナーがキャラクターやシステムのできること、どのステートに遷移できるかをボックスと矢印のダイアグラム ("box and arrow" diagram) を通じて視覚化することは、FSM をコーディングのプロセスにおいて非常に直感的で、デバッグ (debugging) が容易な構造にします。

特に、システムの瞬間的なモード、アニメーションのフェーズ、またはキャラクターの物理的ステートを正確かつ不浸透性の境界で定義することが重要である領域において、FSM は比類のないものです。FSM が完璧に機能する特定の文脈は次のとおりです。

第一に、格闘ゲーム (fighting games) は FSM アーキテクチャの最も輝かしい応用分野の一つです。格闘ゲームにおいて、キャラクターの「攻撃」、「ジャンプ」、「スタン」 (Stunned)、「しゃがみ」、「防御」のステートは、互いに正確で論理的な境界線によって切り離されている必要があります。例えば、キャラクターが対戦相手から重い一撃を受けて「スタン」ステートに入ったとき、プレイヤーがジャンプボタンを押したとしてもキャラクターはジャンプできません。FSM アーキテクチャを使用しない場合、キャラクターのあらゆるアクションの試行において、「もしキャラクターがスタンしておらず、空中に居ず、攻撃アニメーションにロックされていない場合……」という風に延々と続く、保守が不可能なネストされた条件 (conditional) 式を書く必要があります。FSM は、「キャラクターがステート A にある場合、ステート B または C にのみ遷移できる」というロジックを完璧に処理することで、コードブロックにおけるこの巨大なスパゲッティの複雑さを回避します。

第二に、キャラクターアニメーションコントローラーは大部分が FSM ベースです。業界リーダーである Unreal Engine のような現代のゲームエンジンでは、キャラクターアニメーションは「Animation Blueprints」(アニメーションブループリント)と呼ばれる、裏側でステートマシンを実行するインターフェースによって制御されます。キャラクターが「待機」 (Idle) アニメーションから「歩行」 (Walk) アニメーションへ、そこから「走る」 (Run) アニメーションへいつ、どのように遷移するかは、このボックスと矢印のインターフェースによって管理される FSM の基本的な機能です。

第三に、アーケードシステムや単純な決定ロジックを必要とするゲームにおいて、FSM は「KISS」(Keep It Simple, Stupid - シンプルにしろ、愚か者め)の原則に従って動作するのに理想的です。アーケードスタイルのゲームの多くには、敵の「パトロール」、「追跡」、「攻撃」、「逃走」といった非常に限定的かつ具体的なステートがあります。ネイティブ C++ 環境で実装された FSM は、最新のプロセッサ上でナノ秒レベルで動作し、比類のないパフォーマンスを提供します。ソフトウェア開発者は、名前のない列挙型 (unnamed enums) を使用してステートを定義し、「1つの大きな switch」(one big switch)の構造やビットマスク技術を使用してこれらのステートをイベント ID (event IDs) に関連付けることができます。この構造がもたらす整理されたコードアーキテクチャにより、FSM の実行時 (runtime) のホットリコンパイル (hot-recompiling) が可能になる一方で、SetState() のようなサブルーチンの代わりにイベントハンドラー (event handlers) からゼロ以外のステート ID を返すことで安全で中断のない実行 (execution safety) が確保されます。この直線的な実行フローにより、ゲームループ内のスタッター(カクつき)が防止され、高フレームレート (framerate) の達成が可能になります。

アーキテクチャの危機ポイント:ステート爆発 (State Explosion) の問題

FSM は、限られた数のステートを持つ決定論的振る舞いモデルに対しては完璧でパフォーマンスが高いものの、自律システムの複雑さ、環境変数の数、および人工知能が持つことが期待される行動のレパートリーが増加するにつれて、構造的に崩壊する傾向があります。文献では、この慢性的な弱点は「ステート爆発」(State Explosion) と呼ばれています。

FSM アーキテクチャの根本的な制約は、マシンが同時に単一のステートにしか存在できないことです。キャラクターが走ると同時に射撃できる場合、FSM アーキテクチャではキャラクターは「走る」ステートと「射撃」ステートに同時に存在することはできません。代わりに、「走りながら射撃する」というまったく新しいハイブリッドステートを作成する必要があります。システムに追加されるすべての新しい変数は、既存のすべてのステートとの可能な組み合わせと同じ数の新しいステートを生成することを要求します。モデルが表現しなければならないステートの数は、変数セットの直積ほどに巨大なサイズに達します。

さらに重大な問題は、ステートの増加によって生じる遷移 (transition) の複雑さです。FSM においてステートを追加することは、単にそのステートを作成することを意味しません。新しく追加されたこのステートへシステム内の他のすべての関連するステートからどのように遷移するか、そしてこのステートからどのステートに戻ることができるかを一つずつ、特定のルールでコード化することを要求します。コンピュータサイエンスの専門用語では、ステートの増加に伴う遷移の複雑さの成長率は(二乗比例)として表現されます。この幾何学的な増加率は、ネットワーク経済において電気通信ネットワークの価値がユーザー数の二乗に比例すると主張するメトカーフの法則に類似した累積的な複雑さの負担を生み出します。

FSM が約 10 のステートに達すると管理が困難になり、ステートの数が 40 に達すると(例えば高度な隻狼 (Sekiro) やダークソウル (Dark Souls) スタイルのボスの戦闘 AI において)、コードファイルは数百もの

行の遷移ロジックで埋め尽くされ、文字通り「スパゲッティコード」(Spaghettification) に変貌します。13 この段階でコードの保守 (maintenance) やバグの修正 (debugging) は悪夢へと進化します。なぜなら、発生した論理的バグ (bug) の根本原因は、数十の異なるステート遷移のいずれかにおける誤ったトリガー、誤って構築された優先順位の順番、または忘れられた遷移の矢印である可能性があるからです。23

このステート爆発を軽減し、スパゲッティコードの発生をある程度防ぐ目的で、「階層型有限ステートマシン」(Hierarchical Finite State Machines - HFSM) が開発されました。HFSM モデルでは、ステートが入れ子にできるように設計されています。「親ステート」(parent state) がその内部で独立して動作する「サブステート」(substates) を保持します。例えば、「戦闘」というメインステートは、その内部で「物陰に隠れる」、「エイムする」、「射撃する」サブステートを実行するサブマシンを持つことができます。システムが「戦闘」メインステートにあるときにプレイヤーが遠ざかった場合、サブステートのどれにいるかに関わらず、メインステートから「パトロール」ステートへの単一の「グループ遷移」(Group Transition) によって、内部のサブステートのそれぞれに個別に逃避やキャンセルのコードを書く必要性が排除されます。8 遷移ポイント (transition points) とイベントトリガーの優先順位 (event triggering precedence) のおかげで、HFSM は FSM のキャパシティを少し上に引き上げます。24 しかし、システムの複雑さが特定の閾値を超えたとき(例えば、数十のステートと数百の遷移を含む複雑なタスクプランナーにおいて)、HFSM でさえ視覚的な複雑さに屈し、構造的に脆弱になります。8

ビヘイビアツリー(Behavior Trees):進化、構造、実行ロジック

FSMやHFSMがもたらした幾何学的スケーラビリティの障壁により、自律型キャラクターやエージェントの意思決定プロセスにおける新しいアーキテクチャパラダイムの誕生が余儀なくされました。ビヘイビアツリー(Behavior Trees - BT)は、まさにこの閉塞感を打破し、「もしこれが起こったら、その時はこうする」という硬直した遷移の迷宮に迷い込むことなく、視覚的で明確なロードマップをAIに提供するために開発された、モジュール式の階層的な意思決定構造です。 2

歴史的背景と業界における採用プロセス

ビヘイビアツリーが正確にいつ、どこで誕生したのかについては、学術的および業界の語りにおいて若干の違いが見られますが、これらの構造は高度な研究室からというよりも、ゲーム開発スタジオの現場から直接生まれたということが広く受け入れられています。 2 記録されている最も古い使用例の一つは、Maxisによって開発された1996年のゲーム『SimCopter』に遡ります。元Maxis従業員であるドン・ホプキンス(Don Hopkins)の説明によると、ゲーム内のNPCを制御するために「SimAntics」と呼ばれるビジュアル言語が使用されており、ゲームコード内のpeople.dfファイル内では「リアクションツリー(reaction trees)」として記載されていました。このファイルのコメント行には、「あるリアクションツリーから別のリアクションツリーを呼び出すことはできるが、その最中に中断されることはない」といった、現代のビヘイビアツリーのメカニズムを彷彿とさせる定義が含まれています。 25

しかし、ビヘイビアツリーアーキテクチャが現代的な意味で定式化され、業界標準に発展し、堅固な学術的基盤を獲得したのは、主にダミアン・アイスラ(Damian Isla)氏が2005年のゲーム開発者会議(GDC)において、『Halo 2』の画期的なAIアーキテクチャを発表した象徴的な講演(「Handling Complexity in the Halo 2 AI」)によって実現されました。 3 『Halo 2』の開発プロセスにおいて、BungieチームはFSMがもたらした2つの大きなジレンマに直面しました。急速に増加する行動の多様性に対するシステムのスケーラビリティの喪失と、AIが迅速な決定の間を揺れ動くことに起因する不安定さ、すなわち「ディザリング(dithering)」の問題です。 3

FSMによって引き起こされるこの精神的過負荷(mental bandwidth)を解決したいと考えたチームは、キャラクターの行動を「行動DAG(Directed Acyclic Graphs - 有効非巡回グラフ)」と呼ばれる階層の中に落とし込みました。 3 このシステムには、約50種類のコアビヘイビアが含まれていました。

イスラが定義した構造では、ツリーの上部のノードが意思決定アルゴリズムを担い、最も末端の葉ノードがアクションの実行を担当していました。このアプローチにより、AIは単に何をすべきかを知るだけでなく、常識的(common sense)に行動することが可能になりました。さらに、キャラクターはターゲットを認識するために独自の内部「ターゲットリスト(target lists)」と空間認識(firing positions)を持っていました。 3 このモジュール式構造は非常に柔軟で、フォールトトレラントであり、可読性も高かったため、このコンセプトは瞬く間にロボット工学や学術界にも波及しました。現在では、無人航空機から産業用協働ロボット(collaborative robots)、自動運転システムに至るまで、幅広い分野においてビヘイビアツリーは事実上の標準(de facto standard)となっています。 1

BTの構造的アーキテクチャとノード(Node)階層

ビヘイビアツリーは、アクションや決定をデジタルレゴブロックのように結び付ける、階層的なツリーデータ構造です。 2 従来の決定木(Decision Trees)とは異なり、BTは結果に到達するまで単一のパスをたどるだけでなく、ノードの論理的制御、非同期実行プロセス(execution flows)、割り込み(interrupts)を、システムのルート(root)から葉(leaves)に向かって送信される定期的な信号(一般的に「ティック(tick)」と呼ばれる)によって管理します。 1

このアーキテクチャの動作における最も重要で区別される概念は、各ノードが受け取った「ティック」処理の結果として、親ノード(parent node)に必ず論理的ステータス(status)を返すという点です。これらの返却ステータスは、3つの普遍的な種類で構成されています。

  1. Success(成功):ノードがタスクを完全かつ問題なく完了したか、またはテストされた条件が真である場合。

  2. Failure(失敗):ノードがタスクを実行できなかったか、障害に直面したか、またはテストされた条件が偽である場合。

  3. Running(実行中):処理がまだ完了していません。アクションを完了するために複数のタイムサイクル(tick/frame)が必要です。 8

まさにこの「Running」ステータスの存在こそが、ビヘイビアツリーを他のすべての古典的なツリー構造から区別する技術的な飛躍です。 27 物理的なロボットが「ターゲットに向かって歩く」という命令をコンマ数秒で完了したり、ゲームのキャラクターが「宝箱を開ける」アニメーションを瞬時に完了したりすることは期待できません。Runningステータスにより、ツリーのその特定のブランチがバックグラウンドで非同期にアクションを継続できるようになり、システムがブロックされてフリーズする(blocking the execution thread)を防ぎます。 27

ビヘイビアツリーは構造的に、コンポジット、デコレータ、リーフの3つの主要なノードカテゴリで構成されています。 28

1. コンポジットノード(Composite Nodes)

コンポジットノードは、ツリーの分岐点です。複数の子ノード(チルドレン)を持ち、自身に接続されたこれらの子ノードがどのような順序で、どのような条件で、または同時に実行されるかを決定する構成要素です。 28

  • セレクター(Selector / Fallback Nodes):プログラミングの基本ロジックにおけるOR(または)演算子の反映です。自身に接続された子ノードを左から右へと順番に実行します。子ノードのいずれかがSuccessまたはRunningを返した場合、セレクターノードは他の子どものテストを即座に停止し、そのステータスを自身の親ノードに伝達します。セレクターノードがFailure(失敗)を返す唯一の方法は、自身に接続されているすべての子ノードが失敗することです。この構造は、エージェントの生存優先順位や代替プラン(fallback)を決定するのに最適です。システムはまず「自己治癒」オプションを試し、失敗した場合は「掩蔽に隠れる」オプションに切り替え、それもうまくいかない場合は「逃走」オプションを試します。いずれかが成功した瞬間にアクションチェーンが満たされます。 8

  • シーケンス(Sequence Nodes):プログラミングにおけるAND(かつ)演算子のビヘイビアツリー版です。子ノードを左から右へ順に試します。ただしセレクターとは異なり、シーケンスは子ノードのいずれかがFailureを返した場合、即座に処理を中断し、親ノードにFailureを返します。シーケンスがSuccessを返すためには、含まれるすべての子ノードが例外なく成功することが条件となります。このノードは、タスクの論理的なステップチェーンを構築するために使用されます。NPCがドアを通過するために必要なチェーンは、「ドアまで歩く」、次に「鍵を開ける」、次に「ドアノブを下ろす」、次に「中に入る」という形で構成されます。ドアに鍵がかかっており、キャラクターが鍵を開けられない場合(Failure)、次のステップに進む意味はないため、シーケンスは失敗し、キャラクターはドアを通過する計画を断念します。 8

  • パラレルノード(Parallel Nodes):コンポジットファミリの中で最も複雑なメンバーの1つです。子ノードを左から右へと順番ではなく、同時に(並行して)実行します。特定の成功または失敗のポリシー(例:「子ノードのいずれかが成功したら処理を終了する」または「すべてが成功するまで待つ」)に従って、ツリーに結果を返します。キャラクターが「話しながら同時に手足を動かす」や、ロボット車両が「レーダースキャンを行いながら同時にターゲットに向かって移動する」といった並行タスクの制御に使用されます。 30

2. デコレータノード(Decorator Nodes)

デザインパターンのデコレータパターンと非常によく似ており、単一の子ノードのみを持つことができ、その子ノードが返す結果をさまざまなポリシーに従って変更したり、実行を条件付けたりするノードです。 8

  • インバーター(Inverter):古典的なプログラミングにおけるNOT演算子です。子ノードのSuccessの結果をFailureに、Failureの結果をSuccessに変換します。

  • リミッター(Limiter):子ノードが特定の秒数またはライフサイクル全体を通じて、指定された回数だけ実行されることを許可し、このクォータを超える場合には失敗を返します。

  • タイマー(Timer):子ノードのアクションを即座に実行する代わりに、一定時間待機させます。 8

3. リーフノード(Leaf Nodes)

ツリーの最も末端、最下位レベルに位置し、その性質上、子ノードを一切持たない実行ノードです。 29 リーフは、仮想のゲーム世界や実際のロボットのセンサーと直接相互作用し、システムに具体的な影響をもたらす終端ポイントです。 22

  • アクション(Actions/Tasks):世界に物理的または論理的な変更を加え、アニメーションを再生し、音を鳴らし、あるいはモーターに電力を送る実際のコードブロックです(「射撃する」、「ターゲットに向かって歩く」、「モーターを停止する」)。

  • コンディション(Conditions/Queries):通常はSuccessまたはFailureを返し、いかなるアクションも実行しない論理的な瞬時チェックおよびセンサーのクエリです(「敵は視界範囲内にいるか?」、「弾薬は残っているか?」、「バッテリー残量は20%未満か?」)。 8

イベント駆動型(Event-Driven)ビヘイビアツリーとオブザーバー(Observers)

初期の古典的なBTは、すべての「ティック」処理(通常はすべての視覚的フレーム)において、ツリーをルートから開始して連続的に下に向かって再評価するポーリング(継続的なポーリング)ロジックで動作していました。 19 この状況は、リアクティブ性の点では完璧であるものの、すべてのフレームの計算において巨大なプロセッサ(CPU)の事前負荷を生み出していました。ツリーが深くなるにつれて、すべてのフレームで最上部から最下部まで全ての条件を繰り返しテストするコストは持続不可能なものとなっていました。 9

Unreal Engineのような現代のゲームエンジンや業界標準は、このハードウェアのボトルネックを克服するために、アーキテクチャを「イベント駆動型ビヘイビアツリー(Event-Driven Behavior Trees)」モデルに進化させました。 32 この革新的な構造では、システムはすべての「ティック」で警察官のように最初から最後まで条件をチェックする代わりに、「オブザーバー中断(Observer Aborts)」と呼ばれるリアクティブなデコレータを使用します。例えば、猫のAIがネズミを追跡している場合、古典的なパラレルノードはネズミが穴に入ったかどうかを毎秒尋ねます。イベント駆動型の構造では、「ネズミが観察可能か?」という条件がオブザーバーとしてツリーに配置されます。ネズミが穴に逃げ込んだ瞬間(event)、このイベントがトリガーされ、オブザーバーは猫のその時点での「走る」および「ジャンプする」シーケンスを即座に中断(abort)します。これにより、人工知能は状況が実際に変化したときのみ再計算を行い、プロセッサの電力を大幅に節約し、複雑なツリーにおける並行動作パスを最小限に抑え、システム最適化が信じられないほど容易になります。さらに、Unreal Engineシステムでは、コンポジットノードに「サービス(Services)」と呼ばれる特殊なノードを追加できます。サービスは、サブツリーがアクティブである限り特定の周期(例:2秒ごと)で動作し、FSMの定期的な「during」アクションに代わって、敵の追跡などのデータを継続的に更新します。

メモリの問題とブラックボード(Blackboard)メカニズム

ビヘイビアツリーの圧倒的なモジュール性には代償があります。BTノードは、その設計上、完全に孤立しておりステートレス(stateless)です。つまり、「ターゲットに向かって歩く」アクションノードは、すぐ左にある「敵を見つける」条件ノードが何を見つけたのか、あるいは前のサイクルで何が決定されたのかを知りません。FSMとは異なり、BTは過去の決定や瞬時のセンサーデータを独自の内部構造に保存しません。

この致命的な通信の空白を埋め、ツリーに一種の「短期記憶」をもたらすために、ブラックボード(Blackboard)デザインパターンが使用されます。ブラックボードは、ツリー内のすべてのノードが実行中に読み書きできる、外部かつ共有のデータプールです(通常、プログラミング言語ではDictionary、Hash Map、またはVariantデータ構造として構築されます)。

動作は次のように行われます。ツリーが「敵を見る」条件ノードに到達すると、このノードは敵の座標を検出しますが、この情報を自分自身には保持せず、ブラックボード上にTargetPosition = として直接書き込みます。ツリーのフローが次のステップである「そこに移動する」アクションノードに到達すると、アクションノードはブラックボードに接続し、TargetPositionデータを読み取ってルートを描画します。

ブラックボードアーキテクチャは、ビヘイビアツリーの純粋なモジュール性とノードの分離を損なうことなく、ノードとブランチの間に信じられないほど強力、柔軟、かつ高速なデータブリッジを構築します。

比較分析:FSMとビヘイビアツリーの衝突

ゼロからAIシステムの基礎を築こうとするアーキテクトにとって、有限ステートマシン(FSM)とビヘイビアツリー(BT)の選択は、単なる構文やエンジンの好みではなく、プロジェクトのライフサイクル全体に深く影響を与える極めて重要なアーキテクチャの決定です。ゲームデベロッパーズ・カンファレンス(GDC)の論文、産業界の事例研究、そして近年発表された学術的なロボットシミュレーションでは、これら2つのシステムの構造的パフォーマンスを、意思決定、モジュール性、反応性、可読性、拡張性の観点から包括的に比較しています。

1. 意思決定(Decision-Making) vs. ステート制御(State Control)

ソフトウェア業界における最も強力なコンセンサスは、BTが「意思決定」プロセスを、FSMが「ステート制御」プロセスを得意としているという点にあります。

ビヘイビアツリーは、動的で絶えず変化する環境条件に反応し、多数の論理的分岐を含み、優先順位付けを必要とする認知的な決定(「エージェントは今何をすべきか?」)を下すために特別に最適化されています。一方、FSMは、すでに下された決定の実行方法、システムの首尾一貫した独立した物理モードの管理、および順序付けられたフロー(「エージェントはこのアクションをどのように、どのような段階で実行すべきか?」)を厳格な境界で制御するために最適です。

次の表は、これらの基本的な哲学的違いを体系的に要約しています。

2. モジュール性と依存関係(Coupling)の危機

業界で認められているように、BTは「依存度の低い」(low-dependency)アーキテクチャです。BTのリーフノード(例:「ターゲットに向かって走る」アクション)は、ツリー内のどこにあるかに関係なく、完全に独立したカプセル化されたオブジェクトです。このノードをコピーして、「重機関銃防衛モード」という全く異なるブランチにドラッグ&ドロップしても、ソースコードを変更することなく問題なく動作します。

対照的に、FSMの「ステート」は、その後にどの特定のステートに移行できるか、そしてこの移行がどのような条件で行われるかを、自分自身の中または自分のマネージャー内で定義する必要があります。この「密結合」(tight coupling)アプローチにより、記述されたコードブロックをプロジェクトからコピーして別のAIに転送することはほぼ不可能になります。FSMで行うすべての微小な変更や新しいステートの追加には、そのステートに接続するすべての入力および出力矢印(トランジション)を個別に再調整する必要があります。ロボット制御の研究において、FSMベースのシステムに新しい耐障害性動作(例:バッテリーが切れたときに自律充電に戻る)を追加することは、BTシステムに比べて何倍も困難であることが統計的に証明されています。

3. 表現力(Expressiveness)と反応性の競合

ロボット制御アーキテクチャで行われたラボでの比較は、これら2つのアーキテクチャの本質的な哲学的違いを非常に印象的な指標で示しています。

表現力(Expressiveness):予想に反して、学術的研究により、FSMはBTよりも「表現力豊か」であることが証明されています。FSMが存在するアクティブなステートは、過去に行われた決定の具体的な物理的蓄積です。FSMが「現在アラーム状態です」という信号を出している場合、この情報には、過去に脅威が検知されたこと、システムがこの脅威を有効とみなしたこと、および一連のアクションを開始したという事実が本質的に(inherently)含まれています。一方、BTは完全に忘れっぽいです。すべての新しい「ティック」ループで、ツリーあたかも世界が新しく創造されたかのようにルートノードからスキャンを開始します。過去のアクションやモードを記憶するには、ブラックボード上の外部データに完全に依存しています。

反応性:モジュール性の代償として、FSMの反応性は弱いです。FSMの設計者が「ロボットが荷物を運んでいるときに突然火災報知器の音が聞こえたら、次のステートに移行する」というトランジションの矢印を描いていない場合、ロボットは持っている箱を放り出して逃げ出すことは決してありません。一方、BTはFSMよりもはるかに反応性に優れています。すべてのループで世界が最初からチェックされるかオブザーバーが使用されるため、わずかな環境の変化でも、ツリーは即座に最も優先度の高いブランチ(例:「緊急脱出」)に向かい、その時点で「Running」ステータスにある荷物運びのアクションをプリエンプト(中断)することができます。

4. セットアップコスト、デバッグ、およびメンテナンス

意思決定システムにおいて、メンテナンスコストは開発者が最も多くの時間を費やす分野です。FSMは初期段階では非常に低いコストで、いくつかの簡単な列挙型(enum)とswitch-case文を使用してゼロから数分で構築できます。しかし、時間が経つにつれてシステムが大きくなると、このメリットは消え去り、デバッグは完全なカオスへと変わります。

一方、ビヘイビアツリーは最初から重い「ボイラープレート」(定型コード)の負担を抱えてスタートします。ルートメカニズム、ティックシステム、ブラックボード統合など、システムを立ち上げるだけでも深刻なアーキテクチャへの投資が必要です。しかし、この代償を一度支払えば、提供されるリアルタイムの視覚的デバッグ(ビジュアルデバッグ)機能は絶大です。Unreal Engine内の組み込みBTツールや、Godot用に開発されたBeehaveアドオンなどのシステムでは、ゲームのプレイ中やシミュレーションの実行中に、開発者はツリー上のデータフロー(点灯する緑や赤のステータス)をリアルタイムで監視し、どのアクションノードがなぜ失敗したのかを数秒で特定できます。FSMベースの「蜘蛛の巣」の中で、視覚的にエラーの原因を見つけるには、多くの場合何時間もかかります。

高度なハイブリッドアーキテクチャの応用とゴール指向型システム

単一のアーキテクチャパターンに固執し続けることは、自律システムプロジェクトにおいて頻繁に失敗を引き起こします。純粋なFSMアプローチがスケーラビリティの壁にぶつかる一方で、最小限の移動ループやジャンプアルゴリズムでさえBTを使用して設計しようとすることは、「オブザーバー」の数を増やし、不要な条件チェックと膨大なCPUコストを生み出します。このため、現代のAAAゲームや産業用ロボットソリューションにおける「黄金律」は、これら2つのアーキテクチャが互いの弱点を補うように巧みに統合されたハイブリッド(複合)デザインです。

ビヘイビアツリーとステートマシンの融合(レイヤードAI)

最も効率的で業界に受け入れられているハイブリッドデザインでは、AIシステムはレイヤー(層)に分割されます。キャラクターが何をすべきかについての高レベルな認知的決定は、その性質上階層的で分岐しやすいビヘイビアツリーによって行われる一方、選択されたこの決定を現場で物理的およびアルゴリズム的に実行する役割は、下位のFSMまたはHFSMに委譲されます。

例えば、高度な敵AIや自律型監視エージェントにおいて、システムは次のように

機能します。

  1. 決定レイヤー(BT - 戦略的脳):キャラクターの周囲の脅威の数、自身の体力、および弾薬をブラックボード経由で読み取ります。選択的評価の結果として、「戦術的撤退」の決定が下されます。35

  2. 実行レイヤー(FSM - 運動スキル):「戦術的撤退」のコマンドが、キャラクターの骨格システムに統合されたステートマシンにトリガーとして伝達されます。FSMは、キャラクターを現在の「攻撃アニメーション」ステートから直ちに抜け出させ、「ダッシュ」ステートへ、そしてそこから遮蔽物裏での「しゃがみ」アニメーションステートへとスムーズな順序で移行させます。

この階層的アプローチのおかげで、BTは各フレームで不要に「キャラクターの左足が前か右足か?」といった実行詳細に悩まされることがなくなり、FSMは「敵はどこにいるのか?」といったマクロ戦略的な決定を尋ねる必要がなくなります。22

ロボット分野においても状況は同様の類似性を示します。物流倉庫で稼働する無人搬送車(AGV)の最上位レベルのモード変更(人間による手動制御、自律ミッションモード、ハードウェアエラー/緊急モード)は、理解性を担保するためにマクロなHFSMによって調整されます。27 しかし、ロボットが「自律ミッションモード」に入ると、目的地への移動ルート上の動的障害物の回避、繊細なオブジェクトの操作、瞬間的なセンサーフィードバックなどの処理は、BTの比類なき階層的リアクティビティに委ねられます。27 文献では、後方連鎖(backward-chaining)プランナーを使用して、目標から逆向きに条件を並べることでゼロから自律的なビヘイビアツリーを動的に生成できる高度なソリューションも正常に応用されています。27

自律的な意思決定のその他の側面:GOAPの文脈

アーキテクチャの複雑さを完全に理解するために、業界においてFSMやBTシステムの枠を超える「ゴール指向型アクションプランニング」(Goal-Oriented Action Planning - GOAP)の概念に触れることも重要です。1971年の学術的なSTRIPSプランニング理論に基づき、『F.E.A.R.』の伝説的な敵AIのアーキテクトであるジェフ・オーキン(Jeff Orkin)によって普及されたGOAPは、意思決定プロセスに全く異なる次元をもたらしました。13

GOAPシステムでは、アクションは事前に硬直したツリーに結合されません。システムには、「アクション」(Actions - 例:ドアを開ける)、「前提条件」(Preconditions - 例:ドアの近くにいること)、および「効果」(Effects - 例:ドアが今や開いていること)のリストのみが与えられます。システムは(通常A*探索アルゴリズムを使用して)望ましい「ゴール」状態に到達するために、これらのアクションを実行時(runtime)に結合して最適なプランを自動的に作成します。『F.E.A.R.』の天才性は、背後にあるこの巨大な自律プランニングエンジンによって生成されたプランを実行するために、実際にはたった3つのステート(GoTo、Animate、Use Smart Object)しか持たない非常にシンプルでミニマリストなFSMを使用している点にあります。13 現代のBTハイブリッドと同様に、脳が複雑なアルゴリズムである一方で、筋肉は常に堅牢なFSMで構成されています。

次世代ゲームエンジンエコシステム:Unreal Engineの「State Trees」(ステートツリー)ビジョン

ゲームエンジン技術や自律システムシミュレーションにおけるグローバルなパイオニアであるEpic Gamesは、Unreal Engine 5の革新的な構造とともに(特に5.5アップデートで顕著になった形で)、ビヘイビアツリーとステートマシンの何十年にもわたる拮抗に終止符を打つことを目指すビジョナリーなツールを業界に提供しました:「State Trees」(ステートツリー)です。36

従来のビヘイビアツリー(BT)が特定のスケールを超えると鈍重になりがちな「ステートレス」な性質と、FSMの柔軟性に欠けスパゲッティコードを生み出しがちな厳格な境界は、「ステートツリー」の概念において巧みに融合されています。36 Epic Gamesは、State Treeアーキテクチャによって古いスタイルのBTが持つ構造的な脆弱性を解消し、FSMの線形のパワーを現代的な決定メカニズムで武装させています。

State Treeアーキテクチャの際立った特徴は次のとおりです。

● 基本的な処理フローとして、BTの絶えずティックを打ち「条件を休むことなくチェックする」プロセッサに負担をかける構造の代わりに、FSMが提供する最適化されたステート制御(state flow)のパフォーマンスを基盤とします。36 ● ステート間の移行を定義する際、FSMの最も脆弱なポイントである「互いに密に結合された複雑な移行の矢印」を使用する代わりに、ビヘイビアツリーが使用するフォールバック(Fallback)ノードの柔軟性から利益を得ます。 ● これをさらに一歩進めて、ユーティリティ(有用性/重み付け評価)アルゴリズムをステート選択に直接統合します。38 開発者は、ターゲットに対する「戦闘」や「逃走」のアクションのために静的で脆い移行の矢印を描く代わりに、各ステートに数学的重み(weight)パラメータと確率分布を定義できます。キャラクターの健康が低下するにつれて、「逃走」ステートを計算する関数の有用性(utility)スコアが「戦闘」ステートのスコアを上回ります。38 このようにしてツリーは、無数の移行の矢印を必要とせず、まるで決定木の優雅さでステートからステートへと有機的な移行を行います。38

この新世代の技術的アプローチは、自律意思決定の分野においてゲームのルールを変えるステップです。Epic Gamesのエンジニアが新しいハードウェアやシステムの構築においてState Treeアーキテクチャに直接重点を置いていることは、単なる古典的なビヘイビアツリーが将来的に徐々に放棄され、FSMのパフォーマンスで武装しユーティリティ関数で豊かにされたハイブリッドな「ステートツリー」にその座を譲っていくことの明確なプロジェクションを描いています。36

結論

自律キャラクター、ロボットアーム、自動運転車、そしてビデオゲーム内の高度なAIエージェントの意思決定の背骨を設計する際、「どのアーキテクチャが優れているか?」という問いに対する絶対的な単一の理論的答えは存在しません。計算機科学やソフトウェア工学において下されるすべてのアーキテクチャの決断には、深いトレードオフの計算が伴います。

有限ステートマシン(FSM)は、決定的ステート移行において提供する高速なパフォーマンス、開発者の視点から見た論理的理解の容易さ、および厳格なハードウェアの境界で武装したその性質のおかげで、特に低レベルのゲーム制御、格闘ゲーム、アーケードメカニクス、および複雑なアニメーションシステムにおいて不可欠な構成要素であり続けます。とはいえ、表現される変数の数が増加し、環境条件がリアルタイムで変化する認知的シナリオにおいて、FSMが引き起こす「ステートの爆発」は、プロジェクトを短期間で保守不可能なスパゲッティコードに追いやる危険な構造的危機へと変貌します。

一方、ビヘイビアツリー(Behavior Trees)は、柔軟性、極端なモジュール性、コンポーネントベースの再利用性、および高いリアクティビティのパラダイムを業界にもたらし、ゲームAIとロボットの自律性に真の意味での進化をもたらしました。時間を跨ぐアクションを非同期で実行できる「Running」の概念の存在や、コードを二度と変更することなく他のエージェントに追加できる独立したレゴブロックのように形作れる点は、BTを巨大なオープンワールドシミュレーションの議論の余地のない頭脳にしました。しかし、この柔軟性の代償であるステートレス性(statelessness)は、システムデザイナーにブラックボードのような外部メモリブリッジの構築を強要し、パフォーマンスの最適化を確実にするために重いイベント駆動型(event-driven)デザインの導入を義務付けています。

最終的に、成功する現代の自律システムのデザインは、アーキテクトがプロジェクトをどの抽象化(abstraction)レベルで管理することを選択するかに関わっています。実践的な産業応用は議論の余地のない事実を証明しています:自律システムの目標が定義され、どのアクションを選択すべきかについてのリアクティブな決定がビヘイビアツリーによって行われ、選択されたこのアクションの物理的コーディネーション、アニメーションのステップ、およびモード移行がFSMによって管理される階層的ハイブリッドアーキテクチャは、今日のソフトウェアが到達した最も優雅で洗練されたポイントを代表しています。未来の意思決定メカニズムは、境界がさらに曖昧になり、アーキテクチャがFSMとBTを単一のボディに溶け込ませる(Unreal Engine State Treesの例のように)次世代のシステムの進化の舞台であり続けるでしょう。

*情報:画像はGoogle Geminiによって生成されました。

BehaviorTreeFSMStateTreeGameDesign
ディープリサーチツール
Google Gemini
Google Gemini
翻訳ツール
Google Gemini
Google Gemini

共有